ソートアルゴリズムに関するウィキペディアの this の記事を読むと、smoothsortが最高のソートアルゴリズムであるように思われます。最高、平均、最悪のすべてのカテゴリで最高のパフォーマンスを発揮します。どのカテゴリーでもこれに勝るものはありません。また、一定のメモリ要件があります。唯一の欠点は、それが安定していないことです。
メモリ内でtimsortを上回り、最悪の場合のパフォーマンスとメモリの両方でquicksortを上回ります。
しかし、私はsmoothsortについて聞いたことがありません。誰もそれについて言及することはなく、ほとんどの議論は他のソートアルゴリズムを中心に展開しているようです。
何故ですか?
Big-Oのパフォーマンスは論文の出版には最適ですが、現実の世界では定数も確認する必要があります。クイックソートは、その内部ループを非常に効率的に実装でき、非常にキャッシュフレンドリーであるため、長い間、不安定なインプレースのメモリ内ソートに最適なアルゴリズムでした。クイックソートと同じくらい効率的またはほぼ同じくらい効率的にsmoothsortの内部ループを実装できたとしても、キャッシュミス率が遅くなることに気付くでしょう。
クイックソートの最悪の場合のパフォーマンスを軽減するために、適切なピボットを選択して(病的なケースの数を減らすために)、病的なケースを検出するためにもう少し労力を費やします。ルックアップ イントロソート 。イントロソートは最初にクイックソートを実行しますが、過度の再帰を検出するとヒープソートに切り替わります(これはクイックソートの病的なケースを示しています)。
より良い漸近線は、より良いパフォーマンスを意味するわけではありません(通常はそうなることがわかりますが)。隠し定数は数倍大きくなる可能性があり、比較的小さいサイズの配列での別のアルゴリズム(同じまたは最悪の漸近的複雑さ)よりも遅くなります(ここで、比較的小さい配列は、実際には任意のサイズである可能性があります、10100、 例えば。それは漸近解析です)。しかし、smoothsortの隠し定数については何も知りません。
たとえば、 あります a O(n) k次統計量を見つけるための時間アルゴリズムのワーストケースですが、非常に複雑なので、O(n log n)ワーストケースバージョンよりもパフォーマンスが優れていますほとんどの場合それ。
また、興味深いものがあります 比較 :
…ご覧のとおり、TimsortとSmoothsortはどちらもマスタードをカットしていません。 Smoothsortは、すべての場合でSTLソートよりも劣ります(std:bitsetがrawビット演算に置き換えられた場合でも)…
まず最初に、Smoothsortが有名ではないというわけではありません。それはユーザーのニーズに依存し、またそれを使用するかどうかはユーザーに依存します。
Smoothsortの利点は、入力がすでにある程度ソートされている場合はO(n)時間に近づくのに対し、ヒープソートは最初のソート状態に関係なくO(n log n)を平均化することです。
ドキュメント から:-
Smoothsortアルゴリズムは、文字列内のすべてのヒープのサイズをメモリに保持できる必要があります。これらの値はすべて異なるため、これは通常、ビットベクトルを使用して行われます。さらに、シーケンスには最大でO(log n)の数があるため、これらのビットは、二分法のマシンモデルを想定して、O(1)マシンワードでエンコードできます。