是运行时o(logn)还是o(n)?

时间:2014-02-05 04:21:43

标签: algorithm

我对这个问题感到有些困惑。似乎每一步,问题的大小减少了一半,这表明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

4 个答案:

答案 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 somethingTheta(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)

的结果