我在解决“Cormen算法简介”中的问题时遇到困难,问题如下,
合并排序中的小数组中的插入排序
尽管合并排序在O(n logn)最坏情况下运行,插入排序在O(n ^ 2)中运行,但后者运行速度更快,适用于小问题。考虑对Merge Sort的修改,其中使用插入排序对长度为k的n / k子列表进行排序,然后使用标准合并机制进行合并。
要对k长度的这些n / k子列表进行排序,需要O(nk)并合并这些n / k子列表需要O(n lg(n / k))
因此修改后的算法需要O(nk)+ O(n lg(n / k)),
作为n函数的k的最大渐近(Θnotation)值是什么,修改后的算法与标准合并排序具有相同的渐近运行时间?
如何在实践中选择k?
这是我被卡住的两件事,感谢任何帮助,提前谢谢:)
答案 0 :(得分:0)
第一个问题是,基本上,要求k可以大于或等于lg n,并且仍然具有Θ(n lg n)的渐近阶。如果它大于,我们知道两种排序算法的组合不如合并排序那么有效。所以我们假设k =Θ(lg n)。如果你插入lg n,其中k在你的递归关系中,那么T(nlgn + n lg(n / lg(n))并解决你将在Θnotation中得到你最大的渐近值。
至于如何选择K,k应该是插入排序比合并更快的最大输入大小。如果我们为nk和nlgn添加一些正整数,我们知道k取决于这两个正整数之间的比率。希望这有帮助!
ex xnk + ynlgn
x和y是正常数
所以k = x / y因为这会使上述表达式最小化。所以k不依赖于n。
答案 1 :(得分:0)
抱歉迟到了,但我想我可以补充一些关于你第二个问题的额外信息。 根据Robert Sedgewick和Kevin Wayne撰写的算法(第4版)一书
切换到小子阵列(长度为15或更小,比如说)的插入排序将改善运行>典型的mergesort实现时间为10%到15%。