Я работаю над алгоритмом Дейкстры в течение последней недели, и у меня есть правильный рабочий код для него в 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 )время)