时间和空间复杂的同时声明的复杂性

时间:2012-09-03 03:39:27

标签: c time-complexity

int foo(char *str)
{
    char *p = str;
    while (p && *p!='\0' && 
        ((*p >= 'a' && *p <= 'z') 
            || (*p >= 'A' && *p <= 'Z') || *p == '@')) {
         p++;
    }
    return p-str;
}

上述复杂while语句的时间和空间复杂度是多少?是否取决于in-en-close中的陈述  while (p && *p!='\0' && ((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z') || *p == '@'))

或仅限于while正文

while(){ 
 //body statements   
  p++;
}

如上所述。它也取决于&&||的短路。

2 个答案:

答案 0 :(得分:1)

我不知道您的运行时或空间复杂性,但实际条件复杂性可以简化很多,以使其更具可读性。首先,您不必每次循环检查指针p,首先检查str是否为单独检查中的非空指针。其次,您应该使用isalpha来检查字母。

所以代码看起来像这样:

int foo(char *str)
{
    if (str == NULL)
        return 0;

    char *p = str;
    while (*p != '\0' && (isalpha(*p) || *p == '@'))
        p++;

    return p - str;
}

使用isalpha可以帮助您解决问题评论中提到的问题,即使您的语言区域已更改也能正常运行。

答案 1 :(得分:0)

当你谈到复杂性时,你在谈论它根据输入的大小增长了多少。在这种情况下,它基于作为str传入的字符串的大小。在while条件下检查的内容数量不会改变。它固定在算法中,即所谓的“常数因子”,所以我们不计算它。因为在最坏的情况下,测试在字符串的每个字符上运行一次,它是O(n),其中n是字符串的长度。