我对这个问题感到有些困惑。似乎每一步,问题的大小减少了一半,这表明O(logn)。但是如果你真的想到它,那么交互的数量只是几何系列2 + 4 + 8 + ...小于n,这表明O(n)。有人可以提供他们的见解吗?
for (int i=1; i < n; i=2i)
for (int j=i; j < n; j++)
// do something
答案 0 :(得分:0)
看起来完全是sum(sum(1, j = (2^i)..n), i = 1..log(n)) = nlog(n) - 2n + log(n) + 2 = O(n log n)
答案 1 :(得分:0)
复杂度为O(n log n)
首先获得更多清关,例如: 当n为4时,外循环迭代2次 当n为64时,ouret循环迭代6次 所以外循环迭代log2(n)次。
解决方案: 在外循环的第一次迭代中,“do somethings”语句运行n次 在外循环的第二次迭代中,“do somethings”语句运行n-2次 在外循环的最后一次迭代中,“do somethings”语句正在运行n-log2(n)次
因此,对于程序的总执行,“do somethings”语句运行n + n-2 + n-4 + ... + n-log2(n)次。 它等于n * log2(n) - (1 + 2 + 4 + 8 + ... + log2(n))= n * log2(n) - (2n-1)倍。 所以复杂性是o(n log n)
答案 2 :(得分:0)
假设do something
为Theta(1)
,则算法应为Theta(nlog(n))
,如U2EF1所示。
以下解释了如何找到双重求和的闭合公式:
Sum p in [1, logn] (Sum j in [2^p, n] 1) =
Sum p in [1, logn] (n - 2^p) =
nlogn - Sum p in [1, logn] (2^p) =
nlogn - Theta(n) =
Theta(nlogn)
特别是,您可以使用closed form评估几何系列中第一个n
项的最终总和。或者您可以使用更有限的变体,例如&#34;将n
视为二进制数字,例如1111
,并注意如果您对每个幂2^p
求和p = 1 to log(n)
然后您再次获得n
&#34;。
封闭表单足以证明Theta
绑定,但您需要在复杂性分析中使用其他常见引理来显示Theta(nlogn) - Theta(n) = Theta(nlogn)
等步骤。
答案 3 :(得分:-1)
解决这个问题的一个好方法是分别计算内部和外部循环的复杂性。一旦你这样做,你就可以计算两者的乘积来得到总的复杂性。
您还可以根据每个循环中需要多少步骤来考虑这一点,这可以作为方法的良好健全性检查。通过与之前相同的逻辑,可以清楚地看到,由于i
几何增长,该循环中实际发生的迭代次数将与此相反,或O(log n)
。
如果您想查看给定n
将运行多少内部循环,很明显,因为每n
只有一个步骤,内部循环将是线性的给出外循环的结果。这给出了O(n)
此方法返回O(n log n)