两个循环但Theta(n)?

时间:2017-01-17 22:40:11

标签: algorithm time-complexity

i = n
while (i >= 1)
{
    for j = 1 to i 
    {
    Function() <- (O(1))
    }
i = i/2
}

答案是Theta(n),但我不明白为什么这是Theta(n)。

根据我的理解,内部循环将执行n + n / 2 + n / 4 + ... + 1,因此总数将为O(n),外部循环将执行logn time so so 答案应该是nlogn。 但是为什么这是Theta(n)而不是Theta(nlogn)?

5 个答案:

答案 0 :(得分:4)

正如您所正确指出的那样,内部循环将执行n + n/2 + n/4 + ... + 1 ≈ 2*n次。

让我们看看每行代码执行的次数。

i = n                  // Executed 1 time
while (i >= 1)         // Executed approximately log(n) times
{
    for j = 1 to i     // Executed approximately 2*n times
    {
        Function()     // Executed approximately 2*n times
    }
    i = i/2            // Executed approximately log(n) times
}

因此算法的总时间复杂度为:

Θ(1) + Θ(log(n)) + Θ(n) + Θ(n) + Θ(log(n))

相当于Θ(n)

答案 1 :(得分:3)

  

根据我的理解,内部循环将执行n + n / 2 + n / 4 + ... + 1,因此总数将为O(n)

这就是你所需要的一切。您已经考虑了外循环对内循环运行次数的乘法效应。外循环的复杂性本身为O(n)的事实可以添加到内循环的总复杂性。总数不是n * log n,而是n + log n,即O(n)

答案 2 :(得分:1)

对于执行n + n / 2 + n / 4 + ... + 1的总内环,你是对的,它是O(n)。您不必将内循环的运行时间乘以O(log(n)),因为当外循环的运行时间为O(log(n))时,内循环的运行时也会因log(n)而减小将i除以2,因此运行时只是O(n)

答案 3 :(得分:1)

您的计算部分正确。您只是错过了一个已经计算出外循环复杂性的小细节。在您的情况下,您选择通过简单计算外循环中每次迭代所需的时间来计算时间复杂度。那就是:

for i=n : O(n)

for i=n/2: O(n/2)

.
.
.

for i=1: O(1)

现在,根据内部循环的时间复杂度进行每次迭代的计算。因此,总时间复杂度是外部循环所花费的时间(包括内部循环所花费的时间),这是运行每次迭代所需的总和,即:n+n/2+n/4+...+1

您所指的乘法是一种技术,当您知道外循环运行了多少次以及内循环运行多少次并将它们相乘以获得总时间复杂度时使用的技术。您可以选择添加内循环运行到自身n次的次数,而n是外循环运行的次数(简单数学:k * n = k + k + ... + kn次)。

所以在你的情况下,你只是简单地使用第二种方法,因为n + n / 2 + n / 4 + ... + 1不是内循环运行的次数,它是&#39; s sum 它在外循环的每次迭代中运行的次数。

答案 4 :(得分:0)

n + n/2 + n/4 ... + 1的总和始终小于或等于2*n,因为q = 0.5的几何系列会收敛于此。

因此,该函数永远不会被调用超过2n次,因此复杂度为Θ(n)