【问题标题】:Time and Space Complexity of a complex while statement [closed]复杂while语句的时间和空间复杂性[关闭]
【发布时间】:2012-09-03 03:39:26
【问题描述】:
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 语句的时间和空间复杂度是多少。它是否取决于 while encloser 中的语句 while (p &amp;&amp; *p!='\0' &amp;&amp; ((*p &gt;= 'a' &amp;&amp; *p &lt;= 'z') || (*p &gt;= 'A' &amp;&amp; *p &lt;= 'Z') || *p == '@'))

或仅在while 正文上

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

如上。它还取决于&amp;&amp;|| 的短路。

【问题讨论】:

  • 如果我是你,我会少担心性能,多担心可读性 :-) 可能还有可移植性——不是每个人都使用 ASCII。
  • @paxdiablo 不正确 - 不是每个人都使用 ASCII :-) 你为什么认为他不使用 - 例如 EBCDIC 保证 >=
  • 大型机 (z/OS) 使用 EBCDIC,甚至用于它们的 UNIX 子系统。并且 A-Z 在 EBCDIC 中连续。 ISO C 标准仅保证 0-9 范围的连续性 (??)。
  • Right so char='A'
  • C 标准只保证 0

标签: c time-complexity


【解决方案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 可以帮助您解决问题中 cmets 中指出的问题,即使您的语言环境发生更改也可以使用。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      相关资源
      最近更新 更多