必要なものと同様の時間の複雑さを持つアルゴリズムがありますが、必要な場合は平均時間O(log n)
でのみ実行されます。このアルゴリズムでは、関数なしで既存のプライオリティ キューを使用できます。requeue()
グラフ内のノードと優先キュー内の要素の間に接続があると仮定します。プライオリティ キューの要素には、 と呼ばれる余分なビットも格納しますignore
。dequeue
変更された実行のアルゴリズムは次のとおりです。
- 電話
dequeue()
- 要素の
ignore
ビットが true の場合は 1 に戻り、それ以外の場合はアイテム ID を返します。
enqueue
変更された実行のアルゴリズムは次のとおりです。
- エンキューを呼び出す(項目、優先度)
- グラフ内の項目の隣接ノード
v
を 1 つずつ
訪問する
ignore
キュー内の現在リンクされている要素のビットを true に変更します。v
- enqueue(v, new_priority(v))
- ノードの接続を
v
新しくエンキューされた要素に変更します。
num_ignore
++
- 無視要素(
num_ignore
)の数が非無視要素の数よりも多い場合、プライオリティ キューを再構築します。
dequeue
すべての要素、保存、およびenqueue
無視されない要素のみを再び
このアルゴリズムでは、ignore
ビットの設定に一定の時間がかかるため、基本的に無視要素O(log n)
が蓄積されるまで「リキュー」を遅らせます。O(n)
次に、それらすべてを 1 回クリアしますO(n log n)
。したがって、平均して、各「再キューイング」にはO(log n)
.