Кратчайший путь DAG против алгоритма Дейкстры

Я реализовал алгоритм Дейкстры из псевдокода, найденного в справочнике «Введение в алгоритмы», 3-е издание Кормена, для задачи поиска кратчайшего пути с одним источником.

Моя реализация была сделана на python с использованием связанных списков для представления графиков в виде списка смежности. Это означает, что список узлов представляет собой связанный список, и каждый узел имеет связанный список, представляющий края каждого узла. Кроме того, я не реализовал и не использовал какую-либо двоичную кучу или кучу Фибоначчи для очереди с минимальным приоритетом, которая требуется алгоритму, поэтому я ищу каждый узел за время O (V) внутри связанного списка узлов, когда процедура должна извлечь следующий узел с наименьшим удалением от источника.

С другой стороны, в справочнике также представлен алгоритм для DAG (который я реализовал) с использованием топологической сортировки перед применением процедуры релаксации ко всем ребрам.

Со всем этим контекстом у меня есть алгоритм Дейкстры со сложностью

O(V^2)

И алгоритм кратчайшего пути DAG со сложностью

O(V+E)

Используя функцию timeit.default_timer() для расчета времени работы алгоритмов, я обнаружил, что алгоритм Дейкстры быстрее, чем алгоритм DAG, при применении к DAG с положительными весами ребер и различной плотностью графов, все для 100 и 1000 узлов.

Разве алгоритм кратчайшего пути DAG не должен быть быстрее, чем алгоритм Дейкстры для DAG?


person JsMartinez    schedule 17.11.2017    source источник
comment
Является ли алгоритм dijk более быстрым для ВСЕХ плотностей графиков? или только некоторые из них?   -  person NL628    schedule 03.12.2017
comment
Это было быстрее для всех моих тестовых случаев   -  person JsMartinez    schedule 25.12.2017


Ответы (1)


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

Однако есть 3 возможных причины ваших результатов тестирования:

  1. График, который вы использовали для тестирования, очень плотный. Когда граф очень плотный, E ≈ V ^ 2, поэтому время работы обоих алгоритмов приближается к O (V ^ 2).

  2. Количество вершин все еще недостаточно велико. Чтобы решить эту проблему, вы можете использовать гораздо больший график для дальнейшего тестирования.

  3. Инициализация DAG требует много времени.

В любом случае, алгоритм кратчайшего пути DAG теоретически должен быть быстрее, чем алгоритм Дейкстры.

person Hunter Wang    schedule 06.03.2020