O(1)
整数のエッジウェイトを使用すると、バケットを使用して、最悪の場合の複雑さで優先キューを実現できますが、O(U)
スペースの複雑さが増します。
あなたが言及したMSTアルゴリズム内で、比較ベースの優先度キューをこの整数構造に置き換えることができるはずです。したがってO(log(n))
、複雑さの要件の依存性を取り除くことができます。のスタイルは全体的に複雑になると思いますO(n + m)
。
基本的に、圧縮されたリンクリストのセットを設定します。各リストは、そのバケットに関連付けられた(整数!)コストによってインデックスが付けられます。
struct bucket_list
{
_cost; // array[0..N-1] holding current cost for each item
_head; // array[0..U-1] holding index of first item in each bucket
_next; // array[0..N-1] where _next[i] is the next item
// in a list for the ith item
_prev; // array[0..N-1] where _prev[i] is the last item
// in a list for the ith item
};
この構造は、各アイテムが一度に1つのバケットリストにしか存在できないという事実に基づいています。
この構造に基づいて、これらの操作の最悪の場合のO(1)
複雑さを実現できます。
push(item, cost); // push an item onto the head of the appropriate bucket list
_pop(item, cost); // _pop an item from (anywhere!) within a bucket list
update(item, old_cost, new_cost); // move an item between buckets by combining
// push and _pop
この構造を優先キューとして使用するには、スキャンする現在の最小バケットを指すインデックスを維持するだけです。次に低コストのアイテムを取得したい場合は、このバケットからヘッドアイテムをポップするだけです。バケットが空の場合は、空でないバケットインデックスが見つかるまでバケットインデックスをインクリメントします。
もちろん、U
スペースが非常に複雑になり、バケット全体にアイテムがまばらに分散する可能性がある場合、この種のアプローチは魅力的ではなくなる可能性があります。