Algoritmusok és Adatszerkezetek I. Feszítőfák és legrövidebb utak 2018. november 13.
Minimális feszítőfák
Feszítőfa Telefon, út stb. hálózat vagy elektromos áramkör tervezése
Minimális feszítőfa probléma (Minimum Spanning Tree, MST) Bemenet: összefüggő, irányítatlan, súlyozott G=(V,E) gráf. A w(u,v) súly az (u,v) él költségét fejezi ki. Kimenet: Egy T feszítőfa, amire minimális Feszítőfa: minden csúcsot érintő, összefüggő, körmentes élhalmaz (fa)
Minimális feszítőfa
Kruskal algoritmus Minimális fák erdejét tároljuk Kezdetben minden pont egy külön fa Minden lépésben a legkisebb, két fát összekötő élt húzzuk be (egyesítjük egyetlen fává a két fát) Mohó algoritmus! https://visualgo.net/en/mst
Kruskal algoritmus O(ElogE) O(logE) össz futásidő: O(ElogE)
Kruskal helyessége véges lépésben véget ér eredmény élhalmaz: minden V csúcsot érint körmentes összefüggő minimális költségű (bizonyítások)
Prim algoritmus egyetlen fát növesztünk tetszőleges gyökérpontból indulva minden lépésben új csúcsot kötünk be a fába legolcsóbb éllel elérhető csúcsot választjuk Mohó algoritmus!
Prim algoritmus gyökérpont össz futásidő: O(VlogV+ElogV) = O(ElogV) ha V<E fában nem szereplő csúcsok prioritási sora a legközelebbi fapont szerint O(logV) O(logV)
Kruskal vs Prim Kruskal O(ElogE) (ha E<V2 logE=O(logV) → O(ElogV)) Prim O(ElogV) (tovább gyorsítható O(E+VlogV)) Sűrű gráfok esetén (E nagy) Prim előnyösebb, egyébként Kruskal egyszerűbb adatszerkezetet használ
Adott csúcsból induló legrövidebb utak
Legrövidebb utak probléma Bemenet: irányított, súlyozott G=(V,E) gráf és egy s kezdőcsúcs. A w(u,v) súly az (u,v) él költségét fejezi ki. Kimenet: Minden V csúcshoz a legrövidebb út s-ből indulva
Dijsktra algoritmusa azokat a csúcsokat tárolja amihez már megtalálta a legrövidebb utat minden lépésben egyel bővíti az elért csúcsok halmazát legkisebb legrövidebb úttal bíró csúcsot választja Mohó algoritmus! https://visualgo.net/en/sssp
Dijsktra algoritmusa
Dijsktra algoritmusa össz futásidő: O(ElogV) fában nem szereplő csúcsok prioritási sora a legrövidebb összúthosszak szerint O(logV)
Dijkstra helyessége
Negatív élsúlyok és körök Körök nem okoznak problémát, de a negatív összsúlyú körök igen!
Negatív élsúlyok és Dijkstra Dijkstra nem ad helyes megoldást negatív élsúlyok esetén
Bellman-Ford algoritmus Negatív élsúlyok mellett is működik Ha elérhető negatív kör a kezdőcsúcsból akkor azt észreveszi Egy iterációban minden élen megpróbálunk javítani V-1 iterációra van szükség legrosszabb esetben
Bellman-Ford algoritmus O(VE)
Legrövidebb utak minden csúcspárra
Legrövidebb utak minden pontpárra Dijsktra minden kezdőpontból: O(VElogV) Bellman-Ford minden kezdőpontból: O(V2E)
Floyd-Warshall algoritmus Dinamikus programozás d mátrix dij eleme az ismert legrövidebb út i-ből j-be dinamikus programozással a belső csúcsként használható csúcsokat bővítjük
Floyd-Warshall algoritmus O(V3)
Legrövidebb utak minden pontpárra Ha nincsenek negatív élsúlyok és ritka a gráf akkor Dijsktra minden kezdőpontból O(VElogV) Ha vannak negatív élsúlyok, de nincsenek negatív összköltségű körök vagy sűrű a gráf akkor Floyd-Warshall O(V3) Ha negatív összköltésgű körök is lehetnek akkor Ford-Bellman minden kezdőcsúcsra O(V2E)
Gráfalgoritmusok Minimális feszítőfák Legrövidebb utak egy csúcsból Kruskal Prim Legrövidebb utak egy csúcsból Dijsktra Bellman-Ford Legrövidebb utak összes pontpárra Floyd-Warshall