我正在阅读算法分析主题。这是书中的文字片段
当n加倍时,线性运行时间上升2倍 程序,4用于二次程序,8用于立方程序。 以对数时间运行的程序仅使用加性常量 当n加倍时,以及在O(n log n)中运行的程序占用时间更长 在相同的情况下运行的时间略长两倍。
如果低阶项具有,则很难发现这些增加 相对较大的系数和n不够大。
我的问题是作者的意思是低阶项具有相对较大的系数?任何人都可以用例子解释
谢谢!
答案 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中被丢弃,问题是该因素也会变得非常大并影响绩效。