程序的运行时间

时间:2016-01-19 16:19:42

标签: algorithm

我对以下程序的运行时间有疑问: 问题1:

a = 0
for i = 1 to n:
    if i is odd:
        for j = 1 to i:
            a = a + j

问题2:

k = n
while k >= 1:
    k = k / 2

使用大O和大Theta这两个问题的运行时间是什么?

对于第一个问题,第一行是O(1),外部for循环是O(n)。我对内部for循环有点困惑,因为它与j有关。我认为当n为大奇数时,由于嵌套循环,它将为O(n ^ 2)。

对于第二个问题,我认为k小于1需要n / 2次,但不确定它是否为n的O(n)或大θ。

3 个答案:

答案 0 :(得分:0)

您对第一个问题的分析基本上是正确的。关键点成分是经典身份

1 + 3 + 5 + ... + (2k-1) = k^2

在这种情况下2k-1 = n(或n-1)因此复杂性为O((n/2)^2) = O(n^2)

对于第二个问题 - 这是一个典型的分而治之的问题。关键问题是 - 为了达到1,你需要多少次将n除以?这相当于询问您需要将1乘以2乘以n的次数?换句话说 - k使2^k = n成为什么?您可能想要查看您对对数的了解。

答案 1 :(得分:0)

首先:你几乎完全(N x N / 2/2)次操作,所以它是O(N ^ 2)。画一个正方形:你会看到你拿一个三角形(和一个两个以上的情况)。

第二:你有log2 N个操作,所以它是O(log N)。

答案 2 :(得分:0)

要理解问题2,您可以模拟一个示例。如果你在二进制基数中写出数字,事情应该变得很明显:

100 -> 1100100
 50 ->  110010
 25 ->   11001
 12 ->    1100
  6 ->     110
  3 ->      11
  1 ->       1