Почему A * работает быстрее, чем алгоритм Дейкстры?

Википедия говорит, что A * запускается в O (| E |), где | E | количество ребер в графе. Но мой друг говорит, что A * - это просто общий случай алгоритма Дейкстры, а алгоритм Дейкстры работает в O (| E | + | V | log | V |). Поэтому я не понимаю, почему A * работает быстрее, чем алгоритм Дейкстры.


person Jessica    schedule 08.11.2013    source источник
comment
wikipedia Похоже, довольно много говорится о разнице между ним и Джикстрой. Я бы начал там   -  person hankd    schedule 09.11.2013
comment
Да, в статье в Википедии говорится, что A * эквивалентен алгоритму Дейкстры. Вот что меня смущает.   -  person Jessica    schedule 09.11.2013
comment
Нет, там написано ... и A * эквивалентно запуску алгоритма Дейкстры с уменьшенной стоимостью d '(x, y): = d (x, y) - h (x) + h (y). < / b>   -  person hankd    schedule 09.11.2013
comment
Ага, а это значит, что это должно занять столько же времени, верно?   -  person Jessica    schedule 09.11.2013
comment
Дейкстра является частным случаем A *. Когда h не дает информации, сложность такая же. См. Предыдущий ответ в SO   -  person Louis Hugues    schedule 09.11.2013
comment
Временная сложность обоих алгоритмов одинакова. Первый учитывает только количество ребер, которые необходимо расширить, а второй также включает временную сложность использования очереди с приоритетами. Это сравнение яблок с апельсинами.   -  person BlueRaja - Danny Pflughoeft    schedule 09.11.2013


Ответы (2)


Я думаю, что временная сложность A *, указанная в Википедии, неверна (или, по крайней мере, вводит в заблуждение). Эта временная сложность, по-видимому, учитывает только количество расширенных состояний при поиске, а не время, необходимое для определения того, какие состояния исследовать.

Чтобы быть эффективным, поиск A * должен хранить очередь приоритетов, содержащую, какие узлы на периферии должны быть исследованы, и он должен иметь возможность вызывать кнопку уменьшения для этих приоритетов. Время выполнения для этого в худшем случае составляет O (n log n + m), если реализовано с использованием очереди с хорошим приоритетом. Следовательно, в худшем случае можно ожидать, что A * перейдет в алгоритм Дейкстры. При хорошей эвристике A * не будет расширять все узлы и ребра, как алгоритм Дейкстры, что является основной причиной того, почему A * работает быстрее.

Конечно, временная сложность поиска A * должна учитывать затраты на вычисление эвристики. Некоторые сложные эвристики могут быть не вычислимы за время O (1), и в этом случае время выполнения для A * может быть хуже, чем алгоритм Дейкстры.

Надеюсь это поможет!

person templatetypedef    schedule 08.11.2013

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

person Dale Myers    schedule 08.11.2013