JavaでLinkedListとして保存されている数字のリストの中央値はどうやって見つかりますか?私はウィキペディアが指す選択アルゴリズムを理解していません。あなたがそれを説明できるなら、ボーナスポイント。LinkedList内の数字の中央値を見つける
答えて
最良のアルゴリズムはQuickSelect
ある記事を読み、クイックソートを理解しよう - コンセプトは似ています。
しかし、このアルゴリズムは依然として*リンクされた*リストで最速でしょうか?小さなNのように思えますが、素朴なアプローチが良いかもしれません。 –
はい、そうです。 QuickSelectはリンクされたリスト(完全に機能的な言語でさえ)に完全に適用可能です! – Dario
リンクは古いです。 –
プログラムをすばやくしたい場合は、リストを並べ替えて中央の要素(または2つの中間要素の平均)を選択します。
より効率的な選択アルゴリズムは、基本的に、あなたが実際にあなたのN与えられたためN番目の要素を見つけるためにソートする必要はありませんリストのビットを並べ替えないようにしてください。 (JDKは現在、箱から出して、このようなアルゴリズムを提供していません。)更新:をちょうど私の以前の記事に拡大して、より効率的な方法の例が含まれます:
- その初期parallel sortに選択を基づか各バケットのソート前に複数のバケットにデータを入れますが、中央のバケットを実際に並べ替える場所(中央値の場合)は、バケットのどちらの側でもアイテムの正確な順序が無関係
- クイックソートのような分割および征服ソートアルゴリズムをベースにしていますが、アルゴリズムが実際に必要な範囲外のサブリストをソートすることはありません。
中央値は、ソートされたリストの中央の数字です。 (エントリの数が不均一なリストの場合は簡単ですが、エントリ数が偶数のリストの場合は、両方の "中間の数字"の間に任意の数を入れることができます)
リストをソートし、ミドルナンバーは。
O(log n)で実行しないQuickSelectをお勧めしますか? – Dario
そうでなければ、どうしてあなたはO(n)と言うでしょうか? –
彼が主張するQuickSelectは実際にはO(n)で実行されます。 Intuitiveleyでは、QuickSortよりも処理が少なくなります。各ステップでは、配列の左または右半分だけが表示されるためです。 –
あなたは基本的に2つの主要なオプションがあります。
簡単かつ迅速な方法 -
O(nlogn)
でリストをソートします。中央値は値の半分がそれよりも大きく、半分が小さい値として定義されるので、n/2
番目の値を取ってください - それは中央値です。パフォーマンスが非常に重要な場合は、
O(n)
を与えることができるさまざまな選択アルゴリズムを適用できます(ただし、最悪の場合は直線性は保証されません)。いずれの場合においても
- 1. 最小数比較の3つの数字の中央値を見つける
- 2. CSVの13行で中央値を見つける
- 3. ArrayList内の数字を見つける
- 4. 異なるマシンの数値の中央値を見つけるのに最も速いアルゴリズムは何ですか?
- 5. 5つの異なる値の中央値を6つの比較でどのように見つけるか?
- 6. SQL - テーブル内の5つの数字を見つける
- 7. 文字列内の数字を見つけるxslt
- 8. 文字列内の数字を見つけるlua
- 9. 理解「中央値の中央値」アルゴリズム
- 10. 配列内の値を見つける
- 11. Xcode:ブレークポイントの設定中に変数値を見つける
- 12. 文字列中のregexpを見つけて変数につける方法
- 13. ベクトル内の複数の最大値のインデックスを見つける
- 14. 配列内の数字のシーケンスを見つける
- 15. 数字の配列内の最小合計を見つける
- 16. ファイル内の上位n個の数字を見つける
- 17. 配列内の連続する数字を見つける
- 18. 一致ID + Matlabの行列内の数値を見つける
- 19. NSMutable配列内の複数の値を見つける
- 20. 数値の範囲内のギャップを見つける
- 21. 文字列の数値パターンを見つける方法
- 22. 最高の数字を見つける
- 23. クイックソートの実装のためのjavaのメディアンの中央値を見つける方法
- 24. CSVファイル内にある3つの数字の平均を見つける
- 25. メディアンの中央値
- 26. 配列 - 配列内に見つからない数字を見つける
- 27. 2つの数値の間の素数を見つける
- 28. 文字列内の文字の位置を見つける
- 29. Cの文字列内の文字を見つける
- 30. 文字列内の文字のインデックスを見つける
あなたの最初のステップは、データを配列/ ArrayListにコピーすることです。 –
リストのコピーを妨害するメディアンを見つけたくない場合は、間違いなくしかし、効率をソートするだけであれば、Collections.sort()はこれを内部的に行います。 –