これは、Introduction to Algorithms By Cormen からの質問です。しかし、これは宿題ではなく自習です。
length の配列があり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)
関係のために。2 つの実行時間の同等性を見つけると制限が得られ、単純な試行錯誤を使用してそれ以上を確認できると思いました。
私はこのようにそれを解決しました
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
何の関係も示さない私に与えました。関係は何ですか?関係を見つけるための方程式を間違っていたのではないかと思います。
私はアルゴリズムを実装することができ、挿入ソートを呼び出すために関数here (マージソート実装の Github リンク) にif (length_Array < k)
ステートメントを追加するだけで十分だと思います。しかし、実際の生活ではどのように選択すればよいでしょうか。merge_sort
k