【问题标题】:Analyzing Nested Loop Running Times?分析嵌套循环运行时间?
【发布时间】:2014-10-06 03:58:10
【问题描述】:

我正在经历一些练习题,很难理解如何分析下面给出的循环函数的运行时间。有人可以为我一步一步地完成整个事情吗?

对于下面给出的每个函数,我必须给出以下每个代码片段的运行时间的增长顺序(作为 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++; 

【问题讨论】:

标签: java performance algorithm big-o


【解决方案1】:

案例一

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)

案例2

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)

案例3

 int sum = 0;
    for(int i = 1; i<N; i*=2) 
     for(int j =0; j < N; j++)
      sum++; 

无论外循环 i 取什么值,内循环完成的工作都是 N。由于外循环取值 1, 2, 4, ..., 2^(⌊log(N)⌋),所以完成的总工作由外循环可能值的数量相乘得出乘以 N,因此完成的总功为:

O(log(N)) * N = O(N log (N))

【讨论】:

  • 谢谢大佬,@chiwangc 兄弟你有解决这些问题的秘诀吗?他们对我来说总是一个巨大的痛苦
  • @Vimzy 我建议您首先考虑修复外循环上的内循环条件所做的工作。然后,您可以通过对外部循环可以采用的所有可能值求和来找到完成的总工作(就像我的解决方案一样)。此外,我发现写出循环的前几个索引确实有助于更具体地了解正在发生的事情。
  • @chiwango 你是从哪里得到的“N / 2^⌊log(N)⌋”?这就是让我困惑的地方
  • 和 "1 / 2^⌊log(N)⌋" 你从哪里得到这些?
  • 不要被这个表示法弄糊涂了,我只是想在解决方案中做到精确。 2^⌊log(N)⌋ 仅表示小于 N最大 整数,这里是 2 的幂。在外循环中,您将 n 除以 2 直到小于 1,2^⌊log(N)⌋ 是您可以将 N 除以 2 的最大次数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 2021-08-14
  • 2011-11-14
相关资源
最近更新 更多