私は非常に興味がありますが、なぜソートアルゴリズムで安定性が重要なのか、重要でないのですか?
ソートアルゴリズムは、キーが等しい2つのオブジェクトが、ソートされる入力配列に表示されるのと同じ順序でソートされた出力に表示される場合、stableと呼ばれます。挿入ソート、マージソート、バブルソートなど、一部のソートアルゴリズムは本質的に安定しています。また、ヒープソート、クイックソートなど、一部のソートアルゴリズムは安定していません。
Background:「安定した」ソートアルゴリズムは、同じソートキーを持つアイテムを順番に保持します。 5文字の単語のリストがあるとします:
Peach
straw
Apple
spork
各Wordの最初の文字だけでリストを並べ替えると、安定した並べ替えで次のようになります。
Apple
Peach
straw
spork
nstableソートアルゴリズムでは、straw
またはspork
を交換できますが、安定したものでは、同じ相対位置に留まります(つまり、入力のstraw
の前にspork
が現れるため、前にも現れます)出力のspork
)。
このアルゴリズムを使用して、単語のリストを並べ替えることができます。列5、4、3、2、1の順で安定した並べ替えができます。最終的には、正しく並べ替えられます。そのことを確信してください。 (ところで、そのアルゴリズムは基数ソートと呼ばれます)
ここで質問に答えるために、名と姓のリストがあるとします。 「姓、次に名の順」でソートするように求められます。最初に(安定または不安定)名でソートし、次に姓で安定ソートできます。これらの並べ替えの後、リストは主に姓で並べ替えられます。ただし、姓が同じ場合は、名が並べ替えられます。
不安定なソートを同じ方法でスタックすることはできません。
ソートの安定性とは、同じキーを持つレコードがソートの前後で相対的な順序を保持することを意味します。
そのため、解決している問題がその相対的な順序を保持する必要がある場合にのみ、安定性が重要になります。
安定性が必要ない場合は、ヒープソートやクイックソートなどのライブラリから高速でメモリを消費するアルゴリズムを使用して、それを忘れることができます。
安定性が必要な場合は、より複雑です。安定したアルゴリズムは、不安定なアルゴリズムよりも高いbig-O CPUおよび/またはメモリ使用量を持っています。そのため、大きなデータセットがある場合は、CPUまたはメモリのどちらを使用するかを選択する必要があります。 CPUとメモリの両方に制約がある場合、問題が発生します。適切な妥協の安定したアルゴリズムは、二分木ソートです。 Wikipediaの記事 には、STLに基づいた哀れなほど簡単なC++実装があります。
元のレコード番号を各レコードの最後の場所のキーとして追加することにより、不安定なアルゴリズムを安定したアルゴリズムにすることができます。
安定性が重要になる理由はいくつかあります。 1つは、2つのレコードをスワップして交換する必要がない場合、メモリの更新が発生する可能性があり、ページがダーティとしてマークされ、ディスク(または別の低速メディア)に再書き込みする必要があるということです。
何をするかによります。
姓と名のフィールドを持つレコードをいくつか持っていると想像してください。まず、リストを名で並べ替えます。その後、安定したアルゴリズムを使用してリストを姓で並べ替えると、リストが名と姓で並べ替えられます。
ソートアルゴリズムは、キーが等しい2つのオブジェクトが、ソートされていない入力配列に現れるのと同じ順序でソートされた出力に現れる場合、安定していると言われます。挿入ソート、マージソート、バブルソートなど、一部のソートアルゴリズムは本質的に安定しています。また、ヒープソート、クイックソートなど、一部のソートアルゴリズムは安定していません。
ただし、安定していない特定のソートアルゴリズムは、安定するように変更できます。アルゴリズムを特定の方法でソートして安定させることもできますが、一般的に、本質的に安定していない比較ベースのソートアルゴリズムは、2つのキーの比較で位置が考慮されるようにキー比較操作を変更することで安定するように変更できます等しいキーを持つオブジェクトの係数。
参照: http://www.math.uic.edu/~leon/cs-mcs401-s08/handouts/stability.pdfhttp://en.wikipedia.org/wiki/Sorting_algorithm#Stability
これには多くの答えがあることは知っていますが、 この答え 、 Robert Harvey によって、より明確に要約されています:
安定したソートとは、入力セットの元の順序を保持するソートです。この場合、[不安定]アルゴリズムは2つ以上のアイテムを区別しません。
ソート対象が単なる数字であり、それらの値のみがそれらを識別/区別すると仮定する場合(たとえば、同じ値を持つ要素は同一です)、ソートの安定性の問題は無意味です。
ただし、ソートの優先順位が同じオブジェクトは区別される場合があり、相対的な順序が意味のある情報になる場合があります。この場合、不安定なソートにより問題が発生します。
たとえば、ゲーム内のレベル[L]で迷路を掃除するためのすべてのプレイヤーの時間コスト[T]を含むデータのリストがあります。迷路の掃除の速さでプレイヤーをランク付けする必要があるとします。ただし、追加のルールが適用されます。高レベルの迷路を掃除したプレイヤーは、時間の長さに関わらず常に高いランクを持ちます。
もちろん、ペアの値[T、L]を、ルールに従うアルゴリズムで実数[R]にマッピングしてから、すべてのプレーヤーを[R]値でランク付けすることもできます。
ただし、安定した並べ替えが可能な場合は、リスト全体を[T](高速プレイヤー)で並べ替えてから[L]で並べ替えることができます。この場合、プレイヤーが掃除した迷路のレベルでグループ化した後、プレイヤーの相対的な順序(時間コストによる)は変更されません。
PS:もちろん、2回並べ替えるアプローチは特定の問題に対する最善の解決策ではありませんが、ポスターの問題を説明するには十分です。
安定したソートは、常に同じ入力で同じ解(順列)を返します。
たとえば、[2,1,2]は順列[2,1,3]として安定した並べ替えを使用して並べ替えられます(並べ替えられた出力では、最初にインデックス2、次にインデックス1、次にインデックス3)。つまり、出力は常に同じ方法でシャッフルされます。他の安定していないが正しい順列は[2,3,1]です。
クイックソートは安定したソートではなく、同じ要素間の置換の違いは、ピボットを選択するアルゴリズムに依存します。一部の実装はランダムに選択され、同じアルゴリズムを使用して同じ入力で異なる順列を生成する迅速なソートを行うことができます。
安定したソートアルゴリズムが必要です。