非常相似的复杂性示例。我试图理解这些问题是如何变化的。考试即将到来:(任何可以在这里找到复杂性的快捷方式。
案例1:
void doit(int N) {
while (N) {
for (int j = 0; j < N; j += 1) {}
N = N / 2;
}
}
案例2:
void doit(int N) {
while (N) {
for (int j = 0; j < N; j *= 4) {}
N = N / 2;
}
}
案例3:
void doit(int N) {
while (N) {
for (int j = 0; j < N; j *= 2) {}
N = N / 2;
}
}
非常感谢你!
答案 0 :(得分:4)
void doit(int N) {
while (N) {
for (int j = 0; j < N; j += 1) {}
N = N / 2;
}
}
要找到O(),请注意我们每次迭代将N除以2。所以,(不是为了侮辱你的智力,但为了完整性)通过循环的最终非零迭代,我们将得到N = 1。之前的时间我们将具有N = a(2),然后在那之前N = a(4)...其中0 < a&lt; N(注意那些是非包容性边界)。所以,这个循环将执行总共log(N)次,这意味着第一次迭代我们看到N = a2 ^(floor(log(N)))。
为什么我们关心这个?嗯,这是一个几何系列,有一个很好的封闭形式:
Sum = \sum_{k=0}^{\log(N)} a2^k = a*\frac{1-2^{\log N +1}}{1-2} = 2aN-a = O(N).
如果有人能弄清楚如何正确地显示该符号,我会非常感激。
答案 1 :(得分:3)
你已经得到数字1 - O(n)
的答案,正如@NickO所给出的,这是另一种解释。
用T(N)表示内环的外部重复次数,并将外环的数量设为h
。请注意h = log_2(N)
T(N) = N + N/2 + ... + N / (2^i) + ... + 2 + 1
< 2N (sum of geometric series)
in O(N)
数字3:是O((logN)^2)
用T(N)表示内环的外部重复次数,并将外环的数量设为h
。请注意h = log_2(N)
T(N) = log(N) + log(N/2) + log(N/4) + ... + log(1) (because log(a*b) = log(a) + log(b)
= log(N * (N/2) * (N/4) * ... * 1)
= log(N^h * (1 * 1/2 * 1/4 * .... * 1/N))
= log(N^h) + log(1 * 1/2 * 1/4 * .... * 1/N) (because log(a*b) = log(a) + log(b))
< log(N^h) + log(1)
= log(N^h) (log(1) = 0)
= h * log(N) (log(a^b) = b*log(a))
= (log(N))^2 (because h=log_2(N))
2号与3号几乎相同。
(2,3:假设j
从1开始,而不是从0开始,如果不是这样的情况@WhozCraig给出它永远不会中断的原因