dijkstra algoritmus minimális költségű feszítőfák fák alulról felfelé

52
Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Upload: wauna

Post on 17-Jan-2016

24 views

Category:

Documents


2 download

DESCRIPTION

Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé. Kupac. 1. 6. 2. 3. 7. 4. 8. 5. A kupac olyan véges elemsokaság, amely rendelkezik az alábbi tulajdonságokkal: - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Dijkstra algoritmus

Minimális költségű feszítőfák

Fák alulról felfelé

Page 2: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Kupac

A kupac olyan véges elemsokaság, amely rendelkezik az alábbi tulajdonságokkal:

1. Minden elemnek legfeljebb két rákövetkezője (leszármazottja) lehet. Azaz bináris fának tekinthető.

2. Minden eleme kisebb (vagy egyenlő) a közvetlen leszármazottainál.

3. A kupac balról folytonos, azaz ha nem teljes a fa, akkor csak a leg-utolsó szintből hiányozhatnak elemek, de azok is csak a szint jobb széléről.

Ezek következménye, hogy ábrázolhatófolytonosan is, tömbben.

12 6

3 4 7 85

Gráfok - fák 23.04.21. 2

Page 3: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Kupac

Műveletei: Üres, üres?, első, Felcsúsztat, Lecsúsztat, Kupacba, KupacbólÜres: Kupacüres?(Kupac): Logikaielső(Kupac): Elem {NemDef}Kupacba(Kupac,Elem): Kupac {NemDef}Kupacból(Kupac,Elem): (Kupac Elem) {NemDef} Felcsúsztat(Kupac,Index):

KupacLecsúsztat(Kupac,Index): KupacGráfok - fák 23.04.21. 3

Page 4: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Kupac

Kupac ábrázolása: Rekord(N: Egész; t: Tömb(1..MaxN:Elemtípus), hiba: Logikai)

Gráfok - fák 23.04.21. 4

Page 5: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Kupac

Műveletek megvalósítása: Üres(K): K.N:=0Eljárás vége.

üres?(K): üres?:=(K.N=0)Függvény vége.

első(K): első:=K.t(1)Függvény vége.

Gráfok - fák 23.04.21. 5

Page 6: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Kupac

13 6

5 4 7 8

12 6

3 4 7 85

Elem berakás: Kupacba([1,3,6,5,4,7,8],2) [1,2,6,3,4,7,8,5]

Elemberakás

13 6

2 4 7 85

13 6

5 4 7 82

Felcsúsztatás:

Gráfok - fák 23.04.21. 6

Page 7: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Kupac

Kupacba(K,e): K.N:=K.N+1; K.t(K.N):=e; Felcsúsztat(K,K.N)Eljárás vége.Felcsúsztat(K,i): Ha i>1 akkor Ha K.t(i)<K.t(i div 2) akkor Csere(K.t(i),K.t(i div 2))

Felcsúsztat(k,i div 2)Eljárás vége.Kupacból(K,e): e:=K.t(1); K.t(1):=K.t(K.N); K.N:=K.N-1Lecsúsztat(K,1)

Eljárás vége.

Gráfok - fák 23.04.21. 7

Page 8: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Kupac

8

12 6

3 4 7

5 „Utolsó előre fuss!”

25 6

3 4 7 8

23 6

5 4 7 8

Előrehozás + lecsúsztatás:

Elemkiolvasás

Elemkivétel: Kupacból([1,2,6,3,4,7,8,5]) (1,[2,3,6,5,4,7,8])

Gráfok - fák 23.04.21. 8

Page 9: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Kupac

Lecsúsztat(K,i): Ha i≤K.N div 2 akkor j:=kisebb(2*i,2*i+1) Ha K.t(i)>K.t(j) akkor Csere(K.t(i),K.t(j)) Lecsúsztat(K,j)Eljárás vége.kisebb(j,k): Ha k>K.N vagy K.t(j)≤K.t(k) akkor kisebb:=j különben kisebb:=kEljárás vége.

3

5 8

6

7

Gráfok - fák 23.04.21. 9

Page 10: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Kupac

Műveletigény:Lecsúsztat = Kupacból: O(log2(N))

Felcsúsztat = Kupacba: O(log2(N))

Használjuk a kupacot rendezésre! Rendezési idő: O(N*log2(N))

Gráfok - fák 23.04.21. 10

Page 11: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Kupacrendezés

Rendez(X): Üres(K) Ciklus i=1-től N-ig Kupacba(K,X(i)) Ciklus vége Ciklus i=1-től N-ig Kupacból(K,X(i)) Ciklus végeEljárás vége.

Gráfok - fák 23.04.21. 11

Page 12: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Prioritási sor

Prioritási sor: speciális sorozatMindig a legfontosabb (minimális vagy maximális) lép ki belőle.

Emlékeztető:időrendbeli tárolás (kb.)Sorba – végére – O(1), Sorból – minimumkiválasztás, majd az utolsó a minimum helyére – O(N)

nagyság szerinti tárolásSorba – beillesztés a helyére – O(N), Sorból – elejéről – O(1)

Gráfok - fák 23.04.21. 12

Page 13: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Prioritási sor

Prioritási sor megvalósítása kupaccalÖtletek:A prioritási sor speciális kupac, ahol elemek sorszámát tá-roljuk, egy prioritás tömbben pedig a prioritásukat. (Ha egyéb jellemzőjük lenne, azt is külön tárolnánk.)

A prioritási sor speciális kupac, ahol az elemek rekordok, s az egyik mezőjük a prioritás.

Gráfok - fák 23.04.21. 13

Page 14: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Prioritási sor

Prioritási sor ábrázolása (kupac+prioritás tömb):

Rekord(N: egész, t: Tömb(1..MaxN: Elemtípus), pr: Tömb(1..MaxN:Egész))Műveletei: Üres, üres?, PrSorba,

PrSorból, első

Megoldás: újraírjuk a kupac műveleteit. Gráfok - fák 23.04.21. 14

Page 15: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Prioritási sor

Műveletek megvalósítása: Üres(P): P.N:=0Eljárás vége.

üres?(P): üres?:=(P.N=0)Függvény vége.

első(K): első:=P.t(1)Függvény vége.

Gráfok - fák 23.04.21. 15

Page 16: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Prioritási sor

PrSorba(P,e,pr): P.N:=P.N+1; P.t(P.N):=e; P.pr(e):=pr Felcsúsztat(P,P.N)Eljárás vége.

PrSorból(P,e,pr): e:=P.t(1); pr:=P.pr(e); P.t(1):=P.t(P.N) P.N:=P.N-1; Lecsúsztat(P,1)Eljárás vége.

Gráfok - fák 23.04.21. 16

Page 17: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Prioritási sor

Felcsúsztat(P,i): Ha i>1 akkor Ha P.pr(P.t(i))<P.pr(P.t(i div 2)) akkor Csere(P.t(i),P.t(i div 2))

Felcsúsztat(k,i div 2)Eljárás vége.

Gráfok - fák 23.04.21. 17

Page 18: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Prioritási sor

Lecsúsztat(P,i): Ha i≤P.N div 2 akkor j:=kisebb(2*i,2*i+1) Ha P.pr(P.t(i))>P.pr(P.t(j)) akkor Csere(P.t(i),P.t(j)) Lecsúsztat(P,j)Eljárás vége.kisebb(j,k): Ha k>P.N vagy P.pr(P.t(j))≤P.pr(P.t(k)) akkor kisebb:=j különben kisebb:=kEljárás vége.

Gráfok - fák 23.04.21. 18

Page 19: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Prioritási sor

Prioritási sor ábrázolása (kupac rekord elemekkel):

Rekord(N: egész, t: Tömb(1..MaxN: Elemtípus)) Elemtípus=Rekord(pr: Egész, egyéb: Egyébtípus)Műveletei: Üres, üres?, PrSorba,

PrSorból, elsőMegoldás: újraírjuk a kupac műveleteit.

Gráfok - fák 23.04.21. 19

Page 20: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Prioritási sor

Műveletek megvalósítása: Üres(P): P.N:=0Eljárás vége.

üres?(P): üres?:=(P.N=0)Függvény vége.

első(K): első:=P.t(1)Függvény vége.

Gráfok - fák 23.04.21. 20

Page 21: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Prioritási sor

PrSorba(P,e): P.N:=P.N+1; P.t(P.N):=e Felcsúsztat(P,P.N)Eljárás vége.

PrSorból(P,e): e:=P.t(1); P.t(1):=P.t(P.N); P.N:=P.N-1 Lecsúsztat(P,1)Eljárás vége.

Gráfok - fák 23.04.21. 21

Page 22: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Prioritási sor

Felcsúsztat(P,i): Ha i>1 akkor Ha P.t(i).pr<P.t(i div 2).pr akkor Csere(P.t(i),P.t(i div 2))

Felcsúsztat(P,i div 2)Eljárás vége.

Gráfok - fák 23.04.21. 22

Page 23: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Prioritási sor

Lecsúsztat(P,i): Ha i≤P.N div 2 akkor j:=kisebb(2*i,2*i+1) Ha P.t(i).pr>P.t(j).pr akkor Csere(P.t(i),P.t(j)) Lecsúsztat(P,j)Eljárás vége.kisebb(j,k): Ha k>P.N vagy P.t(j).pr≤P.t(k).pr akkor kisebb:=j különben kisebb:=kEljárás vége.

Gráfok - fák 23.04.21. 23

Page 24: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Prioritási sor

Prioritási sor megvalósítása kupaccal – értékelés

A prioritási sor speciális kupac, ahol elemek sorszámát tároljuk, egy prioritás tömbben pedig a prioritásukat.

Csak akkor alkalmazható, ha az elemek sorszámozhatók.

Gazdaságos az elemek kupacban való mozgatása miatt.

A prioritási sor speciális kupac, ahol az elemek rekordok, s az egyik mezőjük a prioritás.

Egyszerűbb megvalósítás, nem sorszámozható elemekre is.

Lassú lehet hosszú elemek mozgatása a kupacban.

Gráfok - fák 23.04.21. 24

Page 25: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Prioritási sor

Módosítható prioritási sor ábrázolása (kupac + prioritás tömb + index tömb): Rekord(N: egész, t: Tömb(1..MaxN: Elemtípus), pr: Tömb(1..MaxN: Egész), index: Tömb(1..MaxN: Egész))Műveletei: Üres, üres?, PrSorba, PrSorból, első, Fel, Le

A már sorban levő elemeket prioritásuk megváltozása esetén mozgatni kell.Gráfok - fák 23.04.21. 25

Page 26: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Prioritási sor

Műveletek megvalósítása: Üres(P): P.N:=0Eljárás vége.

üres?(P): üres?:=(P.N=0)Függvény vége.

első(K): első:=P.t(1)Függvény vége.

Gráfok - fák 23.04.21. 26

Page 27: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Prioritási sor

PrSorba(P,e,pr): P.N:=P.N+1; P.t(P.N):=e; P.pr(e):=pr P.index(e):=P.N; Felcsúsztat(P,P.N)Eljárás vége.

PrSorból(P,e,pr): e:=P.t(1); pr:=P.pr(e); P.t(1):=P.t(P.N) P.N:=P.N-1; P.index(P.t(1)):=1; Lecsúsztat(P,1)

Eljárás vége.

Le(P,i): Lecsúsztat(P,P.index(i))Eljárás vége.

Gráfok - fák 23.04.21. 27

Page 28: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Prioritási sor

Lecsúsztat(P,i): Ha i≤P.N div 2 akkor j:=kisebb(2*i,2*i+1) Ha P.pr(P.t(i))>P.pr(P.t(j)) akkor Csere(P.t(i),P.t(j)) P.index(P.t(i)):=i P.index(P.t(j)):=j Lecsúsztat(P,j)Eljárás vége.

Gráfok - fák 23.04.21. 28

Page 29: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Prioritási sor

Fel(P,i): Felcsúsztat(P,P.index(i))Eljárás vége.

Felcsúsztat(P,i): Ha i>1 akkor Ha P.pr(P.t(i))<P.pr(P.t(i div 2)) akkor Csere(P.t(i),P.t(i div 2))

P.index(P.t(i)):=i P.index(P.t(i div 2)):=i div 2 Felcsúsztat(P,i div 2)Eljárás vége.

Gráfok - fák 23.04.21. 29

Page 30: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Szélességi bejárás alkalmazásai

Legrövidebb utak súlyozott gráfbanA szélességi bejárás megadja a legrövidebb utat, ha az út hosszán a benne szereplő élek számát értjük.

Ha az élek összhosszát, akkor azonban nem.Ha minden él pozitív hosszúságú, akkor a kezdő-ponthoz legközelebbi pontba biztosan ismerjük a legrövidebb út hosszát.

A többi pontra pedig ismerjük az odavezető út hosszának egy felső korlátját.

Mi a helyzet a negatív élekkel?

Gráfok - fák 23.04.21. 30

Page 31: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Szélességi bejárás alkalmazásai

Legrövidebb utak súlyozott gráfbanAbból a szürke pontból lépjünk tovább, ami a legköze-lebb van a kezdőponthoz – prioritási sor legelső eleme.

A belőle elérhető pontokra számoljunk új felső korlá-tot:

a fehér pontokra a szürke távolságát megnöveljük az élhosszal – bekerül a prioritási sorba;

a szürke pontokra javítjuk a becslést az új távolsággal, ha lehetséges – mozog a prioritási sorban előre.

Gráfok - fák 23.04.21. 31

Page 32: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Szélességi bejárás alkalmazásai

Szélességi bejárás(p): Szín(p):=szürke; PrSorba(p); Táv(p):=0 Ciklus amíg nem üresPrSor? PrSorból(p); Szín(p):=fekete Ciklus i=1-től Szomszédpontokszáma(p)-ig j:=Szomszéd(p,i) Ha Szín(j)=fehér akkor Táv(j):=Táv(p)+Élhossz(p,j) PrSorba(j); Szín(j):=szürke különben ha Táv(j)>Táv(p)+Élhossz(p,j) akkor Táv(j):=Táv(p)+Élhossz(p,j) PrSorbanMozgat(j); Ciklus vége Ciklus végeEljárás vége.

Gráfok - fák 23.04.21. 32

Page 33: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Dijkstra algoritmus

Dijkstra – legrövidebb utakAlapötlet (pozitív élhosszak esetén): Az összes pont legyen szürke!A kezdőpont távolsága önmagától 0, a többi pont távolsága pedig + – becsült felső korlát!

Vegyük a kezdőponthoz legközelebbi szürkét!Az ő távolsága biztos jó, módosítsuk a belőle kive-zető éleken levő pontok távolságát, ha szükséges!

Gráfok - fák 23.04.21. 33

Page 34: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Dijkstra algoritmus

Legyenek a pontok egy kupaccal ábrázolt prioritásai sorban! Ekkor KiveszMin=PrSorból, Mozgat=Felfelé.

LegrövidebbUtak(p): Táv():=(+,…,+); Szín():=(szürke,…,szürke) Honnan(p):=p; Táv(p):=0 Ciklus i=1-től Pontszám-1-ig KiveszMin(p); Szín(p):=fekete Ciklus j=1-től Szomszédpontokszáma(p)-ig k:=Szomszéd(p,j) Ha Szín(k)≠fekete és Táv(k)>Táv(p)+Élhossz(p,k) akkor Táv(k):=Táv(p)+Élhossz(pont,i) Honnan(k):=p; PrSorbanMozgat(k)

Ciklus vége Ciklus vége

Eljárás vége.

Gráfok - fák 23.04.21. 34

Page 35: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Fák

Bináris fa "fordított" ábrázolása, a levelektől vissza:Ha a bináris fa elemei címezhetőek is (pl. sorszámuk van), akkor elképzelhető egy olyan statikusan láncolt ábrázolás, amikor azt adjuk meg minden elemről, hogy ki van a fában fölötte.Típus BFa=Tömb(1..Max,BFaelem) BFaelem=Rekord(érték: Elemtípus, szülő: 0..Max)

Egy ilyen fára persze másféle művele-teket definiálhatunk.

Gráfok - fák 23.04.21. 35

Page 36: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Fák

Üres(bf): Ciklus i=1-től N-ig bf(i).szülő:=0Ciklus vége

Függvény vége.

Beilleszt(bf,a,b): {a szülője b-nek} bf(b).szülő:=aFüggvény vége.

Gráfok - fák 23.04.21. 36

Page 37: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Fák

Ősszülő(bf,e): Ha bf(e).szülő=0 akkor Ősszülő:=e különben Ősszülő:=Ősszülő(bf,bf(e).szülő)

Függvény vége.

Őse?(bf,utód,ős): Ha utód=ős akkor Őse?:=igaz különben ha bf(utód).szülő=0 akkor Őse?:=hamis különben Őse?:=Őse?(bf,bf(utód).szülő,ős)Függvény vége.

Megjegyzés: egyetlen fa esetén a bf tömb lehet globális változó is.Gráfok - fák 23.04.21. 37

Page 38: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Fák

Ősszülő(bf,e): Ciklus amíg bf(e).szülő≠0 e:=bf(e).szülőCiklus vége

Függvény vége.

Őse?(bf,utód,ős): Ciklus amíg utód≠ős és bf(utód).szülő≠0 utód:=bf(utód).szülőCiklus végeŐse?:=utód=ős

Függvény vége.Ugyanez ciklussal.

Gráfok - fák 23.04.21. 38

Page 39: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Minimális költségű feszítőfa

Ha a gráf nem összefüggő, akkor feszítő erdőről beszélhetünk.

Feszítőfa: Egy irányítatlan gráf azon részgráfja, amely fa (kör-mentes, összefüggő) és maximális (tartalmazza a gráf összes pontját).Minimális költségű feszítőfa: Súlyozott gráf azon feszítőfá-ja, amely éleinek összköltsége minimális.Megjegyzés: A szélességi és a mélységi bejárás is egy-egy feszí-tőfát határoz meg, de nem feltétlenül – sőt általában nem – minimális költségűt.

Gráfok - fák 23.04.21. 39

Page 40: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Minimális költségű feszítőfa

Kruskal algoritmusÖtlet: a feszítőfa kezdetben álljon Pontszám darab feszítő erdőből (mindegyikben 1-1 pont lesz);vegyük az éleket hosszuk szerint növekvő sorrendben;ha egy él a feszítő erdő két különböző feszítőfáját köti össze, akkor biztosan eleme a feszítőfának (mert nincs nála rövidebb, ami a két fát összeköti);az ilyen fákat egyesítsük és vegyük fel az élt a feszítőfa élei közé!Legyen Fa(i) az i pontot tartalmazó feszítőfa azonosítója!

Műveletigény: rendezési idő+O((Élszám+Pontszám)*log2(Pontszám))Gráfok - fák 23.04.21. 40

Page 41: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Minimális költségű feszítőfa

Kruskal algoritmusMinimálisFeszítőfa(F): Üres(F) Ciklus i=1-től PontSzám-ig szülő(i):=i Ciklus vége ÉlekRendezéseHosszSzerint(G) Ciklus e=1-től ÉlSzám-ig i:=Él(e,1); j:=Él(e,2) Ha Fa(i)≠Fa(j) akkor F:=F(i,j); Egyesít(i,j) Ciklus végeEljárás vége. A Fa(i) gyakori művelet,

annyiszor hasz-náljuk, ahány éle van a gráfnak, az Egye-sít pedig ritkább, annyiszor használjuk, ahány pontunk van, azaz az előbbinek kell nagyon hatékonynak lenni.

Gráfok - fák 23.04.21. 41

Page 42: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Diszjunkt halmazfelbontás

Építsünk egy erdőt, amelyben azonos fában vannak az azonos részhalmazban levő elemek:

Egyesít(1,4) hatása: Egyesít(3,4) hatása lehetne:

Mi lehetne Egyesít(3,5)?

Gráfok - fák 23.04.21. 42

Page 43: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Diszjunkt halmazfelbontás

A megoldás: egyesítéskor mindkét fában menjünk a legfelső elemhez és ott hajtsuk végre az egyesítést!

Egyesít(3,5) hatása:

Gráfok - fák 23.04.21. 43

Page 44: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Diszjunkt halmazfelbontás

Egyesít(u,v): Ciklus amíg u≠szülő(u) u:=szülő(u) Ciklus vége Ciklus amíg v≠szülő(v) v:=szülő(v) Ciklus vége Fa(u): szülő(v):=u Ciklus amíg u≠szülő(u)Eljárás vége. u:=szülő(u)

Ciklus vége Fa:=u

Függvény vége.

Gráfok - fák 23.04.21. 44

Page 45: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Diszjunkt halmazfelbontás

Amikor a fában felfelé megyünk, akkor még érdemes a megtett utat tömöríteni, azaz minden bejárt pontot a gyökérhez csatolni:Fa(u): v:=u Ciklus amíg v≠szülő(v) v:=szülő(v) Ciklus vége Ciklus amíg u≠szülő(u) w:=szülő(u); szülő(u):=v; u:=w Ciklus vége Fa:=uFüggvény vége. Ilyenkor az egyesítés is

egyszerűbb lehet, nem kell hozzá ciklus!

Gráfok - fák 23.04.21. 45

Page 46: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Diszjunkt halmazfelbontás

Ugyanez az úttömörítés rekurzívan:Fa(u): Ha u≠szülő(u) akkor F:=Fa(szülő(u)) szülő(u):=F; Fa:=F különben Fa:=uFüggvény vége.Egyesítésként legfeljebb 1 távolságra vagyunk a gyökértől:Egyesít(u,v): Ha u≠szülő(u) akkor u:=szülő(u) Ha v≠szülő(v) akkor v:=szülő(v) szülő(v):=uEljárás vége.

Gráfok - fák 23.04.21. 46

Page 47: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Diszjunkt halmazfelbontás

Fa(6) hatása

A fa magassága így kisebb lehet, ami gyorsíthatja az algoritmust!

Megjegyzés: a két művelet miatt hívják ezt a típust Unió-Holvan típusnak is.Gráfok - fák 23.04.21. 47

Page 48: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Minimális költségű feszítőfa

Prim algoritmusÖtlet: a gráf pontjait 2 halmazba soroljuk, a feszítőfában bent levő és a még azon kívül levő pontok halmazára;a két halmaz közötti legrövidebb él biztosan eleme a feszí-tőfának (mert a legközelebbi pontba vezet);vegyük fel az első halmazhoz legközelebbi pontot a feszítőfa pontjai közé és számoljuk újra a szomszédjai távolságát!Tegyük a második halmazbeli pontokat egy prioritásai sorba, az első halmaztól való távolságuk sorrendjében!

Műveletigény:O((Élszám+Pontszám)*log2(Pontszám))Gráfok - fák 23.04.21. 48

Page 49: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Minimális költségű feszítőfa

Prim algoritmusMinimálisFeszítőfa(Honnan): Táv(1..PontSzám):=+; PrSorba az összes pont p:=1; Honnan(p):=p; Ciklus i=1-től PontSzám-1-ig PrSorból(p); Táv(p):=0 Ciklus j=1-től SzomszédPontokSzáma(p)-ig s:=SzomszédPont(pt,j) Ha Táv(s)>0 és ÉlHossz(p,s)<Táv(s)

akkor Táv(s):=ÉlHossz(p,s) Honnan(s):=p; PrSorbanElőre(s) Ciklus vége Ciklus végeEljárás vége.

Gráfok - fák 23.04.21. 49

Page 50: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Online feszítőfa

Ötlet: kezdetben minden pont külön feszítőfában van;olvassuk egyesével a gráf éleit;ha különböző feszítőfabeli pontokat köt össze, akkor egyesítsük a két feszítőfát;ha azonos feszítőfabeli pontokat köt össze, akkor a köztük levő út leghosszabb élét cseréljük le rá, amennyiben rövidebb nála!Legyen Fa(i) az i pontot tartalmazó feszítőfa azonosítója!

Gráfok - fák 23.04.21. 50

Page 51: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Online feszítőfa

MinimálisFeszítőfa(F): Üres(F); Fa():=(1,2,…,Pontszám) Ciklus e=1-től ÉlSzám-ig Be: i,j,Hossz(i,j) Ha Fa(i)≠Fa(j) akkor F:=F(i,j); Egyesít(i,j) különben Útkeresés(i,j, li,lj) Ha Hossz(i,j)<Hossz(li,lj) akkor F:=F-(li,lj); F:=F(i,j) Ciklus végeEljárás vége.

Gráfok - fák 23.04.21. 51

Page 52: Dijkstra algoritmus Minimális költségű feszítőfák Fák alulról felfelé

Dijkstra algoritmus

Minimális költségű feszítőfák

Fák alulról felfelé