【问题标题】:how would i find the time and space complexity of this code?我如何找到这段代码的时间和空间复杂度?
【发布时间】:2011-05-02 16:10:30
【问题描述】:


我很难找到我编写的这段代码的空间和时间复杂度,以查找字符串中的回文数。

/**
 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;
}

我试了一下,这就是我的想法:
在 main 中,我们有两个 while 循环。外层贯穿整个长度为 1 的字符串。现在这是混乱之处,内部 while 循环首先运行整个长度,然后是 n-1,然后是 n-2,以此类推,以用于外部 while 循环的每次迭代。那么这是否意味着我们的时间复杂度将是O(n(n-1)) = O(n^2-n) = O(n^2)? 对于空间复杂度,我最初为字符串长度+1分配空间,然后为(length+1)-1、(length+1)-2等分配空间,那么我们如何从中找到空间复杂度? 对于 checkPalin 函数,它的 O(n/2).
我正在准备面试,想了解这个概念。
谢谢

【问题讨论】:

    标签: algorithm time-complexity palindrome space-complexity


    【解决方案1】:

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

    至于空间复杂性,您每次都通过外循环分配,然后释放它。所以空间复杂度是O(n)。 (注意 O(n) == O(n/2)。重要的是函数的指数和形式。)

    【讨论】:

    • 啊,我错过了。如果我错了,请纠正我,所以时间复杂度应该这样写: O(n(n-1(n/2))) = O(1/2(n^3-n^2)) = O (n^3)。太糟糕了!!!
    • @rashid - 我认为您修改后的分析是正确的。是不是很糟糕,我不知道。这是一个很难有效解决的问题。您可能能够将空间复杂度降低到 O(1) 而不会减慢算法速度;我不明白为什么你不能(有更多的簿记)只是检查到位,而不将子字符串复制到暂存区域。
    【解决方案2】:

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

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

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

    【讨论】:

    • 此代码检查字符串中的多个回文,而不仅仅是一个。所以我们可以在一个字符串中有n个回文。本质上,我从给定字符串创建子字符串,然后检查 O(n/2)(由 checkPalin 函数完成),如果那是回文。
    • 我看不出如何在 O(n) 时间内完成。一串 n 个相同的符号具有 O(n^2) 回文(每个符号本身;每个连续的对;每个连续的 3 字符串等)。我不知道(一般而言)你如何能比它们的数量更快地计算它们。
    • Ted 是对的,基本上我们必须配对(至少我是这么想的),我们需要在字符串中至少有两个字符来检查回文。 :)
    • 对不起。我浏览了代码并没有注意到对子回文的检查。我的错。
    猜你喜欢
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多