在什么情况下程序员会关注平均时间复杂度?

时间:2017-05-23 19:36:55

标签: algorithm big-o

作为一名程序员,我在实现算法时总会考虑渐近的复杂性,但我接受过训练,只关心“最坏情况”的时间。任何人都有任何关于平均时间复杂度为何如此重要的真实例子?谢谢。

1 个答案:

答案 0 :(得分:0)

你应该总是担心平均时间的复杂性(除非时间太少以至于不值得担心)但你还需要担心最坏情况下的时间复杂度,除非:

  • 最坏情况的可能性非常小,
  • 对手不可能通过精心定制的输入触发最坏的情况。

有些情况下,最坏情况的表现只是不太可能,不是极不可能。一个典型的例子是树算法,它假设相对平衡的树,并且当呈现左偏置树时会发生灾难性的失败,特别是如果偏置树是不可能输入的结果(例如,几乎排序或反向排序的数据)。这些情况下你应该使用不同的算法,即使它在一般情况下较慢。

但是使用慢速算法来保护自己免受拒绝服务攻击,就是切断你的鼻子来惹恼你的脸。为了防止DoS,在代码周围放置一个计时器就足够了,如果超过时间就会失败。 (或者你可以切换到一个更慢更安全的算法来完成,例如,这实际上就是introsort所做的。)

在现实世界中,渐近时间不是决定因素。用户不耐心等待O(n)秒;他们现在想要结果,而不是现在+ cn用于某些常量 c ,特别是如果 c 很大的话。这对对数因素尤其如此。在大多数情况下,log n和' log log n , and often not even between log n and n`之间没有任何有效差异。因此,不要渐渐地去寻找更好的"更好的"解决方案,如果这种优势涉及一个如此之大的常数,以至于渐近线不会与真实世界的问题规模接近。

举个例子,看看各种bignum乘法算法。已知的渐近最佳算法是如此之慢,以至于它只对数字如此之大,以至于它们不适合普通机器的存储器。还有其他的,不那么渐近优越的算法,它们只用数百个数字就可以击败数字上的天真乘法。大多数好的bignum包实现了两种或三种不同的算法,根据数量大小进行启发式选择。