【问题标题】:Why is this algorithm linear and not linearithmic?为什么这个算法是线性的而不是线性的?
【发布时间】:2013-01-23 18:19:01
【问题描述】:
int sum = 0; 
for (int n = N; n > 0; n /= 2)
   for (int i = 0; i < n; i++)
      sum++; 

我很确定它会在 nlogn 中增长,但被告知它是线性的……为什么它是线性的而不是线性的?

【问题讨论】:

  • “线性”?你的意思是“对数”吗?
  • @duffymo: linearithmic
  • 以前从未听说过这个词。我可以称它为对数线性的。我会用谷歌搜索你的术语。
  • 对数线性已经有了不同的含义。

标签: java algorithm complexity-theory big-o


【解决方案1】:

它是线性的。想象一下n 是 64。内部循环运行 64 次,然后是 32 次,然后是 16 次,然后是 8 次,然后是 4 次,然后是 2 次,然后是 1 次。 64 + 32 + 16 + 8 + 4 + 2 + 1 = 127。

所以它需要2n-1 总操作数(对于 2 的幂,但这不会改变分析),假设内部循环没有被优化掉。这显然是O(n)——线性。

如果内部 for 循环被优化掉(到sum += n;),它是对数的。

【讨论】:

  • 我不确定我是否遵循,它不是第一次在内循环上击中每个元素吗?
  • @BlackVegetable:很好,我会解决的。
【解决方案2】:

这个算法的复杂度是Θ(N)。

操作次数为

sum{2**k} for k = 0..log2(N)

这个级数的总和是

2*N-1

这是 Θ(N)。

【讨论】:

  • 可能是k = 0..log2(N) - 并不是说​​它对结论有影响
  • 嗯,我明白了。我对那个符号不太熟悉。 "0..log2(N)"
【解决方案3】:

形式上,使用 Sigma 表示法可以帮助您清楚地看到增长顺序是线性的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    相关资源
    最近更新 更多