【问题标题】:Is O(log n) the correct running time T(n) for this?O(log n) 是正确的运行时间 T(n) 吗?
【发布时间】:2023-03-23 00:32:01
【问题描述】:

这里是:

for(i=n;i >0; i=i/2)
    printf(“%i”,i);

我还是新手,任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 正确。 i 在每次迭代中减半,直到达到 0,因此迭代计数为 log(n)。如果 n 最初
  • 错了。 “%i” 是非标准的,在普通编译器中会产生编译错误,因此没有运行时间。
  • 澄清一下,@MikeCAT 抱怨帖子中使用了不正确的引号字符,即“%i”。应该是"%i"

标签: c time


【解决方案1】:

正如 cmets 中已经指出的那样。您对这段代码的复杂性是正确的。只需使用" 而不是智能引用。正如@John Bollinger 所指出的, 不是标准 C 基本源字符集的一部分。

关于检查的复杂性,你可以自己用基本的日志用法来验证:

#include <stdio.h>
#include <math.h>

double getLog2(double n) {  
    return log(n) / log(2);  
} 

int main() {
    int n = 32;
    int nIterations = 0;
    for (int i = n; i > 0; i /= 2) {
        printf("%i\n", i);
        nIterations++;
    }

    printf("nIterations = %d, getLog2(%d) = %d", nIterations, n, getLog2(n));
}

当您运行此程序时,您将能够看到 nIterations 等于以 N 为底的 2 的对数。这是使用 N=64 运行的示例:

src : $ gcc logncomplexity.c -lm
src : $ ./a.out 
64
32
16
8
4
2
1
nIterations = 7, getLog2(64) = 7

【讨论】:

  • %i%d 完全一样标准,并且两者具有与printf 字段指令相同的含义。 OP没有特别的理由改变。但是他们确实需要使用 ASCII 双引号字符 ("),而不是他们在问题中出现的“智能”引号。后者不在 C 的基本源字符集中,完全接受它们的编译器不太可能将它们识别为字符串文字的分隔符。
  • 非常感谢您的评论,我没注意到它不是"。我会更新我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 2011-12-11
  • 2011-07-09
相关资源
最近更新 更多