performance – for循环的运行时间

我似乎理解更容易循环的基本概念,如此…第一个循环在O(n)中运行,内循环也是如此.因为它们都是嵌套的,所以乘以得到总运行时间为O(n ^ 2).

sum = 0; 
for ( i = 0; i < n; i++ ) 
  for j = 0; j < n; j++ ) 
    ++sum; 

虽然当事情开始转换时,我完全迷失了如何解决问题.有人可以向我解释如何计算以下两种情况的运行时间吗?此外,任何可以进一步帮助我改进的易于理解的参考链接也值得赞赏.谢谢!

sum = 0; 
for( i = 0; i < n; i += 2 ) 
  for( j = 0; j < n; j++ ) 
    ++sum; 

我唯一可以从中收集的是内循环在O(n)中运行. i = 2真的让我在外循环中抛弃了.

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

从我的尝试…外部循环是O(log(n)),内部是O(n),所以总数是O(n log(n))?

最佳答案 考虑Big-O性能的一种好方法是假装代码的每个元素都是一个数学函数,它接收n个项目并返回对这些项目执行的计算次数.

例如,对于(i = 0; i< n; i)的单个for循环将等效于函数i(),其中i(n)= n,表示对每个输入n执行一次计算. 如果你有两个嵌套循环,那么函数等价于

for ( i = 0; i < n; i++ ) 
   for j = 0; j < n; j++ ) 

看起来像这两个功能:

i(n) = n * j(n)
j(n) = n

使用这两个函数产生n * n = n ^ 2的最终结果,因为j(n)可以代替n.

这意味着只要你能解决任何单个循环的Big-O,就可以将这些解决方案应用于一组嵌套循环.

例如,让我们看看你的第二个问题:

for( i = 0; i < n; i += 2 ) 
  for( j = 0; j < n; j++ ) 

i = 2意味着对于n个项目(n0,n1,n2,n3,n4)的输入集合,您只触及该集合的每个其他元素.假设你初始化使i = 0,这意味着你只触及(n0,n2,n4)的集合.这意味着您将用于处理的数据集的大小减半,并且意味着功能等价物的工作方式如下:

i(n) = (n/2) * j(n)
j(n) = n

解决这些问题会得到你(n / 2)* n =(n ^ 2)*(1/2).由于这是Big-O工作,我们删除常量以产生Big-O值(n ^ 2).

这里要记住的两个关键点:

> Big-O数学以一组n个数据元素开始.如果您正在尝试确定遍历该n个元素集的for循环的Big-O,那么您的第一步是查看增量函数如何更改for例程实际触及的数据元素的数量.
> Big-O数学是数学.如果你可以单独解决每个表达式,你可以使用这些解决方案来构建你的最终答案,就像你可以解决一组具有共同定义的方程式一样.

点赞