Recursion 确定递归函数的时间复杂度(大O表示法)
我需要帮助来确定递归函数的时间复杂度。我知道如何解决简单的案件,但我仍在努力学习如何解决较难的案件。这只是我想不出的几个例子。任何帮助都将不胜感激,并将对我的学习大有帮助,谢谢Recursion 确定递归函数的时间复杂度(大O表示法),recursion,time-complexity,big-o,Recursion,Time Complexity,Big O,我需要帮助来确定递归函数的时间复杂度。我知道如何解决简单的案件,但我仍在努力学习如何解决较难的案件。这只是我想不出的几个例子。任何帮助都将不胜感激,并将对我的学习大有帮助,谢谢 int minPalindrome(string text){ int left = 0; int right = text.size()-1; if(text=="") return 0; else if(isPalindrome(text,left,right))
int minPalindrome(string text){
int left = 0;
int right = text.size()-1;
if(text=="")
return 0;
else if(isPalindrome(text,left,right))
return 1;
else{
int minimum = text.size();
for(int i=1;i<text.size();i++){
minimum = min(minPalindrome(text.substr(0,i)) + minPalindrome(text.substr(i,text.size()-i)),minimum);
}
return minimum;
}
}
int-minPalindrome(字符串文本){
int左=0;
int right=text.size()-1;
如果(文本==“”)
返回0;
else if(isAlindrome(文本,左,右))
返回1;
否则{
int最小值=text.size();
对于(int i=1;i方法1
设n表示字符串的长度,T(n)时间表示长度
显然,这些行动-
int left = 0;
int right = text.size()-1;
if(text=="")
return 0;
else if(isPalindrome(text,left,right))
return 1;
else{
int minimum = text.size();
在恒定时间内发生(为方便起见,假设等于1)
然后循环需要时间2*T(n-i)
对于不同的i,常数2
会相乘,因为对于任何特定的长度都会进行两次函数调用,如下所示:
text.substr(0,i)
的长度等于其他一些i的text.substr(i,text.size()-i)
的长度
示例(如果您没有获得以上段落,则很重要)
如果有三个字母字符串“abc”
它将分为两部分
"a" and "bc" for i=1
"ab" and "c" for i=2
因此将有2个函数调用,字符串长度为2(“bc”和“ab”)和1(“a”和“c”)
现在可以用上面的结果来推断-
T(1)=1 //constant time is taken when string is of one letter
T(2)=1+2*T(1) //it will be broken into two strings of length 1 which are used in function
T(3)=1 + 2*T(2) + 2*T(1) //it is broken as shown in example
=1 + 2*(1 + 2*T(1)) + 2*T(1)
=3 + 6*T(1)
同样地,我们得到
T(n)=1 + 2*T(n-1) + 2*T(n-2) + .......
=1 + (2 + 4*T(n-2) + 4*T(n-3)+....) + 2*T(n-2) + 2*T(n-3)..... //expanding T(n-1)
=3 + 6*T(n-2) +6*T(n-3) +......
=3 +(6 + 12*T(n-3)+....) +6*T(n-3) +....
=9 + 18*T(n-3)+.....
=3^2 +(3^3-3^2)*T(n-3)+....
对于k将军,我们得到了
T(n)=3^(k-1) + (3^k-3^(k-1))*T(n-k) +....
T(n)=3^((n-1)-1) + (3^(n-1) -3^((n-1)-1))*T(n-(n-1) //for k=n-1
=3^(n-2) + (3^(n-1)-3^(n-2))*T(1)
=3^(n-1) //As T(1)=1
这是所需的时间复杂性
方法2
查找函数复杂度的一种更简单的方法是声明一个初始值为零的整数,并在每次函数调用时递增。最后将该整数的值与n的值进行比较,得到时间复杂度。对于大多数函数来说,这通常有助于轻松查找时间复杂度
您可以全局声明整数(这不是一个好的做法,但应该适用于u,因为我们只需要找到时间复杂性),并每次递增它
int minPalindrome(string text){
count++; //count is global
int left = 0;
int right = text.size()-1;
if(text=="")
return 0;
else if(isPalindrome(text,left,right))
return 1;
else{
int minimum = text.size();
for(int i=1;i<text.size();i++){
minimum = min(minPalindrome(text.substr(0,i)) + minPalindrome(text.substr(i,text.size()-i)),minimum);
}
return minimum;
}
}
时间复杂度很容易计算为3^(n-1)您请求了“帮助”,但我看不到您试图解决此问题。请详细描述您设法解决的问题、您的困境等。
n count
1 1
2 3
3 9
4 27
5 81