Min-Heap 配列に加えて、ハッシュ テーブルを使用してこれを行います。
ハッシュ テーブルには、ノード オブジェクトになるようにハッシュ コード化されたキーと、それらのノードが最小ヒープ配列のどこにあるかのインデックスである値があります。
次に、最小ヒープで何かを移動するたびに、それに応じてハッシュ テーブルを更新するだけで済みます。最小ヒープ内の操作ごとに最大 2 つの要素が移動され (つまり、交換される)、1 回の移動あたりのコストはハッシュ テーブルを更新するための O(1) であるため、最小ヒープ操作。たとえば、minHeapify は O(lgn) です。minHeapify 操作ごとに 2 つの O(1) ハッシュ テーブル操作を追加しました。したがって、全体の複雑さは依然として O(lgn) です。
この追跡を行うには、最小ヒープでノードを移動するメソッドを変更する必要があることに注意してください。たとえば、minHeapify() には、Java を使用して次のように変更する必要があります。
Nodes[] nodes;
Map<Node, int> indexMap = new HashMap<>();
private minHeapify(Node[] nodes,int i) {
int smallest;
l = 2*i; // left child index
r = 2*i + 1; // right child index
if(l <= heapSize && nodes[l].getTime() < nodes[i].getTime()) {
smallest = l;
}
else {
smallest = i;
}
if(r <= heapSize && nodes[r].getTime() < nodes[smallest].getTime()) {
smallest = r;
}
if(smallest != i) {
temp = nodes[smallest];
nodes[smallest] = nodes[i];
nodes[i] = temp;
indexMap.put(nodes[smallest],i); // Added index tracking in O(1)
indexMap.put(nodes[i], smallest); // Added index tracking in O(1)
minHeapify(nodes,smallest);
}
}
buildMinHeap、heapExtract は minHeapify に依存する必要があるため、ほとんどが修正されますが、抽出されたキーもハッシュ テーブルから削除する必要があります。これらの変更を追跡するには、recreaseKey も変更する必要があります。それが修正されたら、reduceKey メソッドを使用する必要があるため、insert も修正する必要があります。それはすべてのベースをカバーするはずであり、アルゴリズムの漸近的な境界を変更することはなく、優先キューにヒープを使用し続けることができます。
この実装では、実際には標準の最小ヒープよりもフィボナッチ最小ヒープが優先されることに注意してください。