アルゴリズムのメモ: ヒープ

[特に明記されていない限り、すべて最小バイナリ ヒープです]

1 はじめに

2つの特徴

  • 構造: 完全なバイナリ ツリーの構造に準拠します。
  • 順序性: 親ノードが子ノードより小さい (ヒープを最小化)、または親ノードが子ノードより大きい (ヒープを最大化) ことを満たします。

3 バイナリ ヒープ ストレージ

順次ストレージ

バイナリ ヒープの順序は添字によって簡単に反映できます

4 新しい要素をヒープに挿入する

  • ヒープ挿入とは、最大のシーケンス番号を持つ要素の後に新しい要素またはノードを挿入することです。そうしないと、ヒープの構造的性質に違反します。
  • ヒープの順序に違反せずに新しい要素が配置された場合、操作は終了します。
  • それ以外の場合は、順序が満たされるかルート ノードに到達するまで、ノードを親ノードに向かって移動させます。
  • 新しいノードの上方への移動は上方フィルタリングと呼ばれます

4.1 時間効率

  • 最悪のケースは O(logn) [ルート ノードまで交換]
  • 平均すると、フィルタリングは早く終了します。
    • 一部のデータでは、平均 2.6 回の比較が行われるため、要素は平均 1.6 レベル上に移動します。

5 プッシュ操作 (DeQueue)

  • 最小の要素を削除すると、ルートに空のノードが表示されます。ヒープのサイズは以前より 1 小さくなり、ヒープの構造から最後のノードを削除する必要があることがわかります。
  • この空のノードに最後のアイテムを配置できる場合は、それを配置します。ただし、これは通常は不可能です
  • 挿入操作と同様の「ゲーム」をプレイする必要があります。つまり、いくつかのアイテムを空のノードに配置し、空のノードを移動します。
    • 唯一の違いは、DeQueue 操作の場合、空のノードが下に移動されることです。

  • 空のノードのより小さい子ノードを見つけます。子の値が配置したい項目より小さい場合は、その子を空のノードに配置し、空のノードを 1 レベル下にプッシュします。
    • アイテムが正しい位置に配置されるまで、この操作を繰り返します。

5.1 時間計算量

  • 最悪の場合、デキューは対数時間操作になります。
  • ヒープの順序に従って、ヒープ内の最後のノードの値は一般に比較的大きくなります。したがって、下向きフィルタリングが 1 レベルまたは 2 レベル早く終了することはほとんどないため、デキュー操作には平均して対数時間がかかります。

6 杭を作る

  • これは N 回の連続した挿入として見ることができ、O(NlogN) 時間で完了する必要があります。

  • 実際、構築プロセスでは、各要素が追加された後のヒープの状態は気にしません。重要なのは、N 個の要素がすべて追加された後の最終状態です。最終状態は、ヒープの順序性を確保することです。 。中間工程での秩序性が確立されているかどうかは関係ありません。
  • この前提により、ヒープ構築の時間を O(N) に減らすことができます。
    • ヒープの再帰的定義の使用
      • buildHeap 関数が完全なバイナリ ツリーをヒープに調整できる場合は、左側のサブヒープと右側のサブヒープで buildHeap を再帰的に呼び出すだけです。
      • この時点で、ルート ノードを除く他の場所でヒープの順序が確立されていることを確認できます。
      • 次に、ルート ノードで下向きフィルタリングを呼び出して、ヒープの順序性を作成します。
      • 逆階層順序でノードに対して下向きフィルタリングを呼び出す場合、ノード i を下向きにフィルタリングするときに、ノード i のすべての子孫がすでに下向きフィルタリングを呼び出しています。
        • リーフノードで下方フィルタリングを実行する必要はありません
        • 最大の番号を持つ非リーフ ノードから下方向にフィルタリングします

6.1 例

最初に、データの順序に基づいて完全なバイナリ ツリーが構築されます。

最大のシーケンス番号 (30) を持つ非リーフ ノードから下方向にフィルタリングします。

 

6.2 時間分析

  •  ノード h (リーフ ノードの高さは 0) の場合、下方フィルタリングでの交換の最大数は h です。
  • ヒープの構築にかかる最大時間は、すべてのノードの調整に必要な交換回数の合計、つまりすべてのノードの高さの合計です。

7Dパイル

  • 各ノードには d 個の息子があるため、結果として得られるヒープは短くなります。
  • 入れる:O(\log_dN)
  • 削除: d 要素の中から最小のものを見つける必要があります。時間計算量は次のとおりです。O(\log_dN)
  • 利点: 迅速な挿入
  • 欠点: 削除が遅い
  • 使用:
    • 削除よりも挿入の方が多いキュー
    • キューが大きすぎてメモリに保存できないため、外部ストレージに保存する必要がある場合

おすすめ

転載: blog.csdn.net/qq_40206371/article/details/132712733