我怎样才能找到这段代码的时间和空间复杂度?

时间:2011-05-02 16:10:30

标签: algorithm time-complexity palindrome space-complexity


我很难找到这个代码的空间和时间复杂性,我写这个代码来查找字符串中的回文数。

/**
 This program finds palindromes in a string.
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int checkPalin(char *str, int len)
{
    int result = 0, loop;

    for ( loop = 0; loop < len/2; loop++)
    {

        if ( *(str+loop) == *(str+((len - 1) - loop)) )
            result = 1;
        else {
            result = 0;
            break;
        }
    }

    return result;
}

int main()
{
    char *string = "baaab4";
    char *a, *palin;

    int len = strlen(string), index = 0, fwd=0, count=0, LEN;
    LEN = len;

    while(fwd < (LEN-1))
    {
        a = string+fwd;
        palin = (char*)malloc((len+1)*sizeof(char));    

        while(index<len)
        {
            sprintf(palin+index, "%c",*a);
            index++;
            a++;

            if ( index > 1 ) {
                *(palin+index) = '\0';
                count+=checkPalin(palin, index);
            }
        }

        free(palin);
        index = 0;
        fwd++;
        len--;
    }

    printf("Palindromes: %d\n", count);
    return 0;
}

我试了一下,这就是我的想法:
在主要我们有两个while循环。外部的一个在字符串的整个长度-1上运行。现在这里是混乱,内部while循环首先在整个长度上运行,然后在外部while循环的每次迭代中运行n-1,然后是n-2等。这是否意味着我们的时间复杂度为O(n(n-1)) = O(n^2-n) = O(n^2)? 而对于空间复杂性,我最初为字符串长度+ 1,然后(长度+ 1)-1,(长度+ 1)-2等分配空间,那么我们如何从中找到空间复杂度? 对于checkPalin函数,其O(n/2)
我正在准备面试,并希望了解这个概念 谢谢

2 个答案:

答案 0 :(得分:2)

对于时间复杂度,您的分析是正确的。它是O(n ^ 2),因为n +(n-1)+(n-2)+ ... + 1步。对于空间复杂性,通常只计算任何给定时间所需的空间。在您的情况下,您需要的最多额外内存是第一次循环时的O(n),因此空间复杂度是线性的。

那就是说,这不是检查回文的特别好的代码。你可以在O(n)时间和O(1)空间内完成它,并且实际上有更清晰,更清晰的代码来启动。

Gah :没有仔细阅读。其他地方给出了正确答案。

答案 1 :(得分:2)

不要忘记每次调用checkPalin(每次通过main的内部循环执行)都会在checkPalin中执行循环index / 2次。除此之外,您对算法时间复杂度的计算是正确的。由于indexn一样大,这会为时间复杂度增加另一个n因子,给出O(n 3 )。

至于空间复杂性,你每次通过外部循环分配,然后释放它。因此空间复杂度为O(n)。 (注意O(n)== O(n / 2)。它只是指数和函数的形式,这很重要。)