1 Søgetræer. 2 Binære søgetræer Definition Operationer Balancerede binære søgetræer AVL-træer Rød-sort-træer (AA-træer) B-træer Plan.

Slides:



Advertisements
Lignende præsentationer
Den danske befolknings syn på handicappedes rettigheder
Advertisements

Atomer Et programmeret forløb. En måde at lære på.
v/ Professor Lars Ehlers, Aalborg Universitet
Bolig selskabernes Landsforening– Almene lejeboliger - Maj/Juni Almene lejeboliger - Danmarkspanelet - Maj/Juni 2010.
1 Rekursion og algoritmedesign. 2 Rekursion Rekursiv definition af X: X defineres i termer af sig selv. Rekursion er nyttig, når en generel version af.
Algoritmer og Datastrukturer 1 Merge-Sort [CLRS, kapitel 2.3] Heaps [CLRS, kapitel 6] Gerth Stølting Brodal.
1 Effektiv forrentning Kjeld Tyllesen PEØ, CBS Erhvervsøkonomi / Managerial Economics Kjeld Tyllesen, PEØ, CBS.
Arbejdsmarkedsuddannelser – også for personer med læse-, skrive- og regnevanskeligheder Oplæg fra AMU-Fyn Konference d. 22/5 -07.
Representations for Path Finding in Planar Environments.
HUSKESPIL – den lille tabel
Titel: Arial, fed, skriftstr. 20, mørkegrå. Tekst: Arial, normal, fed eller kursiv, skriftstr. 10, 12 og 14 til print – 16 og 18 til projektor – mørkegrå.
Relativ vigtighed for elektroniske ressourcer,24,22,20,18,16,14,12,10 Indeks FARM nem at bruge Info om anvendelse af elektroniske.
 2 3  3 =  83  43  53  63  73  93  10 4.
Pleje og Sundhed Gennemførte719 Inviterede895 Svarprocent80% FREDERICIA KOMMUNE MTU og Psykisk APV 2012 Rapportspecifikationer.
1 UNION-FIND. 2 inddata: en følge af heltalspar (p, q); betydning: p er “forbundet med” q uddata: intet, hvis p og q er forbundet, ellers (p, q) Eksempel.
Induktion og rekursion
Region Midtjyllands tilbud 2013
Algoritmer og Datastrukturer 1 Binære Søgetræer [CLRS, kapitel 12] Gerth Stølting Brodal.
Datastrukturer og Collections Rasmus D. Lehrmann DM
ETU 2008 | Elevtilfredshedsundersøgelse Erhvervsskolen Nordsjælland HTX (Teknisk Gymnasium) - Hillerød Baseret på 313 besvarelser.
Algoritmer og Datastrukturer 1 Merge-Sort [CLRS, kapitel 2.3] Heaps [CLRS, kapitel 6] Gerth Stølting Brodal.
D 3 5A A A 16 5D 15 5A 14 5D A B D D A B A A D
1 Søgning I. 2 Plan Sekventiel søgning Binær søgning Binære søgetræer Balancerede binære søgetræer træer.
1 Sortering I elementære metoder. 2 Plan Terminologi Elementære metoder til sortering -sortering ved udvælgelse -sortering ved indsættelse -Shellsort.
Anvendelser I Leg og spil.
Matematik B 1.
Claus Brabrand, ITU, Denmark Mar 10, 2009EFFECTIVE JAVA Effective Java Presentation Workshop Claus Brabrand [ ] ( “FÅP”: First-year Project.
1 Tråde 2 Plan Trådbegrebet Synkronisering Koordinering Eksempel: et flertrådet spil.
Grunde til at jeg elsker dig
1 Søgning. 2 Binære søgetræer og skiplister     S0S0 S1S1 S2S2 S3S3    2315.
GP 11, 14/ Grundlæggende programmering Efterår 2001 Forelæsning 11 onsdag 14/ kl. 9:15 – 12:00.
DMU PeopleXS Workflows (alt) (uden forhandlingsdel) Stillingsfaser – Opslag Fremstilling/validering, godkendelse, annoncering – Bedømmelsesudvalg.
1 Implementering af fundamentale datastrukturer. 2 Plan Stakke og køer Array-repræsentation Liste-repræsentation Hægtede lister Træer Terminologi Traversering.
Lektion 7 Læsestof: Kopier fra Caranno
Fundamentale datastrukturer
1 vare på 2 markeder, samme pris
1 Sortering. 2 Plan Elementære metoder til sortering -sortering ved indsættelse -Shellsort Sorteringsmetoder baseret på rekursion –quicksort –flettesortering.
1 Sortering II. 2 Plan Avancerede sorteringsmetoder: Metoder med kompleksitet O(n logn): - Quicksort (ekskurs: udvælgelse) - Sortering ved fletning
Algoritmer og Datastrukturer 1 Binære Søgetræer [CLRS, kapitel 12] Gerth Stølting Brodal.
1 Sortering. 2 Sortering ved fletning (merge-sort) 7 2 | 9 4  | 2  2 79 | 4   72  29  94  4.
1 Fundamentale datastrukturer. 2 Definitioner: abstrakt datatype, datastruktur Elementære datastrukturer og abstrakte datatyper: arrays, stakke, køer,
1 Fundamentale datastrukturer. 2 Definitioner: abstrakt datatype, datastruktur Elementære datastrukturer og abstrakte datatyper : arrays, stakke, køer,
Algoritmer og Datastrukturer 1 Dynamisk Rang & Interval Træer [CLRS, kapitel 14] Gerth Stølting Brodal.
1 Kap. 4, Jordens Tyngdefelt = Torge, 2001, Kap. 3. Tyngdekraftens retning og størrelse g (m/s 2 ) Acceleration Tyngdepotentialet (W): evene til at udføre.
Algoritmer og Datastrukturer 1 Binære Søgetræer [CLRS, kapitel 12] Gerth Stølting Brodal Aarhus Universitet.
1 Hashing. 2 Hashing Hashfunktioner Kollisionsstrategier Effektivitet Hashing i Javas biblioteker Prioritetskøer Binær hob Anvendelser: heapsort, ekstern.
1 Implementering af fundamentale datastrukturer. 2 Stakke og køer Array-repræsentation Liste-repræsentation Hægtede lister Træer Terminologi Traversering.
1 Sortering. 2 Plan Elementære metoder til sortering -sortering ved indsættelse -Shellsort Sorteringsmetoder baseret på rekursion –quicksort –flettesortering.
Anvendelser I Leg og spil.
Grundlæggende programmering Forår 2002
Begreber og Redskaber 11. Plan for idag Lidt afrunding: Collections Framework i Java Noget om oversættere og sprog Evaluering Sidste gang øvelser før.
Paradigmer i Programmering 3. Højere ordens funktioner Idag: Højere ordens funktioner Algebraiske datatyper Næste gang: I/O, Filer, interaktive programmer.
Algoritmer og Datastrukturer 1 Dynamisk Rang & Interval Træer [CLRS, kapitel 14] Gerth Stølting Brodal Aarhus Universitet.
I o p o DAIMI, AU, November 1999Programkonstruktion I9E.1 Konstruktion og brug af klasser – en stak og en HP-regnemaskine push pop.
 Henrik B. Christensen, 1999Introducerende objektorienteret programmering8B.1 Interfaces En ren kontrakt.
 Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.1 Programmering med interfaces – en stak og en HP-regnemaskine push pop.
Programmering med interfaces Separering af specifikation, anvendelse og implementation.
Programmering med interfaces – en stak og en HP-regnemaskine push pop.
 Jens Bennedsen 2001Multimedie programmering10B.1 Interfaces En ren kontrakt.
I o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.1 Sweep-algoritmer Programmering med invarianter og uden kaniner.
Programmering med interfaces – en stak og en HP-regnemaskine push pop.
 Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.1 Sweep-algoritmer Programmering med invarianter og uden kaniner.
Algoritmer og Datastrukturer 1
Algoritmer og Datastrukturer 1
Algoritmer og Datastrukturer 1
Grundlæggende Algoritmer og Datastrukturer
Præsentationens transcript:

1 Søgetræer

2 Binære søgetræer Definition Operationer Balancerede binære søgetræer AVL-træer Rød-sort-træer (AA-træer) B-træer Plan

3 Metode: Opdel arrayet i to (næsten) lige store dele. Afgør i hvilken af de to dele, nøglen skal findes. Fortsæt søgningen i denne del på samme måde. Binær søgning i et sorteret array Eksempel: Søgning efter N. A B E F G H I L M N P R S X L M N P R S X L M N N

4 Binær søgning kan beskrives ved et binært søgetræ: I E A B F H L N R X G M S P Binært søgetræ Et binært søgetræ, er et binært træ, hvor der for enhver knude X gælder, at alle knuder i dets venstre undertræ er mindre end X, og alle knuder i dets højre undertræ er større end X.

5 Binært søgetræ som abstrakt datatype public class BinarySearchTree implements SearchTree { public Comparable find(Comparable x); public void insert(Comparable x); public void remove(Comparable x); public isEmpty(); public makeEmpty(); public printSorted(); public Comparable findMin(); public Comparable findMax(); }

6 Intern repræsentation class BinaryNode { BinaryNode(Comparable e, BinaryNode lt, BinaryNode rt) { element = e; left = lt; right = rt; } Comparable element; BinaryNode left, right; } public class BinarySearchTree {... BinaryNode root; }

7 Søgning public Comparable find(Comparable x) { return find(x, root).element; } Comparable find(Comparable x, BinaryNode t) { while (t != null) { if (x.compareTo(t.element) < 0) t = t.left; else if (x.compareTo(t.element) > 0) t = t.right; else return t; } throw new ItemNotFoundException(x.toString()); }

8 Der foretages en mislykket søgning, og den nye knude indsættes der, hvor søgningen stopper. Indsættelse Indsættelse af

9 Indsættelse public void insert(Comparable x) { root = insert(x, root); } BinaryNode insert(Comparable x, BinaryNode t) { if (t == null) t = new BinaryNode(x, null, null); else if (x.compareTo(t.element) < 0) t = insert(x, t.left); else if (x.compareTo(t.element) > 0) t = insert(x, t.right); else throw new DuplicateItemException(x.toString()); return t; }

10 Erstat roden med den knude, der er mindst i rodens højre undertræ. Denne knude befinder sig længst til venstre i rodens højre undertræ. Hvis det højre undertræ er tomt, fjernes roden blot fra træet. Sletning Sletning af roden

11 Sletning public void remove(Comparable x) { root = remove(x, root); } BinayNode remove(Comparable x, BinaryNode t) { if (t == null) throw new ItemNotFoundException(x.toString()); if (x.compareTo(t.element) < 0) t.left = remove(x, t.left); else if (x.compareTo(t.element) > 0) t.right = remove(x, t.right); else if (t.right != null) {// x found t.element = findMin(t.right).element; t.right = removeMin(t.right); } else t = t.left; return t; }

12 BinaryNode findMin(BinaryNode t) { if (t == null) throw new ItemNotFoundException(); while (t.left != null) t = t.left; return t; } BinaryNode removeMin(BinaryNode t) { if (t == null) throw new ItemNotFoundException(); if (t.left == null) return t.right; t.left = removeMin(t.left); return t; } t t.left t.right

13 BinaryNode remove(Comparable x, BinaryNode t) {if (t == null) throw new IntemNotFoundException(); lastNode = t; if (x.compareTo(t.element) < 0) t.left = remove(x, t.left); else { deletedNode = t; t.right = remove(x, t.right);} if (t == lastNode) { if (t == null || x.compareTo(t.element) != 0) throw new IntemNotFoundException(x.toString()); deletedNode.element = t.element; deletedNode = null; t = t.right;} return t; } Alternativ implementering af sletning

14 Udskrivning af elementerne i sorteret rækkefølge Inorder-traversering af træet void printSorted(BinaryNode t) { if (t != null) { printSorted(t.left); System.out.println(t.element); printSorted(t.right); }

15 Find det k’te mindste element Vedligehold for enhver knude t en variabel, size, der angiver antallet af knuder i det træ, der har t som rod. BinaryNode FindKth(int k, BinaryNode t) { if (t == null) throw new ItemNotFoundException(); int leftSize = t.left != null ? t.left.size : 0; if (k == leftSize + 1) return t; if (k <= leftSize) return findKth(k, t.left); return findKth(k - (leftSize + 1), t.right); } leftSize t

Kompleksiteten af søgning, indsættelse og sletning afhænger af søgetræets udseende. I alle tre tilfælde er tiden proportional med længden af den anvendte søgevej. I bedste fald, nemlig når træet er fuldt, udføres cirka log 2 N sammenligninger. I værste fald, nemlig når træet er en lineær liste, udføres N sammenligninger. Kompleksitet

17 Hvis hvert element indsættes i tilfældig rækkefølge i et fra starten tomt binært søgetræ, vil længden af søgevejen i det frembragte træ i gennemsnit være 1.38 log 2 N. I praksis er udførelsestiden for de tre grundoperationer O(logN) for tilfældigt input. Det er dog endnu ikke blevet påvist analytisk. Det gennemsnitlige tilfælde

18 Balancerede søgetræer Balancering er en teknik, der garanterer, at de værste tilfælde ved søgning ikke forekommer. Ideen er at omorganisere træet under indsættelse og sletning, så det bliver fuldt (eller næsten fuldt). Et fuldt træ siges at være i perfekt balance. For enhver knude gælder nemlig, at antallet af knuder i dens venstre undertræ er lig med antallet af knuder i dens højre undertræ. I det følgende præsenteres en række datastrukturer, der garanterer O(logN) kompleksitet for såvel søgning, indsættelse som sletning.

19 BinaryNode buildTree(Comparable[] a, int low, int high) { if (low > high) return null; int mid = (low + high) / 2; return new BinaryNode(a[mid], buildTree(a, low, mid - 1), buildTree(a, mid + 1, high)); } Opbygning af et balanceret søgetræ ud fra en tabel af poster BinarySearchTree buildTree(Comparable[] a) { sort(a); BinarySearchTree bst = new BinarySearchTree(); bst.root = buildTree(a, 0, a.length - 1); return bst; }

20 AVL-træer (Adelson-Velskii og Landis, 1962) Et AVL-træ er et binært søgetræ, som opfylder følgende egenskab: For enhver knude i træet gælder, at højden af dens venstre undertræ og højden af dens højre undertræ højst afviger med 1.

21 Højden af er træ er det maksimale antal af kanter fra træets rod til et af dets blade. For et tomt træ vedtages, at højden er -1. Eksempel på et AVL-træ (1)(1) (0)(0) (3)(3) (2)(2) (0)(0)(1)(1) (0)(0)(0)(0)

22 Indsættelse i AVL-træ S H-1 S H-2 X H-2 H-1 H Indsættelse i X’s venstre undertræ kan ødelægge AVL-egenskaben. I det følgende betegner X den “dybeste” knude, som er rod i et træ, der ikke længere opfylder AVL-egenskaben.

23 Indsættelse i AVL-træ 4 tilfælde Ved indsættelse i et af X’s undertræer er der 4 mulige tilfælde: 1. Indsættelsen sker i det venstre undertræ af X’s venstre søn. 2. Indsættelsen sker i det højre undertræ af X’s venstre søn. 3. Indsættelsen sker i det venstre undertræ af X’s højre søn. 4. Indsættelsen sker i det højre undertræ af X’s højre søn. X X X X Tilfælde 1 og 4 er symmetriske. Tilfælde 2 og 3 er symmetriske.

24 Tilfælde 1 A B C k2k2 k1k1 X En højrerotation genskaber balancen A B C k2k2 k1k1

25 Tilfælde 2 A k2k2 k1k1 X B C En højrerotation genskaber ikke balancen B A C k2k2 k1k1

26 Tilfælde 2 (fortsat) En venstre-højre-dobbeltrotation genskaber balancen k3k3 X D A k2k2 B k1k1 C k3k3 D k1k1 k2k2 A C B k3k3 D A C B k2k2 k1k1

27 Implementation af højrerotation A B C k2k2 k1k1 X A B C k2k2 k1k1 BinaryNode rotateWithLeftChild(BinaryNode k2) { BinaryNode k1 = k2.left; k2.left = k1.right; k1.right = k2; return k1; }

28 Implementation af dobbeltrotation k3k3 X D A k2k2 B k1k1 C k3k3 D k1k1 k2k2 A C B k3k3 D A C B k2k2 k1k1 BinaryNode doubleRotateWithLeftChild(BinaryNode k3) { k3.left = rotateWithRightChild(k3.left); return rotateWithLeftChild(k3); }

29 Højdeinformation I klassen BinaryNode tilføjes et ekstra felt: int height. height angiver højden af det træ, der har den angivne knude som rod. int height(BinaryNode t) { return t == null ? -1 : t.height; } Hjælpemetode

30 Implementering af metoden insert BinaryNode insert(Comparable x, BinaryNode t) { if (t == null) t = new BinaryNode(x, null, null); else if (x.compareTo(t.element) < 0) { t.left = insert(x, t.left); if (height(t.left) - height(t.right) == 2) if (x.compareTo(t.left.element) < 0) t = rotateWithLeftChild(t); // case 1 else t = doubleRotateWithLeftChild(t); // case 2 } else if (x.compareTo(t.element) > 0 ) {... // case 3 or 4 } else throw new DuplicateItemException(); t.height = Math.max(height(t.left), height(t.right)) + 1; return t; }

31 Opdatering af height A B C k2k2 k1k1 X A B C k2k2 k1k1 BinaryNode RotateWithLeftChild(BinaryNode k2) { BinaryNode k1 = k2.left; k2.left = k1.right; k1.right = k2; k2.height = Math.max(height(k2.left), height(k2.right)) + 1; k1.height = Math.max(height(k1.left), k2.height) + 1; return k1; }

32 Eksempel på indsættelse indsættes: fortsættes

Venstrerotation ved 20: fortsættes Ubalance i 60:

Højrerotation ved 60: slut

35 Effektiviteten af AVL-træer Højden H af et AVL-træ tilfredsstiller H < 1.44 log 2 (N+2) I et tilfældigt konstrueret træ er højden meget tæt på log 2 (N).

36 Problem Et skakbræt med 8 x 8 felter kan dækkes af 32 dominobrikker, som hver dækker 2 af brættets felter. To af brættets hjørnefelter på samme diagonal skæres væk. Kan 31 brikker nu dække brættet? Farvelægning løser problemet.

37 Et Rød-Sort-træ er et binært søgetræ, som opfylder følgende 4 egenskaber: 1. Enhver knude er farvet enten rød eller sort. 2. Roden er sort. 3. Hvis en knude er rød, så er dens sønner sorte. 4. Enhver vej fra roden til en null -reference indeholder det samme antal sorte knuder. Rød-Sort-træer (Bayer, 1972)

38 Eksempel på et Rød-Sort-træ Træet er et binært søgetræ. 1. Enhver knude er farvet enten rød eller sort. 2. Roden er sort. 3. Hvis en knude er rød, så er dens sønner sorte. ( null regnes for sort) 4. Enhver vej fra rod til blad indeholder det samme antal sorte knuder. (3)

39 Effektiviteten af Rød-Sort-træer Højden H af et Rød-Sort-træ tilfredsstiller H ≤ 2 log 2 (N+1) I et tilfældigt konstrueret træ er højden meget tæt på log 2 (N). (faktisk log 2 (N))

40 Indsættelse i Rød-Sort-træer En ny knude indsættes som nyt blad i træet. Hvis den nye knude farves sort, ødelægges rød-sort-egenskab 4, og det er ikke umiddelbart klart, hvorledes egenskaben kan genoprettes. Hvis den nye knude farves rød, og dens far samtidig er sort, vil ingen af rød-sort-egenskaberne blive ødelagt. Hvis dens far derimod er rød, ødelægges rød-sort-egenskab 3. Vi skal sørge for, at en ny knude indsættes som rød søn af en sort far. Hvordan? Svar: Benyt rotationer og farveskift.

41 Behandling af 5 tilfælde X: den aktuelle røde knude. P: X’s røde far. G: X’s farfar (må nødvendigvis være sort) S: X’s farbror Tilfælde 1: X er venstre-søn til P, P er venstre-søn til G, og S er sort. AB C G P X S C G A B P X S rotateWithLeftChild(G) C G A B P X S Skift farve på P og G

42 Tilfælde 2: X er højre-søn til P, P er venstre-søn til G, og S er sort. A B1 C G P X S B2 A B1 C G X P S B2 rotateWithRightChild(P) A B1 G X P CB2 S rotateWithLeftChild(G) A B1 G X P C B2 S Skift farve på X og G

43 Tilfælde 3: X er højre-søn til P, P er højre-søn til G, og S er sort. Er symmetrisk med tilfælde 1 Tilfælde 4: X er venstre-søn til P, P er højre-søn til G, og S er sort. Er symmetrisk med tilfælde 2 Tilfælde 5: Både P og S er røde. AB C G P X S Skift farve på P, S og G. Hvis G er rod, så farv G sort. AB C G P X S

44 I tilfælde 5 kan en rød-farvning af G ødelægge rød-sort-egenskab 3. Dette problem kan dog let løses ved en enkelt-rotation (tilfælde 1 og 3) eller en dobbelt-rotation (tilfælde 2 og 4). Ingen af disse rotationer giver i sig selv anledning til yderligere rotationer. Rotationerne af type 5 kræver adgang til X’s oldefar. I lærebogens algoritme vedligeholdes således følgende referencer: current : den aktuelle knude parent : den aktuelle knudes far grand : den aktuelle knudes bedstefar great : den aktuelle knudes oldefar Disse referencer kan undværes, hvis indsættelse foretages rekursivt. Dette vil blive beskrevet i det følgende.

45 Implementering I klassen BinaryNode tilføjes feltet int color ; I klassen RedBlackTree defineres konstanterne static final int RED = 0; static final int BLACK = 1; I stedet for null -referencer benyttes objektet nullNode : static BinaryNode nullNode;static { nullNode = new BinaryNode(null); nullNode.left = nullNode.right = nullNode; nullNode.color = BLACK; }

46 BinaryNode insert(Comparable x, BinaryNode t, boolean rightChild) { if (t == nullNode) { t = new BinaryNode(x, nullNode, nullNode); t.color = RED; } else { if (t.left.color == RED && t.right.color == RED) { t.color = RED; t.left.color = t.right.color = BLACK; } if (x.compareTo(t.element) < 0) { t.left = insert(x, t.left, false); if (rightChild && t.color == RED && t.left.color == RED) t = rotateWithLeftChild(t); if (t.left.color == RED && t.left.left.color == RED) { t = rotateWithLeftChild(t); t.color = BLACK; t.right.color = RED; } } else if (x.compareTo(t.element) > 0) {...} else throw new DuplicateItemException(x.toString());} return t; } public void insert(Comparable x) {root = insert(x, root, true); root.color = BLACK; }

47 t.right = insert(x, t.right, true); if (!rightChild && t.color == RED && t.right.color == RED) t = rotateWithRightChild(t); if (t.right.color == RED && t.right.right.color == RED) { t = rotateWithRightChild(t); t.color = BLACK; t.left.color = RED; } Behandling af de 2 symmetriske tilfælde left erstattes med right right erstattes med left rightChild erstattes med !rightChild

Eksempel på indsættelse 45 indsættes: fortsættes Farveskift på 50, 40 og 55:

Højrerotation ved 70 med farveskift af 60 og 70: slut

50 AVL-træer contra Rød-Sort-træer Et rød-sort-træ er sædvanligvis mere effektivt: Indsættelse i et AVL-træ kræver (i værste tilfælde) 2 gennemløb af en vej (ned til et blad og tilbage til roden), mens indsættelse i et rød-sort-træ kan klares med 1 gennemløb. NB. I den rekursive implementation for et rød-sort-træ benyttes 2 gennemløb. Implementation af sletning i såvel AVL- som rød-sort-træer er vanskelig.

51 AA-træer Et AA-træ er et rød-sort-træ, som opfylder en ekstra betingelse: (5) En venstre-søn må ikke være rød. Betingelsen forenkler implementering: (a) antallet af omstruktureringstilfælde halveres (b) et besværligt tilfælde ved sletning i et rød-sort-træ elimineres

52 Figurlig beskrivelse af AA-træer Niveau erstatter farve. En knudes niveau er 1, hvis knuden er et blad lig med sin fars niveau, hvis knuden er rød 1 mindre end sin fars niveau, hvis knuden er sort niveau 3 niveau 2 niveau 1

Vandrette hægter peger mod højre 2. Der er ikke to konsekutive vandrette hægter 3. Enhver knude på niveau 2 eller højere har mindst to børn 4. Hvis en knude på niveau 2 eller højere ikke har en vandret hægte, så må dens to børn være på samme niveau Egenskaber

54 Rotationer kan opretholde AA-egenskaberne Tilfælde 1 (vandret venstre-hægte): Der er kun 2 tilfælde, der kræver omstrukturering: P X ABC BinaryNode skew(BinaryNode t) { if (t.left.level == t.level) t = rotateWithLeftChild(t); return t; } P X ABC

55 Tilfælde 2 (to konsekutive vandrette hægter): BinaryNode split(BinaryNode t) { if (t.right.right.level == t.level) { t = rotateWithRightChild(t); t.level++; } return t; } XR A B G X R A B G Efter skew kan en split være nødvendig

56 BinaryNode insert(Comparable x, BinaryNode t) { if (t == nullNode) t = new BinaryNode(x, nullNode, nullNode); else if (x.compareTo(t.element) < 0) t.left = insert(x, t.left); else if (x.compareTo(t.element) > 0) t.right = insert(x, t.right); else throw new DuplicateItemException(); return split(skew(t)); } Metoden insert Benyt rekursion og kald skew og split på tilbagevejen.

Eksempel på indsættelse indsættes: fortsættes

split ved 35: skew ved 50: fortsættes

split ved 40: skew ved 70: fortsættes

split ved 30: slut

61 BinaryNode remove(Comparable x, BinaryNode t) { if (t == nullNode) return nullNode; lastNode = t; if (x.lessThan(t.element)) t.left = remove(x, t.left); else { deletedNode = t; t.right = remove(x, t.right); } if (t == lastNode) { if (deletedNode == nullNode || x.compareTo(deletedNode.element) != 0) throw new ItemNotFoundException(); deletedNode.element = t.element; deletedNode = nullNode; t = t.right; } else { /* se næste side */ } return t; } Metoden remove Benyt rekursion og kald skew og split på tilbagevejen.

62 if (t.left.level < t.level - 1 || t.right.level < t.level - 1 ) { t.level--; if (t.right.level > t.level) t.right.level = t.level; t = skew(t); t.right = skew(t.right); t.right.right = skew(t.right.right); t = split(t); t.right = split(t.right); } Opretholdelse af AA-egenskaben Se lærebogen for en forklaring

Eksempel på sletning 1 slettes: t.level-- : nullNode t t.right.level-- : fortsættes t t

t = skew(t) : t.right = skew(t.right) : ingen effekt t.right.right = skew(t.right.right) : fortsættes t t t

65 t = split(t) : t.right = split(t.right) : t t slut

66 Måling af tidsforbrug Indsættelse af 300,000 forskellige heltal i et fra starten tomt træ. Metrowerks, 400 MHz PowerBook. AVL-træ 6.8 sekunder Rød-sort-træ (ikke-rekursiv version) 7.2 sekunder Rød-sort (rekursiv version) 6.6 sekunder Rød-sort ( java.util.TreeSet ) 6.9 sekunder AA-træ 7.0 sekunder

67 B-træ en datastruktur til ekstern søgning (Bayer og McCraight, 1970) 10,000,000 poster ønskes lagret på en disk på en sådan måde, at søgetiden bliver kort. Almindeligt binært træ: Det gennemsnitlige tilfælde: 1.38*log 2 (10,000,000) ≈ 32 tilgange til disken Det værste tilfælde: 10,000,000 tilgange! Balanceret binært træ: cirka log 2 (10,000,000) ≈ 24 tilgange Dette er uacceptabelt. Benyt et B-træ - et balanceret flervejstræ.

68 B-træ af orden 5 poster nøgler

69 Definition af B-træ Et B-træ af orden M er et M-vejs træ med følgende egenskaber: 1. Posterne er lagret i træets blade. 2. De interne knuder kan indeholde op til M-1 nøgler. Nøgle i er den mindste nøgle i undertræ i Roden er enten et blad eller har mellem 2 og M børn. 4. Alle interne knuder, undtagen roden, har mellem  M/2  og M børn. 5. Alle blade er på den samme dybde og indeholder mellem  L/2  og L poster. (Gælder dog kun hvis træet indeholder mindst  L/2  poster)

70 Effektivitet ved brug af et B-træ Antag at hver af de 10,000,000 poster fylder 256 bytes at hver nøgle fylder 32 bytes at hver diskhenvisning fylder 4 bytes at blokstørrelsen er 8,192 bytes. Vælg M så stor som mulig, og (M-1)*32 + M*4 ≤ 8192, altså M = 228. Hver intern knude har mindst  M/2  = 114 børn. L = 8192/256 = 32. Antal blade: højst 10,000,000/  L/2  = 10,000,000/16 = 625,000. Antal niveauer i træet log 114 (625,000) ≈ 3.4. Alle blade er på niveau 4. Hvis roden ligger i RAM, kræves derfor kun 3 tilgange til disken for at finde en post.

71 Indsættelse af 57 er simpel

72 Indsættelse af 55 medfører 1 splitning

73 Indsættelse af 40 medfører 2 splitninger

74 Sletning af 99 medfører 2 “nabolån”

75 Skitse til implementering af B-træer public class BTree { private int M, height; private Node root; private class Node {...} private class Entry {...} public BPTree(int order) { M = order; } public Object find(Comparable key) {...} public void insert(Comparable key, Object data) {...} public boolean remove(Comparable key) {...} }

76 class Node { Entry[] entry = new Entry[M + 1]; int size; Object find(Comparable key, int ht) {...} Node insert(Comparable key, Object pointer, int ht) {...} Node split() {... } } class Entry { Comparable key; Object pointer; Entry(Comparable k, Object p) { key = k; pointer = p; } }

77 Object find(Comparable key) { return root != null ? root.find(key, height) : null; } Object find(Comparable key, int ht) { if (ht == 0) { for (int i = 0; i < size; i++) if (key.compareTo(entry[i].key) == 0) return entry[i].pointer; } else for (int i = 0; i < size; i++) if (i + 1 == size || key.compareTo(entry[i + 1].key) < 0) return ((Node) entry[i].pointer).find(key, ht - 1); return null; } find

78 void insert(Comparable key, Object data) { if (root == null) root = new Node(); Node t = root.insert(key, data, height); if (t != null) { // split root Node newRoot = new Node(); newRoot.entry[0] = new Entry(root.entry[0].key, root); newRoot.entry[1] = new Entry(t.entry[0].key, t); root = newRoot; root.size = 2; height++; }

79 Node insert(Comparable key, Object data, int ht) { Entry newEntry = new Entry(key, pointer); int i; if (ht == 0) { for (i = 0; i < size; i++) if (key.compareTo(entry[i].key) < 0) break; } else for (i = 0; i < size; i++) if (i + 1 == size || key.compareTo(entry[i + 1].key) < 0) { Node t = ((Node) entry[i++].pointer). insert(key, data, ht - 1); if (t == null) return null; newEntry.key = t.entry[0].key; newEntry.pointer = t; break; } for (int j = size; j > i; j--) entry[j] = entry[j - 1]; entry[i] = newEntry; return ++size <= M ? null : split(); }

80 Node split() { Node t = new Node(); for (int i = 0, j = M / 2; j <= M; i++, j++) t.entry[i] = entry[j]; t.size = M - M / 2 + 1; size = M / 2; return t; }

81 Læs kapitel 20 og 21 i lærebogen Løs følgende opgaver Opgave 41: 19.1 (1 point) Opgave 42: 19.5 (3 point, ikke-obligatorisk) Opgave 43: (2 point, ikke-obligatorisk) Opgave 44: (2 point) Opgave 45: (1 point) Afleveringsfrist: tirsdag den 11. december Ugeseddel november - 4. december