Pythonのヒープ
ヒープ (Heap) は特別な完全なバイナリ ツリー データ構造で、ラージ トップ ヒープとスモール トップ ヒープの 2 つのタイプがあります。大きな上部ヒープでは、親ノードの値はその子ノードの値以上になりますが、小さな上部ヒープでは、親ノードの値はその子ノードの値以下になります。 。
特徴:
- ヒープは完全なバイナリ ツリーです。つまり、最後のレベルを除くすべてのレベルが満たされ、最後のレベルのノードがすべて左から右に順番に配置されると、ヒープはいっぱいになります。
- 大きなトップ ヒープでは、各ノードの値はその子ノードの値以上になりますが、小さなトップ ヒープでは、各ノードの値はその子ノードの値以下になります。
- ヒープ内のノードは、そのサブツリー内のノードの最大値または最小値であることが保証されません。
一般的な操作:
ヒープは通常、優先キューや並べ替えアルゴリズム (ヒープ ソートなど) などのシナリオで使用されます。ヒープに対する一般的な操作は次のとおりです。
- 挿入操作: 要素をヒープに挿入し、ヒープのプロパティを維持します。
- 削除操作: ヒープ内のルート ノードを削除し、ヒープの性質を維持します。
- ヒープの構築: 入力データ セットをヒープに変換するプロセス。
- ヒープ操作: シンキング (下方比較と交換) またはフローティング (上方比較と交換) によってヒープの性質を復元します。
実現方法:
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 つのヒープを使用して、並べ替えられていないデータセットの中央値の高速検索を実装します。
重要なデータ構造として、ヒープは多くのシナリオで効率的なソリューションを提供します。優れた時間計算量と柔軟な適用性を備えているため、アルゴリズムやソフトウェア開発で広く使用されています。