Definisjon: Et sortert tre

Like dokumenter
Definisjon av binært søketre

Selv-balanserende søketrær

Definisjon. I et binært tre har hver node enten 0, 1 eller 2 barn

Heap og prioritetskø. Marjory the Trash Heap fra Fraggle Rock

Et eksempel: Åtterspillet

Binære trær: Noen algoritmer og anvendelser

Flerveis søketrær og B-trær

Fra Kap.10 Binære søketre (BS-tre) Sist oppdatert Definere en abstrakt datastruktur binært søketre. Vise hvordan binær søketre kan brukes

Et eksempel: Åtterspillet

Lars Vidar Magnusson

Heap* En heap er et komplett binært tre: En heap er også et monotont binært tre:

Binær heap. En heap er et komplett binært tre:

INF2220: Forelesning 2

Søkeproblemet. Gitt en datastruktur med n elementer: Finnes et bestemt element (eller en bestemt verdi) x lagret i datastrukturen eller ikke?

Datastrukturer for rask søking

INF2220: Forelesning 2. Balanserte søketrær Rød-svarte trær (kapittel12.2) B-trær (kapittel 4.7)

INF2220: Forelesning 2

Liste som abstrakt konsept/datatype

Balanserte binære søketrær

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

Ny/utsatt EKSAMEN. Dato: 5. januar 2018 Eksamenstid: 09:00 13:00

Repetisjon: Binære. Dagens plan: Rød-svarte trær. Oppgave (N + 1)!

Lars Vidar Magnusson Kapittel 13 Rød-Svarte (Red-Black) trær Rotasjoner Insetting Sletting

EKSAMENSOPPGAVE. INF-1101 Datastrukturer og algoritmer. Adm.bygget, rom K1.04 og B154 Ingen

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

Binære søketrær. Et notat for INF1010 Stein Michael Storleer 16. mai 2013

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

Trær. Består av sammenkoblede noder Hver node har 0 eller flere barne-noder. Må være asyklisk. Et tre med n noder har n-1 kanter.

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

Vi skal se på grafalgoritmer for:

Enkle datastrukturer. Lars Greger Nordland Hagen. Introduksjon til øvingsopplegget og gjennomgang av python

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

Dagens plan: INF Algoritmer og datastrukturer. Repetisjon: Binære søketrær. Repetisjon: Binære søketrær

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

IN Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Kap.12. Flervegssøketre. Studerer 2-3 og 2-4 trær. Sist oppdatert

Notater til INF2220 Eksamen

INF Algoritmer og datastrukturer

PG4200 Algoritmer og datastrukturer Forelesning 7

Oppgavesettet består av 7 sider, inkludert denne forsiden. Kontroll& at oppgaven er komplett før du begynner å besvare spørsmålene.

Kap 9 Tre Sist oppdatert 15.03

Trær. En datastruktur (og abstrakt datatype ADT)

Dagens tema. INF Algoritmer og datastrukturer. Binærtrær. Generelle trær

Binære søketrær. En ordnet datastruktur med raske oppslag. Sigmund Hansen

Sorteringsproblemet. Gitt en array A med n elementer som kan sammenlignes med hverandre:

Rekursiv programmering

Lars Vidar Magnusson

PG 4200 Algoritmer og datastrukturer Innlevering 2

INF2220: Time 4 - Heap, Huffmann

INF Algoritmer og datastrukturer. Hva er INF2220? Algoritmer og datastrukturer

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

Eksamen i IN 110, 18. mai 1993 Side 2 Del 1 (15%) Vi skal se på prioritetskøer av heltall, der vi hele tiden er interessert i å få ut den minste verdi

Hva er en algoritme? INF HØSTEN 2006 INF1020. Kursansvarlige Ragnar Normann E-post: Dagens tema

Obligatorisk oppgave 1 INF1020 h2005

Algoritmer og Datastrukturer

INF1010 Rekursive metoder, binære søketrær. Algoritmer: Mer om rekursive kall mellom objekter Ny datastruktur: binært tre

Algoritmer og Datastrukturer

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Hashing: Håndtering av kollisjoner

KONTINUASJONSEKSAMEN

Rekursiv programmering

NITH PG4200 Algoritmer og datastrukturer Løsningsforslag Eksamen 4.juni 2013

INF1010 Binære søketrær ++

Algoritmer og datastrukturer Løsningsforslag

UNIVERSITETET I OSLO

Eksempel: Uttrykkstrær I uttrykkstrær inneholder bladnodene operander (konstanter, variable,... ), mens de interne nodene inneholder operatorer.

Algoritmer og Datastrukturer IAI 21899

MAT1030 Diskret matematikk

EKSAMEN med løsningsforslag

Innhold. Innledning 1

INF1010 siste begreper før oblig 2

INF2220: Forelesning 1

Oppsummering. MAT1030 Diskret matematikk. Oppsummering. Oppsummering. Eksempel

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

E K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 00HINDB / 00HINEA ( 2DA / 2DB / 2EA ) TID:

Heapsort. Lars Vidar Magnusson Kapittel 6 Heaps Heapsort Prioritetskøer

Ny/utsatt EKSAMEN. Dato: 6. januar 2017 Eksamenstid: 09:00 13:00

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

Eksamen iin115, 14. mai 1998 Side 2 Oppgave 1 15 % Du skal skrive en prosedyre lagalle som i en global character array S(1:n) genererer alle sekvenser

Algoritmer og Datastrukturer

Høgskolen i Gjøvik. Avdeling for elektro- og allmennfag K O N T I N U A S J O N S E K S A M E N. EKSAMENSDATO: 11. august 1995 TID:

Eksamen iin115 og IN110, 15. mai 1997 Side 2 Oppgave 1 Trær 55 % Vi skal i denne oppgaven se på en form for søkestrukturer som er spesielt godt egnet

EKSAMEN Løsningsforslag. med forbehold om bugs :-)

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Dynamisk programmering Undervises av Stein Krogdahl

Binære Søketre. Egenskap. Egenskap : Grafisk. Egenskap : Kjøretid. Egenskap : Kjøretid. Egenskap : Oppsumering. Binære Søketre

Transkript:

Binære søketrær

Definisjon: Et sortert tre For alle nodene i et binært søketre gjelder: Alle verdiene i nodens venstre subtre er mindre enn verdien i noden Alle verdiene i nodens høyre subtre er større eller lik verdien i noden Det binære søketreet er en sortert datastruktur: Nodene oppsøkes i stigende sortert rekkefølge ved en inorder (venstre-roten-høyre) traversering av søketreet

Alfabetisk sortert søketre Inorder traversering: Abigail, Abner, Adam, Adela, Agnes, Alex, Alice, Allen, Angela, Arthur, Audrey

Forenklinger i forhold til læreboken Læreboken implementerer binære søketrær med: Generisk ADT (som kan lagre 'alt') Både array og pekere Se avsnittene 10.2 10.4 og lærebokas kode For å holde fokus på prinsippene og algoritmene, og ikke på Java, forenkler vi til: Bare implementasjon med pekere Ingen ADT, skreddersyr noder og algoritmer for hvert enkelt problem Noder som bare inneholder enkle data (heltall, tegn, strenger) og referanser til venstre og høyre barn

Søking i binært søketre Starter i roten av treet Følger en vei gjennom treet inntil: Verdien vi søker etter er funnet, eller Vi kommer til en bladnode uten å ha funnet verdien det søkes etter Maksimalt antall steg i søkingen blir omtrent lik høyden av treet (lengden av lengste vei fra roten frem til et blad)

Eksempel: Søk etter verdien x = 3

Rekursiv algoritme for søking etter en verdi x i et binært søketre Hvis roten er lik null: x finnes ikke i treet, ferdig Hvis x = verdien i roten: x er funnet, ferdig Ellers hvis x < verdien i roten: Søk etter x i rotens venstre subtre Ellers: Søk etter x i rotens høyre subtre

Søking: Implementasjon og effektivitet Implementeres effektivt med iterasjon: En while-løkke der vi i hvert steg enten går til høyre eller venstre i treet, se Java-koden Kan også kodes rekursivt: Enklere(?) kode, men langsommere enn iterasjon Effektivitet: Verste tilfelle: Verdien vi søker finnes ikke i treet Må da gå hele veien fra roten til et blad Søking i et tre med n noder er O(log n) hvis treet er noenlunde balansert Søking blir O(n) hvis treet blir en skjev «nesten-liste»

Innsetting av ny verdi i binært søketre Starter i roten av treet Følger en vei gjennom treet inntil: Vi kommer til posisjonen der verdien kunne ha ligget (som en bladnode) hvis den var i treet Setter inn den nye noden som en bladnode på denne posisjonen Maksimalt antall steg i innsettingen blir omtrent lik høyden av treet (lengden av lengste vei fra roten frem til et blad)

Rekursiv algoritme for innsetting av en verdi x i et binært søketre Hvis roten er lik null: Sett inn ny rotnode med verdien x Ellers hvis x < verdien i roten: Sett inn x i rotens venstre subtre Ellers: Sett inn x i rotens høyre subtre Se lærebokas animasjon av innsetting

Innsetting: Implementasjon og effektivitet Implementeres effektivt med iterasjon: En while-løkke der vi i hvert steg enten går til høyre eller venstre i treet Setter inn ny node som et blad, som blir venstre eller høyre barn til sist oppsøkte node i treet, se Java-koden Effektivitet: Verste tilfelle: Går den lengste veien fra roten til et blad Innsetting i et tre med n noder er O(log n) hvis treet er noenlunde balansert Innsetting blir O(n) hvis treet degenererer til en «nesten-liste»

Innsetting kan gi ubalanse Binært søketre etter innsetting av: (a) K B P D M R (b) B K D P M R (c) B D K M P R

Fjerning av en verdi fra binært søketre Starter i roten av treet Følger en vei gjennom treet inntil vi finner verdien som skal fjernes Kan ikke ha «hull» i treet Må flytte på én node slik at den «fyller hullet» etter noden som skal fjernes Maksimalt antall steg i fjerningen blir igjen omtrent lik høyden av treet (lengden av lengste vei fra roten frem til et blad)

Fjerning av node i binært søketre: Må skille på fire ulike tilfeller 1. Noden som skal fjernes er en en bladnode (har ingen barn) 2. Noden som skal fjernes mangler venstre subtre 3. Noden som skal fjernes mangler høyre subtre 4. Noden som skal fjernes har både høyre og venstre subtre

Tilfelle 1: Fjerning av bladnode Sett forgjengernoden til å peke på null Fjerning av verdien 3:

Tilfelle 2 og 3: Fjerning av node med ett tomt subtre Sett forgjengernoden til å peke på fjernet nodes etterfølger Fjerning av verdien 5:

Tilfelle 4: Fjerning av node med to subtrær Flytt minste node (lengst til venstre) i nodens høyre subtre, til posisjonen der noden som skal fjernes står Krever oppdateringer av forgjenger (hvis det ikke er roten som fjernes) og (oftest) høyre etterfølger Fjerning av verdien 2, noden med verdi 3 flyttes:

Fjerning: Implementasjon og effektivitet Implementeres med iterasjon: En while-løkke der vi i hvert steg enten går til høyre eller venstre i treet, inntil noden som skal fjernes er funnet Fjerningen medfører en del «pekerfikling», som skilles ut i en egen metode, for å håndtere alle spesialtilfellene, Se lærebokas animasjon av fjerning og Java-koden Effektivitet: Verste tilfelle: Går den lengste veien fra roten til et blad «Pekerfiklingen» er alltid O(1) Fjerning i et tre med n noder er O(log n) hvis treet er noenlunde balansert Fjerning av noder kan ødelegge balansen i treet

En anvendelse av søketrær: Svadageneratoren Leser en fil med tekst, f.eks. engelsk eller tysk Registrerer i binære trær: Alle sekvenser av 2 (evt. 3, 4 eller 5) påfølgende tegn som finnes i teksten Alle tegn som kommer rett etter en tegnsekvens og hvor ofte disse forekom Skriver ut en ny tekst som bare inneholder de leste tegnsekvensene, der frekvensen av tegnene som kommer etter hver sekvens er den samme som i innlest tekst utskriften vil da ligne på språket som er lest inn

Eksempel: «en pen gren.» Tegnsekvenser: "en", "n ", " p", "pe", "en", "n ", " g", "gr", "re", "en", "n." "en" > 2' ', 1'.' / \ / \ 1'e' < " p" "n " > 1'p', 1'g' / / \ 1'r' < " g" "gr" "pe" > 1'n' / \ 1'e' < + "n." "re" > 1'n'

Svadageneratoren: Java-kode Versjon 0.1: Innlesning av n-sekvenser Versjon 0.2: Innlesning og datastruktur Versjon 0.3: Innlesning og oppbygging av binære søketrær Versjon 1.0: Innlesning og utskrift av svada

Selv-balanserende søketrær Operasjonene på søketrær er oftest O(log n), men dette kan ikke garanteres Selvbalanserende søketrær implementerer innsetting og fjerning av verdier slik at ubalanse i treet rettes opp hvis nødvendig Er alltid O(log n) Men: Krever mer komplisert programkode med mye «pekerfikling» Varianter: AVL-tre, Red-black tree (Java Collections), Splaytree, Scapegoat tree,...

AVL-trær Hver node i søketreet lagrer en balansefaktor: Forskjellen i høyde mellom nodens høyre og venstre subtre 0: Subtrærne er like høye Negativ : Venstre høyest Positiv: Høyre høyest AVL-tre: Alle noder har balansefaktor lik -1, 0 eller +1 Retter opp ubalanse hvis balansefaktor blir -2 eller 2 ved en innsetting eller fjerning i søketreet Kan bevises at høyden av AVL-tre alltid er O(log n)

Innsetting i AVL-tre Sett inn ny node som i et vanlig søketre Justér treet etterpå slik at Balansefaktoren i alle nodene fortsatt er korrekt Noder flyttes rundt i treet hvis nødvendig, for å sikre at ingen noder kommer i ubalanse Pivotnode: Nærmeste node på veien ned til ny node som har balansefaktor som ikke er lik 0 ( + eller ) Noder flyttes i treet med rotasjoner rundt pivotnoden Flere ulike tilfeller som må spesialbehandles

Tilfelle 1: Ingen pivotnode Alle noder på søkeveien ned til den nye noden som er satt inn har balansefaktor lik 0 Innsettingen kan ikke forårsake ubalanse Ingen omstruktureringer er nødvendig Trenger bare å justere balansefaktoren for alle nodene som ligger på søkeveien

Tilfelle 1: Eksempel

Tilfelle 2: Ny node i pivotnodens korteste subtre Det finnes en pivotnode på veien ned til ny node Ny node er satt inn i pivotnodens korteste subtre Kan ikke forårsake ubalanse i treet Trenger ikke flytte noen noder Justerer balansefaktor for alle noder fra og med pivotnoden og ned til den nye noden som er satt inn

Tilfelle 2: Eksempel

Tilfelle 3: Ny node i pivotnodens høyeste subtre Det finnes en pivotnode på veien ned til ny node Ny node er satt inn i pivotnodens høyeste subtre Pivotnoden blir ubalansert Treet må omstruktureres for å opprettholde AVLegenskapene To (fire) tilfeller av omstrukturering: Enkel rotasjon (to symmetriske tilfeller) Dobbel rotasjon (to symmetriske tilfeller)

Eksempel som krever enkel rotasjon Ny node settes inn i venstre subtre til pivotnodens etterfølger på søkestien:

Enkel rotasjon (symmetrisk for noden p3 til høyre)

Enkel rotasjon: Eksempel

Eksempel som krever dobbel rotasjon Ny node settes inn i høyre subtre til pivotnodens etterfølger på søkestien:

Dobbel rotasjon (symmetrisk for noden p3 til høyre)

Dobbel rotasjon. Eksempel

AVL-trær: Implementasjon og effektivitet Innsetting i AVL-trær er relativt «fiklete» Fjerning med rebalansering er enda verre... Men: Rebalansering er i verste fall en O(log n) operasjon AVL-trær garanterer derfor alltid O(log n) effektivitet for søking, innsetting og fjerning Hvis vi vet at dataene kommer i random rekkefølge, er det tilstrekkelig å bruke vanlig binært søketre