長年ボトムダウンが使用されてきたにもかかわらずstd::list<>::sort() の -up マージ ソート アプローチにより、Microsoft の Visual Studio 2015 は、驚くほど非効率なトップダウン マージ ソートの再帰的実装に移行しました。この変更は、根本的な動機について疑問を引き起こします。
当初、特に VS2015 でのデフォルトで構築不可能なステートフル アロケーターの導入を考慮すると、Microsoft には非効率的なアプローチに切り替えるやむを得ない理由があると考えられていました。しかし、さらなる調査の結果、元のボトムアップ マージ ソート アルゴリズムはイテレータで動作するように変更できることが判明しました。
Microsoft のトップダウン実装では、再帰の各レベルでリストを半分に分割する再帰的アプローチ。この明らかな理由は、メモリ割り当てと例外の安全性の問題を回避するためです。並べ替えられた実行を保存するためのリストの配列を作成する代わりに、反復子を使用して元のリスト内の実行境界を追跡します。
このアプローチではメモリ割り当ての問題は回避できますが、次のような非効率性が生じます。各再帰呼び出しでリストの中間点にアクセスするため、実行時間が遅くなる可能性があります。
代替案として、他の開発者はボトムアップの修正バージョンを提案しています。 -up リストの配列の代わりに反復子を使用するマージ ソート アルゴリズム。このアプローチには、各エントリが並べ替えられた実行の開始点を表す反復子の配列の作成が含まれます。リストがスキャンされると、ソートされた単一のリストが得られるまで、ノードがこれらの実行にマージされます。
この方法は、速度とメモリ効率の両方を提供し、リストでトップダウンのマージ ソートよりも約 40 ~ 50% 優れています。
Microsoft がトップダウン マージ ソートに切り替えた理由は、やや不明瞭なままです。メモリ割り当てと例外の安全性に関する懸念が決定に影響を与えた可能性がありますが、これらの問題は、より高い効率を維持する別のアプローチで対処できることに留意することが重要です。効率の低いアルゴリズムを選択したということは、Microsoft がパフォーマンスよりも安定性と例外処理を優先した可能性があることを示唆しています。
以上がMicrosoft が std::list::sort() でトップダウン マージ ソートに切り替えたのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。