【问题标题】:Complexity in Algorithms算法的复杂性
【发布时间】:2018-10-09 01:40:16
【问题描述】:

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

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

但是我相信它是决定性的,因为根据数组的长度,一种排序可能比另一种更好,并且它的渐近线以图形方式显示了这一点。你怎么看?谢谢

【问题讨论】:

  • 经典的例子是快速排序,它通常被用作排序算法,因为它速度很快,并且它的预期时间是O(N log N),即使它是最坏的情况时间是 O(N^2)...虽然库实现通常有警卫和后备以确保病理数据保持 O(N log N)

标签: algorithm sorting complexity-theory


【解决方案1】:

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

总之,算法的选择取决于您正在处理的数据、多线程容量和内存使用情况。

【讨论】:

    【解决方案2】:

    以哈希表为例。通常它们非常快,并且插入、查找、删除应该在恒定时间内工作,这很棒。这就是为什么每个人都使用它们。但是最坏的情况是,每个元素的哈希值都是相同的,然后运行时会变得更糟。有一些方法可以最大限度地减少损坏,例如 Cuckoo 哈希等,但在最坏的情况下,哈希表的运行时间或内存消耗会比其他数据结构更差。通常,您不会选择 Hashtable,因为它们的最坏情况渐近运行时,因为它不太可能发生。

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

    【讨论】:

      【解决方案3】:

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

      这就是 Quicksort 主要在所有地方使用的原因,因为它们不仅具有良好的平均值,而且平均值的 K&M 非常低。

      但是你必须减轻最坏情况仍然很糟糕的问题,使用像Introsort 这样的后备算法,如果递归太深,或者当值的数量变少时回退到堆排序切换到插入排序。

      【讨论】:

        猜你喜欢
        • 2015-04-25
        • 1970-01-01
        • 1970-01-01
        • 2016-07-11
        • 2019-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多