Skip to content

Commit f41e6ab

Browse files
committed
Add Dijkstra algorithm illustrations and explanations
1 parent 0627034 commit f41e6ab

File tree

2 files changed

+134
-1
lines changed

2 files changed

+134
-1
lines changed

src/algorithms/graph/dijkstra/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# Dijkstra's Algorithm
22

33
_Read this in other languages:_
4-
[_한국어_](README.ko-KR.md)
4+
[_한국어_](README.ko-KR.md),
5+
[_Українська_](README.uk-UA.md)
56

67
Dijkstra's algorithm is an algorithm for finding the shortest
78
paths between nodes in a graph, which may represent, for example,
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
# Алгоритм Дейкстри
2+
3+
_Читайте іншими мовами:_
4+
[_English_](README.md),
5+
[_한국어_](README.ko-KR.md)
6+
7+
Алгоритм Дейкстри — це алгоритм пошуку найкоротших шляхів між вершинами графа, який може представляти, наприклад, дорожню мережу.
8+
9+
Існує багато варіантів цього алгоритму; оригінальний варіант Дейкстри знаходив найкоротший шлях між двома вершинами, але більш поширений варіант фіксує одну вершину як «джерело» і знаходить найкоротші шляхи від неї до всіх інших вершин графа, утворюючи дерево найкоротших шляхів.
10+
11+
![Dijkstra](https://upload.wikimedia.org/wikipedia/commons/5/57/Dijkstra_Animation.gif)
12+
13+
Алгоритм Дейкстри для пошуку найкоротшого шляху між `a` та `b`.
14+
Він вибирає непереглянуту вершину з найменшою відстанню, обчислює відстань через неї до кожного непереглянутого сусіда й оновлює відстань до сусіда, якщо вона менша. Коли всі сусіди опрацьовані — вершина позначається як відвідана (червоним кольором).
15+
16+
## Практичні застосування алгоритму Дейкстри
17+
18+
- GPS / навігаційні системи
19+
- Оптимізація маршрутів громадського транспорту та авіаліній
20+
- Інтернет-маршрутизація (протоколи OSPF, IS-IS)
21+
- Оптимізація мережевого трафіку та затримок
22+
- Пошук шляху в іграх (найкоротший шлях на карті)
23+
- Оптимізація маршрутів доставки
24+
- Проєктування логістичних та транспортних мереж
25+
26+
## Покроковий приклад алгоритму Дейкстри
27+
28+
Припустімо, ми маємо зважений граф вершин, де кожне ребро має певну довжину. Наприклад, відстань між вершинами `A` і `B` становить `7 метрів` (або просто `7m`).
29+
30+
Алгоритм використовує [чергу з пріоритетом](../../../data-structures/priority-queue/), щоб завжди вибирати наступну непереглянуту вершину з найменшою відстанню від початкової вершини.
31+
32+
Початкова вершина, за визначенням, має відстань `0m` від самої себе. З неї й починається пошук — вона єдина в черзі на початку.
33+
34+
Решта вершин додаються до черги з пріоритетом пізніше, у процесі обходу графа (під час відвідування сусідів).
35+
36+
![Dijkstra step 1](./images/dijkstra-01.png)
37+
38+
Кожен сусід витягнутої з черги вершини перевіряється для обчислення відстані до нього від початкової вершини. Наприклад, відстань від `A` до `B` — це `0m + 7m = 7m`.
39+
40+
Щоразу, коли ми відвідуємо нового (ще не баченого) сусіда, ми додаємо його в чергу з пріоритетом, де пріоритет — це відстань до цієї вершини від початкової.
41+
42+
Вершину `B` додаємо до мінімальної черги з пріоритетом, щоб відвідати її пізніше.
43+
44+
![Dijkstra step 2](./images/dijkstra-02.png)
45+
46+
Відвідуємо наступного сусіда `C` вершини `A`. Відстань від `A` до `C` становить `0m + 9m = 9m`.
47+
48+
Додаємо вершину `C` до мінімальної черги з пріоритетом.
49+
50+
![Dijkstra step 3](./images/dijkstra-03.png)
51+
52+
Те саме робимо для вершини `F`. Поточна відстань від `A` до `F``0m + 14m = 14m`.
53+
54+
Вершину `F` додаємо до черги для подальшого обходу.
55+
56+
![Dijkstra step 4](./images/dijkstra-04.png)
57+
58+
Коли всі сусіди поточної вершини перевірені, ми додаємо її до множини `visited`. Такі вершини більше не відвідуємо.
59+
60+
Тепер вибираємо з черги наступну вершину, найближчу до початкової, і починаємо відвідувати її сусідів.
61+
62+
![Dijkstra step 5](./images/dijkstra-05.png)
63+
64+
Якщо вершина, яку ми відвідуємо (наприклад, `C`), уже є в черзі, це означає, що відстань до неї вже обчислювалася раніше з іншого шляху (`A → C`). Якщо нова відстань (через інший шлях, наприклад `A → B → C`) менша, ми оновлюємо її в черзі. Якщо більша — залишаємо без змін.
65+
66+
Під час відвідування `C` через `B` (`A → B → C`), відстань дорівнює `7m + 10m = 17m`. Це більше, ніж уже відома `9m` для шляху `A → C`. Тож ми ігноруємо довший шлях.
67+
68+
![Dijkstra step 6](./images/dijkstra-06.png)
69+
70+
Відвідуємо іншого сусіда `B` — вершину `D`. Відстань до `D` дорівнює `7m + 15m = 22m`.
71+
Оскільки `D` ще не відвідано і її немає в черзі, додаємо її з пріоритетом `22m`.
72+
73+
![Dijkstra step 7](./images/dijkstra-07.png)
74+
75+
Тепер усіх сусідів `B` відвідано, тож додаємо `B` до множини `visited`.
76+
Наступною вибираємо вершину, що найближча до початкової.
77+
78+
![Dijkstra step 8](./images/dijkstra-08.png)
79+
80+
Відвідуємо непереглянутих сусідів вершини `C`.
81+
Відстань до вершини `F` через `C` (`A → C → F`) дорівнює `9m + 2m = 11m`.
82+
Це коротше за попередній шлях `A → F` довжиною `14m`.
83+
Тому оновлюємо відстань до `F` — з `14m` до `11m`. Ми щойно знайшли коротший шлях.
84+
85+
![Dijkstra step 9](./images/dijkstra-09.png)
86+
87+
Так само для `D`: шлях `A → C → D` коротший за `A → B → D`.
88+
Оновлюємо відстань з `22m` до `20m`.
89+
90+
![Dijkstra step 10](./images/dijkstra-10.png)
91+
92+
Усі сусіди `C` пройдені, додаємо її до `visited`.
93+
Дістаємо з черги наступну найближчу вершину — `F`.
94+
95+
![Dijkstra step 11](./images/dijkstra-11.png)
96+
97+
Записуємо відстань до `E`: `11m + 9m = 20m`.
98+
99+
![Dijkstra step 12](./images/dijkstra-12.png)
100+
101+
Додаємо `F` до множини `visited`, далі дістаємо `D`.
102+
103+
![Dijkstra step 13](./images/dijkstra-13.png)
104+
105+
Відстань до `E` через `D`: `20m + 6m = 26m`.
106+
Це більше, ніж уже обчислені `20m` через `F`, тому ігноруємо довший шлях.
107+
108+
![Dijkstra step 14](./images/dijkstra-14.png)
109+
110+
Вершину `D` відвідано.
111+
112+
![Dijkstra step 15](./images/dijkstra-15.png)
113+
114+
Вершину `E` також відвідано. Обхід графа завершено.
115+
116+
![Dijkstra step 16](./images/dijkstra-16.png)
117+
118+
Тепер ми знаємо найкоротші відстані до кожної вершини від початкової `A`.
119+
120+
На практиці під час обчислення відстаней також зберігаються `previousVertices` — попередні вершини, щоб можна було відновити повний шлях.
121+
122+
Наприклад, найкоротший шлях від `A` до `E` — це `A → C → F → E`.
123+
124+
## Приклад реалізації
125+
126+
- [dijkstra.js](./dijkstra.js)
127+
128+
## Джерела
129+
130+
- [Вікіпедія](https://uk.wikipedia.org/wiki/Алгоритм_Дейкстри)
131+
- [Відео на YouTube від Nathaniel Fan](https://www.youtube.com/watch?v=gdmfOwyQlcI&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8)
132+
- [Відео на YouTube від Tushar Roy](https://www.youtube.com/watch?v=lAXZGERcDf4&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8)

0 commit comments

Comments
 (0)