确定递归函数的时间复杂度(Big O表示法)

时间:2017-03-19 12:16:46

标签: 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))
        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;
    }
}

1 个答案:

答案 0 :(得分:0)

方法1

设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)