私は過去1週間、ダイクストラのアルゴリズムに取り組んできました。Javaで正しい実行コードを使用しています。最小距離の頂点を与える標準のfindMin関数の計算に配列を使用しています。明らかにそれはO(n)であり、現在はPriority Queue(Min Heaps)を使用して実装しようとしています。
私の思考プロセスは次のとおりです。
while (there are unseen Vertex)
{
vertex= get TheVertex WithSmallest Distance Yet;//(In can be done in O(log n) using heap)
for this vertex {
find all of the adjacent edges and traverse them.
for a particular vertex which is not there in heap yet{
Simply add it in the queue;
}
}
}
ただし、特定の頂点がヒープ内に存在する場合、検出された最小ノードの距離を考慮して、その距離が更新される可能性があります。
今私の質問は、O(log n)時間でヒープ内の特定の要素をどのように更新するかです。
O(1)時間でその要素を見つけることができませんか?
私のような素朴な実装では、O(n)になります。
では、このボトルネックを処理するために何ができるかを誰かが提案できますか?O(log n)時間でヒープ内の特定の頂点を更新するにはどうすればよいですか?(同様に、O(1)時間で特定の要素を見つけるにはどうすればよいですか)