Självbalanserande AVL-träd Weiss, avsnitt 4.4

Relevanta dokument
Självbalanserande träd AVL-träd. Koffman & Wolfgang kapitel 9, avsnitt 1 2

Ett generellt träd är. Antingen det tomma trädet, eller en rekursiv struktur: rot /. \ /... \ t1... tn

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning 5 TDDC91,TDDE22,725G97: DALG. Föreläsning i Datastrukturer och algoritmer 18 september 2018

Datastrukturer. föreläsning 10. Maps 1

Ännu mera träd: 2-3-träd, B-träd, rödsvarta träd, träd Weiss, avsnitt 4.7, 11.5, 12.2, etc.

Föreläsning 2. AVL-träd, Multi-Way -sökträd, B-träd TDDD71: DALG. Innehåll. Innehåll. 1 Binära sökträd

Programkonstruktion och. Datastrukturer

Algoritmer och datastrukturer 2012, föreläsning 6

Föreläsning Datastrukturer (DAT036)

Föreläsning 6. Sökträd: AVL-träd, Multi-Way -sökträd, B-träd TDDC70/91: DALG. Innehåll. Innehåll. 1 AVL-träd

Algoritmer och datastrukturer 2012, fo rela sning 8

Datastrukturer. föreläsning 10. Maps 1

Träd Hierarkiska strukturer

BST implementering, huvudstruktur

Föreläsning 10 Datastrukturer (DAT037)

Lösningsförslag till tentamen Datastrukturer, DAT037 (DAT036), Tiden det tar att utföra en iteration av loopen är oberoende av värdet på

Föreläsning 7. Träd och binära sökträd

Föreläsning 9 Innehåll

Binära sökträd. Seminarium 9 Binära sökträd Innehåll. Traversering av binära sökträd. Binära sökträd Definition. Exempel på vad du ska kunna

Datastrukturer. föreläsning 9. Maps 1

Datastrukturer och algoritmer

Föreläsning Datastrukturer (DAT036)

Föreläsning 10 Innehåll. Diskutera. Inordertraversering av binära sökträd. Binära sökträd Definition

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två

Föreläsning 10 Innehåll

Föreläsning 11 Innehåll. Diskutera. Binära sökträd Definition. Inordertraversering av binära sökträd

Lösningsförslag till tentamen Datastrukturer, DAT037,

Algoritmer och datastrukturer

Datastrukturer. föreläsning 9. Maps 1

Datastrukturer, algoritmer och programkonstruktion (DVA104, HT 2014) Föreläsning 5

Tentamen Datastrukturer (DAT036)

Föreläsning 4 Datastrukturer (DAT037)

Upplägg. Binära träd. Träd. Binära träd. Binära träd. Antal löv på ett träd. Binära träd (9) Binära sökträd (10.1)

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning 4 Datastrukturer (DAT037)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Lösningar Datastrukturer TDA

Lösningsförslag till tentamen Datastrukturer, DAT037,

Träd, binära träd och sökträd. Koffman & Wolfgang kapitel 6, avsnitt 1 4

Innehåll. Föreläsning 12. Binärt sökträd. Binära sökträd. Flervägs sökträd. Balanserade binära sökträd. Sökträd Sökning. Sökning och Sökträd

Tentamen Datastrukturer, DAT037 (DAT036)

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Tentamen Datastrukturer (DAT036)

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Föreläsning 9 Innehåll

Programmering i C++ EDA623 Dynamiska datastrukturer. EDA623 (Föreläsning 11) HT / 31

Föreläsning 5 Datastrukturer (DAT037)

Lösningsförslag till exempeltenta 1

Tentamen Datastrukturer (DAT036)

Föreläsning 13. Träd

Datastrukturer. Föreläsning 5. Maps 1

Programmering i C++ EDAF30 Dynamiska datastrukturer. EDAF30 (Föreläsning 11) HT / 34

Tentamen Datastrukturer D DAT 036/INN960

Föreläsning 3 Datastrukturer (DAT037)

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 8 Om abstrakta datatyper och binära sökträd

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tentamen, Algoritmer och datastrukturer

13 Prioritetsköer, heapar

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

Fredag 10 juni 2016 kl 8 12

Trädstrukturer och grafer

Seminarium 13 Innehåll

Datastrukturer som passar för sökning. Föreläsning 10 Innehåll. Inordertraversering av binära sökträd. Binära sökträd Definition

Föreläsning Datastrukturer (DAT037)

Tentamen Datastrukturer D DAT 036/INN960

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Implementering av tabellen. Operationer på tabellen

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Datastrukturer som passar för sökning. Föreläsning 11 Innehåll. Binära sökträd Definition. Inordertraversering av binära sökträd

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

DAI2 (TIDAL) + I2 (TKIEK)

Datastrukturer i Haskell

Sökning. Översikt. Binärt sökträd. Linjär sökning. Binär sökning. Sorterad array. Linjär sökning. Binär sökning Hashtabeller

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Lösningsförslag till tentamen

Informationsteknologi Tom Smedsaas 19 augusti 2016

Tentamen Datastrukturer för D2 DAT 035

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

Dugga Datastrukturer (DAT036)

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

Tentamen Datastrukturer D DAT 035/INN960

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Specifikationer för tabellfunktionerna. Operationer på tabellen

ADT Prioritetskö. Föreläsning 12 Innehåll. Prioritetskö. Interface för Prioritetskö. Prioritetsköer och heapar

Föreläsning Datastrukturer (DAT036)

Föreläsning 5. Träd Binära träd Binärt sökträd som ADT Implementering av binärt sökträd Travestera binärt sökträd Sökning Insättning/borttagning

Träd - C&P kap. 10 speciellt binära sökträd sid. 452

F5: Debriefing OU2, repetition av listor, träd och hashtabeller. Carl Nettelblad

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar

Länkade strukturer, parametriserade typer och undantag

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

Tentamen kl Uppgift 4. Uppgift 5

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning 3 Datastrukturer (DAT037)

Tentamen'('Datastrukturer,'algoritmer'och'programkonstruktion.'

Tentamen TEN1 HI

Transkript:

Självbalanserande AVL-träd Weiss, avsnitt 4.4 Peter Ljunglöf DAT036, Datastrukturer 30 nov 2012 1

Balanserade träd Nodbalanserat träd: skillnaden i antalet noder mellan vänster och höger delträd är högst 1 Höjdbalanserat träd: skillnaden i höjd (djup) mellan vänster och höger delträd är högst 1 Nivåbalanserat träd: alla nivåer är fyllda, utom den nedersta som fylls på från vänster till höger Notera att höjden av alla dessa träd är logaritmisk: h = O(log n), där n är antalet noder i trädet 2

Självbalanserande sökträd Effektiviteten hos ett binärt sökträd är proportionell mot höjden på trädet: ett balanserat träd är effektivare än ett obalanserat i värsta fall kan sökträdet ha linjär höjd, dvs h = O(n) då blir komplexiteten också linjär För att lösa detta problem introducerar vi självbalanserande träd: vid insättning och uttagning så balanserar trädet om sig om det är nödvändigt 3

Obalanserade träd Sökningar i detta obalanserade träd är O(n), inte O(log n) Här är ett mer realistiskt exempel på ett obalanserat träd 4

Rotering Vi behöver en operation på binära träd som ändrar de relativa höjderna mellan vänster och höger delträd, men bibehåller sökträdsegenskapen 5

AVL-träd Uppkallat efter Adelson-Velskii och Landis (Адельсóн-Вéльский och Лáндис) AVL-trädet håller reda på höjdbalansen mellan vänster och höger delträd: höjdskillnaden mellan vänster och höger delträd får aldrig överstiga 1, i alla noder i trädet (inte bara rotnoden) om balansen hamnar utanför 1 till +1, roteras delträdet för att få det i balans igen 6

Balansera ett vänster-vänsterträd 2 ±0 1 ±0 7

Balansera ett vänster-vänsterträd 2 ±0 1 ±0 Y Y 7

Balansera ett vänster-vänsterträd 2 ±0 ±0 ±0 Y Y 7

Balansera ett vänster-vänsterträd 2 1 ±0 1 Y Y 7

Balansera ett vänster-vänsterträd 2 1 ±0 1 Y Y Det funkar även om Y är lika hög som X 7

Balansera ett höger-högerträd +2 ±0 +1 ±0 8

Balansera ett höger-högerträd +2 ±0 +1 ±0 Y Y 8

Balansera ett höger-högerträd Y Y 8

Balansera ett höger-högerträd Y Y Det funkar även om Y är lika hög som Z 8

9 Balansera ett vänster-högerträd

Balansera ett vänster-högerträd Enkelrotation funkar inte! ett vänster-högerträd blir ett höger-vänster 9

Balansera ett vänster-högerträd 2 ±0 +1 ±0 ±0 ±0 Vi behöver dubbelrotera! 10

Balansera ett vänster-högerträd 2 ±0 +1 ±0 ±0 ±0 B B Vi behöver dubbelrotera! 10

Balansera ett vänster-högerträd B B Vi behöver dubbelrotera! 10

Balansera ett vänster-högerträd B B Vi behöver dubbelrotera! Det funkar även om k2 är lätt obalanserad 10

Balansera ett vänster-högerträd Vi behöver dubbelrotera! Det funkar även om k2 är lätt obalanserad 10

Balansera ett vänster-högerträd C C Vi behöver dubbelrotera! Det funkar även om k2 är lätt obalanserad 10

Fyra sorters obalanserade träd Vänster-vänster (föräldern < 1, vänster barn 0) rotera åt höger runt föräldern Vänster-höger (föräldern < 1, vänster barn > 0) rotera åt vänster runt barnet rotera åt höger runt föräldern Höger-höger (föräldern > 1, höger barn 0) rotera åt vänster runt föräldern Höger-vänster (föräldern > 1, höger barn < 0) rotera åt höger runt barnet rotera åt vänster runt föräldern 11

Balansering av de fyra olika fallen (bilden är från Wikipedia) 12

Ett större AVL-exempel Nu ska vi bygga ett AVL-träd för exemplet i avsnitt 4.4.1 4.4.2 (sid 127 131 i Weiss, 2nd ed.): 3 2 1 4 5 6 7 16 15 14 13 12 11 10 8 9 vänster-vänster höger-höger höger-vänster vänster-vänster höger-höger vänster-höger Vi gör det med följande Java-applet: http://people.ksp.sk/~kuko/bak/index.html 13

Att implementera ett AVL-träd private static class AvlNode<T> { T element; AvlNode<T> left; AvlNode<T> right; int height; } AvlNode(T elem, AvlNode<T> lt, AvlNode<T> rt) { element = elem; left = lt; right = rt; height = 0; } private int height(avlnode<t> t) { return (t == null? 1 : t.height); } 14

Att implementera ett AVL-träd private static class AvlNode<T> { T element; AvlNode<T> left; AvlNode<T> right; int height; } AvlNode(T elem, AvlNode<T> lt, AvlNode<T> rt) { element = elem; } left = lt; right = rt; height = 0; det går att lagra balansen ( 1/0/+1) istället för höjden, men såhär blir koden något enklare private int height(avlnode<t> t) { return (t == null? 1 : t.height); } 14

Insättning i ett AVL-träd 15 private AvlNode<T> insert(t x, AvlNode<T> t) { if (t == null) return new AvlNode(x); if (x < t.element) { t.left = insert(x, t.left); if (height(t.left) height(t.right) == 2) { if (x < t.left.element) t = rotatewithleftchild(t); else t = doublewithleftchild(t); } } else if (x > t.element) { // symmetriskt med föregående fall } t.height = 1 + Math.max(height(t.left), height(t.right)); return t; }

Enkelrotering private AvlNode<T> rotatewithleftchild(avlnode<t> k2) { AvlNode<T> k1 = k2.left; k2.left = k1.right; k1.right = k2; k2.height = 1 + Math.max(height(k2.left), height(k2.right)); k1.height = 1 + Math.max(height(k1.left), k2.height); return k1; } 16

Dubbelrotering private AvlNode<T> doublewithleftchild(avlnode<t> k3) { k3.left = rotatewithrightchild(k3.left); return rotatewithleftchild(k3); } 17

Effektivitet hos AVL-träd AVL-träd är logaritmiska, O(log n), eftersom varje delträd är balanserat varje delträd får vara lite obalanserat (±1 balans), så trädet kan innehålla några hål i värsta fall (vilket är ovanligt) kan ett AVLträd vara 1,44 gånger så högt som ett perfekt nodbalanserat träd 18

Det värsta AVL-trädet Följande träd är det minsta AVL-trädet med höjd 9 (fig. 4.30) 19

Det värsta AVL-trädet Följande träd är det minsta AVL-trädet med höjd 9 (fig. 4.30) h = 4 h = 9 19