为什么在渐近分析中忽略常数?

时间:2010-11-11 00:41:41

标签: complexity-theory big-o

为什么在渐近分析中忽略常数?

3 个答案:

答案 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大得多 - 你可以放心地忽略它。