我相信您所引用的文字是不准确的(除非您提供上下文:使用时间,空间等,否则使用“更好”一词通常是没有意义的)无论如何,我相信最简单的解释是:
如果执行时间随着输入的大小而增长,那肯定不是 O (1 ) 这应该很清楚。 O (1 )并不意味着快。仅仅意味着(就时间复杂度而言)执行时间具有恒定的上限。
现在,让我们以相对较小的10个元素为一组,并使用一些算法对其进行排序(仅作为示例)。假设我们将元素保留在一个结构中,该结构还为我们提供了能够在恒定时间内对元素进行排序的算法。假设我们的排序算法可以具有以下复杂性(使用big-O表示法):
- O (1 )
- O (n )
- ø (Ñ 升Ò 克(n ))
- Ø (ñ2)
您会选择哪种算法?我想到的第一个答案可能是“我当然会使用O (1 )一个!”,但这不一定正确。当您这样想时,您会忘记的是big-O符号隐藏了常数因子。如果您知道集合很小,那么这个常数因子可能会很大比数量更为重要渐进复杂性。
现在,让我们“揭示”上述排序算法的真正复杂性(其中“ true”表示不隐藏常量),以完成所需的步骤数表示(并假设所有步骤花费相同的时间):
- 200 脚步
- 11 n 脚步
- 4 Ñ 升ö 克(n ) 步骤(以2为底的对数)
- 1 n2 脚步
如果我们输入的大小为10,则这些是上述每种算法的准确步数:
- 200 脚步
- 11 × 10 = 110 脚步
- 4 × 10 × 3.32 ≈ 134 脚步
- 1 × 100 = 100 脚步
如您所见,在这种情况下,最糟糕的算法具有渐近复杂性 Ø (ñ2) 是最快的,击败算法 O (1 ),O (n ) 和 ø (Ñ 升Ò 克(n ))渐进的复杂性。big-O标记隐藏的常数在这里很重要。我认为这并不意味着我们可以治疗Ø (ñ2) 优于 O (1 ) (这到底意味着什么?)这意味着对于足够小的输入(如您在示例中所看到的), Ø (ñ2) 可能仍然比 O (1 )因为隐藏的常数。而且,如果常量与输入的大小相比相对较大,那么它可能比渐近复杂性更为重要。