以下のように、バケットの並べ替えに関する私の分析を検討したいと思います。
バケットの並べ替えを実装する方法はたくさんあります。それらのいくつかは次のとおりです。
タイプ 1:
ソートする要素の範囲がわかっている場合は、考えられる要素ごとにバケットを設定し、要素を対応するバケットに放り込むだけです。次にバケットを順番に空にすると、結果はソートされたリストになります。このアルゴリズムの実装では、配列を使用してバケットを簡単に表すことができます。各配列インデックスの値は、対応するバケット内の要素の数を表します。[0..max] の範囲に整数がある場合、(max + 1) 整数の配列を設定し、すべての値をゼロに初期化します。次に、ソートされていない配列を順次処理し、各要素の値を読み取り、バケット配列内の対応するインデックスに移動し、そこで値をインクリメントします。
時間 : O(N)
空間: O(1)
タイプ 2:
例: 人の配列を年齢でソートする
年齢は、任意の整数によるソートとは多少異なります。そのため、[0 ~ 150] という小さな範囲になります (すべての人の年齢は 0 ~ 150 の間です)。したがって、並べ替える最も簡単な方法は、151 個のリンクされたリスト (バケットと呼びましょう) を割り当て、年齢に応じて各人のデータ構造をバケットに入れることです。
時間 : O(N+K)
空間: O(N+K)
Type 3 (ウィキペディアにある type2 のバリエーション)
関数 nextSort は、各バケットを並べ替えるための並べ替え関数です。最悪よりも挿入ソートを使用する場合は、O(n^2) またはマージソートを使用して、O(nlgn) よりも安定性を維持できるようにします。
- 質問:
1>線形ソートと見なされる理由は、タイプ 1 またはタイプ 2 によるものですか?
2>WIkepedia のようなタイプ 3 を使用する場合、各バケットを効率的にソートするのはどのソートですか?
挿入ソートが実際に使用される理由は、バケットが小さいと予想されるためであり、小さなリストの場合、挿入ソートは他の何よりもはるかに高速です。マージソートまたはクイックソートを実装する場合でも、リストが十分に小さくなると (たとえば、20 項目以下など)、挿入ソートが使用されます。
3>タイプ 3 の場合、どの基準でバケットの範囲を決定できますか?
これは重要です。たとえば、n よりもはるかに大きい多数のバケットを使用してバケット ソートを実行しようとすると、実際に使用したバケットを探すためにすべてのバケットをスキャンするのに必要な時間が実行時間の大半を占める可能性があるためです。それらのほとんどは空です。
以下に基づいて分析を行いました:
ウィキペディア
バケット ソートの複雑さはどのように O(n+k) になるのでしょうか?
アルゴリズムの設計と分析 1996 年 1 月 23 日の講義ノート
http://www1bpt.bridgeport.edu/~dichter/lilly/bucketsort.htm
http://cs.nyu.edu/courses/fall02/V22.0310-002/ lectures/lecture-23.html
連結リストを使ってバケットを実装した場合、バケット ソートの複雑さはどのように O(n+k) になりますか?
バケットソートの最悪のケースの複雑さは?