Big-O表示法的函数时间复杂度?

时间:2013-05-01 17:45:28

标签: c++ algorithm

1)Althoug我研究了大O符号,我无法理解我们如何用Big-O符号计算这个函数的时间复杂度。你能详细解释一下吗?

2)用于递归函数;为什么我们在使用递归函数时调用len-2?

bool isPalindrome( char *s, int len) {
             if (len <= 1) {
             return true;
        }
             else
            return ((s[0] == s[len-1]) && isPalindrome(s+1,len-2));
        }

此功能在Big-O表示法方面的时间复杂度是多少?

T(0) = 1 // base case
T(1) = 1 // base case
T(n) = 1 + T(n-2)// general case
T(n-2)=1+T(n-4)
T(n) = 2 + T(n-4)
T(n) = 3 + T(n-6)
T(n) = k + T(n-2k) ... n-2k = 1  k= (n-1)/2
T(n) = (n-1)/2 + T(1)  O(n)

2 个答案:

答案 0 :(得分:5)

使用len-2调用递归函数,因为在每次执行中都会从单词中删除2个字符(第一个和最后一个)。因此len-2。 T(n)= 1 + T(n-2)= 1 + 1 + T(n-4)= 1 + 1 + 1 + T(n-6)= n / 2 + T(1)= O(n ) 如果存在常数c和数字n0,则函数g(n)是O(f(n)),因此对于n> n0 g(n)&lt; C * F(N)。 big-O表示法只是一个上限,因此函数是O(n),但也是O(n ^ 2)等等。

答案 1 :(得分:1)

该函数以长度为n的字符串开头,每次循环时将其减少2,直到它全部缩小为止。

迭代次数因此与长度/ 2成比例,即O(n/2) =&gt; O(n)