for循环的运行时间

时间:2012-09-12 23:15:19

标签: performance big-o

我似乎理解更容易循环的基本概念,如此...第一个循环在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))?

1 个答案:

答案 0 :(得分:2)

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

例如,像for这样的单个for ( i = 0; i < n; i++ )循环等同于函数i(),其中i(n) = n表示对每个输入执行一次计算{{ 1}}。

如果你有两个嵌套循环,那么

的功能等价物
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)

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

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

n

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 。由于这是Big-O工作,我们删除常量以产生Big-O值(n/2) * n = (n^2)*(1/2)

这里要记住两个要点:

  1. Big-O数学以一组(n^2)数据元素开头。如果您正在尝试确定迭代通过该组n元素的for循环的Big-O,那么您的第一步是查看递增函数如何更改数据元素的数量。 n例程实际上触及了。

  2. Big-O数学是数学。如果您可以单独解决每个for表达式,您可以使用这些解决方案构建您的最终答案,就像您一样可以求解一组具有共同定义的方程式。