導入
並べ替えは、要素を数値順やアルファベット順などの特定の順序に並べ替える、コンピューター サイエンスにおける重要な操作です。時間と効率の指標を備えたさまざまな並べ替えアルゴリズムが開発されています。線形時間ソートは、大きな利点を持つソート アルゴリズムのサブセットです。指定された要素セットを線形時間でソートでき、実行時間は入力サイズに応じて線形に増加します。
最もよく知られている線形時間ソート アルゴリズムは降順ソートです。計算による並べ替えは、入力要素の範囲が既知で比較的小さい場合に特に効率的です。これにより、他の多くの並べ替えアルゴリズムでは主に時間のかかる操作である要素の比較が不要になります。入力ドメインの知識を使用すると、計算による並べ替えにより線形な時間計算量が実現されます。数値ソートでは、まず入力配列をスキャンして各要素の数を決定します。次に、これらの数値を使用して、順序付けされた結果テーブル内の要素の正しい位置を計算します。アルゴリズムは次のステップで構成されます。
- 範囲を決定するには、入力配列の最小値と最大値を特定します。
- 範囲サイズとゼロで初期化されたワークシートを作成します。
- 入力配列を反復処理し、見つかった各要素をインクリメントします。
- 累積合計を計算してワークシートを変更し、各要素の正しい位置を取得します。
- 入力配列と同じサイズの出力配列を作成します。
- 入力配列を再度移動し、ワークシートに基づいて出力配列内の正しい位置に各要素を配置します。
- 結果テーブルには並べ替えられた要素が含まれます。
降順ソートの主な利点は、O(n) の線形時間計算量を達成できることです。これにより、大きな入力サイズに対して非常に効率的になります。ただし、その適用可能性は、入力要素の選択が事前にわかっており、比較的小規模なシナリオに限定されます。
Javaの文字列メソッド
クイックソートやマージなどの他の並べ替えアルゴリズムの時間計算量は通常 O(n log n) であり、これは多くの実用的なアプリケーションにとって効率的であると考えられていることに注意することが重要です。数値ソートなどの線形時間ソート アルゴリズムは、入力の特定の制約またはプロパティにより線形時間計算量の使用が許可される場合に代替手段を提供します。
歴史
線形時間ソート アルゴリズムには、コンピューター サイエンスにおける豊かな歴史があります。線形時間秩序の発展は 20 世紀半ばまで遡ることができ、科学者や数学者の貢献は多大でした。最も初期の線形時間ソート アルゴリズムの 1 つは、1954 年に Harold H. Seward によって提案されたバケット ソートです。バケット ソートは、入力要素を有限数のバケットに分割し、各バケットを個別にソートします。入力要素の分布が比較的均一であれば、このアルゴリズムの時間計算量は線形になります。
1959 年に Kenneth E. Iverson は、線形時間計算量を実現する基数アルゴリズムを導入しました。基数は、要素を番号または符号によって最下位から最上位に並べ替えます。数値ソートやバケットソートなどの堅牢なソートアルゴリズムを使用して、各桁の位置で要素をソートします。基数ソートは、パンチカードと初期のコンピュータ システムの時代に普及しました。ただし、最もよく知られている線形時間ソート アルゴリズムは、1954 年に Harold H. Seward と Peter Elias によって導入され、その後 1961 年に Harold H. 'Bobby' Johnson によって独立して再発見された列挙型アルゴリズムです。数値ソートはかなりの注目を集めています。
これは、入力要素の範囲が既知で比較的小さい場合に特に効果的です。線形時間ソートの歴史は、他の特殊なアルゴリズムの開発とともに続きました。たとえば、1987 年にハナン サメットは、多次元データの線形時間ソート アルゴリズムであるバイナリ分布ツリー ソートを提案しました。長年にわたり、研究者は特定のシナリオと制約に焦点を当てて、線形スケジューリング アルゴリズムの研究と改善を続けてきました。クイックソートやマージなどのアルゴリズムは、より多くのシナリオで効率性を高めるために広く使用されていますが、線形時間ソート アルゴリズムは、特定の状況で線形時間の複雑さを利用できる場合に貴重な代替手段となります。一般に、線形時間ソートの歴史は、比較ベースのソート アルゴリズムの制限を克服し、線形時間で大規模なデータ セットをソートできる効率的なアルゴリズムの探索によって特徴付けられます。さまざまな研究者の貢献により、これらの特殊な分類技術の開発と理解への道が開かれました。
線形時間ソートの種類
いくつかの異なる線形時間ソート アルゴリズムがあります。 2 つの主なタイプは、カウントベースのアルゴリズムと基数ベースのアルゴリズムです。以下に、最も一般的な線形時間ソート アルゴリズムを次のタイプに基づいて分類します。
カウントベースのアルゴリズム
基数ベースのアルゴリズム
線形時間ソートの利点
数値ソートなどの線形時間ソート アルゴリズムには、特定のシナリオでいくつかの利点があります。
それ以外の場合は Java
線形時間ソートの欠点
線形スケジューリング アルゴリズムには利点もありますが、次のような制限や欠点もあります。
並べ替えアルゴリズムを選択するときは、入力データの詳細と並べ替え問題の要件を慎重に検討することが重要です。線形スケジューリング アルゴリズムは特定のシナリオでは利点を提供しますが、最も適切または効率的な選択肢となる場合のみです。
線形時間ソートアルゴリズムの応用
線形時間ソート アルゴリズムは効率的であり、さまざまな分野で多くの用途があります。線形時間順序の典型的な応用例をいくつか示します。
C++ での線形時間ソートの実装
以下は、線形時間ソート アルゴリズムであるカウンティング ソートを実装するプログラムの例です。
Linuxファイルシステムとは何ですか
#include #include using namespace std; void countingSort(vector& arr) { // Find the maximum element in the array int max_val = *max_element(arr.begin(), arr.end()); // Create a count array to store the count of each element vector count(max_val + 1, 0); // Count the occurrences of each element for (int num : arr) { count[num]++; } // Compute the prefix sum for (int i = 1; i <count.size(); i++) { count[i] +="count[i" - 1]; } create a sorted output array vector output(arr.size()); place the elements in order for (int i="arr.size()" 1;>= 0; i--) { output[count[arr[i]] - 1] = arr[i]; count[arr[i]]--; } // Copy the sorted elements back to the original array for (int i = 0; i <arr.size(); i++) { arr[i]="output[i];" } int main() vector arr="{4," 2, 8, 3, 1}; sort the array using counting countingsort(arr); print sorted cout << 'sorted array: '; for (int num : arr) ' endl; return 0; < pre> <p> <strong>Sample Output</strong> </p> <pre> Sorted array: 1 2 2 3 3 4 8 </pre> <p>This indicates that the input array has been sorted in ascending order using the Counting Sort algorithm, resulting in the sorted array [1, 2, 2, 3, 3, 4, 8].</p> <p>In this C++ program, the counting sort function takes a reference to the vector arr and runs the counting sort routine. It finds the table's maximum value to determine the worksheet's size. It then counts each element's occurrence and calculates the worksheet's prefix sum. Then, it creates a result vector and puts the elements in order according to the worksheet. Finally, it copies the sorted elements back into the original array. In the primary function, the example array {4, 2, 2, 8, 3, 3, 1} is sorted by the enumeration sort algorithm and printed as a sorted matrix. Note that the program uses libraries to work with vectors and find the maximum element of an array using the max_element function.</p> <hr></arr.size();></count.size();>
これは、入力配列がカウンティング ソート アルゴリズムを使用して昇順に並べ替えられ、その結果、並べ替えられた配列 [1、2、2、3、3、4、8] になったことを示します。
この C++ プログラムでは、カウント ソート関数はベクトル arr への参照を取得し、カウント ソート ルーチンを実行します。テーブルの最大値を見つけて、ワークシートのサイズを決定します。次に、各要素の出現をカウントし、ワークシートの接頭辞の合計を計算します。次に、結果ベクトルを作成し、ワークシートに従って要素を順序付けします。最後に、ソートされた要素を元の配列にコピーします。プライマリ関数では、配列例 {4, 2, 2, 8, 3, 3, 1} が列挙型並べ替えアルゴリズムによって並べ替えられ、並べ替えられた行列として出力されます。このプログラムはライブラリを使用してベクトルを操作し、関数 max_element を使用して配列の最大要素を検索することに注意してください。