整数がn個ある場合、O(k + logn)時間でn個の値からk個の最大要素をリストすることは可能ですか?私が得た最も近いのは、最大ヒープを構築し、最大k回抽出することです。これにはO(klogn)時間がかかります。また、インオーダートラバーサルの使用についても考えます。k個の最大要素を抽出する
答えて
は、あなたはそれがのアイデアクイックソートを使用しているので、時にはクイック選択と呼ばれているarray.Techniqueからk番目の要素を抽出するための分割統治技術を使用することができます。
クイックソートは、我々は、その正確な位置とその周囲partition
アレイにピボット要素を移動する、pivot
要素を選びます。アイデアは、は完全なクイックソートをしないが、ピボット自体がk番目に小さい要素であるところで停止する。また、ピボットの左右両側を再発するのではなく、ピボットの位置に従って一方を再発させます。この方法の最悪の場合の時間複雑度はO(n^2)
ですが、平均でO(n)
で動作します。
ヒープの構築にはO(nlogn)が必要であり、k個の要素の抽出にはO(klogn)が必要です。 k要素の抽出がO(klogn)であるという結論に達した場合は、ヒープを構築するのにかかる時間が心配されていないことを意味します。
その場合、リスト(O(nlogn))をソートし、k個の最大要素(O(k))を取ります。
を参照してください。これは間違っています。 O(n)時間にヒープを構築することができます。 –
O(n)でヒープを構築するにはどうすればいいですか? – zmbq
https://stackoverflow.com/questions/1787252/is-there-a-on-algorithm-to-build-a-max-heap –
この問題を解決する方法。
データをソートし、トップkを取る。ソートには
O(n lg n)
が必要で、先頭kを反復するにはO(k)
が必要です。合計時間:O(n lg n + k)
データから最大ヒープを作成し、上位k回を削除します。ヒープの構築は
O(n)
で、トップアイテムを削除する操作はO(lg N)
です。合計時間:O(n) + O(k lg n)
最大サイズkの実行中の最小ヒープを維持します。すべてのデータを繰り返し、ヒープに追加してから、ヒープ全体を取得します。合計時間:
O(n lg k) + O(k)
k番目に大きい値を見つけるために選択アルゴリズムを使用します。次に、すべてのデータを繰り返して、その値より大きいすべての項目を検索します。
a。平均実行時間が
O(n)
であるが、最悪の場合はO(n^2)
であるQuickSelectを使用してk番目に大きいものを見つけることができます。合計平均ケースタイム:O(n)
+O(n)
=O(n)
最悪の場合の合計時間:O(n^2) + O(n) = O(n^2)
b。最悪の場合の実行時間が
O(n)
であるが、インプレースではないmedian-of-mediansアルゴリズムを使用して、k番目に大きいものを見つけることもできます。合計時間:O(n)
+O(n)
=O(n)
メジアンの中央値には、配列内のデータを入れ替えるインプレースバリエーションがありますメモリの割り当てを回避します。スタック領域は再帰によって使用されます。それはO(n)ですが、定数は大きくなります。 – rcgldr
- 1. 行列のk個の接続要素の最大合計
- 2. 最も近いk個の要素を検索する
- 3. 配列から最大の要素を抽出する
- 4. n個のペアからn個のペアからk個の別個の要素を抽出する最速の方法R
- 5. 大きなXMLから個々のファイルに要素全体を抽出する
- 6. バイナリ検索ツリーのK個の最小要素の合計
- 7. 反復要素のベクトルを最大k回繰り返す
- 8. XMLデータ抽出は、最後の10個のアルファベットを抽出する必要
- 9. 最小ヒープ抽出2最小要素
- 10. 抽出要素要素
- 11. n個の要素を持つ配列の最大数
- 12. NumPy配列で合計が最大のn個の列を抽出する
- 13. priority_queueの最後の要素を抽出する
- 14. R:dplyr tibble内の特定の要素を中心とするn個の要素を抽出する
- 15. Kウェイマージのための最大K
- 16. k個以下の要素が隣接しているような配列の要素の最大和を求めるアルゴリズム
- 17. 最小値と最大値を持つk個の部分の分割
- 18. k個以下の要素が隣接しないような要素配列の最大和を求めるアルゴリズム
- 19. リストの要素を抽出する
- 20. postgresqlのステートメントから最初の要素を抽出します
- 21. 最大要素。アルゴリズム
- 22. n個の要素の配列から要素Kを形成する方法の数を求める
- 23. マルチスレッドプログラム内の最近隣のk個
- 24. N個の文字列を最大K個の編集で共通のターゲット文字列に変換する
- 25. PHPでXML要素を抽出する
- 26. キャンバス要素の最大サイズ
- 27. 最大の要素は
- 28. Theano要素の最大値
- 29. 最後のn個の要素
- 30. k番目の最小要素を見つける
なぜO(k + log n)が必要ですか?あなたはそれを少なくとも1回、少なくともO(n)回越える必要があります。 –
コレクションがソートされていない場合は、すべてのn個の整数を調べる必要があります。どのようにO(k + log n)の解を持つことができるかわかりません。 maxヒープを構築するだけですでにO(n)であることに注意してください。 –
AVLツリーの使用はどうですか? –