テストスコアの大規模なリストをソートします
-
28-09-2020 - |
質問
並べ替えたいテストスコアの大きなリスト(n> 10000)を持っています。テストスコアは1から100の間です。リストを並べ替えるための最速の方法は何ですか?
最初の考え。o(n log n)がバインドされていますが、配列内の数量に関する追加情報もありますので、私たちはもっとうまくいくと思います。
2番目の考え:ハッシュテーブルを使うべきです、私たちは二重化を気にしていますか?ハッシュテーブルの使用方法を見ることができません。
第三の思想:基本的な並べ替えとは何かをしていますか?わかりません。
第4の考え:別のリストを作成してこのリストを並べ替えてから、要素の元のカウント周波数を通過させます。しかし、より大きなソートリストを作成するには別のパスが必要です。これはO(n ^ 2)になります。すごすぎる。
これは非常に簡単な質問か、または非常に難しい質問ですか?
解決
すべてのスコアが整数であると仮定して、これは非常に簡単な質問です。
これは平凡な単語で最も単純なアルゴリズムです。100ゼロの整数配列であるcount
を開始します。スコアs
ごとに、count[s]
に1を追加します。必要なソートされたスコアを作成するには、count[1]
1S、count[2]
2S、...、および最後にcount[100]
100Sを出力します。
この種のソートアルゴリズムはカウントソートと呼ばれます。
$ n> 10000 $ の場合のケース1から100の間のテストスコアは、カウントソートの素数使用量です。時間の複雑さは $ o(n)$ です。スペースの複雑さは100の100個の小さい定数倍の倍数です。
他のヒント
はい、マージ並べ替えのようなソートアルゴリズムを使用して、o(n * logn)によってこれを達成することができます私たちはここでよりよくすることができます。 テストスコアのバインドに関する追加情報はここで非常に便利です。
重複について気にしますか?
スコアを扱っている場合は、student_nameまたはseconse_infoのような他の情報を気にしなくても、ソートされた形式のスコアがこのアルゴリズムを使用することができます。
maintain a int table[101] = {0} - hash table with key as score
//all elements are initialised to 0
array contains all scores
for score in array
table[score] = table[score] +1
//above in O(N) time and O(1) space.
sorted_list = {} // initially empty
for (score= 0; score < 101;i++)
for(count = 0; count < table[i]; count++)
sorted_list.add(score)
//the above runs in O(N) time and O(N) space.
.
今すぐ情報を気にするならば、それが属している学生/件名のようなスコアがこのアプローチを使用していました。 スコアと関連情報をC / C ++構造または任意のオブジェクト形式に保存すると仮定しています。
サイズ100のハッシュテーブルを維持する(テストスコアの範囲) キー=スコア value=このスコアを持つオブジェクトまたはインスタンスのリスト(あなたがいる場合 このスコアを持つ生徒のリストを生徒のリストの並べ替え)
C / C ++に精通している場合、このデータ構造はリンクリストの配列を使用して実装できます。ここで使用されるハッシュ技術は個別ハッシュです。
データ構造の機能はこのようなものです DS [スコア]はリンクリストへのポインタ/参照を持っています 別のハッシュマップを使用して、各サブリストの末尾をDSで識別します。o(1)時刻に新しい要素を挿入できます。
SOはi= 0からiへのシングルパスで
挿入後、作成したDSを作成したシングルパスで新しいリストを作成できます。
アルゴリズムはこのようなものです。
Let Arrayには、それぞれのスコアを持つすべてのオブジェクトが含まれています
for (i = 0; i< n; i++)
key = array[i].score
DS[key].insert(array[i]) //the tail part can be used for O(1) insertion.
//the above loop runs in O(N)
sorted_list = {} // empty_list
for(score = 1; score<=100;score++)
for each (obj in DS[score])
sorted_list.add(obj)
//the above loop runs in O(N).
//the N refers to the size of original list here.
.
このアプローチは誤ってキューベースの基数100の基数100である。レジッドソートとキューの実装でソートをカウントする。
質問から「4番目の考え:別のリストを作成してこのリストをソートしてから、元の要素の元のカウント周波数を通過させることができます。しかし、より大きなソートリストを作成するには別のパスが必要です。これはO(n ^ 2)です。つまり大きすぎる。 "
あなたが別のパスを間違えていると思います。ループ内に「別のパス」を置かない限り。
私はあなたのすべての質問に答えたことを願っています