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

Relevanta dokument
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

Föreläsning 9 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

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

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

Föreläsning 9 Datastrukturer (DAT037)

Diskutera. Hashfunktion

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

Inlämningsuppgift och handledning

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

Inlämningsuppgift och handledning. Föreläsning 11 Innehåll. Diskutera. Hashtabeller

Föreläsning 14 Innehåll

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

Föreläsning 10 Innehåll

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

Interfacen Set och Map, hashtabeller

Föreläsning Datastrukturer (DAT036)

Föreläsning 9 Innehåll

Föreläsning 10 Innehåll. Diskutera. Hashtabeller. Hashfunktion. hashfunktion. hashkod (ett heltal)

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

Seminarium 13 Innehåll

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

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

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

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

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

Föreläsning 11 Innehåll

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

Föreläsning 13 Innehåll

Tentamen, Algoritmer och datastrukturer

Datastrukturer. föreläsning 10. Maps 1

Föreläsning 12 Innehåll

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

Algoritmer och datastrukturer 2012, fo rela sning 8

Föreläsning 10 Datastrukturer (DAT037)

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

13 Prioritetsköer, heapar

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

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Lösningar Datastrukturer TDA

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

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

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

Datastrukturer. föreläsning 10. Maps 1

Lösningsförslag till tentamen i EDAA01 programmeringsteknik fördjupningkurs

Träd Hierarkiska strukturer

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

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

Sortering. Föreläsning 12 Innehåll. Sortering i Java. Sortering i Java Exempel. Sortering

Begreppet subtyp/supertyp i Java. Mera om generik. Generik och arv. Generik och arv. Innehåll

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

Algoritmer och datastrukturer 2012, föreläsning 6

Föreläsning 11 Innehåll

Föreläsning 11 Innehåll. Sortering. Sortering i Java. Sortering i Java Comparable. Sortering. O(n 2 )-algoritmer: urvalssortering insättningssortering

Föreläsning 4 Innehåll

Föreläsning 3 Innehåll

Diskutera Sortera objekt

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Föreläsning 12 Innehåll

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)

Programkonstruktion och. Datastrukturer

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Lösningsförslag till tentamen Datastrukturer, DAT037,

Algoritmer och datastrukturer

Länkade strukturer, parametriserade typer och undantag

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

BST implementering, huvudstruktur

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

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Föreläsning Datastrukturer (DAT036)

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

Tentamen Datastrukturer, DAT037 (DAT036)

Programmering fortsättningskurs

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Lösningsförslag till tentamen Datastrukturer, DAT037,

Seminarium 2 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Informationsteknologi Tom Smedsaas 19 augusti 2016

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

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

Datastrukturer. föreläsning 9. Maps 1

Lösningsförslag till exempeltenta 1

Generiska konstruktioner. Kursbokens kapitel 13

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

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Föreläsning 4 Datastrukturer (DAT037)

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

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

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

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

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

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning 6 Innehåll. Rekursion. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursiv problemlösning. Rekursion. Rekursivt tänkande:

Transkript:

Föreläsning Innehåll Diskutera Binära sökträd algoritmer för sökning, insättning och borttagning implementering effektivitet balanserade binära sökträd, AVL-träd Jämföra objekt interfacet Comparable Interfacet Comparator Antag att vi i ett program ska hantera ett stort antal element av något slag. Det ska gå snabbt att sätta in ett element ta bort ett element söka efter ett visst element Vilken/vilka datastrukturer passar bra för detta? Fungerar vektor, länkad lista? Datavetenskap (LTH) Föreläsning HT 7 / Datavetenskap (LTH) Föreläsning HT 7 / Binära sökträd Definition Ett binärt sökträd är ett binärt träd där följande gäller för varje nod n: Alla värden som finns i noder i vänster subträd till n är mindre än värdet som finns i n. Alla värden som finns i noder i höger subträd till n är större än värdet som finns i n. Dubbletter tillåts alltså inte. Inordertraversering av binära sökträd Genomgång av trädet i inorder besöker noderna i växande ordning. Exempel: En inordertraversering av trädet i figuren ger noderna i ordningen,,,,, Datavetenskap (LTH) Föreläsning HT 7 3 / Datavetenskap (LTH) Föreläsning HT 7 /

Binära sökträd sökning Binära sökträd - sökning Exempel Då man söker efter ett element i ett binärt sökträd kan man utnyttja ordningen i trädet: Börja i roten, jämför med sökt element x, om likhet är vi klara. Sök efter i trädet: Sök efter 3 i trädet: Om x är mindre än rotens element: gå till vänster barn annars gå till höger barn. Börja här: Börja här: Fortsätt på samma sätt tills vi hittar det sökta, eller tills den nod som står i tur att undersökas är null (misslyckad sökning). Man följer alltså en gren i trädet: Klart! Grenen börjar i roten. Man fortsätter tills man hittar det sökta eller till grenen tar slut (misslyckad sökning). Misslyckad sökning! Datavetenskap (LTH) Föreläsning HT 7 / Datavetenskap (LTH) Föreläsning HT 7 / Implementering av binära sökträd Klassen BinarySearchTree Exempel på hur en klass som representerar ett binärt sökträd kan se ut: public class BinarySearchTree<E extends Comparable<? super E>> { private Node<E> root; public BinarySearchTree() { root = null; public boolean add(e item) { public E find(e target) { public boolean remove(e target){ nästlad klass Node<E> som representerar nod Metoden find public E find (E target) { return find(root, target); private E find(node<e> n, E target) { if (n == null) { return null; int compresult = target.compareto(n.data); if (compresult == ) { return n.data; else if (compresult < ) { return find(n.left, target); else { return find(n.right, target); Datavetenskap (LTH) Föreläsning HT 7 7 / Datavetenskap (LTH) Föreläsning HT 7 /

Diskutera Interfacet Comparable Vad betyder <E extends Comparable<? super E>>? Skulle man lika gärna kunna skriva så här? public class BinarySearchTree<E> { Vad måste man tänka på när man skapar ett objekt av klassen BinarySearchTree? Metoden compareto i interfacet Comparable används inuti add, find och remove för att jämföra två element. public interface Comparable<T> { /** * Compares this object with the specified object for order. * Returns a negative integer, zero, or a positive integer as * this object is less than, equal to, or greater than the * specified object. */ public int compareto(t x); Datavetenskap (LTH) Föreläsning HT 7 / Datavetenskap (LTH) Föreläsning HT 7 / Att jämföra elementens nycklar Interfacet Comparable<E> Vi anger en begränsning på typparametern: public class BinarySearchTree<E extends Comparable<E>> { <E extends Comparable<E>> betyder att klassen som ersätter E måste implementera interfacet Comparable<E>. Metoden compareto kan anropas på objekt av typen E. Klassrubriken public class BinarySearchTree<E>> hade också fungerat, men då hade det krävts en typkonvertering vid anrop av compareto: ((Comparable<E>) target).compareto(n.data) Datavetenskap (LTH) Föreläsning HT 7 / Typparameter med begränsning Varför? super E Ibland är det för restriktivt att kräva att E implementerar Comparable<E>. Istället kan vi kräva att E implementerar Comparable<? super E>. Exempel: class Person implements Comparable<Person> { class Student extends Person { Student implementerar inte Comparable<Student>, men däremot (genom arv) Comparable<Person>. Klassen Student uppfyller inte kravet E extends Comparable<E>.Vi kan därför inte deklarera träd av typen BinarySearchTree<Student>. Lätta på restriktionen och kräv att klassen som ersätter E ska implementera Comparable<? super E>.? super E kan utläsas okänd superklass till E (inklusive E) Student implementerar Comparable<Person> och Person är superklass till Student. Därför uppfyller Student kravet för att ersätta E och vi kan skapa träd av typen BinarySearchTree<Student>. Datavetenskap (LTH) Föreläsning HT 7 /

Exempel på användning av klassen BinarySearchTree Implementering av interfacet Comparable Klassen Person // Skapa ett träd och lägg till personer i trädet BinarySearchTree<Person> bst = new BinarySearchTree<Person>(); bst.add(new Person("Kalle", "3-3")); bst.add(new Person("Kajsa", "37-")); // sök efter personen med personnummer 37- Person p = bst.find(new Person(null, "37-")); public class Person implements Comparable<Person> { private String name; private String pnbr; public int compareto(person other) { return pnbr.compareto(other.pnbr); Klassen Person måste implementera Comparable<Person>. Observera att man måste skapa ett Person-objekt för att kunna söka efter en person i trädet. Detta objekt måste få korrekta värden på de attribut som används för jämförelser i compareto. Comparable är ett generiskt interface. I exemplet är Person typargument. Observera att parametern i compareto därför har typen Person. Datavetenskap (LTH) Föreläsning HT 7 3 / Datavetenskap (LTH) Föreläsning HT 7 / Implementering av find alternativ Publika metoden find i trädklassen Implementering av find alternativ Privata metoden find i nodklassen I trädklassen: public E find (E target) { if (root == null) { return null; else { return root.find(target); Hjälpmetoden finns på nästa bild. Datavetenskap (LTH) Föreläsning HT 7 / I nodklassen: private E find (E target) { int compresult = target.compareto(data); if (compresult == ) { return data; else if (compresult < ) { if (left!= null) { return left.find(target); else { return null; else { if (right!= null) { return right.find(target); else { return null; Datavetenskap (LTH) Föreläsning HT 7 /

Diskutera Binära sökträd - insättning Exempel Hur går insättning i ett binärt sökträd till? Var i trädet ska 3 sättas in? Var i trädet ska 7 sättas in? Sök in 3 i trädet: Börja här: Efter insättning: Misslyckad sökning! Sätt in 3 här. 3 Datavetenskap (LTH) Föreläsning HT 7 7 / Datavetenskap (LTH) Föreläsning HT 7 / Binära sökträd - insättning Exempel Binära sökträd insättning Sammanfattning Sätt in i trädet: Börja här: Vid insättning av nytt element ska ordningen i trädet bevaras. Dubbletter får inte förekomma. Dubblett hittas. Insättningen genomförs inte. Insättning kan tolkas som misslyckad sökning : Vi söker på en gren i trädet. Om vi misslyckas med hitta det element som ska sättas in utförs insättningen som ett löv på den plats i trädet där misslyckandet konstaterats. Datavetenskap (LTH) Föreläsning HT 7 / Datavetenskap (LTH) Föreläsning HT 7 /

Binära sökträd borttagning Binära sökträd - borttagning Exempel på enkelt fall - noll barn För att kunna ta bort ett element ur trädet måste vi söka upp det. När vi tar bort det måste vi koppla ihop föräldern med något av barnen. Vid sökningen behöver man därför hålla reda på en referens till föräldern. Sammankopplingen sköts på olika sätt beroende på hur många barn som finns till den nod som ska bort: Enklaste fallen är noll eller ett barn. Fallet två barn är lite krångligare. Tag bort 3 ur trädet. Börja med att söka efter noden (och föräldern). parent = null act parent act 3 Noden, act, som ska bort är ett löv. Sätt den referens i parent som refererar till act till null. Datavetenskap (LTH) Föreläsning HT 7 / Datavetenskap (LTH) Föreläsning HT 7 / Binära sökträd - borttagning Exempel på enkelt fall - ett barn Binära sökträd - borttagning Exempel - två barn Tag bort ur trädet. Börja med att söka efter noden (och föräldern). parent = null act parent act 3 Noden, act, som ska bort har ett barn. Sätt den referens i parent som refererar till act till att referera till act:s barn. 3 Tag bort ur trädet. parent act min 3 Noden, act, som ska bort har två barn: Sök upp minsta noden (min) i act:s högra subträd Flytta data från denna till act Tag bort min Datavetenskap (LTH) Föreläsning HT 7 3 / Datavetenskap (LTH) Föreläsning HT 7 /

Binära sökträd - borttagning Exempel - två barn, forts Binära sökträd borttagning Specialfall Efter flyttning av data från min till act: Efter borttagning av min: 3 3 I några av de fall som beskrivits finns det ett alternativ som måste hanteras speciellt: förälder till den nod som skall tas bort saknas, d.v.s. roten tas bort. Fall : roten ska då bli null. Fall : roten ska referera till act:s barn. min 3 Observera att borttagning av min är ett enklare fall eftersom denna nod kan ha högst ett barn (höger). Datavetenskap (LTH) Föreläsning HT 7 / Datavetenskap (LTH) Föreläsning HT 7 / Diskutera Binära sökträd tidskomplexitet En traversering genom alla noderna i ett träd med n noder har tidskomplexiteten O(n). Varje nod besöks en gång. Vad påverkar effektiviteten för operationerna sökning, insättning och borttagning? Vad får dessa metoder för tidskomplexitet? Operationerna sökning, insättning och borttagning innebär sökning utmed en gren i trädet. Ivarjenodgörsettkonstantarbete(väsentligenenjämförelse). Den längsta grenen i ett träd har h noder, där h är trädets höjd. Värsta fall för samtliga operationer är alltså O(h). Vi vill uttrycka tidskomplexiteten som en funktion av antal noder, n. Vi måste alltså känna till sambandet mellan trädet höjd och antal noder. Datavetenskap (LTH) Föreläsning HT 7 7 / Datavetenskap (LTH) Föreläsning HT 7 /

Samband mellan höjd och antal noder i binära träd För alla binära träd T med n noder gäller för höjden h och h h apple n () log(n + ) () () är enkelt att inse. Trädet får största möjliga höjd om man placerar en nod på varje nivå. Höjden blir då n. Ex. för n = 3: Samband mellan höjd och antal noder i binära träd, forts (): På nivå ett finns en nod (roten). På nivå två högst noder, på nivå tre högst nodet etc. Allmänt finns det på nivå i högst i noder. Den högsta nivån i ett träd med höjd h är h. =) antal noder, n apple + + + + i + + h = h = h. Vilket ger att h log(n + ) Här har vi använt formeln för geometrisk summa: + a + a + + a k = ak+ a Datavetenskap (LTH) Föreläsning HT 7 / Datavetenskap (LTH) Föreläsning HT 7 3 / Binära sökträd tidskomplexitet Diskutera Samtliga operationer (sökning, insättning, borttagning) innebär sökning utmed en gren i trädet. I varje nod görs ett konstant arbete (väsentligen en jämförelse). Den längsta grenen i ett träd har h noder, där h är trädets höjd. Värsta fall för samtliga operationer är alltså O(h). Sätt in,,... 7 (i den ordningen) Sätt in,,,,, 3, 7: Sätt in,,,, 7, 3, : Vi har tidigare visat att för alla binära träd med n noder gäller att log(n + ) apple höjden apple n De tre operationerna har tidskomplexitet O(n) i värsta fall och O( log n) ibästafall. Vilken insättningsordning ger bästa respektive sämsta formen på trädet? Datavetenskap (LTH) Föreläsning HT 7 3 / Datavetenskap (LTH) Föreläsning HT 7 3 /

Binära sökträd tidskomplexitet, forts Binära sökträd med minimal höjd Trädets höjd påverkas av insättningar och borttagningar. Ivärstafallbestårträdetavenendagrenochvärstafallstidenför sökning, insättning och borttagning blir O(n). Vid slumpmässiga insättningar och borttagningar blir tidskomplexiteten i medelfall O( log n). Vi ska strax se hur man kan hålla trädet balanserat och även få en värstafallstid på O( log n). Den idealiska formen på ett binärt sökträd: Alla nivåer, utom möjligen den högsta, har så många noder som är möjligt. Det betyder att noderna ligger så nära roten som möjligt. Då blir trädets höjd garanterat O( log n). Datavetenskap (LTH) Föreläsning HT 7 33 / Datavetenskap (LTH) Föreläsning HT 7 3 / Exempel på binära träd med minimal höjd Binära sökträd - tidskomplexitet Ett binärt träd är perfekt (eng: perfect binary tree) omallanoder utom löven har två barn och om alla löven befinner sig på samma nivå. Då har trädet formen: Ett binärt träd är komplett (eng: complete binary tree) om alla nivåer utom den högsta är fyllda med noder och om noderna på den högsta nivån är samlade längst till vänster. Då har trädet formen: Det finns ingen tillräckligt effektiv algoritm för att se till att ett binärt sökträd får den idealiska formen. Trädet behöver inte ha denna form för att garantera att alla operationer blir O( log n) ivärstafall. Det räcker att garantera att höjden är proprtionell mot log n, d.v.s. att h = O( log n). Det finns effektiva algoritmer för att i samband med insättning och borttagning garantera att trädets höjd alltid är O( log n). Datavetenskap (LTH) Föreläsning HT 7 3 / Datavetenskap (LTH) Föreläsning HT 7 3 /

Balanserade binära sökträd AVL-träd Balanserade binära sökträd Georgy Adelson-Velsky and Evgenii Landis gjorde följande definition: Balanserat binärt träd Ett binärt träd är balanserat om det för varje nod i trädet gäller att höjdskillnaden mellan dess båda subträd är högst ett. De visade också att Ibalanseradeträdärhöjdenh apple. log n. Det finns effektiva algoritmer för att se till att binära sökträd förblir balanserade vid insättningar och borttagningar. Balanserat träd Obalanserat träd Datavetenskap (LTH) Föreläsning HT 7 37 / Datavetenskap (LTH) Föreläsning HT 7 3 / Balanserade binära sökträd Diskutera balans = h R h L h R = höger subträds höjd h L = vänster subträds höjd Vad händer med trädets balansering om man lägger till? Hur kan man rätta till det? Balanserat träd Obalanserat träd Datavetenskap (LTH) Föreläsning HT 7 3 / Datavetenskap (LTH) Föreläsning HT 7 /

Balansering av binära sökträd Balansering av binära sökträd Exempel Balanseringsalgoritmerna arbetar med rotationer i trädet: y x Obalanserat vid : Efter en enkel högerrotation: A x B C Enkel högerrotation vid y =) A B y C y x A B x C Enkel vänsterrotation vid y =) A y B C Datavetenskap (LTH) Föreläsning HT 7 / Datavetenskap (LTH) Föreläsning HT 7 / Balansering av binära sökträd Balansering av binära sökträd Exempel - dubbelrotationer Ibland behövs dubbelrotationer: A y z x D Höger-vänsterdubbelrotation =) A y B z C x D Efter insättning av 7 får man trädet: B C y 7 7 A x B z D C Vänster-högerdubbelrotation =) A x B z C y D Det råder nu obalans vid men om man försöker med en enkel högerrotation blir det: Detta träd är fortfarande obalanserat! Istället måste man göra en dubbel vänsterhögerrotation (se nästa bild). Datavetenskap (LTH) Föreläsning HT 7 3 / Datavetenskap (LTH) Föreläsning HT 7 /

Balansering av binära sökträd Exempel - dubbelrotationer Balansering av binära sökträd Obalanserat vid : 7 Efter en vänster-högerrotation: 7 Obalans måste kunna upptäckas: Man kan ha ett heltalsattribut balance i nodklassen. I balance bokförs höjdskillnaden mellan höger och vänster subträd. Isambandmedinsättning/borttagningändrasev.höjdenavsubträd och attributet uppdateras Om höjdskillnaden blir > eller < sååtgärdasdetmed rotation(er) som i sin tur förändrar höjd och balance hos subträd. Efter eventuella rotation(er) blir absolutbeloppet av balance åter apple. Datavetenskap (LTH) Föreläsning HT 7 / Datavetenskap (LTH) Föreläsning HT 7 / Balansering av binära sökträd kostnad Balansering av binära sökträd kostnad Man kan visa att: Om obalans uppstår till följd av en insättning i ett tidigare balanserat träd så räcker det med en enkel- eller dubbelrotation för att återställa balansen. Om obalans uppstår till följd av en borttagning ur ett tidigare balanserat träd så kan det behövas en enkel- eller dubbelrotation i varje nod på vägen från den nod där obalans uppstod till roten för att återställa balansen. Höjden förblir O( log n) om man balanserat trädet vid varje förändring. En enskild rotation kostar bara O(). Kostnaden för balansering i samband med en insättning eller borttagning är O( log n). Om ett binärt sökträd hålls balanserat kommer sökning, insättning och borttagning därmed att kosta O( log n) ivärstafall. Datavetenskap (LTH) Föreläsning HT 7 7 / Datavetenskap (LTH) Föreläsning HT 7 /

Diskutera Iföljandekodsökermanefterenpersonmedettvisstpersonnummer: BinarySearchTree<Person> bst = new BinarySearchTree<Person>(); bst.add(new Person("Kalle", "3-3")); bst.add(new Person("Kajsa", "37-")); Person p = bst.find(new Person(null, "37-")); Vår exempelklass Person implementerar Comparable<Person>. I metoden compareto är det personnumren som jämförs. Inuti klassen trädklassen används metoden compareto för att jämföra två element. Antag att vi vill kunna jämföra personer på olika sätt (personnummer eller namn). Vi vill t.ex. skapa ett sökträd där personerna ordnas efter personnummer och ett annat sökträd där personerna ordnas efter namn. Hur löser vi detta? Datavetenskap (LTH) Föreläsning HT 7 / Interfacet Comparator Vi måste se till att det finns ett alternativ till compareto för att jämföra element inuti trädklassen. Interfacet Comparator ger oss möjlighet att jämföra objekt av en klass på flera olika sätt. public interface Comparator<T> { /** * Compares its two arguments for order. * Returns a negative integer, zero, or a positive * integer as the first argument is less than, * equal to, or greater than the second. */ int compare(t e, T e); Datavetenskap (LTH) Föreläsning HT 7 / Alternativ implementering av binära sökträd Två konstruktorer Alternativ implementering av binära sökträd, forts Privat metod för att jämföra public class BinarySearchTree<E> { private Node<E> root; private Comparator<? super E> comp; /** Skapar ett tomt binärt sökträd. Elementen förutsätts vara av en klass som implementerar Comparable<? super E>. */ public BinarySearchTree() { root = null; comp = null; /** Skapar ett tomt binärt sökträd. Elementen jämförs med komparatorn comp. */ public BinarySearchTree(Comparator<? super E> comp) { root = null; this.comp = comp; Datavetenskap (LTH) Föreläsning HT 7 / private int compareelements(e e, E e) { if (comp == null) { return ((Comparable<E>) e).compareto(e); else { return comp.compare(e, e); Datavetenskap (LTH) Föreläsning HT 7 /

Metoden find Användning av metoden compareelements Två konstruktorer public E find (E target) { return find(root, target); private E find(node<e> n, E target) { if (n == null) { return null; int compresult = compareelements(target, n.data); if (compresult == ) { return n.data; else if (compresult < ) { return find(n.left, target); else { return find(n.right, target); // nytt Nu har klassen två konstruktorer: public BinarySearchTree(); public BinarySearchTree(Comparator<? super E> c); Används den första konstruktorn, förutsätts elementen implementera Comparable annars genereras ClassCastException. Inuti trädklassen används metoden compareto för att jämföra två objekt. Den andra konstruktorn har en parameter som är ett objekt av en klass som implementerar interfacet Comparator. Används denna kommer jämförelser att utföras med hjälp av komparatorns metod compare. Datavetenskap (LTH) Föreläsning HT 7 3 / Datavetenskap (LTH) Föreläsning HT 7 / Implementering av interfacen Comparable och Comparator Klassen Person implementerar Comparable<Person> precis som förut: public class Person implements Comparable<Person> { private String name; private String pnbr; public int compareto(person other) { return pnbr.compareto(other.pnbr); Ny komparatorklass: public class NameComparator implements Comparator<Person> { public int compare(person p, Person p) { return p.getname().compareto(p.getname()); Datavetenskap (LTH) Föreläsning HT 7 / Exempel med komparatorklass // Skapa ett träd och lägg till personer i trädet BinarySearchTree<Person> bst = new BinarySearchTree<Person>(new NameComparator()); bst.add(new Person("Kalle", "3-3")); bst.add(new Person("Kajsa", "37-")); // sök efter personen med namnet Kalle Person p = bst.find(new Person("Kalle", null)); Ett objekt av typen NameComparator skapas och en referens till detta objekt skickas med som parameter till konstruktorn. Datavetenskap (LTH) Föreläsning HT 7 /

Sammanfattning komparator Diskutera För att förse det binära sökträdet med en komparator måsta man: Skriva en klass som implementerar interfacet Comparator. I metoden compare specificerar man hur jämförelsen mellan två objekt ska gå till: public class NameComparator implements Comparator<Person> { public int compare(person p, Person p) { return p.getname().compareto(p.getname()); Skapa ett objekt av denna klass och 3 skicka med en referens till detta objekt till konstruktorn: I exemplet med binärt sökträd sorterat efter namn skrev vi klassen NameComparator som implementerade ett interface med en enda abstrakt metod. Vi använde denna klass en enda gång. Känner du igen detta mönster från något tidigare moment i kursen? Finns det något sätt att förenkla detta? new BinarySearchTree<Person>(new NameComparator()); Datavetenskap (LTH) Föreläsning HT 7 7 / Datavetenskap (LTH) Föreläsning HT 7 / Lambdauttryck Exempel på vad du ska kunna IJavainfördeslambdauttryck(sebilderfrånförel.7) Interfacet Comparator<E> är ett funktionellt interface, d.v.s. den har bara en abstrakt metod. I sådana fall kan man använda lambdauttryck istället för att skriva en komparatorklass som implementerar interfacet, skapa ett objekt av komparatorklassen och skicka med en referens till ett sådant objekt till konstruktorn i trädklassen: BinarySearchTree<Person> bst = new BinarySearchTree<Person>( (p, p)-> p.getname().compareto(p.getname()) ); Förklara begreppet binära sökträd. Förklara hur insättning, sökning och borttagning i ett binärt sökträd går till och kunna implementera sökning och insättning. Känna till och kunna implementera interfacet Comparable. Förklara begreppet balanserat binärt sökträd och varför man vill ha balanserade träd. Förklara begreppet AVL-träd. Ange tidskomplexitet för operationer på binära sökträd. Känna till och kunna implementera interfacet Comparator. Kunna skicka med lambdauttryck som argument till parametrar av typen Comparator. Datavetenskap (LTH) Föreläsning HT 7 / Datavetenskap (LTH) Föreläsning HT 7 /

Datorlaboration Binära sökträd Datorlaboration, forts Insättning i binära sökträd Implementera en egen generisk klass för binära sökträd. Tips: I flera fall blir det en (kort) publik metod som anropar en privat rekursiv metod. I en av metoderna ska ett nytt träd byggas upp från värden i en vektor. Hämta inspiration från den rekursiva algoritmen för binärsökning. Rita för att förstå vad som händer i programmet! Innehåll: binära sökträd, rekursion, länkad struktur. Nycklarna i vänster subträd < roten < nycklarna i höger subträd Dubbletter är ej tillåtna. Nya noder sätts alltid in som löv. Insättning börjar med en (förhoppningsvis) misslyckad sökning. Exempel: Sätt in 3. Börja här: Misslyckad sökning! Sätt in 3 här. Datavetenskap (LTH) Föreläsning HT 7 / Datavetenskap (LTH) Föreläsning HT 7 /