Чи алгоритм Дейкстри є лише BFS з чергою пріоритетів?


22

Відповідно до цієї сторінки , алгоритм Дейкстри - це лише BFS з чергою пріоритетів. Це справді так просто? Я думаю, НЕ.


1
Чому ти так вважаєш?
Рафаель

@Raphael Тому що це здається занадто простим, і це: я вивчив це ще раз, і зараз я бачу, що він не відстежує відстань між вузлами, тому це дійсно BFS, а не Dijkstra.
Barry Fruitman

1
Ну, Дейкстрой робить зміна значення по черзі «упорядкована» з (часто називається «релаксація»); якщо ви забороняєте це, це не те саме, правда.
Рафаель

Відповіді:


20

Можна реалізувати алгоритм Dijkstra як BFS з чергою пріоритетів (хоча це не єдина реалізація).

Алгоритм Дейкстри покладається на властивість, що найкоротший шлях від до t - це також найкоротший шлях до будь-якої з вершин уздовж шляху. Це саме те, що робить BFS.st

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


4

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

Ось ідея з книги "Алгоритми (розділ 4.4)" Дасгупта та ін:

Для будь-якого ребра з Е (з вагою л е ), замінити її л е ребрами довжини 1 , додаючи л е - 1 фіктивні вузли між U і V .e=(u,v)Elele1le1uv

Як результат, ребра графіка результату мають усі одиничні довжини. Отже, ми можемо обчислити відстані в G , запустивши BFS на G .Г'ГГ'

По-друге, як алгоритм Дікстра на перемагає BFS на перетвореному графіку G ' ?ГГ'

BFS на може бути дуже повільним , якщо деякі л х великі , тому що він витрачає занадто багато часу на обчислення відстані до цих фіктивних вузлів , що ми не дбаємо про взагалі. Алгоритм Dijkstra уникає цього, встановлюючи передбачувані відстані для вузлів і розслабляючи їх, коли це можливо.Г'ле

По-третє, як поводиться алгоритм Дікстра на невагомих графах?

Він поводиться точно так само, як це робить BFS. Це ми детально розробляємо з двох основних моментів.

  • Про «релаксацію».

    Для алгоритму Дейкстри на загальному, зваженому графіку релаксація є

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

    гiст(v)=ш(у,v)=1

    for all edges (u,v) in E:
        if dist(v) = \infty
           dist(v) = dist(u) + 1
    
  • На "черзі пріоритету".

    Коли алгоритм Dijkstra запускається на незваженому графіку, у будь-який час черга пріоритетів містить щонайбільше два різних (відстані) значення. Тому черги FFO BFS є достатньою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.