Föreläsning 6 Sökträd: AVL-träd, Multi-Wa -sökträd, B-träd DDC7/9: DALG Utskriftsversion av föreläsning i Datastrukturer och algoritmer september omm Färnqvist, IDA, Linköpings universitet 6. Innehåll Introduktion find,insert och remove i ett binärt sökträd tar O(h) tid, där h är höjden av trädet. Håll sökträdet balanserat!! 6. Innehåll AVL-träd (, )-träd B-träd 5 6. AVL-träd AVL-träd Självbalanserande BS/höjdbalanserat BS AVL = Adelson-Velskii och Landis, 96 Idén: Håll reda på balansinformation i varje nod AVL-egenskapenFör varje intern nod v i skiljer sig höjden av barnen till v med högst... eller alternativt... För varje intern nod v i gäller att b(v) {,,}, där b(v) = height(leftchild(v)) height(rightchild(v)) 6.4 Maimal höjd av AVL-träd Proposition (. i kursboken). Höjden av ett AVL-träd som lagrar n poster är O(logn). Vilket får som följd att... Proposition. Vi kan göra find, insert och remove i ett AVL-träd i tid O(logn) medan vi bevarar AVLegenskapen. 6.5
Eempel: ett AVL-träd 44 6.6 7 78 5 88 48 6 Insättning i ett AVL-träd Den na noden gör att trädhöjden förändras och att trädet måste höjdbalanseras. Man kan hålla reda på delträdens höjd på olika sätt: Lagra höjden eplicit i varje nod Lagra balansfaktorn för noden Förändringen brukar beskrivas som en höger- eller vänsterrotation av ett delträd. Det räcker med en rotation för att få trädet i balans igen. 6.7 Insättning i AVL-träd (enkla fall) 6.8 Insättningsalgoritm Starta från den na noden och leta uppåt tills man hittar en nod s.a. dess grandparent är obalanserad. Markera :s förälder med. Gör en rekonstruering av trädet så här: Döp om,, till a,b,c baserat på deras inorder-ordning. Låt,,, vara en uppräkning i inorder av delträden till, och. (Inget av delträden får ha, eller som rot.) bts mot b, dess barn är nu a och c. och är barn till a och och är barn till c. 6.9
Eempel: insättning i ett AVL-träd 44 4 6. /c 7 78 /a 5 88 /b 48 6 54 Eempel: insättning i ett AVL-träd 44 b a c 6. 7 6 5 78 48 54 88 Fra olika rotationer a= b= c= enkel rotation a= b= c= Om b = kallas det en enkel rotation. Rotera upp över 6. Fra olika rotationer a= b= c= enkel rotation a= b= c= Om b = kallas det en enkel rotation. Rotera upp över 6.
Fra olika rotationer a= b= c= dubbel rotation a= b= c= Om b = kallas det en dubbel rotation. Rotera upp över och sedan över 6.4 Fra olika rotationer a= b= c= dubbel rotation a= b= c= Om b = kallas det en dubbel rotation. Rotera upp över och sedan över 6.5 Antag att vi har balans... 6.6 4
... och sedan stoppar in något som sabbar den 6.7 Gör en enkel rotation 6.8 5
Gör en enkel rotation 6.9 Gör en enkel rotation 6. Gör en enkel rotation 6. 6
Gör en enkel rotation 6. Klart! 6. 7
Ett ntt eempel... 6.4... den här gången stoppar vi in något på ett annat ställe 6.5 Prova en enkel rotation igen... 6.6 8
... hmm, vi har inte fått balans 6.7 Börja om från början... och titta på strukturen i 6.8 9
Vi får lov att göra en dubbel rotation 6.9 Vi får lov att göra en dubbel rotation 6. Vi får lov att göra en dubbel rotation 6.
Vi får lov att göra en dubbel rotation 6. Vi får lov att göra en dubbel rotation 6.
Vi får lov att göra en dubbel rotation 6.4 Klart! 6.5 renodsrekonstruering = rotationer... Vissa författare använder vänster- och högerrotationer: Enkel vänsterrotation: vänstra delen av delträdet (a och j) sänks ner vi har roterat (upp) b över a a j k b l c m b a c j k l m 6.6 Dubbla rotationer... vå rotationer behövs när noderna som ska balanseras om är placerade i ett sicksackmönster. Rotera upp b över a Rotera upp b över c j a k b l c m a b j k l c m b a c j k l m 6.7
Borttagning i ett AVL-träd find och remove som i ett vanligt binärt sökträd Uppdatera balansinformationen på väg tillbaka upp till roten Om för obalanserat: Strukturera om... men... När vi återställer balansen på ett ställe kan det uppstå obalans på ett annat Måste upprepa balanseringen (eller kontroll av balansen) till dess vi når roten Högst O(logn) ombalanseringar 6.8 (, )-träd N approach: släpp på något av kraven AVL-träd: binärt träd, accepterar viss (liten) obalans... Kom ihåg: Fullt binärt träd: icke-tomt; graden är antingen eller för varje nod Perfekt binärt träd: fullt, alla löv har samma djup Kan vi bgga och underhålla ett perfekt träd (om vi struntar i binärt )? Då skulle vi alltid känna till söktiden i värsta fall eakt! 6.9 (,)-träd Förut: Ett pivotelement Om större letar vi till höger Om mindre letar vi till vänster Nu: illåt flera (nämligen ) pivotelement Antalet barn till en intern nod är antalet pivotelement + (dvs ) 5 8 5 8 6.4 Mer generellt (a, b)-träd Varje nod är antingen ett löv eller så har den c barn, där a c b Varje nod har mellan a och b pivotelement a (b + )/ (men roten behöver bara ha minst två barn (eller inga) även när a > gäller) find fungerar ungefär som förut insert måste kolla att noden inte blivit överfull (i så fall måste noden delas upp) remove kan leda till att man måste slå ihop noder eller föra över värden mellan noder Proposition (4. i kursboken). Höjden av ett (a, b)-träd som lagrar n dataelement är Ω(logn/ logb) och O(logn/ loga). Plattare träd, men mer jobb i noderna. 6.4
Insättning i ett (a,b)-träd med a = och b = 5 Insert() 5 Insert(5) Insert(8) 5 5 Så länge det finns plats i barnet vi hittar, lägg till elementet i det barnet... Om fullt, dela upp och trck det utvalda pivotelementet uppåt...... detta kan hända upprepade gånger Insert(7) 7 5 5 8 5 5 7 8 5 5 8 6.4 Borttagning i (, )-träd re fall: Inga villkor brts genom borttagning Ett löv tas bort (blir tomt) För då över någon annan nckel till det lövet,... ok om vi har sskon med + element Delete(5) Överföring av och 5? 5 4 7? 7 5 5 5 8 5 5 4 5 4 5 5 8 4 6.4 Borttagning i (, )-träd Om ett löv tas bort (blir tomt) För då över någon annan nckel till det lövet, eller Slå ihop det med en granne 7 Delete(8) 5 5? 7 5 5 5 5 8 4 5 5 7 5 5 7 4 6.44 4
Borttagning i (, )-träd En intern nod blir tom Roten: ersätt med föregångare eller efterföljare i inorder Reparera sedan inkonsistenser med lämpliga ihopslagningar och överföringar... Delete() Ersätt......sl å ihop löv För f å element internt......sl å ihop noder? 7 5 7 5? 5 7 5 5 7 4 5? 4 5 4 5 4 6.45 B-träd B-träd Används för att upprätthålla ett inde över eternt data (t.e. innehållet på ett skivminne) Är ett (a, b)-träd där a = b/, dvs b = a Vi kan nu välja b så att en full nod precis tar upp ett block på skivminnet Genom att välja a = b/ kommer vi alltid att flla ett helt block på skivminnet när två block slås samman! B-träd (och varianter) används i många filsstem och databaser Windows: HPFS Mac: HFS, HFS+ Linu: ReiserFS, XFS, EtFS, JFS Databaser: ORACLE, DB, INGRES, PostgreSQL 6.46 5