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

Relevanta dokument
Föreläsning 9 Innehåll

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

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

Algoritmer och datastrukturer 2012, föreläsning 6

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

Föreläsning 9 Innehåll

Föreläsning 14 Innehåll

Föreläsning 13. Träd

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

Träd Hierarkiska strukturer

Tentamen, Algoritmer och datastrukturer

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

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

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

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

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

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

Träd. Rot. Förgrening. Löv

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

Föreläsning 9 Datastrukturer (DAT037)

Datastrukturer. Föreläsning 5. Maps 1

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

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

Föreläsning Datastrukturer (DAT036)

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

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

DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011

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

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

Trädstrukturer och grafer

Programmering i C++ EDA623 Dynamiska datastrukturer. EDA623 (Föreläsning 11) HT / 31

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning 4 Innehåll

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

DAI2 (TIDAL) + I2 (TKIEK)

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

Föreläsning 3 Datastrukturer (DAT037)

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två

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

Programmering i C++ EDAF30 Dynamiska datastrukturer. EDAF30 (Föreläsning 11) HT / 34

Tildatenta Lösningsskiss

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)

Datastrukturer. föreläsning 10. Maps 1

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Inlämningsuppgift MiniPlotter

Föreläsning 6. Rekursion och backtracking

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Föreläsning 2. Länkad lista och iterator

Datastrukturer och algoritmer. Föreläsning 15 Inför tentamen

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

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

Tentamen i Algoritmer & Datastrukturer i Java

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

13 Prioritetsköer, heapar

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

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

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning 10 Datastrukturer (DAT037)

Introduktionsmöte Innehåll

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

Exempeltenta GruDat 2002/2003

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

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

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 1 Datastrukturer (DAT037)

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Föreläsning 4 Datastrukturer (DAT037)

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

Tentamen Datastrukturer (DAT036)

F4: Mer om OU1, OU2, listor och träd. Carl Nettelblad

Tentamen Datastrukturer, DAT037 (DAT036)

Seminarium 13 Innehåll

Tentamen (del 2) (4 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

Lösningsförslag till tentamen Datastrukturer, DAT037,

Länkade strukturer, parametriserade typer och undantag

Träd. Ett träd kan se ut på detta sätt:

Föreläsning 13 Innehåll

Föreläsning 14. Träd och filhantering

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Fredag 10 juni 2016 kl 8 12

Lösningar Datastrukturer TDA

Föreläsning 2. Länkad lista och iterator

Föreläsning Datastrukturer (DAT037)

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Specifikationer för tabellfunktionerna. Operationer på tabellen

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

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Föreläsning 5 Datastrukturer (DAT037)

Två fall: q Tom sekvens: () q Sekvens av element: (a b c) ; (sum-rec '(2 4 6)) = 12. q Första elementet uppfyller vissa villkor: (2 a b c)

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Tentamen'('Datastrukturer,'algoritmer'och'programkonstruktion.'

Mål Förklaring av termer

Tentamen i Algoritmer & Datastrukturer i Java

Prov i DAT 312: Algoritmer och datastrukturer för systemvetare

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

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

TDDC74 Programmering, abstraktion och modellering DUGGA 2

Algoritmer och datastrukturer

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

Transkript:

Föreläsning 9 Innehåll Inlämningsuppgiften De föreläsningar som inlämningsuppgiften bygger på är nu klara. Det är alltså dags att börja arbeta med inlämningsuppgiften. Träd, speciellt binära träd egenskaper användningsområden implementering Två alternativa uppgifter finns: Sudoku - sudokulösare med grafiskt användargränssnitt. Ger träning på rekursion (backtracking). MiniPlotter - program som ritar grafer av matematiska funktioner. Ger träning på rekursion och träd samt en introduktion till hur man implementerar kompilatorer. De två uppgiftsalternativen, anmälan till redovisningstid samt schema för jourtider finns på kurssidan cs.lth.se/edaa0vt Datavetenskap (LTH) Föreläsning 9 VT 208 / 3 Datavetenskap (LTH) Föreläsning 9 VT 208 2 / 3 Datastrukturer i kursen Träd Hittills har vi använt datastrukturerna vektor och enkellänkad lista. T.ex. för att implementera de abstrakta datatyperna lista, stack och kö. Icke-linjär struktur En nod i ett träd kan ha högst en föregångare (förälder), men flera efterföljare (barn). I kursen används också träd binära sökträd och hashtabeller för att implementera de abstrakta datatyperna mängd (eng. Set) och lexikon (eng. Map). heapar för att implementera den abstrakta datatypen prioritetskö. Jfr. listor som är linjära strukturer En nod i en lista kan ha högst en föregångare och en efterföljare. Datavetenskap (LTH) Föreläsning 9 VT 208 3 / 3 Datavetenskap (LTH) Föreläsning 9 VT 208 4 / 3

Träd rekursiv definition Släkträd Exempel på användning av träd Ett träd är antingen tomt (har inga noder) eller består av en speciell nod, roten, och noll eller flera subträd. Karl XIV Johan 763-844 rot Oskar I 799-876 tre subträd Karl XV 826-872 Gustaf 827-852 Oskar II 829-907 Eugenie 830-889 August 83-873 Datavetenskap (LTH) Föreläsning 9 VT 208 5 / 3 Datavetenskap (LTH) Föreläsning 9 VT 208 6 / 3 Terminologi lånad från släktträd Terminologi lånad från naturen Antag att två noder n och n 2 är förbundna med en båge och n är den övre av dem n är då förälder till n 2 och n 2 är barn till n Rot den enda nod som saknar förälder I datavetenskap ritas träden upp och ned med roten överst. Löv noder som saknar barn Gren enserienoderförbundnamedvarandra rot Noder som har samma förälder kallas syskon (eng: siblings) Antag att två noder n och n 2 är förbundna med en serie bågar och n är den övre av dem n är då förfader (eng: ancestor) till n 2 n 2 är avkomling (eng: descendant) till n löv En gren i trädet visas med: löv löv löv Datavetenskap (LTH) Föreläsning 9 VT 208 7 / 3 Datavetenskap (LTH) Föreläsning 9 VT 208 8 / 3

Begreppen nivå eller djup för en nod Begreppet höjd för ett träd Rotens nivå (djup) är. En nod som inte är rot har nivå (djup) =föräldernsnivå(djup)+. Ett tomt träd har höjden 0. Ett träd som inte är tomt har höjd =maximalanivån(djupet)för noderna i trädet. nivå = djup = trädets höjd = 3 nivå = djup = 2 nivå = djup = 3 nivå = djup = 3 Datavetenskap (LTH) Föreläsning 9 VT 208 9 / 3 Datavetenskap (LTH) Föreläsning 9 VT 208 0 / 3 Binära träd Binära träd speciell terminologi Ett träd är binärt om varje nod har högst två barn (eller ekvivalent, två subträd). Ett träd är strikt binärt om varje nod har noll eller två barn. D.v.s. alla noder som inte är löv har två barn. För ett binärt träd brukar man tala om vänster respektive höger subträd till en nod vänster respektive höger barn till en nod Vänster barn till roten Vänster subträd till roten Höger barn till roten Höger subträd till roten Ej binärt, roten har tre barn Binärt, men ej strikt binärt Strikt binärt OBS: en nod kan ha höger barn utan att ha vänster barn. Datavetenskap (LTH) Föreläsning 9 VT 208 / 3 Datavetenskap (LTH) Föreläsning 9 VT 208 2 / 3

Huffmanträd Exempel på användning av (strikt) binära träd Aritmetiska uttryck Exempel på användning av (strikt) binära träd Ett aritmetiskt uttryck med (de binära) operationerna +,, * och / kan representeras av ett (strikt) binärt träd: I Huffmankodning byts tecken ut mot koder av olika längd. Vanligt förekommande tecken ska ha kortare kod än mer sällsynta tecken. + * Tecken Kod a 0 b 00 c 0 d a 0 Datavetenskap (LTH) Föreläsning 9 VT 208 3 / 3 Binära sökträd Exempel på användning av binära träd b 0 0 c d + 2 * 3 2 * Operander lagras i löv, operatorer i övriga noder. 3 + 2 ( + 2) * 3 Ett träds värde = operatorn i roten applicerad på värdet av subträden. Ett lövs värde är det värde som lagrats i lövet. Datavetenskap (LTH) Föreläsning 9 VT 208 4 / 3 Implementering av binära träd Klassen BinaryTree 3 Mona public class BinaryTree<E> { private Node<E> root; Hans Nora public BinaryTree() { root = ; root Ann Karl Tora... operationer på trädet... Lagrar element med söknyckel för vilken jämförelseoperationer är definierade. Här: sträng. Nycklarna i vänster subträd är mindre än rotens nyckel som i sin tur är mindre än nycklarna i höger subträd. Fördel: Enkelt och snabbt att leta upp, sätta in och ta bort element. private static class Node<E> { // se nästa bild Datavetenskap (LTH) Föreläsning 9 VT 208 6 / 3 Datavetenskap (LTH) Föreläsning 9 VT 208 5 / 3

Implementering av binära träd Klassen Node Skriv ut trädets noder private static class Node<E> { private E data; private Node<E> left; private Node<E> right; private Node(E data) { this.data = data; left = right = ; data left right public void print() { print(root); private void print(node<e> n) { if (n!= ) { System.out.println(n.data); print(n.left); print(n.right); M... H S I vilken ordning skrivs noderna ut? A K N T Datavetenskap (LTH) Föreläsning 9 VT 208 7 / 3 Datavetenskap (LTH) Föreläsning 9 VT 208 8 / 3 Rekursiva traverseringar av binära träd Diskutera Traversering betyder att vi besöker varje nod i trädet. M Många operationer på träd kan tolkas som traversering. Under traverseringen utför man operationer på noderna. H S Man kan traversera träd i olika ordningar, t ex följande rekursivt definierade: preorder: först roten, sedan vänster subträd i preorder, därefter höger subträd i preorder inorder: först vänster subträd i inorder, sedan roten och därefter höger subträd i inorder postorder: först vänster subträd i postorder, sedan höger subträd i postorder och därefter roten A K N T Ivilkenordningbehandlasnodernaommantraverserarträdeti preorder? inorder? postorder? Datavetenskap (LTH) Föreläsning 9 VT 208 9 / 3 Datavetenskap (LTH) Föreläsning 9 VT 208 20 / 3

Algoritm för preordertraversering Algoritm för inorder- och postordertraversering if trädet tomt return else besök roten traversera vänster subträd traversera höger subträd Exempel: Skriv ut innehållet i alla noder i preorder i det träd där n är rot. private void print(node<e> n) { if (n!= ) { System.out.println(n.data); print(n.left); print(n.right); Inorder: if trädet tomt return else traversera vänster subträd besök roten traversera höger subträd Postorder: if trädet tomt return else traversera vänster subträd traversera höger subträd besök roten Datavetenskap (LTH) Föreläsning 9 VT 208 2 / 3 Datavetenskap (LTH) Föreläsning 9 VT 208 22 / 3 Traversera trädet rekursivt alternativ Publik metod i trädklassen Traversera trädet rekursivt alternativ Rekursiv metod i nodklassen Alternativt kan vi placera den rekursiva metoden i nodklassen. I klassen BinaryTree implementerar vi då endast följande publika metod: /** Skriver ut trädet i preorder */ public void print() { if (root!= ) { root.print(); Metoden print i klassen Node<E> finns på nästa bild. /* Skriver ut det träd där noden är rot i preorder. */ private void print() { System.out.println(data); if (left!= ) { left.print(); if (right!= ) { right.print(); Datavetenskap (LTH) Föreläsning 9 VT 208 23 / 3 Datavetenskap (LTH) Föreläsning 9 VT 208 24 / 3

Exempel: visualisera träd Visualisera innehåll och form på ett träd genom att översätta trädet till en sträng enligt: b d a e c a b d c e Strängen beskriver trädet i preorder Barn indenteras 2 blanksteg i förhållande till föräldern Varje nod på ny rad Tomma subträd representeras av delsträngen Datavetenskap (LTH) Föreläsning 9 VT 208 25 / 3 Visualisera träd implementering Enklare problem sträng med trädets innehåll public String tostring() { StringBuilder sb = new StringBuilder(); buildstring(root, sb); return sb.tostring(); private void buildstring(node<e> n, StringBuilder sb) { if (n!= ) { sb.append(n.data); sb.append( \n ); buildstring(n.left, sb); buildstring(n.right, sb); Observera att man skapar ett enda StringBuilder-objekt. Det måste skickas med som parameter till den rekursiva metoden. Datavetenskap (LTH) Föreläsning 9 VT 208 26 / 3 Visualisera träd implementering public String tostring() { StringBuilder sb = new StringBuilder(); buildstring(root, 0, sb); return sb.tostring(); private void buildstring(node<e> n, int indent, StringBuilder sb) { for (int i = 0; i < indent; i++) { sb.append( ); if (n == ) { sb.append("\n"); else { sb.append(n.data); sb.append( \n ); buildstring(n.left, indent + 2, sb); buildstring(n.right, indent + 2, sb); Datavetenskap (LTH) Föreläsning 9 VT 208 27 / 3 Traversering i postorder Exempel Om vi har ett binärt träd som representerar aritmetiska uttryck kan vi beräkna trädets värde som en postorder-genomgång. Subträdens värden beräknas först. Därefter besöks roten genom att dess operator appliceras på subträdens värde. + + 2 * 3 2 * 3 + * ( + 2) * 3 Datavetenskap (LTH) Föreläsning 9 VT 208 28 / 3 2 3

Traversering i inorder Exempel Nivå- för nivåtraversering Om vi har ett binärt sökträd får vi elementen i stigande ordning vid en inorder-genomgång. Ann Hans Karl Mona Nora Tora Nivå- för nivåtraversering kan implementeras med hjälp av en kö: skapa en tom kö lägg in roten i kön så länge kön inte är tom tag ut och behandla första noden (actnode) om actnode.left!= lägg in actnode.left i kön om actnode.right!= lägg in actnode.right i kön Datavetenskap (LTH) Föreläsning 9 VT 208 29 / 3 Datavetenskap (LTH) Föreläsning 9 VT 208 30 / 3 Exempel på vad du ska kunna Förklara begreppen träd och binära träd samt begrepp som rot, löv, subträd, förälder, barn. Förklara begreppen nivå/djup för en nod och begreppet höjd för träd. Implementera träd med en länkad datastruktur. Beskriva olika sätt att traversera träd: preorder, inorder, postorder. Implementera operationer på träd, speciellt rekursiva metoder. Datavetenskap (LTH) Föreläsning 9 VT 208 3 / 3