Chiqish natijasi:
Vertex manbadan masofa
0 0
1 4
2 12
3 19
4 21
5 11
6 9
7 8
8 14
Izohlar:
1) Kod eng qisqa masofani hisoblaydi, ammo yo'l to'g'risidagi ma'lumotni hisoblamaydi. Ota-onalar massivini yaratamiz, masofa yangilanganida ota-ona massivini yangilaymiz (masalan, primning bajarilishi kabi ) va undan foydalanib, manbadan turli balandliklargacha eng qisqa yo'lni ko'rsatamiz.
2) Kod yo'naltirilmagan grafik uchun, xuddi shu dijkstra funktsiyasi yo'naltirilgan grafikalar uchun ham ishlatilishi mumkin.
3) Kod manbadan barcha vertikallarga eng qisqa masofani topadi. Agar bizni manbadan bitta maqsadgacha bo'lgan qisqa masofaga qiziqish bildirsa, tanlangan minimal masofa uchi nishonga teng bo'lganda biz halqa sindirishimiz mumkin (algoritmning 3.a qadam).
4) Amalga oshirishning vaqt murakkabligi - O (V ^ 2). Agar kirish grafigi qo'shni ro'yxat yordamida taqdim etilsa , uni ikkilik to'plash yordamida O (E log V) ga kamaytirish mumkin. Qarang
qo'shnilik ro'yxati vakolatxonasi uchun Dijkstra ning Algoritm batafsil ma'lumot uchun.
5) Dijkstraning algoritmi og'irligi qirralari salbiy bo'lgan grafikalar uchun ishlamaydi. Salbiy vazn qirralariga ega grafikalar uchun Bellman-Ford algoritmidan foydalanish mumkin, yaqin orada biz uni alohida post sifatida ko'rib chiqamiz.
2Dijkstra alogoritmi haqida lavha.
Prim algoritmi grafika uchun barcha tugunlarni bog'laydigan va barcha tugunlarni bog'laydigan daraxtlar orasida eng kam xarajat keltiradigan daraxt bo'lgan minimal grafik daraxtini quradi . Biroq, MSTdagi har qanday ikkita tugun orasidagi yo'lning uzunligi asl grafikdagi ushbu ikki tugun orasidagi eng qisqa yo'l bo'lmasligi mumkin. MSTlar foydali bo'ladi, masalan, agar siz grafikadagi tugunlarni elektr energiyasini eng kam xarajat bilan ta'minlash uchun jismonan o'tkazmoqchi bo'lsangiz. Ikkala tugun orasidagi yo'l uzunligi eng maqbul bo'lmasligi muhim emas, chunki siz ularni bog'lab qo'yishingizni istaysiz.
Dijkstra algoritmi ba'zi bir manbali tugunlardan boshlab eng qisqa yo'l daraxtini quradi . Qisqa yo'l daraxti - bu grafikadagi barcha tugunlarni qaytariladigan manba tuguniga bog'laydigan va har qanday yo'lning grafikadagi boshqa tugungacha bo'lgan uzunligi minimallashtirilgan xususiyatdir. Bu foydalidir, masalan, agar siz biron bir muhim muhim joyga etib borishga imkon beradigan darajada yo'l tarmog'ini qurmoqchi bo'lsangiz. Biroq, eng qisqa yo'l daraxti minimal daraxt bo'lishi kafolatlanmaydi va eng qisqa yo'lli daraxtning chekkalari xarajatlari MST narxidan ancha katta bo'lishi mumkin.
Yana bir muhim farq algoritmlarning qaysi grafik turlari ustida ishlashiga bog'liq. Prim algoritmi faqat yo'naltirilmagan grafiklar ustida ishlaydi, chunki MST tushunchasi grafiklarning yo'naltirilmaganligini anglatadi. (Yo'naltirilgan grafikalar uchun "minimal tejamkorlik" deb nomlangan narsa bor, ammo ularni topish algoritmlari ancha murakkab). Dijkstraning algoritmi yo'naltirilgan grafikalarda yaxshi ishlaydi, chunki eng qisqa daraxt daraxtlarini chindan ham yo'naltirish mumkin. Bunga qo'shimcha ravishda, Dijkstra algoritmi salbiy qirralarni o'z ichiga olgan grafiklarda to'g'ri echimni ta'minlamaydi , Prim esa algoritmi bunga qodir.
Men ko'rgan yagona farq shundaki, Prim algoritmi minimal xarajatlar chegarasini saqlaydi, Dijkstra algoritmi esa manba uchidan hozirgi verteksgacha bo'lgan umumiy xarajatlarni saqlaydi.
Dijkstra sizga xarajatlar minimal bo'lishi uchun manba tugunidan maqsad tuguniga yo'l beradi. Ammo Prim algoritmi sizga barcha tugunlar ulanishi va umumiy xarajat minimal bo'lishi uchun minimal daraxtni beradi.
Oddiy so'zlar bilan:
Shunday qilib, agar siz bir nechta shaharlarni ulash uchun poezdni joylashtirmoqchi bo'lsangiz, siz Prim algosidan foydalanasiz. Ammo agar siz bir shahardan ikkinchisiga imkon qadar ko'proq vaqt tejashni istasangiz, Dijkstra algidan foydalangan bo'lar edingiz.
Ikkalasi ham xuddi shunday umumiy algoritm yordamida bajarilishi mumkin:
Inputs:
G: Graph
s: Starting vertex (any for Prim, source for Dijkstra)
f: a function that takes vertices u and v, returns a number
Generic(G, s, f)
Q = Enqueue all V with key = infinity, parent = null
s.key = 0
While Q is not empty
u = dequeue Q
For each v in adj(u)
if v is in Q and v.key > f(u,v)
v.key = f(u,v)
v.parent = u
Prim, pass f = w(u, v)va Dijkstra dovoni uchun f = u.key + w(u, v).
Yana bir qiziq tomoni shundaki, Generic-dan yuqorida "Bread" birinchi qidirishni (BFS) amalga oshirishi mumkin, ammo bu haddan tashqari ko'p bo'lishi mumkin, chunki qimmat ustunlik navbati aslida talab qilinmaydi. Yuqoridagi umumiy algoritmni BFS-ga o'tkazish uchun, f = u.key + 1barcha og'irliklarni 1 ga bog'lash bilan bir xil (masalan, BFS A nuqtadan B ga o'tish uchun zarur bo'lgan minimal qirralarni beradi).
Sezgi
Yuqoridagi umumiy algoritm haqida o'ylashning yaxshi usullaridan biri: A va B ikkita chelakdan boshlaymiz. Dastlab barcha vertikallaringizni B katakchasiga qo'ying. So'ngra biz bitta verteksni B dan A ga o'tkazamiz. Endi A qirralarning B qismidagi kesishgan nuqtalarga qarab, biz kesishgan qirralarning ba'zi bir mezonlaridan foydalangan holda bitta qirrani tanladik va tegishli verteksni B-dan B-ga o'tkazdik. A. Bu jarayonni B bo'sh bo'lmaguncha takrorlang.
Ushbu g'oyani amalga oshirish uchun shafqatsiz kuch usuli bu B tomon kesib o'tgan A vertikal uchlari uchun ustunlarning ustuvor navbatlarini saqlab turishdir. Savol tug'iladi: o'rniga vertikallarning ustuvor navbati saqlanib qoladimi? Bu aslida biz B qaroridan kelib chiqadigan qaysi cho'qqini tanlashimiz mumkin.
Do'stlaringiz bilan baham: |