Вы можете думать об алгоритме Джикстры как о алгоритме заполнения водой (то есть обрезанном поиске в ширину). На каждом этапе цель состоит в том, чтобы покрыть большую часть всего графа с наименьшим возможным путем. Предположим, у вас есть вершины на краю области, которую вы заполнили, и вы перечислили их в терминах расстояния:
v0 <= v1 <= v2 <= v3 ...
Может ли быть более дешевый способ добраться до вершины v1
? Если это так, путь должен проходить через v0
, поскольку ни одна непроверенная вершина не может быть ближе. Таким образом, вы изучаете вершину v0
, чтобы увидеть, куда можно попасть, проверяя, дешевле ли какой-либо путь через v0
(до любой другой вершины на шаг).
Если вы устраняете проблему таким образом, вы гарантируете, что все ваши расстояния минимальны, потому что вы всегда проверяете именно ту вершину, которая может привести к кратчайшему пути. Либо вы найдете этот кратчайший путь, либо исключаете его и переходите к следующей вершине. Таким образом, вы гарантированно потребляете одну вершину за шаг.
И вы останавливаетесь, не выполняя больше работы, чем нужно, потому что вы останавливаетесь, когда вершина назначения занимает «Я самый маленький» слот v0
.
Давайте посмотрим на краткий пример. Предположим, мы пытаемся получить умножение от 1
до 12
, а стоимость между узлами - это число, на которое нужно умножить. (Мы ограничим вершины числами от 1
до 12
.)
Мы начинаем с 1
, и мы можем добраться до любого другого узла, умножив его на это значение. Таким образом, узел 2
имеет стоимость 2
, 3
имеет стоимость 3
, ... 12
имеет стоимость 12
, если выполнить один шаг.
Теперь путь через 2
может (не зная о структуре) достигать 12
быстрее всего, если есть свободная ссылка от 2
до 12
. Нет, но если бы он был, он был бы самым быстрым. Итак, мы проверяем 2
. И мы находим, что мы можем добраться до 4
по стоимости 2
, до 6
за 3
и так далее. Таким образом, у нас есть таблица расходов примерно так:
3 4 5 6 7 8 9 10 11 12 // Vertex
3 4 5 5 7 6 9 7 11 8 // Best cost to get there so far.
Хорошо, теперь, может быть, мы сможем добраться до 12
с 3
бесплатно! Лучше проверь. И мы находим, что 3*2==6
, поэтому стоимость до 6
равна стоимости до 3
плюс 2
, а до 9
плюс 3
, а 12
плюс 4
.
4 5 6 7 8 9 10 11 12
4 5 5 7 6 6 7 11 7
Достаточно справедливо. Теперь мы тестируем 4
и видим, что можем получить 8
для дополнительного 2
и 12
для дополнительного 3
. Опять же, стоимость, чтобы добраться до 12
, таким образом, не превышает 4
+ 3
= 7
:
5 6 7 8 9 10 11 12
5 5 7 6 8 7 11 7
Теперь мы попробуем 5
и 6
- никаких улучшений пока нет. Это оставляет нас с
7 8 9 10 11 12
7 6 8 7 11 7
Теперь мы впервые видим, что стоимость получения 8
на меньше , чем стоимость получения 7
, поэтому нам лучше проверить, что нет бесплатный способ добраться до 12
от 8
. Нет - нет никакого способа попасть туда с целыми числами - поэтому мы его выбрасываем.
7 9 10 11 12
7 8 7 11 7
И теперь мы видим, что 12
такой же дешевый, как и любой оставшийся путь, поэтому стоимость достижения 12
должна составлять 7
. Если бы мы до сих пор отслеживали самый дешевый путь (заменив его только тогда, когда он строго лучше), мы бы обнаружили, что 3*4
- это первый дешевый способ попасть в 12
.