这是 Cormen 的算法介绍中的一个问题。但这不是家庭作业问题,而是自学。
有一个长度数组n
。考虑对合并排序的修改,其中n/k
每个长度k
的子列表使用插入排序进行排序,然后使用合并机制进行合并,其中 k 是要确定的值。
n
和之间的关系k
尚不清楚。数组的长度为n
。均值的k
子列表等于数组的元素。因此,这只是一个限制,在此限制中停止使用合并排序的数组拆分,而是使用插入排序,因为它的常数因子较小。n/k
n * (n/k)
n
k
我能够进行数学证明,证明修改后的算法在Θ(n*k + n*lg(n/k))
最坏情况下也有效。现在这本书继续说
根据 Θ 表示法,找到这个修改后的算法与标准归并排序具有相同运行时间
k
的函数的最大值。n
在实践中我们应该如何选择k?
现在这让我想了很多时间,但我什么也想不出来。我试图解决
n*k + n*lg(n/k) = n*lg(n)
为一段关系。我认为找到两个运行时间的相等性会给我带来限制,并且可以使用简单的命中和试验来检查更大的限制。
我这样解决了
n k + n lg(n/k) = n lg(n)
k + lg(n/k) = lg(n)
lg(2^k) + lg(n/k) = lg(n)
(2^k * n)/k = n
2^k = k
但这给了我2 ^ k = k
没有任何关系的信息。有什么关系?我想我可能用错误的方程式来寻找关系。
我可以实现该算法,我想在函数中添加一条if (length_Array < k)
语句(合并排序实现的 Github 链接)来调用插入排序就足够了。但是我该如何选择merge_sort
k
但是在现实生活中