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