16 Træer. Noter. Definition af et træ. Definitioner i tilknytning til træer. Repræsentation af træer. Binære træer. Den abstrakte datatype.

Relaterede dokumenter
22 Hobe. Noter. PS1 -- Hobe. Binære hobe. Minimum-hob og maximum-hob. Den abstrakte datatype minimum-hob. Opbygning af hobe. Operationen siv-ned.

Binære søgetræer. Binære søgetræer. Nærmeste naboer. Nærmeste nabo

Definition : Et træ er en sammenhængende ikke-orienteret graf uden simple kredse. Sætning : En ikke-orienteret graf er et træ hvis og kun hvis der er

Datastrukturer (recap)

Algoritmeanalyse. Øvre grænse for algoritme. Øvre grænse for problem. Nedre grænse for problem. Identificer essentiel(le) operation(er)

Binære søgetræer. Nærmeste naboer Binære søgetræer Indsættelse Predecessor og successor Sletning Trægennemløb. Philip Bille

3 Algebraisk Specifikation af Abstrakte Datatyper.

Skriftlig eksamen i Datalogi

Datastrukturer (recap) Datastruktur = data + operationer herpå

Algoritmisk geometri

Danmarks Tekniske Universitet

Datastrukturer (recap)

Danmarks Tekniske Universitet

Intervalsøgning. Algoritmisk geometri. Motivation for intervaltræer. Intervalsøgning. Lad der være givet en database over ansatte i en virksomhed

15 Arrays og Lister samt Stakke og Køer.

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet

Binære søgetræer. Binære søgetræer. Nærmeste naboer. Nærmeste nabo

Træer. Datastrukturer & Algoritmer, Datalogi C Forelæsning 9/

Søgetræer: Generel repræsentation af (sorterede) mængder og funktioner Databasesystemer...

Danmarks Tekniske Universitet

Induktive og rekursive definitioner

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet

18 Multivejstræer og B-træer.

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

02105 Eksamensnoter. Lasse Herskind S maj Sortering 3

Prioritetskøer. Prioritetskøer. Prioritetskøer. Prioritetskøer

Danmarks Tekniske Universitet

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: 23n log n. 4 n (log n) log n

Danmarks Tekniske Universitet

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Prioritetskøer. Prioritetskøer. Prioritetskøer. Prioritetskøer

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

Prioritetskøer. Prioritetskøer Træer og hobe Repræsentation af hobe Algoritmer på hobe Hobkonstruktion Hobsortering. Philip Bille

Sortering. Eksempel: De n tal i sorteret orden

Om binære søgetræer i Java

Sortering af information er en fundamental og central opgave.

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507)

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: 4 n n 3n n 2 /logn 5 n n (logn) 3n n 2 /logn 4 n n 5 n

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet

Sortering. Eksempel: De n tal i sorteret orden

Skriftlig Eksamen Algoritmer og Datastrukturer 1. Datalogisk Institut Aarhus Universitet

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

Vejledende løsninger

Prioritetskøer og hobe. Philip Bille

Skriftlig eksamen i Datalogi

Grådige algoritmer. Et algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

Danmarks Tekniske Universitet

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Danmarks Tekniske Universitet

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: n 2 n (log n) 2. 3 n /n 2 n + (log n) 4

Danmarks Tekniske Universitet

4 Basal Objekt-orienteret Programmering I.

28 Algoritmedesign. Noter. PS1 -- Algoritmedesign

Sortering. De n tal i sorteret orden. Eksempel: Kommentarer:

Sortering af information er en fundamental og central opgave.

Algoritmer og datastrukturer Course No Cheat Sheet May 15, 2012

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: n 7 n 1 7 7/n. 7nlogn. 7n 7nlogn n7

26 Programbeviser I. Noter. PS1 -- Programbeviser I. Bevis kontra 'check af assertions' i Eiffel. Betingelser og bevisregler.

Grafer og graf-gennemløb

Danmarks Tekniske Universitet

Opgave 1 (10%) I det følgende angiver log n 2-tals-logaritmen af n. Ja Nej. n+3n er O(2n)? n 6 er O(n 5 )? nlogn er O(n 2 /logn)? 4n 3 er O(3n 4 )?

Grafer og graf-gennemløb

Grafer og graf-gennemløb

Invarianter. Invariant: Et forhold, som vedligeholdes af algoritmen gennem (dele af) dens udførelse. Udgør ofte kernen af ideen bag algoritmen.

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507)

Grafer og graf-gennemløb

Udvidelse og specialisering. Klassehierarkier. Nedarvningsterminologi. Interfaces. Statiske og dynamiske typer. Polymorfi. Abstrakte klasser.

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: (logn) 2 2 n 1/n (logn) n. n 2

Grafer og graf-gennemløb

Skriftlig Eksamen Algoritmer og Datastrukturer 1. Datalogisk Institut Aarhus Universitet. Mandag den 22. marts 2004, kl

Stakke, køer og lidt om hægtede lister

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: n n (log n) 2. n 2 + log n 3 n. n n (log n)

Orienterede grafer. Orienterede grafer. Orienterede grafer. Vejnetværk

Divide-and-Conquer algoritmer

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: (logn) 7 n 1/2 2 n /n 3 2logn n 2 /logn

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: (logn) 5. 5n 2 5 logn. 2 logn

17 Søgning og Søgetræer.

Skriftlig eksamen i Datalogi

DATALOGISK INSTITUT, AARHUS UNIVERSITET

Divide-and-Conquer algoritmer

Danmarks Tekniske Universitet

Skriftlig Eksamen Algoritmer og Datastrukturer (dads)

Divide-and-Conquer algoritmer

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET. Science and Technology EKSAMEN. Grundkurser i Datalogi. Algoritmer og Datastrukturer 1 (2003-ordning)

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: n 3/2. n logn (3/2) n. 2 3logn (3/2) n

Årsagen til fejl. Erkendelse af fejl. Håndtering af fejl.

Skriftlig Eksamen Algoritmer og Datastrukturer (dads)

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET EKSAMEN. Grundkurser i Datalogi. Algoritmer og Datastrukturer 1 (2003-ordning)

DM507 Algoritmer og datastrukturer

Skriftlig Eksamen DM507 Algoritmer og Datastrukturer

Binære søgetræer og skiplister

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: n+logn logn (logn) 7 (3/2) n

29 Opsamling af Objekt-orienteret Programmering.

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Transkript:

16 Træer. Definition af et træ. Definitioner i tilknytning til træer. Repræsentation af træer. Binære træer. Den abstrakte datatype. Gennemløb af binære træer. Træer i Eiffel. 229

Definition af et træ. Et træ T af knudetype S er en samling af knuder. T skal enten være 1. en tom samling, eller 2. bestå af en knude af typen S, som kaldes roden af T, med et endeligt antal, disjunkte, tilknyttede træer (undertræer) af knudetype S. B C D E F G H I J K L M N O P Bemærk, at definitionen af et træ er rekursiv. Når man tegner et træ, lader man som regel orienteringen af kanterne være implicit givne (oppe fra og ned), og man undlader at tegne "pilehovederne". Denne konvention vil vi følge i resten af disse noter. 230

Definitioner i tilknytning til træer (I). Kant Sti fra N1 til Ni Efterkommer af knude K Forgænger af knude K Blad Indre knude Et ordnet træ. Forbindelsen ("pilen") mellem en knude K og roden R i et undertræ af K. Kanten betegnes (K,R). En sekvens af kanter på formen: (N1,N2), (N2,N3),... (Ni-1,Ni), i 2 En knude E, hvor der er en sti fra K til E. En knude F, hvor der en sti fra F til K. En knude, der ikke har nogen efterkommere. En knude, som ikke er et blad. Et træ, hvor mængden af undertræer af hver knude er ordnet. I tilknytning til definitionen af træer kan man definere en mængde funktioner og prædikater på træer og knuder. På denne og næste slide definerer vi en mængde sådanne funktioner. Man skal være opmærksom på, at der kan herske nogen terminologiforvirring mellem forskellige forfattere, og at det samme funktionsnavn undertiden bliver anvendt med forskellig betydning. I definitionen af en sti betegner tuplen (N, M) to knuder, hvor M er rod i et undertræ af N. Med andre ord, og lidt mindre præcist, der er en kant (en "pil") fra N til M. Vi vil tale om en sti (af længde 0) fra en knude til sig selv. Efterkommere og forgængere hedder på engelsk hhv. decendants og ancestors. Relativ til den måde, vi plejer at tegne træer på, er efterkommere af en knude k tegnet under k, og forgængere er tegnet over k. Vi taler også om direkte efterkommere og direkte forgængere i de tilfælde, hvor efterkommere og forgængere er forbundet til k med en sti af længde 1. Et blad kaldes på engelsk for leaf eller terminal. Hvis man lader sig inspirere af familieterminologi, er det naturligt at tale om børn, forældre og søskende af en knude. 231

Definitioner i tilknytning til træer (II). Længden af en sti Dybden af en knude K i et træ T Højden af en knude K i et træ T Højden af et træ T Graden af en knude K Graden af et ikke-tomt træ ntallet af kanter i stien. Længden af stien fra roden af T til K. Længden af den længste sti fra K til et blad i T. Højden af roden af T. ntallet af ikke-tomme undertræer af træet med rod K. Den maksimale grad af nogen knude i træet. Denne slide definerer nogle kvantitative størrelser på stier, knuder og træer. Ifølge ovenstående definitioner er dybden af roden 0 Ligeledes er højden af et blad 0. Højden af et tomt træ sætter vi pr. definition til -1. Dybden af en knude kaldes undertiden for niveauet (level ) af knuden. Nogle forfattere definerer roden til at være på niveau 1. Vi holder fast ved, at dybden af roden er 0. Man kan også tale om dybden af træet. Dette svarer til højden af træet. Vi lader graden af et tomt træ være udefineret. Opgave. Betragt en vilkårlig knude K i et træ T. Opstil en invariant, som relaterer højden af K, dybden af K og højden af T. 232

Eksempel. Træet T: B C D E F G H I J K L M N O P Rod i T: Indre knuder: {, B, C, D, E, F, G, H} Blade: {I, J, K, L, M, N, O, P} Graden af T: 3 Højden af T: 3 Efterkommere af C: {F, G, H, M, N, O, P} Direkte -- -- --: {F, G, H} Forgængere af F: {C, } Direkte -- -- --: {C} Graden af C: 3 Graden af F: 1 Dybden af B: 1 Højden af B: 2 233

Repræsentation af træer (I). Referencer til alle "børn". B C D E F B C D E F Denne repræsentation er rettet mod et træ af grad 3. I hvert knude-objekt er der afsat plads til netop 3 referencer til direkte efterkommere. Hvis der i træet er mange knuder, med variende grad, spildes der en del plads på dette. Det største pladsspild finder dog sted i bladene. Det er måske attraktivt at lade bladene være objekter af en specialiseret knudetype, som ikke allokerer plads til efterkommer-referencer. (Dette er ikke vist på denne slide). 234

Repræsentation af træer (II). Reference til første "barn" og højre "søskende". B C D E F B C D E F I denne repræsentation er undertræerne af en knude kædet sammen i en liste. Derfor er det tilstrækkeligt for en knude at referere til det første undertræ. Endvidere skal knuden referere til sit nabotræ (sit højre søskendetræ). Så uanset graden af træet (og graden af knuderne) indeholder hver knude-objekt netop to referencer. 235

Binære træer. Et ordnet træ af grad 2 kaldes et binært træ. Når en knude har grad 2, taler vi om det venstre undertræ og det højre undertræ af knuden. B C D E F G H I J K Definitionen siger, at et binært træ er et træ af grad 2. Ser man tilbage på definitionen af 'graden af et træ' betyder dette altså, at der maksimalt må være to ikke-tomme undertræer af hver knude. En knude i et binært træ kan altså godt have ét undertræ. Binære træer repræsenteres typisk med en reference til begge børn (altså som repræsentationen vist på slide "Repræsentation af træer (I)"). Selv om en knude K i et binært træ er af grad 1, angiver vi ofte, om knudens efterkommer er højre eller venstre efterkommer af K. Bemærk, at dette er muligt netop når vi vælger repræsentationen med direkte referencer til begge børn. Denne konvention viser sig at være praktisk i den specialisering af binærer træer, som vi kalder binære søgetræer. Opgave: Beregn hvor mange knuder der maksimalt kan være i et binært træ af højde n. 236

lgebraisk specifikation af binære træer. Type Binary-tree[X] Functions emptytree: -> Binary-tree[X] make: Binary-tree[X] x X x Binary-tree[X] -> Binary-tree[X] left: Binary-tree[X] -> Binary-tree[X] right: Binary-tree[X] -> Binary-tree[X] root: Binary-tree[X] -> X isempty: Binary-tree[X] -> Boolean height: Binary-tree[X] -> Integer isin: X x Binary-tree[X] -> Boolean xioms... Opgave: Skriv ligningerne for ovenstående funktioner i den algebraiske specifikation af binære træer. Operationerne left, right og root selekterer hhv. venstre undertræ, højre undertræ og roden (af typen X) af et træ. Isempty returnerer, hvorvidt træet er tomt, og isin returnerer, om parameteren er at finde i træet. Endelig returnerer height højden af træet. fprøv jeres specifikation i GS. 237

Gennemløb af binære træer. Et gennemløb af et binært træ giver en liste af knuder. Hver knude i træet repræsenteres netop én gang i gennemløbet. T R V H Pre-order(T) : insert(r, append(pre-order(v), pre-order(h)) ) In-order(T): append(in-order(v), insert(r, in-order(h)) ) Post-order(T): append(post-order(v), post-order(h), insert(r, empty-list() )) Sliden "Eksempel på gennemløb af binære træer (II)" giver motivationen for valg af navnene for ovenstående gennemløb af binære træer. Ovenstående definitioner af de tre gennemløb viser ikke, hvad gennemløbene af tomme træer er. Det skulle dog ikke overraske nogen, at gennemløbet af et tomt træ er den tomme liste. Vi kan også sige, at et gennemløb af et træ med kun én knude giver listen bestående af denne knude. Operationerne append, insert, og empty-list er listeoperationer. Disse er defineret på sliden "algebraisk specifikation af lister" fra kapitlet "rrays og Lister samt Stakke og Køer". Bemærk dog, at vi har taget os den frihed at benytte append på tre lister. 238

Eksempel på gennemløb af binære træer (I). Træet T B C D E F G H I J K pre-order(t): B D E H I C F J K G in-order(t): D B H E I J F K C G post-order(t): D H I E B J K F G C Opgave: Man kan definere en manifest notation for binære træer på følgende måde: (1) Det tomme træ skrives som (). (2) Træet med rod r og undertræer T1... Tm skrives som (r T1... Tm). (3) Ethvert undertræ, som kun består af en enkelt knude skrives uden paranteser. Denne notation er reelt en Lisp repræsentation.. Hvad er Lisp repræsentationen af det binære træ, som er vist på denne slide? Forsøg at gå systematisk til værks, frem for blot at opskrive træet på en lineær måde i "ét hug". B1. (For dem, der er gode til Lisp). Definer Lisp funktioner, der realiserer pre-order, in-order, og post-order gennemløb af træer, og afprøv disse funktioner på det viste træ. (Til dette spørgsmål vil jeg anbefale, at man benytter Emacs og Emacs Lisp. ) B2. (For dem, der ikke er gode til Lisp). Sæt jer ind i, og afprøv de pre-order, in-order og post-order funktioner, jeg har programmeret på forhånd. Demonstrer, at ovenstående ordninger af det viste træ er korrekte. Hent funktionerne fra filen /user/normark/public/p1/tree-traversal.el. Se endvidere den lille brugervejledning i kørsel af Emacs lisp, som findes først i denne fil. 239

Eksempel på gennemløb af binære træer (II). Træet T * + - a b c * e f pre-order(t): * + a b - c * e f in-order(t): a + b * c - e * f post-order(t): a b + c e f * - * (* (+ a b) (- c (* e f))) ((a + b) * (c - (e*f))) prefix infix postfix Træet repræsenterer strukturen og indholdet af et udtryk. Denne repræsentation opnås ved at parse et udtryk, som det defineres i programmeringssprog. Det er syntaksanalysens opgave at omdanne en streng, i f.eks. infix notation, til dette træ. Parsning og syntakstræer er vigtige emner på "Programmeringssystemer 2" på Dat2/D6D. Det illustreres, at et in-order gennemløb af træet giver den sædvanlige infix notation for udtrykket. Dog skal der konsekvent sættes paranteser om deludtryk for at bevare informationen fra træet i inorder udtrykket. Et pre-order gennemløb giver prefix notationen. Hvis man igen konsekvent sætter paranteser om deludtryk opstår Lisp notationen, også kaldet "Cambridge polsk" notation. Et post-order gennemløb giver postfix notationen, også kaldet "omvendt polsk notation". Det er også notationen, som benyttes på visse typer af lommeregnere. Notationen er hensigtsmæssig idet den lægger op til en stakdisciplin, når udtrykket skal evalueres. Paranteser er ikke nødvendige i postfix notation for at bevare udtrykkets struktur. 240

Iterativt gennemløb af binære træer: Bredde først. Bredde-først-gennemløb(T: Binært-træ): Liste Q: Kø Q.enter(roden af T ); while not Q.empty do let N = Q.front indsæt N i bagenden af resultat-listen ; Q.leave; for alle sønner S af N fra venste mod højre do Q.enter(S) B C D E F G H I J K Bredde-først gennemløb ( B C D E F G H I J K) De forskellige former for rekursive gennemløb (pre-order, in-order og post-order gennemløb af binære træer), vi hidtil har studeret, har alle været såkaldte dybde-først gennemløb. Et rekursivt kald af gennemløbsfunktionen gennemløber et helt undertræ U uden at bevæge sig over i U s søskendetræer. Gennemløbet, som er vist på denne slide er anderledes. Her gennemløbes træet på tværs af søskendetræer, et niveau ad gangen. Dette kaldes et bredde-først gennemøb. Rekursion er ikke velegnet til dette. Det er mere naturligt at programmere gennemløbet iterativt, ved hjælp af en kø. Vi benytter kø-operationerne enter, front og leave fra kapitlet om rrays og lister samt stakke og køer. 241

Iterativt gennemløb af binære træer: Dybde-først. Dybde-først-gennemløb-in-order(T: Binært_træ): Liste S: Stak; U: Binært-træ repeat forever U := T, while U ikke tomt do S.push(U); U := venstre undertræ af U if not S.empty then U := S.top; S.pop; indsæt roden af U i bagenden af resultat-listen ; U := højre undertræ af U else exit repeat B D E F G H I J K C Dybde-først inorder gennemløb (D B H E I J F K C G) Det iterativt programmerede, bredde-først gennemløb af et binært træ skærper vor interesse for iterativt programmerede dybde-først gennemløb. En sådan gennemløbsfunktion er vist på denne slide. Det er ikke en overraskelse, at der internt i denne funktion skal benyttes en stak. Generelt realiseres rekursive procedure- og funktionskald på en stak. Stakken indeholder på ethvert tidspunkt aktiverede, men endnu ikke-afsluttede kald. Stakken i ovenstående indeholder de undertræer, som vi har mødt i vort gennemløb, men som vi endnu ikke har kunnet udskrive roden af. Dette eksempel viser med stor tydelighed værdien af rekursive procedurer og funktioner. Programmer bliver meget mindre gennemskuelige hvis vi eksplicit skal håndtere en stak i en iterativ beregningsfunktion. Man kan sige, at vi med rekursiv programmering abstraherer over de detaljer, som er vist i funktionen på denne slide. 242

Træer i Eiffel. Et træ er en rod-knude, som har en liste af undertræer samt en reference til sin højre bror. class Tree[T] inherit Linkable[T] rename... redefine... Linked_list[T] feature... end; --class Tree Listen af sønner Værdi i knude Højre bror Den trærepræsentation, som Eiffel lægger op til, svarer nøje til trærepræsentationen fra sliden "Repræsentation af træer (II)". Det skitseres, hvordan Eiffel benytter multipel nedarvning til at beskrive de to aspekter af træ-knuder: 1. En træ-knude kan have en liste af undertræer (fra Linked_list). 2. En træ-knude har en værdi, og den kan have en højre bror (fra Linkable). Detaljerne i ovenstående kan findes i.7 i OOSC, og de er desværre relativt vanskelige at hitte ud af. På denne baggrund vil jeg selv foretrække en mere direkte og "lige ud af landevejen" definition af træer. 243