算法的复杂性

时间:2018-10-09 01:40:16

标签: algorithm sorting complexity-theory

我正在阅读此页面https://www.toptal.com/developers/sorting-algorithms,而他们要重点关注的一点是:

“证明最坏情况下的渐近行为并不总是选择算法的决定因素。”

但是我认为这是决定性的,因为取决于数组的长度,一种可能比另一种更好,并且通过渐近线以图形方式显示出来。你怎么看?谢谢

3 个答案:

答案 0 :(得分:1)

通常,存在一种问题,一种算法通常比另一种算法快,但是最坏情况下渐近地慢。具体地说,即使在最坏的情况下渐近变慢,一种算法对于正在处理的特定数据也可能更快。在某些情况下,内存使用也可能是一个问题。一个很好的例子是快速排序与合并排序。它们的平均运行时间均为O(n log n),但是quicksort通常更快。但是,在最坏的情况下,快速排序的运行时间为O(n ^ 2)。此外,mergesort传统上需要O(n)的额外内存。有一个就地变体,但我认为它的速度要慢得多。另一个考虑因素是mergesort更易于并行化。

总而言之,算法选择取决于您使用的数据,多线程容量和内存使用情况。

答案 1 :(得分:0)

以哈希表为例。通常它们非常快,插入,查找,删除应该在恒定时间内工作,这很棒。这就是每个人都使用它们的原因。但是,在最坏的情况下,每个元素的哈希值都相同,那么运行时就会变得更糟。有很多方法可以使破坏最小化,例如Cuckoo哈希等,但是在最坏的情况下,哈希表的运行时间或内存消耗都比其他数据结构差。通常,由于Hashtables的最坏情况是渐近运行时,因此不选择它,因为它非常不可能发生。

编辑:对不起,我错过了这个问题,是关于算法而不是一般的运行时复杂性。但是我只需要做一个小小的改变:假设您想要一种算法来查找数组中的所有重复项。您可以只将所有元素插入HashSet中。如果您具有良好的哈希函数,通常只有元素相同时才会发生冲突。因此,您将拥有O(n)运行时。但是,如果您得到很多误报,即使元素不同,这些元素也具有相同的哈希值,但是findDuplicates算法将占用二次运行时间。同样,这些碰撞非常不可能发生,因此无论如何您都可能会采用这种方法。

答案 2 :(得分:0)

在现实世界中,K和M也是主要因素,例如,动画没有考虑这些因素。 K是算法中的常数,M是内存成本。

这是Quicksort广泛用于所有地方的原因,因为它们不仅具有良好的平均值,而且平均值的K&M极低。

但是,这时您必须缓解最坏情况仍然很糟糕的问题,如果递归太深,则使用回退算法,如Introsort,回退到堆排序或值的数量很少选择插入排序。