Algorithm 我如何找到这段代码的时间和空间复杂性?

Algorithm 我如何找到这段代码的时间和空间复杂性?,algorithm,time-complexity,palindrome,space-complexity,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 =

我很难找到这段代码的空间和时间复杂性,我写这段代码是为了找到字符串中的回文数

/**
 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循环首先在整个长度上运行,然后是n-1,然后是n-2,等等,对于外部while循环的每次迭代。那么这是否意味着我们的时间复杂度将是Onn-1=On^2-n=On^2? 对于空间复杂度,我首先为字符串长度+1分配空间,然后是长度+1-1,长度+1-2等等,那么我们如何从中找到空间复杂度呢? 对于checkPalin函数,其为On/2。 我正在准备面试,我想了解这个概念。
感谢您提供的时间复杂性,您的分析是正确的。由于n+n-1+n-2+…+1步,它在^2上。对于空间复杂性,您通常只计算任何给定时间所需的空间。在您的例子中,您所需要的最大额外内存是第一次通过循环,因此空间复杂度是线性的

也就是说,这不是检查回文的特别好的代码。您可以在时间和O1空间内完成这项工作,并且实际上有更干净、更清晰的代码可以引导


盖伊:读得不够仔细。正确答案在别处给出。

对于时间复杂性,您的分析是正确的。由于n+n-1+n-2+…+1步,它在^2上。对于空间复杂性,您通常只计算任何给定时间所需的空间。在您的例子中,您所需要的最大额外内存是第一次通过循环,因此空间复杂度是线性的

也就是说,这不是检查回文的特别好的代码。您可以在时间和O1空间内完成这项工作,并且实际上有更干净、更清晰的代码可以引导


盖伊:读得不够仔细。正确答案在别处给出。

不要忘记,每次通过main的内部循环调用checkPalin时,都会在checkPalin内部执行循环索引/2次。除此之外,您对算法时间复杂度的计算是正确的。由于索引与n一样大,这就给时间复杂度增加了另一个因子n,得到了On3


至于空间竞争性,您可以通过外部循环分配每次,然后释放它。因此,空间复杂度正在上升。请注意,On==On/2。重要的只是指数和函数的形式。

不要忘记,每次通过main的内部循环调用checkPalin时,都会在checkPalin内部执行循环索引/2次。除此之外,您对算法时间复杂度的计算是正确的。由于索引与n一样大,这就给时间复杂度增加了另一个因子n,得到了On3


至于空间竞争性,您可以通过外部循环分配每次,然后释放它。因此,空间复杂度正在上升。请注意,On==On/2。重要的只是指数和函数的形式。

这段代码检查字符串中的多个回文,而不仅仅是一个。所以我们可以在一个字符串中有n个回文。本质上,我从一个给定的字符串中生成子字符串,然后通过checkPalin函数签入/2done,如果它是回文的话。我不知道如何按时完成。n个相同符号的字符串,每个符号本身有^2个回文;每一连续对;每3个连续字符串;等等。我不知道一般情况下,你怎么能比它们的数量更快地计算它们。Ted是对的,基本上我们必须做好配对,至少我是这么想的,我们需要一个字符串中至少两个字符来检查回文很抱歉我浏览了一下代码,没有注意到子回文的检查。这段代码检查字符串中的多个回文,而不仅仅是一个。所以我们可以在一个字符串中有n个回文。本质上,我从一个给定的字符串中生成子字符串,然后通过checkPalin函数签入/2done,如果它是回文的话。我不知道如何按时完成。n个相同符号的字符串,每个符号本身有^2个回文;每一连续对;每3个连续字符串;等等。我不知道一般情况下,你怎么能比它们的数量更快地计算它们。Ted是对的,基本上我们必须做好配对,至少我是这么想的,我们需要一个字符串中至少两个字符来检查回文很抱歉我浏览了一下代码,没有注意到子回文的检查。我的错,啊,我错过了。如果我错了,请纠正我,因此时间复杂性应该这样写:Onn-1n/2=O1/2n^3-n^2=On^3。那太糟糕了@拉希德-我认为你修改后的分析是正确的。我不知道是不是很糟糕。这是一个很难有效解决的问题。您可能能够在不减慢算法的情况下将空间复杂度降低到O1;我不明白你为什么不能用一点mo
重新记账只需检查到位,而不将子字符串复制到草稿区。啊,我错过了。如果我错了,请纠正我,因此时间复杂性应该这样写:Onn-1n/2=O1/2n^3-n^2=On^3。那太糟糕了@拉希德-我认为你修改后的分析是正确的。我不知道是不是很糟糕。这是一个很难有效解决的问题。您可能能够在不减慢算法的情况下将空间复杂度降低到O1;我不明白为什么你不能多做一点簿记,只检查一下,而不把子字符串复制到一个临时区域。