Generelle trær BINÆRTRÆR. Binærtrær

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

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

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

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

INF2220: Forelesning 1

INF2220: Forelesning 1

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

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

INF1010 Binære søketrær ++

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

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

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

Binære trær: Noen algoritmer og anvendelser

Definisjon av binært søketre

EKSAMEN med løsningsforslag

INF2220: Forelesning 2

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

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

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

EKSAMEN. Algoritmer og datastrukturer

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

INF2220: Forelesning 2

Algoritmer og Datastrukturer

Definisjon: Et sortert tre

... Når internminnet blir for lite. Dagens plan: Løsning: Utvidbar hashing. hash(x) katalog. O modellen er ikke lenger gyldig ved

HENRIK IBSEN VILLANDEN SKUESPILL I FEM AKTER (1884) Etterord av Bjørn Hemmer

Algoritmer og datastrukturer Eksamen

Dagens tema INF1010 INF1010 INF1010 INF1010

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

Object [] element. array. int [] tall

Kap 9 Tre Sist oppdatert 15.03

INF1010 siste begreper før oblig 2

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

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

Algoritmer og Datastrukturer IAI 21899

Algoritmer og Datastrukturer

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

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

Løsnings forslag i java In115, Våren 1996

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

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

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

Algoritmer og datastrukturer Eksamen

UNIVERSITETET I OSLO

Hvorfor sortering og søking? Søking og sortering. Binære søketrær. Ordnet innsetting forbereder for mer effektiv søking og sortering INF1010 INF1010

Lars Vidar Magnusson

En implementasjon av binærtre. Dagens tema. Klassestruktur hovedstruktur abstract class BTnode {}

PG4200 Algoritmer og datastrukturer Forelesning 7

Løsnings forslag i java In115, Våren 1998

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

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

Oppgave 1 LØSNINGSFORSLAG. Eksamen i INF desember Betrakt følgende vektede, urettede graf:

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

alternativer til sortering og søking binære trær søketrær Ikke-rekursiv algoritme som løser Hanois tårn med n plater

Oppgave 1. Løsningsforslag til eksamensoppgave. ITF20006 Algoritmer og datastrukturer Postorden traversering:

København 20 Stockholm

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

INF2220: Gruppe me 2. Mathias Lohne Høsten 2017

Algoritmer og datastrukturer Løsningsforslag

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

IN Algoritmer og datastrukturer

"behrozm" Oppsummering - programskisse for traversering av en graf (dybde først) Forelesning i INF februar 2009

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

KONTINUASJONSEKSAMEN

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

Et eksempel: Åtterspillet

UNIVERSITETET I OSLO

Dagens temaer. Sortering: 4 metoder Søking: binærsøk Rekursjon: Hanois tårn

Løsningsforslag til INF110 h2001

Løsningsforslag for Obligatorisk Oppgave 3. Algoritmer og Datastrukturer ITF20006

Kapittel 9: Sortering og søking Kort versjon

Balanserte binære søketrær

Algoritmer og datastrukturer Kapittel 9 Delkapittel 9.2

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

Sist forelesning snakket vi i hovedsak om trær med rot, og om praktisk bruk av slike. rot. barn

Algoritmer og Datastrukturer

Liste som abstrakt konsept/datatype

MAT1030 Diskret matematikk

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

Oppsummering. MAT1030 Diskret matematikk. Oppsummering. Oppsummering. Eksempel

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.

UNIVERSITETET I OSLO

INF1020 Algoritmer og datastrukturer. Dagens plan

Algoritmer og datastrukturer Eksamen

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

INF Algoritmer og datastrukturer

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Kapittel 9: Sortering og søking Kort versjon

INF Algoritmer og datastrukturer

Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

Kapittel 8: Sortering og søking

UNIVERSITETET I OSLO

~ta11 oppgaver: 4. Nle skriftlige hjelpemidler-både trykte og håndskrevne, er tillatt

Dagens tema. Sortering. Fortsettelse om programmering vha tråder.

INF Algoritmer og datastrukturer

Transkript:

BINÆRTRÆR Kort repetisjon Generelle trær Binærtrær Implementasjon Traversering Binære søketrær Definisjon Søking, innsetting og sletting Gjennomsnitts-analyse Eksempel: Ibsens skuespill Generelle trær Program class A class B class C class D int i int i int j int tall String s char c class TreNode { Object element; TreNode forstebarn; TreNode nestesosken; Ark 1 av 2 Forelesning 28.8.200 Forelesning 28.8.200 Ark 2 av 2 Binærtrær Et binærtre er et tre der hver node aldri har mer enn to barn. Dersom det bare er ett subtre, må det være angitt om dette er venstre eller høyre subtre. I verste fall blir dybden n 1. Gjennomsnittlig dybde er vist å være: O( n). Verste tilfellet: O(n). Representasjon av binærtrær I datastrukturen for binærtrær representerer vi en node og pekere til noden subtrær Et tre ligger lagret som en kinesisk eske (når vi pakker opp en slik eske, finner vi nye esker som er prikk like den vi pakker opp, bare mindre). Forelesning 28.8.200 Ark av 2 Rekursiv problemløsning Rekursjon er egnet for problemer som vi kan løse ved (1) først å løse helt like problem for enklere input (2) løse hele problemet ved å bruke løsningene fra (1) og evt. gjøre noe mer med dem. I tillegg må det finnes en direkte løsning når inputstørrelsen er minimal. Traversering av binærtrær void traverser(binnode n) { if (n!= null) { < Gjør PREFIKS-operasjonene > traverser(n.venstre); < Gjør INFIKS-operasjonene > traverser(n.hoyre); < Gjør POSTFIKS-operasjonene > Forelesning 28.8.200 Ark 4 av 2

Eksempel: Uttrykkstrær I uttrykkstrær inneholder bladnodene operander (konstanter, variable,... ), mens de interne nodene inneholder operatorer. + * 5 2 * + 1 4 Mulige skrivemåter for dette uttrykket: Prefiks: * + 5 * 2 + 1 4 Infiks: (5 + ) * (2 * (1 + 4)) Postfiks: 5 + 2 1 4 + * * Implementasjon Siden hver node har maks to barn, kan vi ha pekere direkte til dem: class BinNode { int tall; BinNode venstre; BinNode hoyre; BinNode(int tall) { this.tall = tall; venstre = hoyre = null; Metoder som opererer på trær, legges her utenfor nodeklassen! Vi må da ta nodene som argumenter til metodene og sjekke for null-verdi inne i metodene. I boka er de lagt inne i nodeklassen. Da må vi typisk sjekke for null-verdi før vi kaller de tilsvarende metodene. Forelesning 28.8.200 Ark 5 av 2 Forelesning 28.8.200 Ark av 2 Eksempel på operasjon over et slikt binærtre: int sum(binnode node) { if( node == null ) return 0; return sum(node.venstre) + sum(node.hoyre) + node.tall; Spørsmål: Evaluerer denne ut fra en infiks eller en postfiks traversering av treet? For å finne den største verdien i et tre, int max(binnode node) { if( node == null ) return -UENDELIG; int d = node.tall; int maxv = max( node.venstre ); int maxh = max( node.hoyre ); if( d < maxv ) d = maxv; if( d < maxh ) d = maxh; return d; Binære søketrær Binære søketrær er en variant av binærtrær hvor følgende holder for hver node i treet: Alle verdiene i nodens venstre subtre er mindre enn verdien i noden selv. Alle verdiene i nodens høyre subtre er større enn verdien i noden selv. 8 1 4 12 2 7 9 15 11 1 1 Hva hvis vi har like verdier? ( ukeoppgave) 2 4 Forelesning 28.8.200 Ark 7 av 2 Forelesning 28.8.200 Ark 8 av 2

Søking: Rekursiv metode public BinNode finn(int x, BinNode t) { if (t == null) { return null; else if (x < t.tall) { return finn(x, t.venstre); else if (x > t.tall) { return finn(x, t.hoyre); else { return t; Dette er eksempel på halerekursjon: ingenting skjer i metoden etter det rekursive kallet. Søking: Ikke-rekursiv metode public BinNode finn(int x, BinNode t) { BinNode n = t; while (n!= null && n.tall!= x) { if (x < n.tall) { n = n.venstre; else { n = n.hoyre; return n; Vi kan da alltid erstatte rekursjonen med en enkel løkke-konstruksjon. Forelesning 28.8.200 Ark 9 av 2 Forelesning 28.8.200 Ark 10 av 2 Innsetting Ideen er enkel: Gå nedover i treet på samme måte som ved søking. Hvis tallet finnes i treet allerede gjøres ingenting. Hvis du kommer til en null-peker uten å ha funnet tallet: sett inn en ny node (med tallet) på dette stedet. Sletting Sletting er vanskeligere. Etter å ha funnet noden som skal fjernes har vi flere mulige situasjoner. Noden er en bladnode: Kan fjernes direkte. Noden har bare ett barn: Foreldrenoden kan enkelt hoppe over den som skal fjernes. 2 8 2 8 1 4 1 4 Forelesning 28.8.200 Ark 11 av 2 Forelesning 28.8.200 Ark 12 av 2

Rekursiv metode for å fjerne et tall: Noden har to barn: Erstatt verdien i noden med den minste verdien i høyre subtre. Slett noden som denne minste verdien var i. public BinNode fjern(int x, BinNode t) { if ( t == null) { return null; if (x < t.tall) { t.venstre = fjern(x, t.venstre); else if (x > t.tall) { t.hoyre = fjern(x, t.hoyre); 1 2 8 5 4 else if (t.venstre!= null && t.hoyre!= null) { t.tall = finnminste(t.hoyre); t.hoyre = fjern(t.tall, t.hoyre); else if (t.venstre!= null) { t = t.venstre; else { t = t.hoyre; return t; Forelesning 28.8.200 Ark 1 av 2 Forelesning 28.8.200 Ark 14 av 2 Eksempel: Ibsen Problem: Vi ønsker å analysere Henrik Ibsens skuespill. Hvilke ord har Ibsen brukt? Hvor mange forskjellige ord? Hvilke ord er mest brukt? De mest brukte ordene (fra UiB): Antall % Kum. 1 1950.09.09 det 2 18241 2.89 5.98 jeg 1774 2.81 8.80 og 4 122 2.10 10.89 i 5 115 2.09 12.98 er 99 1.5 14.51 at 7 912 1.48 15.98 du 8 8927 1.42 17.40 ikke 9 811 1.2 18.72 de 10 7711 1.22 19.94 en 11 7299 1.1 21.10 har 12 7152 1.1 22.2 som 1 971 1.11 2.4 mig 14 901 1.09 24.4 for 15 795 1.08 25.51 til 1 71 1.0 2.5 så 17 14 1.00 27.5 med 18 554 0.88 28.44 han 19 5524 0.88 29.2 den 20 511 0.84 0.1 på Vildanden Vi skal se på ett av Ibsens skuespill: VILDANDEN. SKUESPIL I FEM AKTER AF HENRIK IBSEN. København. 1884 PERSONERNE: Grosserer Werle, værksejer o+s+v+ Gregers Werle, hans søn. Gamle Ekdal. Hjalmar Ekdal, den gamles søn, fotograf. Gina Ekdal, Hjalmars hustru. Hedvig, deres datter, 14 år. Fru Sørby, grossererens husbestyrerinde. Relling, læge. Molvik, forhenværende teolog. Bogholder Gråberg. Pettersen, grossererens tjener. Lejetjener Jensen. En blegfed herre. En tyndhåret herre. En nærsynt herre. Sex andre herrer, middagsgæster hos grossereren. Flere lejetjenere. Første akt foregår hos grosserer Werle, de fire følgende akter hos fotograf Ekdal.. FØRSTE AKT. ------ I grosserer Werles hus. Kostbart og bekvemt indrettet arbejdsværelse; bogskabe og stoppede møbler; skrivebord med papirer og protokoller midt på gulvet; tændte lamper med grønne skærme, således at værelset er dæmpet belyst. Åben fløjdør med fratrukne forhæng på bagvæggen. Forelesning 28.8.200 Ark 15 av 2 Forelesning 28.8.200 Ark 1 av 2

Implementasjon Hvilke ord har Ibsen brukt? Ide: Leser inn ordene fra fil og lagrer dem i et binært søketre. Like ord telles opp. i 504 skuespil 1 søn 11 vildanden værksejer werle 1 år 20 Hvilke ord er mest brukt? Ide: Lager et nytt søketre sortert på antall ganger hvert ord er brukt! vildanden import easyio.*; public class Ibsen { public static void main(string[] args) { String ord; int antallord = 0; IbsenTre tre = new IbsenTre(); FrekvensTre frektre = new FrekvensTre(); String sep = ". :,;-?!\"\n"; In innfil = new In(args[0]); innfil.skipsep(sep); while (!innfil.endoffile()) { ord = innfil.inword(sep).tolowercase(); tre.settinn(new IbsenElem(ord)); antallord++; innfil.skipsep(sep); System.out.println("Antall ord: " + antallord); System.out.println("Ulike ord: " + tre.size()); skuespil 1 hen af 157 i 504 det 1207 frektre.innsetting(tre.getrot()); frektre.skrivinnfiks(); Forelesning 28.8.200 Ark 17 av 2 Forelesning 28.8.200 Ark 18 av 2 Klassen BinNode Vanlig node i binært søketre: class BinNode { Comparable element; BinNode venstre; BinNode hoyre; BinNode(Comparable x) { element = x; Klassen IbsenElem Tar vare på ordene og teller opp antall forekomster: class IbsenElem implements Comparable { String ord; int antall; IbsenElem (String s) { ord = s; antall = 1; public int compareto(object x) { IbsenElem e = (IbsenElem) x; return ord.compareto(e.ord); public String tostring() { return (ord + " " + antall); Forelesning 28.8.200 Ark 19 av 2 Forelesning 28.8.200 Ark 20 av 2

Klassen BinSokeTre Generell klasse for binære søketrær der noe gjøres ved like elementer: void settinn(comparable x) void oppdater(binnode n, Comparable x) Kalles av settinn hvis x allerede finnes i treet (i node n). Default: Ingenting gjøres. int sammenlign(comparable n1, Comparable n2) Kalles av settinn for å sammenligne elementet som skal settes inn med de som allerede finnes i treet. Default: n1.compareto(n2). Tre sortert på ord: class IbsenTre extends BinSokeTre { void oppdater(binnode n, Comparable e) { IbsenElem ie = (IbsenElem) n.element; ie.antall++; NB! Treet blir veldig skjevt, med 88 noder i venstre subtre og bare 158 noder i høyre subtre. Hva er årsaken til dette? int size() BinNode getrot() Forelesning 28.8.200 Ark 21 av 2 Forelesning 28.8.200 Ark 22 av 2 Tre sortert på frekvens: class FrekvensTre extends BinSokeTre { int sammenlign(comparable c1, Comparable c2) { IbsenElem e1 = (IbsenElem) c1; IbsenElem e2 = (IbsenElem) c2; return e1.antall - e2.antall; void oppdater(binnode n, Comparable e) { if (n.venstre == null) { n.venstre = new BinNode(e); else { BinNode b = new BinNode(e); b.venstre = n.venstre; n.venstre = b; antallnoder++; void innsetting(binnode n) { if (n!= null) { settinn(n.element); innsetting(n.venstre); innsetting(n.hoyre); Forelesning 28.8.200 Ark 2 av 2