我似乎理解更容易循环的基本概念,如此...第一个循环在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))?
答案 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)
。
这里要记住两个要点:
Big-O数学以一组(n^2)
数据元素开头。如果您正在尝试确定迭代通过该组n
元素的for
循环的Big-O,那么您的第一步是查看递增函数如何更改数据元素的数量。 n
例程实际上触及了。
Big-O数学是数学。如果您可以单独解决每个for
表达式,您可以使用这些解决方案构建您的最终答案,就像您一样可以求解一组具有共同定义的方程式。