Datastrukturer och algoritmer Innehåll Modell/tillämpningar för träd

January 8, 2018 | Author: Anonymous | Category: Engineering & Technology, Datavetenskap, Data Structures
Share Embed Donate


Short Description

Download Datastrukturer och algoritmer Innehåll Modell/tillämpningar för träd...

Description

Datastrukturer och algoritmer Föreläsning 9 Träd

Modell/tillämpningar för träd

Innehåll • • • • • •

Modeller/tillämpningar för träd Organisation och terminologi Signaturdiagram för ordnat träd Olika typer av träd Trädalgoritmer Implementation av träd

• Modell: – Ordnat träd: • Ordervägarna i ett regemente

– Binärt träd: • Stamtavla/släktträd

• Tillämpningsexempel inom datavärlden: – Filsystem – Klasshierarkier i OOP – Beslut-/sök-/spelträd inom AI – Exekvering av logiska språk exvis prolog 3

4

Organisation och terminologi (1)

Organisation och terminologi (2) •

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

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å som har samma förälder 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.



En nod utan barn kallas löv

Nivå 1 Nivå 2

Nivå 3 Nivå 4

6

1

Organisation och terminologi (3) • Ett träds noder finns på olika nivåer. •

c

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.

b

– 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.

Signaturdiagram för ordnat träd Nivå 1 Nivå 2

Nivå 3

a

Nivå 4

– d(a) = 3, d(b) = 1, d(c) = 0 – nivå(x) = d(x) + 1

• Navigeringsorienterad vs delträdsorienterad specifikation av träd. • Om man arbetar med enstaka träd som förändras långsamt löv för löv så är navigeringsorienterad bättre. • Håller man på med träd och delträd som man vill dela upp eller slå samman är delträdsorienterad bättre.

7

8

Signaturdiagram för ordnat träd

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

9

– Mer abstrakt än de två ovanstående. Har en egen datatyp som hanterar syskonen. Vi kan 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. 10

”Begreppspaus” – om ordning

Olika typer av träd • Riktade träd

• Ordnad

– Man kan bara gå i en riktning i trädet, upp eller ner – I ett nedåtriktat träd saknas Parent – I ett uppåtriktat träd saknas Children. Det måste gå att nå något annat än roten, t.ex en operation som returnerar alla löv.

• Binära träd (ex stamtavla) – Varje nod har högst två barn – Vanligt och mycket användbart

– Används för att beskriva olika sätt att ordna element i ett objekt – En lista är ordnad av före/efter-relationen

• Riktad – När det finns en assymetri när det gäller operationer för att navigera från ett element till ett annat

• Sorterad 11

– När elementvärdena är sorterade enligt någon ordningsrelation

12

2

Binära träd (1)

Maximal och minimal höjd

• En nod i ett binärt träd kan ha högst två barn

• Maximal höjd (n-1) för n=3, en nod/nivå

– 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”).

• Minimal höjd, man kan inte flytta om några noder och få en mindre höjd:

Minimal 13

Binära träd (2)

Ej minimal

14

Binära träd (3)

• För binära träd T med n noder och höjd h gäller: – ℎ ≤ 𝑛 − 1 (maximala höjden) – ℎ ≥ 𝑙𝑜𝑔2(𝑛 + 1) − 1 • Antalet noder på djup i är 2i dvs 1, 2, 4, 8 ... • Antalet noder totalt i trädet: 𝑛 ≤ 2(h+1) − 1

• 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 𝑂(𝑙𝑜𝑔2 (𝑛))

• Komplett binärt träd (Rätt bra balans)

– Ett träd har minimal höjd om 𝑛 > 2ℎ – 1 vilket ger • 𝑙𝑜𝑔2 (𝑛 + 1) − 1 ≤ ℎ < log2(𝑛 + 1) • dvs h är av 𝑂(𝑙𝑜𝑔2 (𝑛))

– 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

15

Algoritmer

16

Traversering av träd • Tillämpningar av träd involverar ofta att man

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

– Söker efter ett element med vissa egenskaper – Transformerar (omvandlar) strukturen till en annan struktur – Filtrerar ut element med vissa egenskaper

• Alla dessa bygger på att man traverserar strukturen, dvs att man går igenom trädet

17

18

3

Traversering av träd Bredden-först

Traversering av träd Bredden-först

• Undersök en nivå i taget. Först roten, sedan rotens alla barn, dess barnbarn osv. – En kö är ofta till 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 så hittar man det.

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) Ordningen: a, b, c, d, e, f, g, h, i, j

a b

c

d f

g

e h

i

j

19

Traversering av träd Djupet-först

Traversering av träd Preorder

• Följ varje gren från roten till lövet

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)

– Stack till hjälp vid implementeringen – Varje nod besöks endast en gång, dvs O(n) – Tre varianter: • • •

20

Preorder Postorder Inorder

preOrder(BinTree T) compute(root(T)) preOrder(leftChild(T)) preOrder(rightChild(T))

21

Traversering av träd Preorder

c

d

f

Preorder - läsa ett dokument

Ordningen: a, b, c, d, f, g, e, h, i, j

a

b

22

g

e

h

i

j

23

24

4

Traversering av träd Postorder

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 b postOrder(BinTree T) postOrder(leftChild(T)) postOrder(rightChild(T)) compute(root(T))

Ordningen: b, c, f, g, d, h, i, j, e, a

a

c

d

f

e

g

h

i

j

25

Postorder – beräkna aritmetiska uttryck Algoritm evaluateExpression(Tree t) If isLeaf(t) return getValue(t) else op
View more...

Comments

Copyright � 2017 NANOPDF Inc.
SUPPORT NANOPDF