C 复杂while语句的时间和空间复杂性

C 复杂while语句的时间和空间复杂性,c,time-complexity,C,Time Complexity,如上所述。它还取决于&&或|的短路。当你谈论复杂性时,你谈论的是它根据输入的大小增长了多少。在本例中,它基于作为str传入的字符串的大小。while条件中正在检查的内容数不变。它固定在算法中,被称为“常数因子”,所以我们不计算它。因为在最坏的情况下,测试在字符串的每个字符上运行一次,所以它是O(n),其中n是字符串的长度 我不知道您的运行时或空间复杂性,但实际条件复杂性可以简化很多,以使其更具可读性。首先,您不必在每个循环中检查指针p,首先在单独的检查中检查str是否为非空指针。其次,你应该用它

如上所述。它还取决于
&&
|
的短路。当你谈论复杂性时,你谈论的是它根据输入的大小增长了多少。在本例中,它基于作为
str
传入的字符串的大小。while条件中正在检查的内容数不变。它固定在算法中,被称为“常数因子”,所以我们不计算它。因为在最坏的情况下,测试在字符串的每个字符上运行一次,所以它是
O(n)
,其中
n
是字符串的长度

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

因此,代码可以改为如下所示:

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

使用
isalpha
可以帮助您解决问题注释中指出的问题,即使您的语言环境发生了更改,也可以使用。

如果我是您,我不太担心性能,而更担心可读性:-)和可能的可移植性-不是每个人都使用ASCII。@paxdiablo不是真的-不是每个人都使用ASCII:-)而且你认为他为什么不这样做-例如EBCDIC保证>=大型机(z/OS)使用EBCDIC,即使对于他们的UNIX子系统也是如此。和A-Z在EBCDIC中是不连续的。ISO C标准仅保证
0-9
范围的连续性(?),因此C标准仅保证0<1<2…<9及其符号表值相邻。见C11 5.2.1/3。标准对字符比较没有其他保证。
while(){ 
 //body statements   
  p++;
}
int foo(char *str)
{
    if (str == NULL)
        return 0;

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

    return p - str;
}