Является ли алгоритм Дейкстры просто BFS с очередью приоритетов?

22

Согласно этой странице , алгоритм Дейкстры - это просто BFS с очередью приоритетов. Неужели это так просто? Думаю, нет.

Барри Фрутман
источник
1
Почему ты так думаешь?
Рафаэль
@Raphael Потому что это кажется слишком простым, и это так: я изучил его снова и теперь вижу, что он не отслеживает расстояние между узлами, так что это действительно BFS, а не Dijkstra.
Барри Фрутман
1
Ну, Dijkstra действительно изменяет значения, с которыми «сортируется» очередь (часто называемая «релаксацией»); если вы запрещаете это, это не то же самое, правда.
Рафаэль

Ответы:

20

Вы можете реализовать алгоритм Дейкстры как BFS с очередью приоритетов (хотя это не единственная реализация).

Алгоритм Дейкстры опирается на свойство того, что кратчайший путь от до также является кратчайшим путем к любой из вершин вдоль пути. Это именно то, что делает BFS.тst

Или с другой точки зрения: как поведет себя алгоритм Дейкстры, если все веса будут равны 1? Точно так же, как BFS.

Shaull
источник
4

Во-первых, как мы можем адаптировать BFS к более общему взвешенному графу ?G=(V,E)

Вот идея из книги «Алгоритмы (раздел 4.4)» Дасгупты и др.:

Для любого ребра из (с весом ) замените его ребрами длины , добавив фиктивные узлы между и .Е л е л е 1 л е - 1 U ve=(u,v)Elele1le1uv

В результате все ребра графа результатов имеют единичную длину. Поэтому мы можем вычислить расстояния в , запустив BFS на . G G GGG

Во-вторых, как алгоритм Дейкстры на превосходит BFS на преобразованном графе ?G GG

BFS на может быть очень медленным, если некоторые велики, потому что они слишком много времени на вычисление расстояний до тех фиктивных узлов, которые нам совершенно не . Алгоритм Дейкстры избегает этого, устанавливая приблизительные расстояния для узлов и ослабляя их, когда это возможно.l eGle

В-третьих, как алгоритм Дейкстры ведет себя на невзвешенных графах?

Он ведет себя точно так же, как BFS. Мы разрабатываем это из двух основных моментов.

  • На "отдыхе".

    Для алгоритма Дейкстры на общем взвешенном графе релаксация

    for all edges (u,v) in E:
        if dist(v) > dist(u) + w(u,v)
           dist(v) = dist(u) + w(u,v)
    

    Для BFS на невзвешенном графе мы знаем, что и , поэтому релаксация проще:w ( u , v ) = 1dist(v)=w(u,v)=1

    for all edges (u,v) in E:
        if dist(v) = \infty
           dist(v) = dist(u) + 1
    
  • На «приоритетной очереди».

    Когда алгоритм Дейкстры запускается на невзвешенном графике, в любой момент очередь с приоритетами содержит не более двух различных (дистанционных) значений. Следовательно, FIFO-очередь BFS достаточна.

Hengxin
источник