作为 N 函数的增长顺序
Order of growth of as function of N
我正在练习复杂的算法,我认为下面的所有代码在增长阶数方面都是二次的,但由于我需要作为 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++
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
次,这个和在N->infinity
时收敛到2N
,所以是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
。
在解释完这些指南后,我也把它留给你作为练习。
我正在练习复杂的算法,我认为下面的所有代码在增长阶数方面都是二次的,但由于我需要作为 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++
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
次,这个和在N->infinity
时收敛到2N
,所以是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
。
在解释完这些指南后,我也把它留给你作为练习。