オーダーO(n)のヒープ構築のボトムアップアプローチはどのようになっていますか? Anany Levitinは、彼の本では、注文O(log n)であるトップダウンアプローチと比較して、これがより効率的であると述べている。どうして?ヒープ構築のトップダウン手法は、成長の順番が低いにもかかわらず、ボトムアップより効率が低いのはなぜですかO(n)?
答えて
私はそれが誤字のようです。
ヒープを構築するための2つの標準アルゴリズムがあります。最初は、空のヒープから始め、繰り返し要素を1つずつ挿入します。個々の挿入には時間がかかる(log n)ので、このスタイルのヒープ構築のコストをO(n log n)で上限にすることができます。最悪の場合、ランタイムはΘ(n log n)であることが判明しました。逆ソート順に要素を挿入すると発生します。
もう1つのアプローチは、heapifyアルゴリズムです。ヒープアルゴリズムは、独自のバイナリヒープ内の各要素から開始し、順番にそれらをまとめてヒープを直接構築します。このアルゴリズムは、入力に関係なく時間O(n)で実行されます。
最初のアルゴリズムが時間を必要とするのは、Θ(n log n)の理由は、挿入される要素の後半部分を見ると、それぞれが高さのあるヒープに挿入されていることがわかりますΘ(log n)であるため、各バブルアップを実行するコストが高くなる可能性があります。 n/2個の要素があり、挿入するにはそれぞれΘ(log n)の時間がかかる可能性があるため、最悪の場合のランタイムはΘ(n log n)です。
一方、heapifyアルゴリズムは時間の大部分を小さなヒープで処理します。要素の半分は高さ0のヒープに、四分の一は高さ1のヒープに、8は高さ2のヒープに挿入されます。これは、作業の大部分が小さなヒープに要素を挿入するのに費やされることを意味します。
あなたの基本的な操作であることをスワッピング考える場合 -
をトップダウン構造では、ツリーが最初に構築され、heapify機能がnodes.The最悪の場合に呼び出されたが取捨選択する(ログをn回交換しますツリーの高さがログnであるツリーの上端までの要素)を、すべてのn/2葉ノードについて計算する。これにより、O(n log n)の上限が得られます。
ボトムアップ構築では、最初のパスですべてのリーフノードが順番になると仮定しているため、heapifyはn/2ノードでのみ呼び出されます。各レベルでは、可能なスワップの数は増えますが、発生するノードの数は減少します。
例: リーフノードのすぐ上のレベルでは、 は、最大で1つのスワップを持つことができるn/4ノードを持っています。 親のレベルでは、 n/8ノードで最大2回のスワップが可能です。 合計で、ヒープのボトムアップ構築のための効率(O(n))を考え出します。
- 1. 閾値が低すぎるにもかかわらず、Sonarqube PASS
- 2. シフトがCの加減算よりも優先順位が低いのはなぜですか?
- 3. O(log n)は常にO(n)よりも速いですか
- 4. フォーム要素が予想よりも低かった。わからない理由
- 5. switch文は、最も効率の低いマシンコードを生成しますか?
- 6. なぜandroid webviewは、ネイティブのアンドロイドブラウザよりもはるかに低速ですか?
- 7. データの配列を並べ替えるのに最も効率的な方法は何ですか(java compareToが高いものから低いものへ)
- 8. アプレットの採用水準が低いのはなぜですか?
- 9. 私のが低すぎるとわかりませんなぜ
- 10. HOTアップデート以外にも、テーブルフィールファクタが低いのはなぜですか?
- 11. AWS RDS t2.medium CPUが高くないにもかかわらず、CPUクレジットが低い
- 12. 一様分布のエントロピーがRの繰り返し値よりも低いのはなぜですか?
- 13. lucene boostedクエリーが同じ通常のクエリーよりもスコアが低いのはなぜですか?
- 14. 私のVotingClassifierの精度が私の個々の分類子よりも低いのはなぜですか?
- 15. ビルドに成功したにもかかわらずアプレットが起動しないのはなぜですか?
- 16. 他のものにもかかわらず私の `onclick`が動作しないのはなぜですか?
- 17. 学習率が低いにもかかわらずクラス数が増えると、 '損失と発散するモデル= NaN'になります。 [tensorflow]
- 18. スタックトレースに手順がないのはなぜですか?
- 19. 文字列のバイトサイズが長さよりも長いのはなぜですか?
- 20. G1の方がポーズ時間は長くなりますがスループットは低いのはなぜですか? G1はより少ない休止時間が、より低いスループットを与えるなぜ
- 21. 2つの同じ長さのリストを順番に組み合わせるO(n)アルゴリズムとは何ですか?
- 22. マスターは常に優先順位が最も低いインスタンスですか?
- 23. なぜconcurrent.futures.ProcessPoolExecutorのパフォーマンスが非常に低いですか?
- 24. 私のヘッダーはなぜそんなに低いですか?
- 25. なぜ5.1よりも低いAPIを下げることができないのですか?
- 26. ニューラルネットオプティマイザがSGDからAdamに変わると、精度が大幅に低下するのはなぜですか?
- 27. はX^n(1/n)よりも効率的ですか? (nは整数)
- 28. なぜWPF Canvasが低下しないのですか?
- 29. ディスクが低速の再構築 - Soalce Applinace
- 30. Sergen:再構築にもかかわらず構文エラー
heapifyアルゴリズムは挿入に関するトップダウンアプローチと比較して効率が悪いのではないですか?トップダウンアプローチは挿入のためにO(log n)を要するが、heapifyのためには、まず要素を順序どおりに挿入し、次にどの要素がO(n)であるかを調べる。したがって、あまりにも多くの要素が次々と挿入されると、heapifyはO(n2)として機能し、これはトップダウンのO(n log n)よりも効率が悪いでしょうか? –
彼らはさまざまなことをするように設計されています。 heapifyアルゴリズムは、ヒープに入れたい要素をすべて手元に用意しておき、他の方法は、要素数や要素数が分からない場合に有効です。一度に1つずつ要素を取得している場合、heapifyアルゴリズムはあまり良くありません。 – templatetypedef
これが助けになりました。説明ありがとう。 –