【问题标题】:quicksort and insertion sort hybrid expected running time快速排序和插入排序混合预期运行时间
【发布时间】:2012-03-22 18:43:48
【问题描述】:

我正在自学 CLRS 第 3 版,这是我遇到的一个比较棘手的问题,连同它的答案作为对所有人的服务。

7.4-5 在实践中,我们可以通过利用 当其输入“几乎”排序时,插入排序的快速运行时间。调用时 对少于k 元素的子数组进行快速排序,让它简单地返回而不 对子数组进行排序。在对快速排序的顶级调用返回后,运行插入排序 在整个数组上完成排序过程。认为这种排序算法 在O(nk+nlg(n/k)) 预期时间运行。我们应该如何选择k,理论上都是 在实践中?

【问题讨论】:

    标签: algorithm complexity-theory quicksort insertion-sort clrs


    【解决方案1】:

    如果你评估方程nlgn > nk + nlog(n/k),你会得到log k > k。这是不可能的。所以理论上是不可能的。但在实践中,插入排序和快速排序涉及到一些不变的因素。看看这个pdf 中讨论的解决方案。您可能想更新您的答案。 .

    【讨论】:

      【解决方案2】:

      其实答案是k = 8

      你得到的算法是两个匿名函数的组合,一个是O(nk),另一个是O(n lg n/k)。这些匿名函数隐藏了平均大小写常量。在平均情况下,插入排序在n^2/4 时间内运行,在平均情况下,随机快速排序在1.386 n lg n 时间运行。我们想找到一个k 的值,它使nk/4 + 1.386( n lg n/k ) 的值最小,等于nk/4 + 1.386 n lg n - 1.386 n lg k。这意味着找到函数1.386 lg k - k/4 的最大值。该最大值出现在k = 8

      【讨论】:

        【解决方案3】:

        叶子的大小在1k 之间的概率相等。
        所以叶子的预期大小是k/2
        如果叶子的预期大小是k/2,那么我们期望n/(k/2)=(2n)/k 这样的叶子。
        为简单起见,假设我们期望 n/k 这样的叶子,并且每个叶子的预期大小是 k
        INSERTION-SORT的预计运行时间为O(n^2)
        我们在练习 5.2-5 和问题 2-4c 中发现了这一点。
        所以INSERTION-SORT使用的预期运行时间是O((n/k)*(k^2))=O(nk)
        如果我们希望我们的分区组大小为k,那么递归树的高度预计为lgn-lgk=lg(n/k),因为我们希望更早停止lgk
        递归树的每一层都有O(n) 操作。
        这将我们引向O(nlg(n/k))
        我们得出的结论是预期的运行时间是O(nk+nlg(n/k))

        理论上,我们应该选择k=lgn,因为这样我们可以获得O(nlgn)的最佳预期运行时间。

        在实践中,我们应该将k 选择为lgn 周围的值之一,它可以为我们提供比仅运行RANDOMIZED-QUICKSORT 更好的性能。

        答案的第二部分非常松散地使用大 O 表示法,因此要更精确地选择 k,请点击 Ankush 在第二个答案中给出的链接。

        【讨论】:

        • 你的回答有点错误。理论上最好的说法是 k 必须是某个函数,使得 k=O(lg n)。要精确选择 k,您必须查看插入排序和快速排序中涉及的平均大小写常量。
        • 感谢您的反馈,您是对的。当我第一次发布问题及其答案时,我对问题的第一部分更感兴趣,并且在某种意义上跳过了它的第二部分。
        • 你也在OpenU学习吗?这个学期我们的妈妈有这个问题。
        • 我很早就毕业了,我在空闲时间学习这本书。
        猜你喜欢
        • 2019-06-30
        • 2018-11-18
        • 1970-01-01
        • 2014-08-26
        • 1970-01-01
        • 1970-01-01
        • 2013-02-25
        • 1970-01-01
        • 2012-08-26
        相关资源
        最近更新 更多