как обновить ключ в очереди приоритетов за O (log n )раз в алгоритме Дейкстры?

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

5
задан Brian 15 January 2014 в 19:44
поделиться