Алгоритм Дийсктра в O ((V + E) * W) - PullRequest
0 голосов
/ 24 января 2019

Допустим, у меня есть ориентированный граф G (V, E) с целыми положительными весами на его ребрах. Если я знаю, что для каждого ребра e ∈ E вес (e) ∈ {0,1, .. 2 ^ W}(где W относительно мало), как я могу реализовать алгоритм Дижктры в O ((V + E) * W)?

Я попытался модифицировать алгоритм Dial, где, если weight (e) ∈ {0,1, .., W} я мог бы использовать ведра и реализовать dijsktra в O (V * W + E), но я не могу добиться хороших результатов.

1 Ответ

0 голосов
/ 25 января 2019

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

Для этого вы помещаете записи (стоимость, вершина) в кучу, и всякий раз, когда стоимость вершины уменьшается, вы просто добавляете новую. Когда вы вытаскиваете вершину из кучи, просто игнорируйте ее, если она уже сделана. В любом случае вы должны следить за тем, какие вершины создаются. Это просто.

Это занимает немного больше места, но сложность остается O (| E | log V) (что совпадает с O (| V + E | log | V |) или O (| E | log | E | ) для подключенного компонента, который будет проходить алгоритм)

Теперь коэффициент log | E | Вышеизложенное вытекает из того факта, что существует до | E | элементы в куче. Если вы сгруппируете все элементы с одинаковым приоритетом в списки и поместите эти списки в очередь с приоритетами, то журнал | E | коэффициент превращается в лог (количество различных приоритетов). Обратите внимание, что массив кучи перестает быть подходящей структурой для очереди приоритетов, но различные виды упорядоченных деревьев работают нормально. Это легко, когда вам не нужен ключ_памяти.

В вашем случае разница в стоимости между вершинами в начале приоритетной очереди и самой высокой стоимостью в приоритетной очереди составляет не более 2 ^ Вт. Это означает, что в очереди имеется не более 2 ^ W различных приоритетов, и сложность алгоритма Дейкстры, использующего этот тип очереди приоритетов, составляет O (| E | W).

Поскольку вы не хотите выделять 2 ^ W сегмента, дерево связанных списков Patricia создаст жизнеспособную очередь с приоритетами для вашего случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...