算法分析

时间:2011-08-18 12:08:14

标签: algorithm

我正在阅读算法分析主题。这是书中的文字片段

  

当n加倍时,线性运行时间上升2倍   程序,4用于二次程序,8用于立方程序。   以对数时间运行的程序仅使用加性常量   当n加倍时,以及在O(n log n)中运行的程序占用时间更长   在相同的情况下运行的时间略长两倍。

     

如果低阶项具有,则很难发现这些增加   相对较大的系数和n不够大。

我的问题是作者的意思是低阶项具有相对较大的系数?任何人都可以用例子解释

谢谢!

4 个答案:

答案 0 :(得分:9)

假设您的算法在n^2 + 1000 n元素上运行时实际执行n次计算。现在n = 1需要1001次计算,n = 2需要2004年。线性增长的差异很小,很难发现二次贡献!

然而,渐近地,您的算法采用O(n ^ 2)步,因此渐近(因为n变大)将输入大小加倍,使运行时增加四倍。但是对于我们的小值,从1倍增加到2倍运行时间翻两番!低阶项为n,其系数(1000)与前导项n^2(即1)的系数相比较大。

这表明渐近复杂性如何不说特定的,特别是小值。这只是n变大的行为的限制性陈述。

答案 1 :(得分:4)

使用O表示法时,指定作为性能界限的函数的最大项。例如,如果性能总是受 f = c 3 n 3 + c 2 n 2 + c 1 n + c 0 ,你可能会说是O(n 3 )。作者说,当n很小时,系数对性能的影响可能大于n,例如,如果c 2 非常大且c 3 非常小,如果只考虑n的特定小实例的相对性能,那么性能可能看起来是O(n 2 ),直到n的大小支配系数。

答案 2 :(得分:2)

渐近符号表示运行时的边界为n->无穷大。因此,O(n log n)函数的实际运行时间可能为.1 * n log n + 100000 * n。

在这种情况下,100000 * n项是“低阶项”。当n->无穷大时,该项被.1 * n log n项所压制。

但是,正如您所看到的,对于小n,100000 * n项将主导运行时。

答案 3 :(得分:0)

例如,如果你有较低尺度的O(n)算法,你可以得到T(n)= 490239n +(这里插入荒谬的常数),这意味着性能看起来很糟糕,但随着尺度的增加,你会看到增长总是线性的。

真实世界的例子是合并排序,O(n logn)问题是递归具有计算成本或开销,这是n的因子,它比nlogn小,所以它在Big-O中被丢弃,问题是该因素也会变得非常大并影响绩效。