我正在练习算法的复杂性,我认为下面的所有代码在增长的顺序方面都是二次的,但由于我需要增长的顺序作为N的函数,我认为改变了事情而我不这样做知道如何解决这个问题。
int sum = 0;
for(int n = N; n > 0; n/=2)
for(int i = 0; i < n; i++)
sum++
int sum = 0;
for(int i = 1; i < N; i*=2)
for(int j = 0; j < i; j++)
sum++
int sum = 0;
for(int i = 1; i < N; i*=2)
for(int j = 0; j < N; j++)
sum++
答案 0 :(得分:12)
int sum = 0;
for(int n = N; n > 0; n/=2)
for(int i = 0; i < n; i++)
sum++
这是O(N)
,内部循环总计N + N/2 + N/4 + ... + 1
次,当2N
时此总和收敛到N->infinity
,因此它是O(N)
。
int sum = 0;
for(int i = 1; i < N; i*=2)
for(int j = 0; j < i; j++)
sum++
这与case1非常相似,我将把它作为练习留给你。按照我在那里做的相同方法,你会得到答案。
int sum = 0;
for(int i = 1; i < N; i*=2)
for(int j = 0; j < N; j++)
sum++
这里,主要区别在于内环不依赖于外环的变量。这意味着,无论i
的值如何,内循环都会重复N
次。
因此,您需要了解外部循环重复的次数,并将其与N
相乘。
在解释这些指导原则后,我也将其作为实践留下。