考虑这三个循环
O(N ^ 2)
int i = 0, s = 0;
while (2*i <= N*N) {
s+=i;
i++;
}
O(N)
int i = 0, s = 0;
while (s <= N*N) {
s+=i;
i++;
}
O(SQRT(N))
int i = 0, s=0, p=1;
while (s < N) {
i++;
p = p*i;
s += i;
}
第一个的时间复杂度是O(N ^ 2),但第二个是O(N)(对我来说,似乎N ^ 2会更合适)。怎么会?另外,为什么循环三个sqrt(N)而不是log(N) - 我怎么能区分它?
答案 0 :(得分:3)
第二个:
假设迭代将为k
,然后循环将重复:
1+2+3+...k <= N^2 --> k*(k-1)/2 <= N^2 --> k^2 <= N^2 --> k is O(N).
第三个:
假设迭代将为k
,然后循环将重复:
1+2+3...+k <= N -->...--> k^2 <= N --> k is O( sqrt(N) ).