【发布时间】:2014-02-06 04:00:17
【问题描述】:
我在使用以下算法时遇到了一些问题:
for (int i = 1; i < n; i = 2i)
for (int j = i; j < n; j++)
// do something (const time)
所以显示运行时为 O(nlogn) 并不难 - 但我不确定如何显示它是 Big Omega(nlogn)!直觉上,我认为一定是这样,因为对于给定的 n,时间复杂度在最佳/最坏情况之间没有变化。
任何建议将不胜感激!
【问题讨论】:
-
如果你能找到一个常量
c1来为一些大于0 的n0 显示f(n) < c1*nlogn,那么找到一个c2来为一些大于0 的n0 显示c2*nlogn < f(n)应该是微不足道的 -
对 - 我可以说内部循环必须执行至少 n/2 次,所以 c 是 1/2?
-
内部循环执行
n + (n-2) + (n-4) + (n-8)...次,我们知道我们将有log(n)的(n-i)总和,所以如果我们把它分开(感谢交换性/关联性)我们应该显示内部循环执行n + n + n ... - 2 - 4 - 8 -...,因此我们有n*logn的计数n's,我们将2^i与i = 1 to logn相加,等于2^(logn+1) -1,我们可以将其减少为2n-1。使用此信息设置不等式并找到c2 -
好吧..所以根据你的计算,这个算法实际上是 O(n) 而不是 O(nlogn)?
-
不 - 我的数学是(非常轻微的)。我将把它移到上一篇文章之前应该有的答案。
标签: algorithm complexity-theory