Алгоритм Зайдельса - Википедия - Seidels algorithm

Алгоритм Зейделя алгоритм, разработанный Раймунд Зайдель в 1992 году для задача поиска всех пар кратчайшего пути для неориентированных, невзвешенных, связанных графов.[1] Решает проблему в ожидаемое время для графика с вершины, где - показатель сложности из матричное умножение. Если искать только расстояния между каждой парой вершин, в худшем случае может быть достигнута такая же граница времени. Несмотря на то, что алгоритм разработан для связанных графов, его можно применять индивидуально к каждому. связный компонент графика с одинаковым временем работы в целом. Существует исключение из указанного выше ожидаемого времени выполнения для вычисления путей: если ожидаемое время работы становится .

Детали реализации

Ядром алгоритма является процедура, вычисляющая длину кратчайших путей между любой парой вершин. время в худшем случае. После того, как длины вычислены, пути могут быть восстановлены с помощью Алгоритм Лас-Вегаса ожидаемое время работы за и за .

Вычисление длин кратчайших путей

В приведенном ниже коде Python предполагается, что входной граф задан как - матрица смежности с нулями по диагонали. Он определяет функцию APD, которая возвращает матрицу с записями такой, что это длина кратчайшего пути между вершинами и . Используемый матричный класс может быть любой реализацией матричного класса, поддерживающей операторы умножения, возведения в степень и индексирования (например, numpy.matrix ).

def apd(А, п: int):    "" "Вычислить длины кратчайших путей." ""    если все(А[я][j] за я в классифицировать(п) за j в классифицировать(п) если я != j):        возвращаться А    Z = А ** 2    B = матрица([        [1 если я != j и (А[я][j] == 1 или же Z[я][j] > 0) еще 0 за j в классифицировать(п)]    за я в классифицировать(п)])    Т = apd(B, п)    Икс = Т*А    степень = [сумма(А[я][j] за j в классифицировать(п)) за я в классифицировать(п)]    D = матрица([        [2 * Т[я][j] если Икс[я][j] >= Т[я][j] * степень[j] еще 2 * Т[я][j] - 1 за j в классифицировать(п)]    за я в классифицировать(п)])    возвращаться D

В базовом случае проверяется, описывает ли входная матрица смежности полный граф, и в этом случае все кратчайшие пути имеют длину .

Графы с весами из конечных вселенных

Алгоритмы для неориентированных и ориентированных графов с весами из конечной вселенной тоже существуют. Самый известный алгоритм для направленного случая - вовремя Цвиком в 1998 году.[2] Этот алгоритм использует умножение прямоугольной матрицы вместо умножения квадратной матрицы. Лучшие верхние границы можно получить, если использовать лучший из имеющихся алгоритмов умножения прямоугольных матриц вместо достижения прямоугольного умножения с помощью умножения нескольких квадратных матриц. Самый известный алгоритм для неориентированного случая вовремя Шошаном и Цвиком в 1999 году.[3] Первоначальная реализация этого алгоритма была ошибочной и была исправлена ​​Эйринакисом, Уильямсоном и Субрамани в 2016 году.[4]

Примечания

  1. ^ Зайдель, Р. (1995). "О задаче всех пар-кратчайшего пути в невзвешенных неориентированных графах". Журнал компьютерных и системных наук. 51 (3): 400–403. Дои:10.1006 / jcss.1995.1078.
  2. ^ Цвик, У. (1 ноября 1998 г.). «Все пары кратчайших путей во взвешенных ориентированных графах - точный и почти точный алгоритмы». Материалы 39-го ежегодного симпозиума по основам компьютерных наук (каталожный номер 98CB36280). С. 310–319. Дои:10.1109 / SFCS.1998.743464. ISBN  0-8186-9172-7 - через IEEE Xplore.
  3. ^ Shoshan, A .; Цвик, У. (15 февраля 1999 г.). «Все пары кратчайших путей в неориентированных графах с целыми весами». 40-й ежегодный симпозиум по основам компьютерных наук (№ по каталогу 99CB37039). С. 605–614. Дои:10.1109 / SFFCS.1999.814635. ISBN  0-7695-0409-4 - через IEEE Xplore.
  4. ^ Эйринакис, Павлос; Уильямсон, Мэтью; Субрамани, К. (28 марта 2016 г.). "Об алгоритме Шошана-Цвика для решения задачи кратчайшего пути для всех пар". arXiv:1603.08627 [cs.DS ]. Cite имеет пустой неизвестный параметр: | publisher = (помощь)