【问题标题】:What's the time complexity of for (int i = 2; i < n; i = i*i)?for (int i = 2; i < n; i = i*i) 的时间复杂度是多少?
【发布时间】:2021-06-09 10:18:28
【问题描述】:

以下循环的时间复杂度是多少?

for (int i = 2; i < n; i = i * i) {
    ++a;
}

在练习运行时复杂性时,我遇到了这段代码,但找不到答案。我以为这会是sqrt(n),虽然它看起来不正确,因为循环的序列是2, 4, 16, 256, ...

【问题讨论】:

  • fwiw,你已经准备好测量循环的复杂性了。为n选择不同的值,看看na的最终值是什么关系
  • a 的值(i 的值的数量)与 n 的值对估计复杂性很重要,而不是 i 的实际值。
  • (实际上这在任何传统架构上最多只能执行 5 次,所以一个明智的答案也是 O(1)。Big-O 仅在有合理意义的情况下才真正重要可以超过常数因子。)

标签: c++ algorithm performance runtime


【解决方案1】:

要理解答案,您必须了解:Exponent 的逆不是SQRT,而是log

此循环将i 与自身相乘(即指数增量),并且仅在i &gt;= n 时停止,因此复杂度为O(log(n))(精确到基数2,因为i=2 在初始化时)

为了说明这一点:

在上图中,您可以看到SQRT 给出了正确的步数只有当i 是 2 的偶数幂时。但是log2 每次都会给出准确的步数。

【讨论】:

    【解决方案2】:

    每次i 由 2 供电。因此,如果A(n) 在最后一步显示i 的当前值(即n),则可以将其写成递归,如下所示(假设 n 是 2 的幂):

    A(n) = A(n-1)^2
    

    现在,你可以展开它来找到一个模式:

    A(n) = A(n-2)^4 = A(n-3)^8 = ... = A(n-(n-1))^(2^(n-1)) = 2^(2^(n-1))
    

    因此,循环迭代k 步骤使得n = 2 ^ (2^ (k-1))。因此,这个循环会迭代Theta(log(log(n))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 2019-06-25
      • 2023-03-29
      相关资源
      最近更新 更多