Datastrukturer föreläsning 10 Maps 1
Minsta uppspännande träd Maps 2
Minsta uppspännande träd Uppspännande träd till graf fritt delträd innehåller alla noderna Minsta uppspännande träd (MST) är det uppspännande träd som har minst totalvikt (summera bågarnas vikter) Tillämpningar Kommunikationsnätverk Transportnätverk DEN 4 DFW 1 8 9 ORD 6 STL 10 3 5 ATL PIT DCA 2 7 Maps 3
Kruskals algoritm för MST De snåla kommunalpolitikernas algoritm för att asfaltera vägar i kommunen! 1 ORD 10 PIT DEN 4 9 6 STL 3 7 DCA 8 5 2 DFW ATL Maps 4
Kruskals algoritm för MST De snåla kommunalpolitikernas algoritm för att asfaltera vägar i kommunen! 1. Asfaltera den kortaste vägen i kommunen 2. Asfaltera den näst kortaste vägen i kommunen, osv 3. Asfaltera dock aldrig någon väg mellan två noder som redan är förbundna med asfalterade vägar DEN 4 DFW 1 8 9 ORD STL 10 ATL PIT Maps 5 6 5 3 DCA 2 7
Hur implementerar man Kruskals algoritm? Gör en prioritetskö av alla bågar viktordning. O(m log m) Konstruera en skog F av fria träd. Från början innehåller varje träd bara en nod. Till slut innehåller F hela mst. Välj minsta bågen i prioritetskön. Om den går mellan olika komponenter i F, slå samman dessa komponenter via bågen. (Detta görs med en algoritm som kallas union-find.) O(m log n). 6
Binära sökträd < 6 2 > = 1 4 8 9 Maps 7
Implementeringsmetoder för binära träd - repetition Maps 8
Enkellänkade binära träd En nod innehåller Pekare till element (elementet självt om primitiv typ) Pekare till vänster barn Pekare till höger barn A B D C E Maps 9
Att lagra binära träd i fält exempel 2 Ett binärt träd 5 6 Samma träd lagrat i ett fält 9 7 2 5 6 9 7 Maps 10
Att lagra binära träd i fält - exempel 0 Ett binärt träd 1 2 Samma träd lagrat i ett fält 3 5 6 0 1 2 3 5 6 8 8 Maps 11
Att lagra binära träd i fält allmän princip Roten lagras i cell 0 Om en viss nod lagras i cell i så lagras - vänster barn i cell 2i + 1 - höger barn i cell 2i + 2 (Obs. G&T lägger roten i 1 och barnen i 2i och 2i + 1) Ett binärt träd är fullständigt om dess n noder lagras i cellerna 0,, n-1. Om fullständiga binära träd lagras i fält har inga tomma mellanrum! Obs. Om våra träd växer kan vi behöva dynamiska (utvidgbara) fält! Maps 12
Varför binära sökträd? Binärsökning i sorterat fält: - snabb uppslagning (O(log n)) men - långsam insättning och borttagning (O(n)) Binärt sökträd: - snabb uppslagning, insättning och borttagning om trädet är balanserat (O(log n)) Maps 13
Vad är ett binärt sökträd? Definition Binära träd som lagrar nycklar (och evt element) och har sökträdsegenskapen: Låt v vara trädets rot och u och w vara vänster resp höger barn. Då gäller key(u) < key(v) < key(w) Vänster och höger delträd är också binära sökträd. Alltså gäller att alla nycklar i vänster delträd är mindre än rotens nyckel, och alla i höger delträd är större än rotens nyckel. (Vi förutsätter här att vi lagrar avbildningar, dvs inga dublettnycklar.) Maps 14
Sökning Algorithm findelement(k, o) if o = null return NO_SUCH_KEY if k = key(o) return element(o) else if k < key(o) return findelement(k, o.left) else if k > key(o) return findelement(k, o.right) Maps 15
findelem i Haskell BinTree a = Empty Node a (BinTree a) (BinTree a) findelem :: Ord k => k -> BinTree (k,v) -> Maybe v findelem k Empty = Nothing findelem k (Node (k,v) left right) k == k = Just v k < k = findelem k left k > k = findelem k right Maps 16
Insättning Operationen insertitem(k,v) sätter in ett nytt par (k,v) på rätt plats Exempel: sätt in ett nytt par med nyckel 5 2 2 < > 1 4 8 1 4 8 5 6 > 6 9 9 Maps 17
Borttagning: fall 0 och 1 barn Operationen removeelement(k) söker efter nyckeln k och om den finner den tar bort motsvarande nod v Fall 0: om v saknar barn är vi klara. Fall 1: om v har precis ett barn flyttar vi upp delträdet, se fig: ta bort nyckeln 4 2 1 4 8 2 > < v 1 5 8 5 6 6 9 9 Maps 18
Borttagning: fall 2 barn 1 Om noden v som ska tas bort har två barn: Leta upp noden w som kommer efter v i inordning (dvs har närmast större nyckel i sökträdet). w måste vara ett löv. (Det går förstås också bra med närmast mindre nyckel.) Ersätt v med w! Exempel: ta bort 3! 1 2 2 3 w 5 v 5 8 6 9 w 8 6 9 Maps 19
Tidskomplexitet värsta fallet Antag att det binära sökträdet har n noder och höjden h Utrymmet är O(n) findelement, insertitem och removeelement är O(h) Höjden h är O(n) i värsta fall O(log n) i bästa fall bästa fallet Maps 20
AVL-träd 1 2 5 2 0 4 1 8 9 3 2 1 11 1 7 Maps 21
AVL-träd AVL-träd är balanserade BST: för alla noder gäller det att höjdskillnaden mellan vänster och höger delträd 0 är högst 1 Sökning fungerar som i vanliga binära sökträd. Insättning och borttagning fungerar också som vanligt, men obalans kan uppstå, så vi måste eventuellt balansera om trädet. 1 2 Maps 22 5 1 8 0 6 3 9 2 1 0 11
Insättning i AVL-träd obalans Sätt först in det nya elementet på samma sätt som i ett vanligt BST! 0 1 2 5 4 1 8 lokal obalans 9 3 2 0 11 Det nya trädet kan bli obalanserat Balansera om trädet! 1 ny nod 6 7 0 lokal obalans Exempel: vi har satt in en ny nod med nyckel 7: Maps 23
Enkelrotation: princip nederst lokal obalans alltför djup nod balansen återställ d Maps 24
Enkelrotation: exempel 5 obalans 9 3 9 5 11 8 11 3 8 10 10 alltför djup nod Balansen återställd Maps 25
Dubbelrotation: princip nederst lokal obalans alltför djup nod balansen återställd Maps 26
Dubbelrotation: exempel 5 obalans 8 2 9 5 9 6 8 10 alltför djup nod 2 6 10 balansen återställd Maps 27
Trenodsomstrukturering Enkel och dubbelrotationer kallas med ett gemensamt namn trenodsomstruktueringar. Vi letar upp tre noder: den nedersta noden med lokal obalans samt dess barn och barnbarn så att barnet och barnbarnet tillhör delträd som har blivit alltför djupa. Dessa tre noder bestämmer fyra delträd. Vid enkelrotation gör man barnet till ny förälder med den gamla föräldern och barnbarnet som nya barn. Vid dubbelrotation gör man barnbarnet till ny förälder med gamla föräldern och barnet som nya barn. Maps 28
Borttagning i AVL-träd Borttagning: som i binära sökträd Om obalans uppkommer omstrukturera med rotationer! Omstrukturering i delträd kan ge upphov till obalans högre upp vi kan behöva omstrukturera flera gånger Jfr: insättning räcker att omstrukturera en gång (kring nedersta obalanserade noden)! Maps 29
Splayträd Binärt sökträd Behöver ej vara balanserade som AVLträd Nycklar som man ofta letar efter skall ligga högt upp i trädet 90-10-regeln: 90% av sökningar är efter 10% av nycklarna Maps 30
Splayträd Insättning, sökning och borttagning som i vanligt binärt sökträd, följda av en splay, dvs man omstrukturerar trädet så att den sist besökta nyckeln placeras i roten. Den amorterade kostnaden är O(log n). Ingen ombalansering som i AVL-träd (eller som i (2,4)-träd eller ommålning som i rödsvarta träd, mer senare). Maps 31
Zig-zig Maps 32
Zig-zag (jfr dubbelrotation) Maps 33
Zig Maps 34
Exempel: sätt in 11 5 5 3 9 3 9 8 12 8 12 10 10 11 Maps 35
Exempel: sätt in 11 zig zag 3 5 9 8 12 3 5 9 8 11 10 11 10 12 Maps 36
Exempel: sätt in 11 zig zig 5 11 3 9 9 12 8 11 5 10 10 12 3 8 Maps 37
(2,4)-träd 9 2 5 7 10 14 Maps 38
Ett (2,4)-träd till 11 2 6 8 27 32 1 3 5 7 10 13 17 23 30 34 Maps 39
(2,4)-träd Varje nod lagrar 1-3 nycklar (+ värden) En inre nod som lagrar n nycklar har n+1 barn Alla löv ligger på samma djup (ett exakt balanserat träd)! Sökträdsegenskapen gäller: de n nycklarna i en nod separerar nycklarna i de n+1 delträden (se nästa bild, boken ger den allmänna egenskapen) Maps 40
(2,4)-träd har sökträdsegenskap 2, 8 är mindre än 10 12 ligger mellan 10 och 15 18 ligger mellan 15 och 24 27, 32 är större än 24 10 15 24 2 8 12 18 27 32 Maps 41
Sökning i (2,4)-träd Exempel: sök efter 30! 11 24 2 6 8 15 27 32 30 saknas Maps 42
Insättning Kan ge upphov till overflow. Vi måste då splittra en nod (se boken) Exempel: insättning av 30 orsakar overflow nedan: 10 15 24 2 8 12 18 v 27 32 35 10 15 24 Sätt in 30 2 8 12 18 27 30 32 35 Maps 43 v overflow
Röd-svarta träd v 6 3 8 4 z Maps 44
Rödsvarta träd: binära sökträd som representerar (2,4)-träd Ett röd-svart träd är ett binärt sökträd vars noder är färgade röda eller svarta Så här gör man om (2,4)-träd till rödsvarta träd: 4 3 5 2 6 7 4 5 3 6 3 eller 5 2 7 Maps 45
Röd-svarta träd Roten är svart Barnen till en röd nod är svarta Alla löv har samma svart-djup, dvs samma antal svarta förfäder (inklusive lövet självt). Detta motsvarar balanseringskravet på (2,4)-träd. 9 4 15 2 6 12 21 7 Maps 46
Insättning i röd-svarta träd 1. Använd först algoritmen för insättning i binära sökträd! 2. Färga den nya noden röd (undantag: den nya noden är rot)! 3. Vi kan då få en dubbel röd strukturera om eller måla om! 9 4 15 2 6 12 21 7 13 dubbel röd ny nod Maps 47
Ommålning Poängen med röd-svarta träd är att det är billigare att måla om än att omstrukturera trädet som man gör med (2,4)-träd! (Jfr hur man handskas med overflow i (2,4)- träd.) 9 måla röd 4 2 6 12 7 13 15 21 måla svart måla svart Maps 48
Omstrukturering Gör en enkelrotation (som i AVL-träd) av 6,7, 8! 7 blir svart med de röda barnen 6 och 8. (Jfr sambandet med (2,4)-träd. Vi behöver här bara se till att vi får en korrekt röd-svart representation av en 4-nod!) 9 4 15 2 6 12 21 dubbel röd 7 8 ny nod Maps 49
Några effektiva implementeringar av lexika Sökning Insättning Borttagning Kommentar AVL-träd (2,4)-träd O(log n) O(log n) O(log n) -omstruktureringskostnader Skiplistor O(log n) i medeltal O(log n) i medeltal O(log n) i medeltal -slumpmässig algoritm Röd-svarta träd O(log n) O(log n) O(log n) -Ommålning men inte mycket omstrukturering! -TreeMap i Java Maps 50
Några effektiva implementeringar av lexika Sökning Insättning Borttagning Kommentar Splayträd O(log n) amorterad O(log n) amorterad O(log n) amorterad -effektivt för vanligaste nycklar B-träd O(log B n) I/O O(log B n) I/O O(log B n) I/O -för stora lexika/databaser Maps 51
B-träd för sökning i externminne Om vår datasamling (mängd, lexikon) inte får plats i primärminnet måste vi lagra delar av den på externminne Tiden det tar för sökningar, insättningar och borttagningar beror huvudsakligen på antalet dataöverföringar från externminnet B-träd generaliserar (2,4)-träd, i stället för noder med mellan 2 och 4 barn har det noder med mellan d/2 och d barn. Storleken d kan vara ett block i externminnet. Maps 52