我对以下程序的运行时间有疑问: 问题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)或大θ。
答案 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