データセット全体を処理する作業が半分以下で済む場合、これにより問題の解決が速くなるというのは理にかなっています。
それは、分割統治アルゴリズムの本質ではありません。通常、ポイントは、アルゴリズムが「データセット全体を扱う」ことができないということです。代わりに、簡単に解決できる部分に分割され(2つの数値を並べ替えるなど)、それらが簡単に解決され、結果が完全なデータセットの解を生成する方法で再結合されます。
しかし、データセットを3つの部分に分割してみませんか?四??
主に、3つ以上の部分に分割し、2つ以上の結果を再結合すると、実装がより複雑になりますが、アルゴリズムの基本的な(ビッグO)特性は変更されないため、差は一定の要因であり、スローダウンを引き起こす可能性があります3つ以上のサブセットの分割と再結合により追加のオーバーヘッドが生じる場合。
たとえば、3方向のマージソートを行う場合、再結合フェーズでは、すべての要素に対して3つの要素のうち最大のものを見つける必要があります。1ではなく2つの比較が必要なので、全体で2倍の比較を行います。 。代わりに、再帰深度をln(2)/ ln(3)== 0.63の係数で減らすため、スワップは37%少なくなりますが、2 * 0.63 == 26%の比較(およびメモリアクセス)が増えます。それが良いか悪いかは、ハードウェアのどちらがより高価かによります。
また、3ウェイクイックソートへの多くの参照を見てきました。これはいつ高速ですか?
どうやらクイックソートのデュアルピボット変異体は、比較の同じ数を必要とするように証明することができますが、平均20%少ないスワップに、それは純利益です。
実際には何が使用されていますか?
最近では、独自のソートアルゴリズムをプログラムする人はほとんどいません。ライブラリが提供するものを使用します。たとえば、Java 7 APIは実際にデュアルピボットクイックソートを使用します。
何らかの理由で実際に独自のソートアルゴリズムをプログラミングする人は、ほとんどの場合、エラーの可能性が20%向上するため、単純な2ウェイバリアントに固執する傾向があります。覚えておいてください。パフォーマンスの最も重要な改善は、コードが「機能しない」状態から「機能する」状態になるときです。