Presentation laddar. Vänta.

Presentation laddar. Vänta.

Datastrukturer och algoritmer

Liknande presentationer


En presentation över ämnet: "Datastrukturer och algoritmer"— Presentationens avskrift:

1 Datastrukturer och algoritmer
Gick igenom exemplen på traverseringar för noga så därför hann jag inte med Arrayimplementationen av binära träd (drog över 10 min). Lite för mycket material men tar man bort exemplen så borde det gå…. Föreläsning 10

2 Innehåll Modeller/tillämpningar för träd Organisation och terminologi
Olika typer av träd Trädalgoritmer Implementering av träd Kapitel 10 och 11 i kursboken

3 Modeller/tillämpningar för träd
Ordnat träd: Ordervägarna i ett regemente Binärt träd: Stamtavla/släktträd Tillämpningsexempel inom datavärlden: Filsystem Klasshierarkier i Java/OOP Besluts-/sök-/spelträd inom AI Prologs exekvering

4 Organisation och terminologi (1)
Varje träd har minst en nod - roten Om det finns flera noder så finns det också grenar… …löv har träden också!

5 Organisation och terminologi (2)
Elementen i ett träd kallas för noder. En nod har en position och ev. ett värde. Värdet på en nod kallas etikett. Alla noder på en nivå kallas syskon. Ett träd har ett ändligt antal noder och är en homogen datatyp. Föräldra-barn hierarki. Delträd = en nod och dess avkomma. Nivå 1 Nivå 2 Nivå 3 Nivå 4 Homogen = samma typ på alla noder

6 Organisation och terminologi (3)
OBS! Detta skiljer sig från kursbokens definitioner! Ett träds noder finns på olika nivåer. Höjden h(x) för nod x är antalet bågar på den längsta grenen i det träd där x är rot. Höjden av ett träd T, h(T) = h(roten) h(a) = 0, h(b) = 2 och h(c) = 3 = h(T) Djupet d(x) hos en nod x är antalet bågar från x upp till roten. d(a) = 3, d(b) = 1, d(c) = 0 nivå(x) = d(x) + 1 c Nivå 1 Nivå 2 Nivå 3 Nivå 4 b a

7 Olika typer av träd Ordnat träd (ex militärhierarki)
Syskonen är linjärt ordnade Oordnat träd (ex filsystemet på en dator) Ordningen bland syskonen har ingen betydelse Urträd Mer abstrakt än de två förra. Har en egen datatyp som hanterar syskonen. Se figur 10.1 sidan 191! I oordnat träd måste First-child och Next-sibling bytas ut mot mängdoperationer… I urträdet kan vi inte ha med några operationer som förutsätter något om hur barnen är organiserade. Kvar blir ”Insert-children” som stoppar in en mängd med barn och ”children” som tar fram barnen till en nod.

8 Olika typer av träd Riktade träd Binära träd (tex stamtavla)
Kan bara gå i en riktning i trädet. I ett nedåtriktat träd saknas Parent. I ett uppåtriktat träd saknas Children, måste gå att nå något annat än roten, tex en operation som ger alla löv. Binära träd (tex stamtavla) Varje nod har högst två barn

9 ”Begreppspaus”- Om ordning
Ordnad Används för att beskriva olika sätt att ordna element i ett objekt i en datatyp Riktad När det finns en asymmetri när det gäller operationer för att hitta från ett element till ett annat. Sorterad När elementvärdena är sorterade enligt någon ordningsrelation En lista är ordnad av före/efter-relationen Riktade och oriktade listor Sorterade och osorterade listor

10 Binära träd (1) En nod i ett binärt träd kan ha högst två barn
Barnen kallas vänster- och högerbarn. Det andra barnet kan komma före det första Träden nedan är OLIKA binära träd (men samma ”ordnade träd med max två barn”).

11 Maximal och minimal höjd
Maximal höjd (n-1) för n=3, en nod på varje nivå: Minimal höjd, man kan inte flytta om några noder och få en mindre höjd: Minimal Ej minimal

12 Binära träd (2) För binära träd T med n noder och höjd h gäller:
h  n-1 (maximala höjden) h  log2(n+1)-1 Antalet noder på höjd i: ni  2i dvs 1, 2, 4, 8,…, 2h Antalet noder totalt i trädet: n  2(h+1) - 1 Ett träd har minimal höjd om n > 2h - 1 vilket ger log2(n+1)-1  h < log2(n+1) dvs h är av O(log2(n)) h(T)  n-1 Varför? Trädet blir högst om man placerar en nod på varje nivå. Höjden blir då n-1. h(T)  log2(n+1)-1 På djupet 0 finns en nod (roten) På djupet ett högst 2 noder osv, på djupet i 2(i) största djupet är h om trädet har höjd h. n <= …+2i h = 2(h+1) -1 Ett träd har minimal höjd om n > 2h -1 (Man kan inte rymma så många noder i ett träd med lägre höjd än h)

13 Binära träd (3) Man vill ha så grunda träd som möjligt
Se Figur 11.3 sidan 224 för exempel! Man vill ha så grunda träd som möjligt Om vänster och höger delträd är ungefär lika stora har trädet balans och vägen till en slumpvis vald nod är O(log2(n)) (se OH 12!) Komplett binärt träd (Rätt bra balans) Fyller på trädet från vänster till höger, en nivå i taget. Fullt binärt träd (Ofta dålig balans) Varje nod är antingen ett löv eller har två barn. Rita exempel!!

14 Algoritmer Basalgoritmer för träd Djup Höjd Slå ihop Dela upp Beräkna
Traversera

15 Traversering av träd Tillämpningar av träd involverar ofta att man
Söker efter ett element med vissa egenskaper Transformerar strukturen till en annan struktur Exempelvis sortering och balansering Filtrerar ut element med vissa egenskaper Alla dessa bygger på att man traverserar strukturen.

16 Traversering av träd - Bredden-först
Man undersöker en nivå i taget. Först roten, sedan rotens barn, dess barnbarn osv. Kö ofta hjälp vid implementationen. Varje nod i trädet besöks endast en gång, dvs O(n). Söker man något som finns hittar man det. Kö: lägg in alla barn till nuvarande nod för att gå dit sen

17 Traversering av träd-Bredden först
Algoritm bfOrder(Tree T) input: A tree T to be traversed for each level L of T do for each node of L do compute(node) a Ordningen: a, b, c, d, e, f, g, h, i, j b c d e f g h i j

18 Traversering av träd - Djupet-först
Man följer varje gren i trädet utifrån roten till lövet Stack till hjälp för implementeringen Varje nod besöks endast en gång, dvs O(n). Tre varianter: Preorder Postorder Inorder Stack: lägg in besökta noder för att gå tillbaks till närmsta nod med obesökta barn

19 Traversering av träd - Preorder
Algoritm preOrder(Tree T) input: A tree T to be traversed compute(root(T)) // Do something with node for each child w of root(T) do preOrder(w) preOrder(BinTree T) compute(root(T)) preOrder(leftChild(T)) preOrder(rightChild(T)) a b c d e f g h i j Ordningen: a, b, c, d, f, g, e, h, i, j

20 Preorder – Läsa ett dokument…

21 Traversering av träd - Postorder
Algoritm postOrder(Tree T) input: A tree T to be traversed for each child w of root(T) do postOrder(w) compute(root(T)) // Do something with node postOrder(BinTree T) postOrder(leftChild(T)) postOrder(rightChild(T)) compute(root(T)) a b c d e Ordningen: b, c, f, g, d, h, i, j, e, a f g h i j

22 Postorder – Beräkna aritmetiska uttryck
Algoritm evaluateExpression(Tree t) If isLeaf(t) return getValue(t) else op  getValue(t) x  evaluateExpression(leftChild(t)) y  evaluateExpression(rightChild(t)) return x op y Postorder – Beräkna aritmetiska uttryck / * + + 3 - 2 1 3 9 5

23 Traversering av träd – Inorder
Algoritm inOrder(Tree T) input: A tree T to be traversed node  root(T) inOrder(firstChild(T)) compute(node) // Do something with node for each child w of node (except first) do inOrder(w) inOrder(BinTree T) inOrder(leftChild(T)) compute(root(T)) inOrder(rightChild(T)) a Man traverserar först det första delträdet inorder Sedan roten Sist resten av delträdet inorder b c d e Ordningen: b, a, c, f, d, g, h, e, i, j f g h i j

24 Inorder – Skriva aritmetiska uttryck
Algoritm printExpression(Tree t) print ”(” if hasLeftChild(t) then printExpression(leftChild(t)) print getValue(t) if hasRightChild(t) then printExpression(rightChild(t)) print ”)” Inorder – Skriva aritmetiska uttryck / * + ( ( ( (3) + (1)) * 3) / ((9 - 5) + 2 ) … typ…. + 3 - 2 3 1 9 5

25 Trädda binära träd Nedåtriktade binära träd har ”lediga” länkar.
Utnyttja dessa för att ”trä” genvägar i trädet. Det är vanligt att skapa inorder- trädda träd. Detta gör att man kan traversera med hjälp av iteration istället för rekursion. Sparar minne

26 Tillämpningar av träd Sökträd
Varje nod symboliserar ett givet tillstånd. Barnen symboliserar de olika tillstånd man kan hamna i utifrån förälderns tillstånd. Det gäller att hitta målnoden, dvs ett tillstånd som löser problemet. Inte rimligt att bygga upp alla noder (möjliga tillstånd). Ofta används heuristik Heuristik i shack: evaluera hur bra en situation är för några nivåer ner

27 Tillämpningar av träd Planträd och OCH/ELLER-träd
Noderna symboliserar hur man bryter ned ett stort problem i mindre delar och i vilken ordning man bör lösa dessa mindre delproblem. Ofta använder man OCH/ELLER-träd där man kan ha OCH-kanter eller ELLER-kanter mellan förälder och barn. OCH – alla barn behövs för lösningen ELLER – något barn behövs Sen finns också syntax eller parseträd som visar hur ett språk bör vara uppbyggd

28 Implementationer av träd
Oordnat uppåtriktat träd som fält Varje element i en vektor består av ett par: nodens etikett och en referens till föräldern. + Tar liten plats - Inget bra stöd för traversering (t ex svårt veta vilka noder som är löv) - Maximala storleken på trädet måste bestämmas i förväg Finns flera olika förslag i boken. Läs och fundera! Se Figur 10.7 och 10.8 på sid. 205 för exempel!

29 Implementationer av träd
Ordnat träd som n-länkad struktur Noden i trädet består av n-celler med etikett, länk till föräldern och n-1 länkar till barnen + Antalet noder i trädet dynamiskt. - Maximala antalet barn bestämt i förväg. - Om det är stor variation i antalet barn så finns outnyttjade länkar. Finns flera olika förslag i boken. Läs och fundera! Se Figur 10.9 på sid. 206 för exempel!

30 Implementationer av träd
Nedåtriktat ordnat träd som 1-länkad struktur med lista av barn Noden i trädet består av 1-celler med en etikett och en länk till en barnlista + Antalet noder i trädet dynamiskt. + Antalet barn i nätet dynamiskt Utöka till 2-celler så blir trädet oriktat Noden får en länk till föräldern, en etikett samt en länk till barnlista. Se Figur och på sid. 207 för exempel! Finns flera olika förslag i boken. Läs och fundera!

31 Implementationer av träd
Uppåtriktat binärt träd med hjälp av 1-cell Nedåtriktat binärt träd med 2-cell Oriktat binärt träd med 3-cell Föräldra-länk Etikett Vänster-barn Etikett Höger-barn Finns flera olika förslag i boken. Läs och fundera! Föräldra-länk Vänster-barn Etikett Höger- barn

32 Implementationer av träd
Noder som håller reda på förälder, första barn och syskon. a b c d e f Finns flera olika förslag i boken. Läs och fundera! g

33 Implementationer av träd
Binärt träd som fält Roten har index 1 och noden med index i har sitt vänsterbarn i noden med index 2i sitt högerbarn i noden med index 2i +1 sin förälder i noden med index floor(i/2) + Tar inget utrymme för strukturinformation - Trädet har ett maxdjup (statiskt fält) - Ev. slöseri med utrymme Krävs ”markörer” för tom nod och inget värde Finns flera olika förslag i boken. Läs och fundera! Kom ihåg förklara floor!! Ev. slöseri med utrymme om litet träd lagras eller ett icke-komplett träd lagras


Ladda ner ppt "Datastrukturer och algoritmer"

Liknande presentationer


Google-annonser