Elmaradó óra A jövő heti, november 0-dikei óra elmarad. Minimális feszítőfák Legyen G = (V,E,c), c : E R + egy súlyozott irányítatlan gráf. Terjesszük ki a súlyfüggvényt a T E élhalmazokra: C(T ) = (u,v) T c(u,v) Az F = (V,T) gráf minimális feszitőfája G-nek, ha F feszitőfája G-nek, és C(T) minimális Legyen A F valamely (V,F) minimális feszítőfára, és (u,v) E. Definíció (u,v) biztonságos él A-ra nézve, ha A {(u,v)} is része valamely minimális feszítőfának. Elvi algoritmus A := /0 While A nem feszítőfa (u,v) biztonságos él keresése; A := A {(u,v)} Definíció: A G = (V,E) gráf vágása: (S,V \ S), ahol S V ; Definíció: (u,v) E keresztél az (S,V \ S) vágásra, ha u S és v V \ S, vagy u V \ S és v S. Az (S,V \ S) vágás elkerüli az A E élhalmazt, ha A-ban nincs keresztél. Definíció: (u,v) könnyű él az (S,V \ S) vágásra, ha a legkisebb c-értékű (súlyú) keresztél. Tétel: Ha A része a G = (V,E,c) valamely minimális feszítőfájának és elkerüli az (S,V \ S) vágást, továbbá (u, v) könnyű él az (S,V \ S) vágásra, akkor (u,v) biztonságos él A-ra nézve. Bizonyítás: Legyen T = (V,F) egy olyan minimális feszítőfa, amelyre A F. Ha (u,v) F, akkor az állítás nyilvánvaló. Ha (u,v) / F, akkor (u,v)-t hozzá véve az F éleihez kört kapunk. Mivel u és v az S vágás különböző oldalán vannak, ezért van a körben egy másik (x,y) keresztél. Ekkor az F := F \ {(x,y)} {(u,v)} élhalmaz is feszítőfája lesz G-nek. Továbbá c(u,v) c(x,y) miatt C(F ) C(F), így szintén minimális. Kruskal algoritmusa Kruskal(G,w) Letesit(A: halmaz) for (v V ) Halmazt Keszit(v) rendezzük E éleit w szerint növekvő sorrendbe for (u,v) E esetén a súly szerinti sorrendben If Halmazt Keres(u) Halmazt Keres(v) A := A {(u,v)} Egyesít(u,v) Megvalósítás: Unio Holvan adattípussal. Helyesség: Az általános tétel alapján, vágásnak olyan vágást használva, ahol az egyik halmaz az u-tartalmazó részfa az aktuális feszítő erdőből. Futási idő: O( E log V )
b a c e d f. ábra. A Kruskal algoritmus a következő sorrendben választja be az éleket: (a,b),(c,e),(d, f ),(a,c),(d,e), Prím algoritmusa Prim(G,c,r) for(v in V) {d(v):=inf Apa(v):=0 Bent(v):=0} d(r):=0 Letesit(Q: ModPrisor) for(v in V) SorBa(Q,v) while(elemszam(q)>0) {SorBol(Q,u) Bent(u):= for(v in KiEl(G,u)) {If (Bent(v)=0) and (c(u,v)<d(v)) then {Apa(v):=u d(v):=c(u,v) Modosit(v) }}} Helyesség: Az általános tétel alapján, vágásnak olyan vágást használva, ahol az egyik halmaz azon v pontokat
tartalmazza, akikre Bent(v)=. Futási idő: O( E + V log V ) b a c e d f. ábra. A Kruskal algoritmus a következő sorrendben választja be az éleket: (a,b),(c,e),(d, f ),(a,c),(d,e), A Prim algoritmus sorrendje (a,b),(a,c), (c,e), (d,e),(d, f ). Maximális párosítás páros gráfokra A G = (V,E) gráfot párosnak nevezzük, ha V csúcshalmaza felosztható két diszjunkt részre V -re és V -re úgy, hogy minden él ezen két halmaz között fut. Az E élhalmaz M E részhalmaza G egy párosítása, ha a G = (V,M) gráfban minden pont foka legfeljebb egy. Egy párosítás maximális ha a lehető legtöbb élet tartalmazza. A megoldandó probléma: Adott egy G = (V,V,E) páros gráf. Határozzuk meg egy maximális párosítását. Legyen G egy gráf, és M a G egy párosítása. Egy G-beli utat M-alternáló útnak hívunk, ha felváltva tartalmaz M-beli és nem M-beli éleket. Legyen M a G egy párosítása. Ekkor azokat az M-alternáló utakat, melynek egyik végpontja sincs benne a párosításban, M-re nézve javító útnak nevezzük. Tétel Legyen G = (V,E) egy tetszőleges gráf és M egy párosítása. Ha M-re nézve nincs javító út G-ben, akkor M a G gráfnak egy maximális párosítása.
Javító út keresése páros gráfokban alternáló erdővel gyökérelemek: V azon pontjai, melyeket M nem fed le, vagyis a párosítatlan pontok. az erdők páratlan szintjei: V azon még nem vizsgált pontjai, melyek egy M-en kívüli éllel elérhetőek az előző szintről az erdők páros szintjei: V azon még nem vizsgált pontjai, melyek egy M-beli éllel elérhetőek az előző szintről Tétel A G = (V,V,E) páros gráfban akkor es csak akkor van az M párosításra nézve javító út, ha az M-hez tartozó alternáló erdőben páratlan szinten van párosításon kívüli pont. Bizonyítás: Ha van ilyen, akkor az erdőben van út. Tegyük fel, hogy v 0,v,...,v k egy alternáló út, és v 0 V egy párosításon kívüli pont. i szerinti indukcióval megmutatható, hogy minden v i bekerül az erdőbe. Tehát az út utolsó pontja is bekerül, de az V -beli, így csak páratlan szintre kerülhet. Stabil párosítások Adott n fiú és n lány és minden fiú és lány rangsort állít fel az általa elfogadhatónak talált partnerek között. Egy házasítás stabil, ha nincs olyan blokkoló pár, akik jobban kedvelik egymást, mint jelenlegi házastársaikat. A leánykérő algoritmus - Minden fiú, aki aktuálisan pár nélkül van minden lépésben ajánlatot tesz a számára legjobban tetsző lánynak - Ha egy lány több ajánlatot kap, a legjobbat tartsa meg feltételesen, a többit utasítsa vissza véglegesen Tétel Az algoritmus stabil párosítást ad. Maximális folyam probléma Legyen G = (V,E) gráf, s,t különböző csúcsok a forrás és a nyelő, c az éleken értelmezett nemnegatív kapacításfüggvény. Legyen (V,E,s,t,c) egy hálózat, az f : E Z folyam, ha rendelkezik a következő tulajdonságokkal: 0 f (u,v) c(u,v) teljesül minden élre (u,v) E f (u,v) = (v,w) E f (v,w) teljesül bármely v V {s,t}-re A cél a (s,v) E f (s,v) összeg maximalizálása. Maradékhálózat: Adott gráf és folyam mellett definiálhatjuk a maradékhálózatot (V,E,s,t,m), ahol Minden uv E élre, ha f (uv) < c(uv), betesszük uv-t az E -be, m(uv) = c(uv) f (uv), és az uv élet előre élnek jelöljük. Minden uv E élre, ha pozitív (azaz f (uv) > 0), betesszük a vu fordított élet az E -be, m(vu) = f (uv), és a vu élet vissza élnek jelöljük. Ford Fulkerson algoritmusa Megkonstruáljuk a maradékhálózatot. Keresünk benne egy s,t utat. 4
: <= > : : <= > <= >,, : <= >,,,,,, : <= >,,,,. ábra. Ha nincs ilyen út véget ér az algoritmus, az aktuális folyam maximális. Ha van s,t út, akkor az út előre élein növeljük a vissza éleken csökkentjük a folyam értékét, egy értékkel, amely a maximális érték, amivel ez megtehető. Alsó korlát rendezési algoritmusokra Minden olyan rendezési algoritmusnak a futását, amely elempárok egymással való összehasonlítása alapján működik leírja egy bináris döntési fa. Az algoritmus által a legrosszabb esetben szükséges összahasonlítások számát a neki megfelelő döntési fa magassága adja meg. Tétel Egy n darab elemet rendező döntési fa magassága Ω(nlogn). Bizonyítás A fa leveleinek száma a lehetséges sorrendek száma, azaz n!. Ha a fa magassága h, akkor h n! kell teljesüljön, következésképpen h lg(n!) lg((n/e) n ) = nlgn nlge = Ω(nlgn). Következmény Minden olyan rendezési algoritmusra, amely csak az elempárok összehasonlítása alapján működik T lr (n) = Ω(nlgn). Számláló rendezés Amennyiben a rendezendő elemek által felvehető értékek halmazának számossága kicsi, akkor megadható lineáris időigényű algoritmus. A bemenet a rendezendő elemek egy n méretű A tömbben eltárolva, a kimenet ezen számok egy B tömbben rendezetten. Továbbá feltesszük, hogy a rendezendő elemek mindegyike az {,...,k} halmazba esik. C[i] tartalmazza azt az információt, hogy a legfeljebb i nagyságú elemből hány darab van. 5
Szamlalorend(A,B,k) for i= to k C[i]:=0 for j= to n C[A[j]]:=C[A[j]]+ for i= to k C[i]:=C[i]+C[i-] for j=n downto {B[C[A[j]]]:=A[j] C[A[j]]:=C[A[j]]-} Megjegyzés: Az algoritmus ötlete nem csak akkor használható, ha az elemek az {,...,k} halmazba esnek. Általánosabb esetben meg kell keresni a minimális elemet min-t, és C[i] a legfeljebb i min + nagyságú elemeket tartalmazza. Definíció Egy rendezést stabilnak nevezünk, ha az azonos értékű elemek ugyanabban a sorrendben jelennek meg a kimeneti tömbben, mint ahogy a bemeneti tömbben szerepeltek. A leszámláló rendezés stabil. Futási idő: Θ(n + k) A=[,,,,,,,,] C=[4,,] C=[4,6,9] B=[0,0,0,0,0,0,0,0,] C=[4,6,8] B=[0,0,0,0,0,,0,0,] C=[4,5,8] B=[0,0,0,,0,,0,0,] C=[,5,8] Számjegyes vagy radix rendezés 9 70 70 9 457 46 9 46 657 457 46 457 89 657 89 657 46 9 457 70 70 89 657 89 Bemenet: H k dimenziós vektorok halmaza, ahol az i-edik komponens minden i-re egy olyan elemtípusból kerül ki, amelyen adott egy rendezési reláció. Kimenet: H elemei a lexikografikus rendezés alapján rendezve. Definíció Egy X = (x,...,x k ) vektor megelőzi az Y = (y i,...,y k ) vektort a lexikografikus rendezésben, ha i, amelyre teljesül, hogy j < i x j = y j és x i < y i. Elvi algoritmus 6
for i:=d downto H Stabil rendezése a kulcs i-edik jegye szerint Helyesség: A ciklusmag végrehajtása után a H halmaz rendezett lesz arra a kulcsra nézve, amely az eredeti kulcs [i..d] jegyeit (karaktereit) tartalmazza. Bizonyítás i-szinti indukcióval. Futási idő Ha a jegyek szerinti rendezés lineáris idejű (pl számláló), akkor a futási idő O(dn). Kiskérdések Kruskal algoritmus Prím algoritmus Ford Fulkerson algoritmus Stabil párosítási probléma és lánykérő algoritmus 7