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

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

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

Föreläsning 13. Träd

Träd Hierarkiska strukturer

Föreläsning 9 Innehåll

Föreläsning Datastrukturer (DAT036)

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

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

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

Tentamen, Algoritmer och datastrukturer

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å

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

Lösningar Datastrukturer TDA

Föreläsning 9 Datastrukturer (DAT037)

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

Föreläsning Datastrukturer (DAT036)

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

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)

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

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

DAI2 (TIDAL) + I2 (TKIEK)

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

Föreläsning Datastrukturer (DAT037)

Algoritmer och datastrukturer 2012, föreläsning 6

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 7. Träd och binära sökträd

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

Föreläsning 4 Datastrukturer (DAT037)

Datastrukturer. Föreläsning 5. Maps 1

TDDC74 Programmering, abstraktion och modellering DUGGA 2

TDDI16 Datastrukturer och algoritmer. Prioritetsköer, heapar, Union/Find

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

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

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 3 Datastrukturer (DAT037)

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

Trädstrukturer och grafer

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

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Implementering av tabellen. Operationer på tabellen

Föreläsning 9 Innehåll

Föreläsning Datastrukturer (DAT036)

Vad har vi pratat om i kursen?

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

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

Föreläsning Datastrukturer (DAT036)

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

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

Tentamen Datastrukturer (DAT036)

Symboliska konstanter const

Tentamen Datastrukturer, DAT037 (DAT036)

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

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

Obligatorisk uppgift 5

Tentamen TEN1 HI

Automatateori (2) Idag: Sammanhangsfria språk. Dessa kan uttryckas med Grammatik PDA

Stack, specifikation. Stack och Kö. Y s t M A p. Stack. <== > Y s t M A p <== > Prioritetskö

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

Sätt att skriva ut binärträd

Övning 2. (Länkade) Listor, noder

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

Tentamen Datastrukturer D DAT 035/INN960

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

Inlämningsuppgift MiniPlotter

Lösningsförslag till tentamen Datastrukturer, DAT037,

Tentamen Datastrukturer (DAT036)

Tentamen kl Uppgift 4. Uppgift 5

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

Tentamen i Algoritmer & Datastrukturer i Java

Ännu mera träd: 2-3-träd, B-träd, rödsvarta träd, träd Weiss, avsnitt 4.7, 11.5, 12.2, etc.

3. Toppkvinnor på hög Låt lådan och de två kvinnornas famnar utgöra stackarna L, K1 respektive K2. Från början finns alla kort i L.

Föreläsning 10 Datastrukturer (DAT037)

Träd och koder. Anders Björner KTH

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

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning 3. Stack

Tentamen Datastrukturer, DAT037 (DAT036)

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

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.

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

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

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

Datastrukturer. föreläsning 10. Maps 1

Innehåll. Föreläsning 12. Binärt sökträd. Binära sökträd. Flervägs sökträd. Balanserade binära sökträd. Sökträd Sökning. Sökning och Sökträd

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

Föreläsning 2 Datastrukturer (DAT037)

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

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

Rekursiva algoritmer sortering sökning mönstermatchning

Lösning av några vanliga rekurrensekvationer

DD1361 Programmeringsparadigm. Formella Språk & Syntaxanalys. Per Austrin

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

729G04: Inlämningsuppgift Diskret matematik

Tillämpad Programmering (ID1218) :00-13:00

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 9 juni 2016, kl 14 18

Länkade strukturer, parametriserade typer och undantag

Tentamen i. TDDC67 Funktionell programmering och Lisp

Datastrukturer och algoritmer

Användning av stack: evaluera uttryck i RPN

Transkript:

Binära träd (forts) Ett binärt träd kan lagras i ett enda sammanhängande minne Roten har index 1 Vänster barn till nod i har index 2*i Höger barn till nod i har index 2*i + 1 Föräldern till nod i har index = heltalsdelen av i/2

Linjärt minne Sammanhängande minne är ej flexibelt Om trädet inte är fullt reserveras onödigt mycket minne Insättning av nya noder kräver kopiering Effektivt Traversering Vet man storleken innan och den inte ändras så elimineras problemen Återkommer i samband med sortering

Höjden på ett fullt träd Höjd=1, n=1 Höjd=2, n=3 Höjd=3, n=7 Höjd=4, n=15

Höjden på ett fullt träd Höjd=1, n=1, 2 h =2 Höjd=2, n=3, 2 h =4 Höjd=3, n=7, 2 h =8 Höjd=4, n=15, 2 h =16 Så att n = 2 h -1 Eller h = lg(n+1)

Att ta sig från roten till ett löv är väsentligt effektivare än att ta sig igenom alla element N lg N 16 4 1024 10 1048576 20 4294967296 32 Vi ska senare se hur detta kan utnyttjas

Tillämpning av Binära träd * + 4 + 4 + + 3 * 3 1 2 1 2 Binära träd kan användas för att på ett intuitivt sätt representera uttryck. Det vänstra trädet representerar 4 * (1 + 2 + 3) Och det högra 4 + 1 * 2 + 3 Hur traversera för att beräkna ett träds värde (pre-, in- eller postorder)? Skriv funktionen!

Postorder Utskrift av ett binärt uttrycksträd enligt postorder ger ett postfix uttryck Utskrift enligt inorder ger ett infix ( vanligt ) uttryck

Rita trädet för a + b + c på två sätt (olika + är rot). Är de likvärdiga? Rita träden för uttrycken 1 / (2 + 3 * 4) och 1 / 2 + 3 * 4 Vilka infix uttryck representerar respektive träd ovan? Postfix? Övning - / 1 - + + - 4 1 2 * 5 2 3 3 4

Trädkonstruktion Algoritm för att bygga ett träd från postfix uttryck (snarlikt det du gjorde i lab 2) Input: Ett postfix uttryck och en tom stack Output: En stack med roten till ett binärt träd Upprepa tills input är tomt: Läs nästa symbol, X, från input Om X är en operand Skapa en trädnod av X och pusha noden Annars (X är en operator) Poppa två träd, T2 och T1, från stacken Skapa en trädnod, n, med X som data, T1 som vänsterbarn och T2 som högerbarn Pusha n på stacken

Träd och postfix Trädet kan på så sätt användas för att skapa ett infix uttryck som motsvarar ett postfix uttryck. Ett problem man oftare vill lösa är att givet ett infix uttryck (skrivet av människor) skapa ett binärt träd (för utskrift enligt postorder) Då behöver vi en algoritm för att bygga träd från infix uttryck

Skapa träd från infix uttryck Här är en iterativ algoritm (för enbart +, * och tal): Skapa en nod, n1, av första termen Upprepa följande tills slut på input Läs nästa symbol från input (det är ett +) Skapa en ny nod, n2, av nästa term Skapa en ny nod, n, av + och med n1 och n2 som vänster resp. höger barnnod Sätt n1 = n Returnera n1

Skapa träd från infix uttryck Term kan göras på liknande sätt: Skapa en nod, n1, av första talet Upprepa följande tills slut på term Läs nästa symbol från input (det är ett *) Skapa en ny nod, n2, av nästa tal Skapa en ny nod, n, av * och med n1 och n2 som vänster resp. höger barnnod Sätt n1 = n Returnera n1

Skapa träd från infix uttryck Genom att man särskiljer på behandlingen av den högprioriterade operationen * och den lågprioriterade +, på så sätt att * delträd byggs under + så kommer de att ges rätt prioritet då trädet senare beräknas. Operatorer av fler prioriteter kan läggas till på liknande sätt. Parenteser kan också behandlas på ett liknande sätt men man får en rekursion tillbaks till första nivån (lägst prioritet) då man kommit in i ett parentessatt uttryck.

Skapa träd från infix uttryck Här är en rekursiv algoritm för att lösa samma sak: uttryck-till-träd(input, rot) om rot = tomtträd så rot := term(input, tomtträd) om ej tomt(input) så Läs nästa symbol från input (det är ett +) rot := skapaträd(rot, +, term(input, tomtträd)) rot := uttryck-till-träd(input, rot) return rot

Skapa träd från infix uttryck Funktionen term kan definieras på liknande sätt: term(input, rot) om rot = tomtträd så Läs nästa symbol, X, från input (det är ett tal) rot := skapaträd(x) om nästa(input) är * så Läs nästa symbol från input (det är ett *) Läs nästa symbol, X, från input (det är ett tal) rot := skapaträd(rot, *, skapaträd(x)) rot := term(input, rot) return rot

Implementation i C: Vi låter nodernas data innehålla strängar som visar vilken operand eller operator det representerar. Vi förenklar problemet på följande sätt. Anta att indata utgörs av en stack där elementen är strängar (operander eller operatorer) på infix form. BTree har även följande operation: /* Funktionen returnerar roten till ett nytt träd som har left och right som sitt vänstra resp. högra barnträd, och data som datainnehåll. */ Btree *BtreeMerge(Btree *left, Btree *right, void *data);

Implementation i C: BTree *expr(stack *input, BTree *root) { BTree *n1, *n2; if (root == NULL) root = term(input, NULL); if (!StackIsEmpty(input)) { StackPop(input); n1 = root; n2 = term(input, NULL); root = expr(input, BtreeMerge(n1, n2, + )); } return root; }

Implementation i C: BTree *term(stack *input, BTree *root) { BTree *n1, *n2; if (root == NULL) root = BTreeCreate(StackPop(input)); if (strcmp(stackpeek(input), * ) == 0) { StackPop(input); n1 = root; n2 = BTreeCreate(StackPop(input)); root = term(input, BtreeMerge(n1, n2, * )); } return root; }

Implementation i C: Även här kan vi bara följa mönstret och utöka med nya funktioner för att klara att hantera uttryck med fler prioritetsnivåer. Flera operatorer med samma prioritet kan enkelt behandlas i samma funktion.