考虑an^2 + bn + c
。我了解,对于较大的n
,bn
和c
变得微不足道。
我也理解,对于较大的n
,2n^2
和n^2
之间的差异非常微不足道与之间的差异,比如说n^2
}和n*log(n)
。
但是,2n^2
和n^2
之间仍然存在2个差异的顺序。这在实践中是否重要?或者人们只考虑没有系数的算法?为什么呢?
答案 0 :(得分:2)
如果您对时间感兴趣,实际系数很重要。但是大O实际上并不是关于时间安排的,而是关于可伸缩性的。当你看到一个描述为O(n ^ 2)的算法时,你真的不知道用特定的编译器解决特定语言的特定计算机上的大小为n的问题需要多长时间,但是你知道大小为2n的问题应该花费大约4倍的时间。
你可以忽略这些系数的原因是,如果你考虑不同尺寸问题的比例,那么较低阶的术语是'系数渐近占优势,最高阶项的系数在比率上取消。
答案 1 :(得分:0)
我们使用时间复杂度分析来帮助我们估算时间成本并了解我们可以走多远。例如,排序算法的下界时间复杂度为O(nlgn),理论上证明了这一点,我们绝不应该尝试设计比这更好的算法。
对于系数,在许多情况下,理论上找不到准确的数字并不容易,因为它可能受输入数据的影响。但这并不意味着它并不重要。 Quicksort是使用最广泛的排序算法,因为时间复杂度系数非常小,平均情况下只有1.39NlgN。
关于quicksort的另一个有趣的事实是,我们都知道快速排序的最坏情况将花费O(N ^ 2)。我们可以使用Median of Medians算法将quicksort的最坏情况时间复杂度降低到O(NlgN),但我们在实践中很少使用这个版本。这是因为Median of Medians版本的系数太大,使其无法使用。