N個の数字の集合(N> X)からX個の最大の数字のソートされたリストを抽出する最良のアルゴリズムは何ですか?ほとんどのアルゴリズムでは、O(NlogN)
時にそれを行うことができます。しかし、それ以上のことは可能でしょうか?たとえば、バイナリツリーの場合:O(NLogX)
?セット内の数字は完全にランダムです。セット内の最大のX番号をソートする最良のアルゴリズムは何ですか
答えて
使用サイズX.
挿入ヒープに最初X要素のmin heap。要素X +1(eと呼びます)から、これをヒープの先頭と比較してm(これまでの最小値)と比較してください。この比較は一定の時間内に行われることに注意してください。 もしE>メートル、次いでEは(メートルを抽出し、Eを挿入)で取得するに値します。セットの各要素に対してそれを行います。このプロセスが終了すると、ヒープにはXという大きな数値が含まれています。その後、抽出 - 最小X回あなたが期待する並べ替えられたリストを提供します。最初のステップは、O(NlgX)
時間であるよう
N反復の各々は、電位O(lgX)
抽出/挿入操作を行います。最小ヒープでのXの抽出 - 最小のコストは、単にO(XlgX)
となり、全体の複雑さはO(NlgX)
になります。
'binary tree'と' min heap'の違いは何ですか? – Pareidolia
@ Pareidolia:分ヒープはやや速くなります。特に、O(1)の中で最大の項目を見つけることができます。バイナリヒープでは、最大(または最小)の項目を見つけることはO(log n)です。さらに、バランスのとれたバイナリツリー(たとえばAVLツリー)を使用しない限り、縮退ツリーで終わるリスクがあり、すべての操作はO(log x)ではなくO(x)になります。 –
"ベスト"アルゴリズムは、データセットのサイズ、元のリストを変更できるかどうか、および選択するアイテムの数など、多くの要素によって異なります。
たとえば、10個のアイテムがあり、最大の3個を探している場合は、リストを並べ替えて最後の3個を選ぶだけです。 Quickselectに電話して、配列の順序を変更して、3つの最大値が前面になるように並べ替え、次にそれらの3つを並べ替えることがあります。しかし、保存する時間が少ないので、複雑さを増やす価値はありません。
10,000からトップ1000を選びたい場合は、間違いなくQuickselectを使用します。 QuickselectはO(n)ですが、QuicksortはO(n log n)です。 QuicksortとQuickselectの両方が元のリストを変更します。
元のリストを変更できない場合、またはリスト全体をメモリに保持できない場合は、前の回答に記載されているヒープ選択アルゴリズムが最適な方法です。
また、QuickselectがO(n)であり、ヒープ選択アルゴリズムがO(n log x)であっても、ヒープ選択アルゴリズムはQuickselectよりも高速です。 。たとえば、1,000,000の中から上位100を選択する場合は、ヒープ選択アルゴリズムが高速になります。私はこのブログについてかなり詳細な記事を書きました。 When theory meets practiceを参照してください。
Xが小さい場合は、挿入の並べ替えが有効です。
ビデオゲームの「トップ10スコア」リストを考えてください。ゲームをプレイした後、リストはどうなりますか?あなたのスコアが10位のスコアより高い場合を除いて、何も起こらない:あなたのスコアはリストを作るには低すぎる。しかし、あなたのスコアがリストを作成するのに十分高い場合、挿入ソートはリストの適切な場所にそれを置き、下のすべてのスコアをそこから外して余裕を持たせます。この後者の場合、古い10位のスコアは新しい11位のスコアになり、リストから外れます。
- 1. 番号を増やすための最良の圧縮アルゴリズムは何ですか?
- 2. DrRacket - セット内で最大の番号を探す
- 3. アルゴリズムの提案が必要:テレビ番組のエピソードをソートする最良の方法は何ですか?
- 4. Windowsフォーム計算アルゴリズム。ソートと最高/最低番号
- 5. リスト内で最大fromed番号python
- 6. サービスするWebサービスの最大番号
- 7. ポイントのセットで最大距離をトラッキングする最も良い方法は?
- 8. 配列内の最小の番号と最大の番号を見つける方法は?
- 9. アナグラムがパリンドロームかどうかを調べる最良のアルゴリズムは何ですか?
- 10. 2つの大きなテキストファイルをJavaでソートする最良の方法は何ですか?
- 11. シリーズのアルゴリズムは内部の最大降下を計算する?
- 12. データベースの最後の番号に基づいて連続番号を生成するアルゴリズムはありますか?
- 13. android SDKの2つの形式の電話番号を照合する最良の方法は何ですか?
- 14. 配列内で最も多く現れる最大数を見つけるアルゴリズムは何ですか?
- 15. イメージ内のテキストを検出して認識するための最良の方法とアルゴリズムは何ですか?
- 16. この週番号アルゴリズムの名前は何ですか?
- 17. Collatz Sequence:どの番号が最大ですか?
- 18. n番目のK番号に最適なアルゴリズム
- 19. 手描きの幾何学図形を認識するための最良のアルゴリズムとデータを収集する最良の方法は何ですか?
- 20. C/C++でテキストファイルを暗号化する最良の方法は何ですか?
- 21. 大量の画像をカタログする最良の方法は何ですか?
- 22. 固定された最大番号に番号を付ける
- 23. 最小/最大番号の配列インデックスのシーケンシャルカウントダウン
- 24. Redisのソートセットで不足している番号を知る最も良い方法は何ですか?
- 25. ブラジルのレアをJavascriptを使用して番号に変換する最も良い方法は何ですか?
- 26. 最低のピクチャ番号でMySQL結果セットを取得する方法は?
- 27. kruskalのアルゴリズムでエッジをソートするのに最適なオプションは?
- 28. 空間内の点の集合から最も近い/最も近い平面を見つける最良のアルゴリズム/論文は何ですか?
- 29. Djangoでユーザー固有の番号を付ける最も良い方法は何ですか?
- 30. ハッシュテーブルを値でソートする最も良い方法は何ですか?
は、「最大のX番号」を意味します。並べ替えと1つの異なる数字は少し違って見えます。あなたが実際に求めるものを明確にしてください。 – Paul
たとえば、この番号は '3 5 2 7 1'に設定されており、最大の3(疑問のあるX)番が欲しいので、' 7 5 3'を出力します。 – Pareidolia