我需要帮助来确定递归函数的时间复杂度。我知道如何解决这个简单的案例,但我仍在努力学习如何解决更难的案例。这只是我无法弄清楚的几个例子。任何帮助都会非常感激,对我的学习有很大帮助,谢谢!
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;
}
}
答案 0 :(得分:0)
设n表示字符串的长度,T表示长度的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)
的长度。
示例(如果你不高于para,则很重要) -
如果有三个字母串“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 找到功能复杂性的 easiler方式是声明一个初始值为零的整数,并在每个函数调用时递增它。然后最后将此整数的值与值n进行比较以获得time complexity
。它通常有助于为大多数功能轻松找到时间复杂度。
你可以在全局范围内声明整数(这不是一个好习惯,但应该适用于你,因为我们只需要找时间复杂度)并且每次都增加它。
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;
}
}
结果是 -
n count
1 1
2 3
3 9
4 27
5 81
从哪个时间复杂度很容易计算为3 ^(n-1)