【问题标题】:Criteria for selecting a sorting algorithm选择排序算法的标准
【发布时间】:2012-10-12 14:17:20
【问题描述】:

我很想知道如何根据输入选择排序算法,以便获得最佳效率。

是否应该与输入的大小或输入的排列方式(Asc/Desc)或使用的数据结构等有关...?

【问题讨论】:

    标签: algorithm c++-concepts


    【解决方案1】:

    算法的重要性,在排序算法中也是如此:

    (*) 正确性 - 这是最重要的。如果您的算法超级快速且高效,但它是错误的,那么它一文不值。在排序中,即使您有 2 个正确排序的候选者,但您需要一个 stable sort - 即使它效率较低,您也会选择稳定的排序算法 - 因为它对您的目的是正确的,而另一个不是.

    接下来基本上是在运行时间、所需空间和实现时间之间进行权衡(如果您需要从头开始实现某些东西而不是使用库,以实现较小的性能提升 - 它可能不会'不值得)

    在考虑上述权衡时需要考虑的一些事项:

    1. 输入的大小(例如:对于小输入,插入排序在经验上比更高级的算法更快,尽管它需要O(n^2))。
    2. 输入位置(磁盘上的排序算法与 RAM 上的算法不同,因为磁盘读取在非顺序时效率要低得多。通常用于在磁盘上排序的算法是合并的变体-排序)。
    3. 数据是如何分布的?如果数据可能“几乎排序” - 也许通常糟糕的冒泡排序可以在 2-3 次迭代中对其进行排序,并且与其他算法相比速度非常快。
    4. 您已经实施了哪些库?实施新事物需要做多少工作?值得吗?
    5. 输入的类型(和范围) - 对于可枚举数据(例如整数) - 整数设计算法(如基数排序)可能比一般情况算法更有效。
    6. 延迟要求 - 如果您正在设计导弹头,并且结果必须在特定的时间内返回,那么在最坏情况下可能会衰减到二次运行时间的快速排序 - 可能不是一个好的选择,而且您可能想要使用具有严格O(nlogn) 最坏情况的不同算法。
    7. 您的硬件 - 例如,如果您正在使用一个巨大的集群和大量数据 - 分布式排序算法可能会比尝试在一台机器上完成所有工作更好。

    【讨论】:

      【解决方案2】:

      应该基于所有这些。

      • 您需要考虑数据的大小,因为对于小型数据集等而言,插入排序可能比快速排序更快

      • 由于每种算法的最坏/平均/最佳情况渐近运行时间不同,您需要知道数据的排列方式(有些算法的最坏/平均情况相同,而另一种可能有明显更差的最坏情况)案例与平均)

      • 而且您显然需要知道所使用的数据结构,因为如果您的数据已经采用特殊格式,或者即使您可以有效地将其放入一个新的数据结构中,那么您也需要知道一些非常专业的排序算法。您为您排序(la BST 或堆)

      【讨论】:

        【解决方案3】:

        决定您选择排序算法的两个主要因素是时间复杂度和空间复杂度。根据您的场景以及您可用的资源(时间和内存),您可能需要根据每种排序算法必须提供的内容在排序算法之间进行选择。

        排序算法的实际性能也取决于输入数据,如果我们事先知道输入数据的某些特征,例如输入的大小、数组已经排序的程度,将会有所帮助。

        例如, 如果你事先知道输入数据只有 1000 个非负整数,你可以很好地使用counting sort 对这样的数组进行线性时间排序。

        排序算法的选择取决于空间和时间的限制,以及输入数据的大小/特征。

        【讨论】:

          【解决方案4】:

          在非常高的层次上,您需要考虑插入的比率与每种算法的比较。

          对于文件中的整数,这不会有太大的相关性,但如果说您是根据内容对文件进行排序,那么您自然会希望尽可能少地进行比较。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-09-28
            • 2021-02-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-01
            • 2019-04-24
            相关资源
            最近更新 更多