Алгоритм Дейкстри — алгоритм на графах, відкритий Дейкстрою. Знаходить найкоротший шлях від однієї вершини графу до всіх інших вершин. Класичний алгоритм Дейкстри працює тільки для графів без ребер від'ємної довжини.
Клас | Алгоритм пошуку |
---|---|
Структура даних | Граф |
Найгірша швидкодія |
Формулювання задачі
Варіант 1. Дана мережа автомобільних доріг, що з'єднують міста Львівської області. Знайти найкоротшу відстань від Львова до кожного міста області, якщо рухатись можна тільки по дорогах.
Варіант 2. Дана карта велосипедних доріжок Латвії та Білорусі. Знайти мінімальну відстань, яку треба проїхати, щоб дістатися від Риги до Бобруйська.
Варіант 3. Є план міста з нанесеними на нього місцями розміщення пожежних частин. Знайти найближчу до кожного дому пожежну станцію.
Абстракція
Дано неорієнтований зв'язний граф G(V, U). Знайти відстань від вершини a до всіх інших вершин V.
Інтуїтивне пояснення
Зберігатимемо поточну мінімальну відстань до всіх вершин V (від даної вершини a) і на кожному кроці алгоритму намагатимемося зменшити цю відстань. Спочатку встановимо відстані до всіх вершин рівними нескінченості, а до вершини а — нулю. Розглянемо виконання алгоритму на прикладі. Хай потрібно знайти відстані від 1-ї вершини до всіх інших. Кружечками позначені вершини, лініями — шляхи між ними («дуги»). Над дугами позначена їх «ціна» — довжина шляху. Надписом над кружечком позначена поточна найкоротша відстань до вершини.
Крок 1
Ініціалізація. Відстань до всіх вершин графу V = . Відстань до а = 0. Жодної вершини графу ще не опрацьовано.
Крок 2
Знаходимо таку вершину (із ще не опрацьованих), поточна найкоротша відстань до якої мінімальна. В нашому випадку це вершина 1. Обходимо всіх її сусідів і, якщо шлях в сусідню вершину через 1 менший за поточний мінімальний шлях в цю сусідню вершину, то запам'ятовуємо цей новий, коротший шлях як поточний найкоротший шлях до сусіда.
Крок 3
Перший по порядку сусід 1-ї вершини — 2-а вершина. Шлях до неї через 1-у вершину дорівнює найкоротшій відстані до 1-ї вершини + довжина дуги між 1-ю та 2-ю вершиною, тобто 0 + 7 = 7. Це менше поточного найкоротшого шляху до 2-ї вершини, тому найкоротший шлях до 2-ї вершини дорівнює 7.
Кроки 4, 5
Аналогічну операцію проробляємо з двома іншими сусідами 1-ї вершини — 3-ю та 6-ю.
Крок 6
Всі сусіди вершини 1 перевірені. Поточна мінімальна відстань до вершини 1 вважається остаточною і обговоренню не підлягає (те, що це дійсно так, вперше довів Дейкстра). Тому викреслимо її з графу, щоб відмітити цей факт.
Крок 7
Практично відбувається повернення до кроку 2. Знову знаходимо «найближчу» необроблену (невикреслену) вершину. Це вершина 2 з поточною найкоротшою відстанню до неї = 7. І знову намагаємося зменшити відстань до всіх сусідів 2-ї вершини, намагаючись пройти в них через 2-у. Сусідами 2-ї вершини є 1, 3, 4.
Крок 8
Перший (по порядку) сусід вершини № 2 — 1-ша вершина. Але вона вже оброблена (або викреслена — див. крок 6). Тому з 1-ю вершиною нічого не робимо.
Крок 8 (з іншими вхідними даними)
Інший сусід вершини 2 — вершина 4. Якщо йти в неї через 2-у, то шлях буде = найкоротша відстань до 2-ї + відстань між 2-ю і 4-ю вершинами = 7 + 15 = 22. Оскільки 22 < ∞, встановлюємо відстань до вершини № 4 рівним 22.
Крок 9
Ще один сусід вершини 2 — вершина 3. Якщо йти в неї через 2-у, то шлях буде = 7 + 10 = 17. Але 17 більше за відстань, що вже запам'ятали раніше до вершини № 3 і дорівнює 9, тому поточну відстань до 3-ї вершини не міняємо.
Крок 10
Всі сусіди вершини 2 переглянуті, заморожуємо відстань до неї і викреслюємо її з графу.
Кроки 11 — 15
По вже «відпрацьованій» схемі повторюємо кроки 2 — 6. Тепер «найближчою» виявляється вершина № 3. Після її «обробки» отримаємо такі результати:
Наступні кроки
Проробляємо те саме з вершинами, що залишилися (№ по порядку: 6, 4 і 5).
Завершення виконання алгоритму
Алгоритм закінчує роботу, коли викреслені всі вершини. Результат його роботи видно на останньому малюнку: найкоротший шлях від 1-ї вершини до 2-ї становить 7, до 3-ї — 9, до 4-ї — 20, до 5-ї — 20, до 6-ї — 11 умовних одиниць.
Найпростіша реалізація
Найпростіша реалізація алгоритму Дейкстри потребує дій. У ній використовується масив відстаней та масив позначок. На початку алгоритму відстані заповнюються великим додатнім числом (більшим максимального можливого шляху в графі), а масив позначок заповнюється нулями. Потім відстань для початкової вершини вважається рівною нулю і запускається основний цикл.
На кожному кроці циклу ми шукаємо вершину з мінімальною відстанню і прапором рівним нулю. Потім ми встановлюємо в ній позначку 1 і перевіряємо всі сусідні з нею вершини. Якщо в ній відстань більша, ніж сума відстані до поточної вершини і довжини ребра, то зменшуємо його. Цикл завершується коли позначки всіх вершин стають рівними 1.
У математичних термінах
Нехай u — вершина, від якої шукаються відстані, V — множина вершин графу, di — відстань від вершини u до вершини i, , w(i, j) — вага «ребра» (i, j).
Алгоритм:
1. Множина вершин U, до яких відстань відома, встановлюється рівною {u}.
2. Якщо U=V, алгоритм завершено.
3. Потенційні відстані Di до вершин з V\U встановлюються нескінченними.
4. Для всіх ребер (i, j), де i∈U та j∈V\U, якщо Dj>di+w(i, j), то Dj присвоюється di+w(i, j).
5. Шукається i∈V\U, при якому Di мінімальне.
6. Якщо Di дорівнює нескінченності, алгоритм завершено. В іншому випадку di присвоюється значення Di, U присвоюється U∪{i} і виконується перехід до кроку 2.
Див. також
Посилання
Вікісховище має мультимедійні дані за темою: Алгоритм Дейкстри |
- Пояслення алгоритму Дейкстри [ 9 липня 2021 у Wayback Machine.] на каналі "Computerphile" на YouTube (англ.)
- algolist.manual.ru [ 5 грудня 2006 у Wayback Machine.]
- на сайті університету Окланда (англ.)
- C. Анисимов. Как построить кратчайший маршрут между двумя точками. [ 26 листопада 2010 у Wayback Machine.]
- Реализация простейшего варианта алгоритма Дейкстры на e-maxx.ru [ 20 серпня 2010 у Wayback Machine.]
- Реализация варианта алгоритма Дейкстры для разреженных графов на e-maxx.ru [ 20 серпня 2010 у Wayback Machine.]
- Реализация на основе очереди с приоритетами на C++ [ 26 серпня 2010 у Wayback Machine.]
- Реализация на основе очереди с приоритетами на Java [ 11 лютого 2011 у Wayback Machine.]
- Алгоритм Дейкстри з прикладами - mathros.net.ua
Це незавершена стаття про алгоритми. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Algoritm Dejkstri algoritm na grafah vidkritij Dejkstroyu Znahodit najkorotshij shlyah vid odniyeyi vershini grafu do vsih inshih vershin Klasichnij algoritm Dejkstri pracyuye tilki dlya grafiv bez reber vid yemnoyi dovzhini Algoritm DejkstriKlasAlgoritm poshukuStruktura danihGrafNajgirsha shvidkodiyaO E V log V displaystyle O E V log V Formulyuvannya zadachiVariant 1 Dana merezha avtomobilnih dorig sho z yednuyut mista Lvivskoyi oblasti Znajti najkorotshu vidstan vid Lvova do kozhnogo mista oblasti yaksho ruhatis mozhna tilki po dorogah Variant 2 Dana karta velosipednih dorizhok Latviyi ta Bilorusi Znajti minimalnu vidstan yaku treba proyihati shob distatisya vid Rigi do Bobrujska Variant 3 Ye plan mista z nanesenimi na nogo miscyami rozmishennya pozhezhnih chastin Znajti najblizhchu do kozhnogo domu pozhezhnu stanciyu AbstrakciyaDano neoriyentovanij zv yaznij graf G V U Znajti vidstan vid vershini a do vsih inshih vershin V Intuyitivne poyasnennyaZberigatimemo potochnu minimalnu vidstan do vsih vershin V vid danoyi vershini a i na kozhnomu kroci algoritmu namagatimemosya zmenshiti cyu vidstan Spochatku vstanovimo vidstani do vsih vershin rivnimi neskinchenosti a do vershini a nulyu Rozglyanemo vikonannya algoritmu na prikladi Haj potribno znajti vidstani vid 1 yi vershini do vsih inshih Kruzhechkami poznacheni vershini liniyami shlyahi mizh nimi dugi Nad dugami poznachena yih cina dovzhina shlyahu Nadpisom nad kruzhechkom poznachena potochna najkorotsha vidstan do vershini Krok 1 Inicializaciya Vidstan do vsih vershin grafu V displaystyle infty Vidstan do a 0 Zhodnoyi vershini grafu she ne opracovano Krok 2 Znahodimo taku vershinu iz she ne opracovanih potochna najkorotsha vidstan do yakoyi minimalna V nashomu vipadku ce vershina 1 Obhodimo vsih yiyi susidiv i yaksho shlyah v susidnyu vershinu cherez 1 menshij za potochnij minimalnij shlyah v cyu susidnyu vershinu to zapam yatovuyemo cej novij korotshij shlyah yak potochnij najkorotshij shlyah do susida Krok 3 Pershij po poryadku susid 1 yi vershini 2 a vershina Shlyah do neyi cherez 1 u vershinu dorivnyuye najkorotshij vidstani do 1 yi vershini dovzhina dugi mizh 1 yu ta 2 yu vershinoyu tobto 0 7 7 Ce menshe potochnogo najkorotshogo shlyahu do 2 yi vershini tomu najkorotshij shlyah do 2 yi vershini dorivnyuye 7 Kroki 4 5 Analogichnu operaciyu proroblyayemo z dvoma inshimi susidami 1 yi vershini 3 yu ta 6 yu Krok 6 Vsi susidi vershini 1 perevireni Potochna minimalna vidstan do vershini 1 vvazhayetsya ostatochnoyu i obgovorennyu ne pidlyagaye te sho ce dijsno tak vpershe doviv Dejkstra Tomu vikreslimo yiyi z grafu shob vidmititi cej fakt Krok 7 Praktichno vidbuvayetsya povernennya do kroku 2 Znovu znahodimo najblizhchu neobroblenu nevikreslenu vershinu Ce vershina 2 z potochnoyu najkorotshoyu vidstannyu do neyi 7 I znovu namagayemosya zmenshiti vidstan do vsih susidiv 2 yi vershini namagayuchis projti v nih cherez 2 u Susidami 2 yi vershini ye 1 3 4 Krok 8 Pershij po poryadku susid vershini 2 1 sha vershina Ale vona vzhe obroblena abo vikreslena div krok 6 Tomu z 1 yu vershinoyu nichogo ne robimo Krok 8 z inshimi vhidnimi danimi Inshij susid vershini 2 vershina 4 Yaksho jti v neyi cherez 2 u to shlyah bude najkorotsha vidstan do 2 yi vidstan mizh 2 yu i 4 yu vershinami 7 15 22 Oskilki 22 lt vstanovlyuyemo vidstan do vershini 4 rivnim 22 Krok 9 She odin susid vershini 2 vershina 3 Yaksho jti v neyi cherez 2 u to shlyah bude 7 10 17 Ale 17 bilshe za vidstan sho vzhe zapam yatali ranishe do vershini 3 i dorivnyuye 9 tomu potochnu vidstan do 3 yi vershini ne minyayemo Krok 10 Vsi susidi vershini 2 pereglyanuti zamorozhuyemo vidstan do neyi i vikreslyuyemo yiyi z grafu Kroki 11 15 Po vzhe vidpracovanij shemi povtoryuyemo kroki 2 6 Teper najblizhchoyu viyavlyayetsya vershina 3 Pislya yiyi obrobki otrimayemo taki rezultati Nastupni kroki Proroblyayemo te same z vershinami sho zalishilisya po poryadku 6 4 i 5 Zavershennya vikonannya algoritmu Algoritm zakinchuye robotu koli vikresleni vsi vershini Rezultat jogo roboti vidno na ostannomu malyunku najkorotshij shlyah vid 1 yi vershini do 2 yi stanovit 7 do 3 yi 9 do 4 yi 20 do 5 yi 20 do 6 yi 11 umovnih odinic Najprostisha realizaciyaNajprostisha realizaciya algoritmu Dejkstri potrebuye O V 2 displaystyle O V 2 dij U nij vikoristovuyetsya masiv vidstanej ta masiv poznachok Na pochatku algoritmu vidstani zapovnyuyutsya velikim dodatnim chislom bilshim maksimalnogo mozhlivogo shlyahu v grafi a masiv poznachok zapovnyuyetsya nulyami Potim vidstan dlya pochatkovoyi vershini vvazhayetsya rivnoyu nulyu i zapuskayetsya osnovnij cikl Na kozhnomu kroci ciklu mi shukayemo vershinu z minimalnoyu vidstannyu i praporom rivnim nulyu Potim mi vstanovlyuyemo v nij poznachku 1 i pereviryayemo vsi susidni z neyu vershini Yaksho v nij vidstan bilsha nizh suma vidstani do potochnoyi vershini i dovzhini rebra to zmenshuyemo jogo Cikl zavershuyetsya koli poznachki vsih vershin stayut rivnimi 1 U matematichnih terminahNehaj u vershina vid yakoyi shukayutsya vidstani V mnozhina vershin grafu di vidstan vid vershini u do vershini i w i j vaga rebra i j Algoritm 1 Mnozhina vershin U do yakih vidstan vidoma vstanovlyuyetsya rivnoyu u 2 Yaksho U V algoritm zaversheno 3 Potencijni vidstani Di do vershin z V U vstanovlyuyutsya neskinchennimi 4 Dlya vsih reber i j de i U ta j V U yaksho Dj gt di w i j to Dj prisvoyuyetsya di w i j 5 Shukayetsya i V U pri yakomu Di minimalne 6 Yaksho Di dorivnyuye neskinchennosti algoritm zaversheno V inshomu vipadku di prisvoyuyetsya znachennya Di U prisvoyuyetsya U i i vikonuyetsya perehid do kroku 2 Div takozhZadacha komivoyazhera Algoritm poshuku A PosilannyaVikishovishe maye multimedijni dani za temoyu Algoritm Dejkstri Poyaslennya algoritmu Dejkstri 9 lipnya 2021 u Wayback Machine na kanali Computerphile na YouTube angl algolist manual ru 5 grudnya 2006 u Wayback Machine na sajti universitetu Oklanda angl C Anisimov Kak postroit kratchajshij marshrut mezhdu dvumya tochkami 26 listopada 2010 u Wayback Machine Realizaciya prostejshego varianta algoritma Dejkstry na e maxx ru 20 serpnya 2010 u Wayback Machine Realizaciya varianta algoritma Dejkstry dlya razrezhennyh grafov na e maxx ru 20 serpnya 2010 u Wayback Machine Realizaciya na osnove ocheredi s prioritetami na C 26 serpnya 2010 u Wayback Machine Realizaciya na osnove ocheredi s prioritetami na Java 11 lyutogo 2011 u Wayback Machine Algoritm Dejkstri z prikladami mathros net ua Ce nezavershena stattya pro algoritmi Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi