我正在经历一些练习问题并且很难理解如何分析下面给出的循环函数的运行时间。有人可以一步一步地为我完成整个过程吗?
对于下面给出的每个函数,我必须给出以下每个代码片段的运行时间的增长顺序(作为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 :(得分:2)
int sum = 0;
for(int n = N; n>0; n/=2)
for(int i =0; i <n; i++)
sum++;
当外环的值n固定时,内环的工作量为n。由于外部循环取值N, N/2, N/4, ..., N / 2^⌊log(N)⌋
,因此完成的总工作由:
N, N/2, N/4, ..., N / 2^⌊log(N)⌋
= N * (1 + 1/2 + 1/4 + ... 1 / 2^⌊log(N)⌋)
< 2N
= O(N)
int sum = 0;
for(int i = 1; i<N; i*=2)
for(int j =0; j <i; j++)
sum++;
当外环的值i固定时,内环的工作是i。由于外部循环取值1, 2, 4, ..., 2^(⌊log(N)⌋)
,因此完成的总工作由:
1, 2, 4, ..., 2^(⌊log(N)⌋)
= 2^(⌊log(N)⌋+1) - 1
= 2 * 2^⌊log(N)⌋ - 1
< 2 * 2^log(N)
= O(N)
int sum = 0;
for(int i = 1; i<N; i*=2)
for(int j =0; j < N; j++)
sum++;
无论外循环采用什么值,内循环的工作都是N.由于外循环取值1, 2, 4, ..., 2^(⌊log(N)⌋)
,所以完成的总工作量由外部的可能值的数量给出循环乘以N,因此完成的总工作是:
O(log(N)) * N = O(N log (N))