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