Відповідно до цієї сторінки , алгоритм Дейкстри - це лише BFS з чергою пріоритетів. Це справді так просто? Я думаю, НЕ.
Відповідно до цієї сторінки , алгоритм Дейкстри - це лише BFS з чергою пріоритетів. Це справді так просто? Я думаю, НЕ.
Відповіді:
Можна реалізувати алгоритм Dijkstra як BFS з чергою пріоритетів (хоча це не єдина реалізація).
Алгоритм Дейкстри покладається на властивість, що найкоротший шлях від до t - це також найкоротший шлях до будь-якої з вершин уздовж шляху. Це саме те, що робить BFS.
Або в іншому ракурсі: як би поводився алгоритм Дейкстри, якби всі ваги були 1? Точно так, як BFS.
По-перше, як ми можемо адаптувати BFS до більш загального зваженого графіка ?
Ось ідея з книги "Алгоритми (розділ 4.4)" Дасгупта та ін:
Для будь-якого ребра з Е (з вагою л е ), замінити її л е ребрами довжини 1 , додаючи л е - 1 фіктивні вузли між U і V .
Як результат, ребра графіка результату мають усі одиничні довжини. Отже, ми можемо обчислити відстані в 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)
for all edges (u,v) in E:
if dist(v) = \infty
dist(v) = dist(u) + 1
На "черзі пріоритету".
Коли алгоритм Dijkstra запускається на незваженому графіку, у будь-який час черга пріоритетів містить щонайбільше два різних (відстані) значення. Тому черги FFO BFS є достатньою.