为什么在渐近分析中忽略常数?
答案 0 :(得分:1)
忽略常数因子,因为在考虑常数因子时,运行时间和内存消耗(通常使用O符号测量的两个属性)更难以推理。
如果我们将U( f(n) )
定义为所有函数g
的集合,其中存在N
,以便对所有N > n: g(n) <= f(n)
(即与{{1相同)如果没有常数因子,则表明算法的运行时间在O
而不是U( f(n) )
更难。
首先,我们需要一个精确的单位来测量运行时间。使用CPU指令作为基本单元可以工作,但这取决于算法的确切实现以及它运行的处理器架构。
内存消耗类似:相同算法的不同实现在内存消耗方面会有所不同(通过常数因子)。此外,如果一个实现使用了很多指针,那么相同的实现将在64位机器上使用大约两倍于32位机器的内存。但是说“当使用这个C代码实现时,这个算法的内存消耗是在32位英特尔PC上的O( f(n) )
中。它位于64位PC上O(23 * n)
”是有用的。
忽略常量允许我们以与实现和平台无关的方式推断算法的属性。
答案 1 :(得分:1)
这是因为图灵机的linear speedup theorem。
如果你给我看一个图灵机,它解决了 f ( n )步骤中 n 的问题,并指定一个常数< em> c &gt; 0,我可以制作一台图灵机来解决 c f ( n )步骤中的相同问题(或者一步,如果 c f ( n )&lt; 1)。例如,通过 c =½,我的机器可以在一半的步骤中解决同样的问题。或者,通过 c = 1 / 1000000 ,我的机器只能在百万分之一的步骤中解决同样的问题!
这个结果使得常数因素无趣(从理论上讲:显然在实践中他们仍然有兴趣)。
答案 2 :(得分:0)
如果你在谈论这个
http://www.cs.cornell.edu/courses/cs312/2004fa/lectures/lecture16.htm
当您分析算法的运行时间(或其他方面)并发现它类似于
时 n ^ 2 + k
然后,当你计算出大O的表现时间时 - 看k是没有意义的,因为你想知道n越来越大的运行时间。 n ^ 2
比k大得多 - 你可以放心地忽略它。