Який найшвидший алгоритм пошуку всіх найкоротших шляхів у розрізненому графіку?


24

У невагомому, непрямому графіку з вершинами та ребрами таким чином, що , який найшвидший спосіб знайти усі найкоротші шляхи у графі? Чи можна це зробити швидше, ніж Флойд-Варшалл, який є але дуже швидкий за ітерацію?E 2 V > E O ( V 3 )VE2V>EO(V3)

Як щодо того, якщо графік зважений?

Відповіді:


32

Оскільки це невагомий графік, ви можете запустити пошук першого ширини (BFS) з кожної вершини v графіка. Кожен запуск BFS дає вам найкоротші відстані (і шляхи) від стартової вершини до кожної іншої вершини. Часова складність для одного BFS становить O(V+E)=O(V) оскільки E=O(V) у вашому розрідженому графіку. Виконання її V разів дає складність у часі O(V2) .

Для зваженого спрямованого графіка алгоритм Джонсона, запропонований Ювалом, є найшвидшим для розріджених графіків. Це займає O(V2logV+VE) що у вашому випадку виявляється O(V2logV) . Для зваженого ненаправленого графіка можна або запустити алгоритм Дейкстривід кожного вузла або замініть кожен непрямий край на два протилежні спрямовані ребра та запустіть алгоритм Джонсона. І те й інше дасть ті самі асимптотичні часи, що й алгоритм Джонсона, наведений вище, для вашого рідкого випадку. Також зауважте, що підхід BFS, який я згадую вище, працює як для спрямованих, так і для непрямих графіків.



7

Ви можете спробувати зробити версію Floyd-Warshall, яка швидша на рідких матрицях.

Спочатку згадаймо, що робить цей алгоритм:

Нехай - матриця відстаней. На початку алгоритму M i , j - вага ребра i j . Якщо цього краю не існує, тоді M i , j = .MMi,jijMi,j=

Алгоритм має кроків. На кроці k алгоритму для кожної пари вузлів i , j ми встановимоVki,j

Mi,jmin{Mi,j,Mi,k+Mk,j}.

Зрозуміло, що якщо або то оновлення не потрібно проводити. Таким чином, на перших кроках алгоритму нам потрібно лише виконати грубо порівняння, де і позначають кількість вхідних та вихідних ребер -го вузла відповідно. По мірі просування алгоритму заповнюється все більше записів матриціОтже, останні кроки можуть зайняти набагато більше часу.M k , j = d e g i n ( k ) d e g o u t ( k ) d e g i n ( k ) d e g o u t ( k ) k MMi,k=Mk,j=degin(k)degout(k)degin(k)degout(k)kM

k

E=O(V)k=0O(1)MO(V)k=|V|O(V2)O(V3)

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