Pythonのヒープ

Pythonのヒープ

ヒープ (Heap) は特別な完全なバイナリ ツリー データ構造で、ラージ トップ ヒープとスモール トップ ヒープの 2 つのタイプがあります。大きな上部ヒープでは、親ノードの値はその子ノードの値以上になりますが、小さな上部ヒープでは、親ノードの値はその子ノードの値以下になります。 。

特徴:

  1. ヒープは完全なバイナリ ツリーです。つまり、最後のレベルを除くすべてのレベルが満たされ、最後のレベルのノードがすべて左から右に順番に配置されると、ヒープはいっぱいになります。
  2. 大きなトップ ヒープでは、各ノードの値はその子ノードの値以上になりますが、小さなトップ ヒープでは、各ノードの値はその子ノードの値以下になります。
  3. ヒープ内のノードは、そのサブツリー内のノードの最大値または最小値であることが保証されません。

一般的な操作:

ヒープは通常、優先キューや並べ替えアルゴリズム (ヒープ ソートなど) などのシナリオで使用されます。ヒープに対する一般的な操作は次のとおりです。

  • 挿入操作: 要素をヒープに挿入し、ヒープのプロパティを維持します。
  • 削除操作: ヒープ内のルート ノードを削除し、ヒープの性質を維持します。
  • ヒープの構築: 入力データ セットをヒープに変換するプロセス。
  • ヒープ操作: シンキング (下方比較と交換) またはフローティング (上方比較と交換) によってヒープの性質を復元します。

実現方法:

Python では、heapqライブラリを。heapqライブラリは、挿入、削除、構築など、ヒープを操作するための関数を提供します。

以下は、小さな上部ヒープを作成および操作する方法を示すサンプル コードです。

import heapq

heap = []  # 创建一个空堆

heapq.heappush(heap, 5)  # 插入元素5
heapq.heappush(heap, 2)  # 插入元素2
heapq.heappush(heap, 8)  # 插入元素8
print(heap)  # 输出: [2, 5, 8]

min_value = heapq.heappop(heap)  # 删除并返回最小值
print(min_value)  # 输出: 2
print(heap)  # 输出: [5, 8]

heapqライブラリを使用すると、ヒープ関連の操作を簡単に実行できます。さらに、比較関数をカスタマイズして、大きなトップ ヒープや特定の要件を持つヒープを実装することもできます。

アプリケーションシナリオ:

ヒープは、次のような多くのアルゴリズムやデータ構造で広く使用されています。

  • ヒープ ソート: ヒープ ソート アルゴリズムは、ヒープの性質を使用してソートし、時間計算量は O(nlogn) です。
  • 優先キュー: ヒープは、優先キューを実装するためによく使用されます。このキューでは、最も高い (または最も低い) 優先順位を持つ要素が常にルート ノードにあります。
  • グラフ アルゴリズム: ヒープは、最短パス アルゴリズム (ダイクストラのアルゴリズムなど) や最小スパニング ツリー アルゴリズム (プリム アルゴリズムやクラスカル アルゴリズムなど) などに使用できます。
  • Median Find: 2 つのヒープを使用して、並べ替えられていないデータセットの中央値の高速検索を実装します。

重要なデータ構造として、ヒープは多くのシナリオで効率的なソリューションを提供します。優れた時間計算量と柔軟な適用性を備えているため、アルゴリズムやソフトウェア開発で広く使用されています。

おすすめ

転載: blog.csdn.net/qq_51447496/article/details/131317895