2n個のRAMを使用してn^2要素をソートする方法を教えてください。 考えられるアプローチの1つは、サイズnのn個のアレイにそれぞれ分割することです。そして、n要素内でマージソートを行い、最後にn個の配列にサイズnのヒープを保持します。しかし、これは、1つの要素が配置されるたびに、私はディスクの読み込みを行い、n要素が完成するたびにディスク書き込みを行うことを意味します。 より良い提案はありますか?おかげさまで 2n RAMでn^2要素をソートする方法
答えて
これはできません。要素のためだけにn^2のメモリが必要です。
この明らかなメモリ消費を考慮しない場合は、ヒープソートなどのインプレースソートアルゴリズムの1つをお勧めします。 O(1)余分なスペースが必要です。
外部ストレージがカウントされず、内部ストレージのみがカウントされる外部ソートアルゴリズムを探している場合は、ボトムアップのmergesortを使用することをおすすめします。あなたはこれを、あなたが望むほどの量の内部メモリを消費するようにすることができます。約2nのメモリを消費し、部分的にソートされた各セットから常にn/2個の要素を読み込み、それらをn個の要素の別の配列にマージします。結果をディスクに書き戻します(できるだけ別のファイルに書き込むことをお勧めします)。
最初にすべてのデータをロードする必要はありません。 –
しかしあなたはどこかにそれらを保存しなければなりません。ディスク上でさえ、彼らは依然としてO(n^2)バイトの記憶域を使います。 –
OP、彼はO(n) 'RAM'を持っていて、O(n^2)のスペースがないと言ったのですか?問題を解決するための彼の提案はまさに彼が外部空間を持っていると言う。 –
キャッシュ忘却型優先度キューの実装がある場合は、ディスクとメモリ階層の各レベルでメモリ転送の観点から最適な実行時間を達成するために使用できます(http://courses.csail.mit.edu/6.897/spring05/lec/lec23.pdf参照)。
それ以外の場合は、単純なコードを最初から書きたい場合は、mergesortのディスクベースの実装がうまくいくはずです。基本的に、 "左"と "右"の半分を最初に再帰的にソートし、2nメモリを使ってそれらをマージして、再帰的にソートされたサブアレイをディスクからバッファすることによって、配列の範囲をソートできます。単純な実装では、これは適切ではないため、ディスク上にアレイの2つのコピーを保管して前後にシャトルする必要があります。
n^2要素がある場合、2nメモリで最後のマージはどうしますか? –
ディスクから番号をバッファリングしています。ディスク上にマージしたい2つのリストがあるので、それぞれからnをロードしてマージし、マージの結果をディスクに書き込みます。バッファの1つが使い果たされると、バッファがリロードされます。技術的には、ディスクに書き込むときにもバッファリングする必要があります。そのため、出力バッファにもO(n)メモリを確保する必要があります。 – jonderry
- 1. $ 2n $要素をペアにする方法の数を計算する方法は簡単ですか?
- 2. ラベル値で要素をソートする方法(ネイティブJavaScriptを使用)?
- 3. C#でXmlDocumentの要素の子をソートする方法は?
- 4. jqueryで要素と位置をソートする方法
- 5. 要素をソートするJavascript
- 6. ソートされたリンクリストに要素を追加する方法は?
- 7. Rのリストの要素をソートする方法は?
- 8. ソート要素が
- 9. 要素を浮動小数点で垂直方向にソートする方法は?
- 10. 1GB RAMのマシンで1TBファイルをソート
- 11. pythonでソートされた赤いセットに要素を追加する方法
- 12. TreeSetでソートされた要素を削除して更新する方法は?
- 13. これらのキャンバス要素をZ-インデックスでソートする方法は?
- 14. 要素で子要素を取得する方法
- 15. ドラッグ中にソート可能な要素を1行に保持する方法
- 16. アコーディオン要素をソート可能かつドラッグ可能にする方法
- 17. JavaScriptで要素をドラッグする方法
- 18. jqueryで要素をチェックする方法
- 19. jqueryソート各itsownownの要素
- 20. Groovy - XML要素のソート
- 21. ソート二つの要素
- 22. ソート二つの要素
- 23. RAMの量を確認する方法
- 24. Jqueryソート可能 - 子要素のみでソートを開始
- 25. 配列要素を指す選択ソート
- 26. マージソートを変更してソートせずに要素のインデックスを返す方法
- 27. ArrayList内の要素をソートするために必要なパスを確認する方法は?
- 28. ソートされたベクトルに要素を挿入し、要素をソートしたままにする
- 29. 入力文字列をbashでチェックする方法は、バージョン形式(n1.n2.n3)
- 30. div要素でフェード&ドロップする方法
「O(log(n))RAMでn個の要素をソートする方法」という別の言い方をしています。 – erikkallen
それはO(sqrt(n))ではいけませんか? –
Knuthは、この問題に関する全章をComputer Programming * Volume 3で手掛けています。 –