java - 分析嵌套循环运行时间?

标签 java performance algorithm big-o

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

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

当外层循环的值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)

案例三

 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))

关于java - 分析嵌套循环运行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26209842/

相关文章:

vba - 在 Excel VBA 中有效地隐藏/取消隐藏许多 (+500) 行

java - 如何使用文件库io Java

java - 调用main方法

performance - 如何在重写或硬件升级之间做出决定?

performance - VS 2010 很慢

algorithm - 边数为偶数的最短路径

ios - 始终将 slider 归因于零而导致100%失败的算法

java - 如何将 Int/String 数组转换为带有节点的二叉树?

java - 使用 Jackson 反序列化(未知属性失败)不会忽略鉴别器属性(DTO 使用 SwaggerCodegen 创建)

URL 的 Java Android 重定向不起作用