【问题标题】:Order of growth - nested loops, outside loop with doubling index增长顺序 - 嵌套循环,具有双倍索引的外部循环
【发布时间】:2020-04-16 01:10:23
【问题描述】:

考虑下面的sn-p代码:

int sum=0;
for (int i = 1; i < n; i *= 2)
{
    for (int j = 0; j < i; j++)
    {
        sum++;
    }
}

这个的增长顺序是(n*log(n)/2)吗? (base 2 log)?

【问题讨论】:

  • 你认为它是什么?为什么?
  • 因子 1/2 和对数的底都与大 O 表示法无关(都是常数因子)。
  • 我将编辑问题以解释我的推理。
  • 没有big-O,问题需要首先定义哪些操作被认为是基本的(即算作1时间单位)
  • @walnut 这将是内部循环中的语句。

标签: for-loop time-complexity big-o


【解决方案1】:

O(n)

实际上是内部循环(以j 作为迭代器的循环),从0 循环到i。总的来说,它每次都会使i循环。

外循环每次加倍j,直到达到n。因此,这意味着我们将按如下方式处理内部循环:

1 + 2 + 4 + … + n

这是一个gemetric series [wiki],因此等于:

∑<sub>j=0</sub><sup>⌊log n⌋</sup> 2<sup>j</sup> = (1-2<sup>⌊log n⌋+1</sup>)/(1-2) = 2<sup>⌊log n⌋+1</sup>-1 ≤ 2n-1

所以sum++指令的总数是2n,因此O(n)

【讨论】:

  • 我说服自己,外循环的增长顺序是对数的。我的结论正确吗?如果需要,我可以提供我的推理。
  • 这也导致渐近线不完全是2n,而是在n2n之间振荡。
  • @Al2110:外部循环将运行 O(log n) 次,是的,但这并不重要。由于内部循环中的循环数取决于 j 的值,并且直到 k 的所有循环的总和是 的循环的两倍k.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
相关资源
最近更新 更多