有人可以解释在计算算法的运行时间复杂度时忽略常量的原因吗?
由于
答案 0 :(得分:4)
因为在比较非常大的值时,(我们称之为n)...对于任何k,n ^ 2将高于k * n,其中n->无穷大。
对于n的任何幂/指数,这当然是正确的。
注意在实际项目中,你确实进行了这些优化并尝试最小化常数,但通常它们与多项式的程度相比不那么显着
答案 1 :(得分:3)
在进行粗略估计时,您只会忽略常量。大多数情况下,这是一个有效的简化:当比较两个大输入维度的算法时,例如对数组进行排序,无论如何,O(n log n)最终会比O(n²)更快或更小。
然而,当两个算法具有相同的复杂性,或者当预期的数据集非常小以至于渐近行为不是有效的真实世界场景时,那么常量肯定是重要的。例如,冒泡排序实现可能在3或4个值的数组上比快速排序执行得更快。
答案 2 :(得分:2)
在分析时间复杂度时,常数很难并且与计算无关。
在一些架构上,加法可能需要两倍于乘法,所以现在我们必须通过算法并计算我们所做的加法次数,以及我们为获得准确的运行时分析而进行的乘法次数。不漂亮!
更重要的是,即使现在是这样,在未来的某个时刻,或者在另一个稍微不同的架构上,该常量可能会有所不同,因此运行时间会因架构而异。那么现在我的算法有多个运行时?现在是这个架构的一个,另一个是另一个架构,其中每个都可能在未来发生变化......再次,不是很漂亮。
在一个计算能力一直在变化,明天的CPU能力提高两倍,一周内存为四倍等的世界中,与常数因素几乎无关。如果我们需要量化现实生命周期运行时情况并非如此,但是当我们分析一般算法的复杂性时,而不是特定环境中解决方案的复杂性就是这种情况。
此外,也许最重要的是,常数因素并不能很好地衡量问题的复杂性,最终我们会尝试衡量复杂性。具有特定复杂性类别的算法,对于所有大小的输入,以某种方式表现(或更准确地说,是有界的)。因此,当我尝试测量两种解决方案的一般复杂性时,我会尽可能地以一般方式进行,因此请尝试考虑输入大小的所有值(即n->无穷大)。
最后,它允许理论家将算法分组到同一个类中,而不管可能会或可能不会改变并且可能会或可能不会改进的某些常数因素。除其他原因外,这有助于最优性证明;发现问题是omega(f(n))
只有在考虑复杂性类O(f(n))
中的算法时才有用,无论常数如何。
答案 3 :(得分:0)