Datastrukturer Föreläsning 5 Maps 1
Traversering av träd Maps 2
Preordningstraversering Traversera = genomlöpa alla noderna i ett träd Varje nod besöks innan sina delträd Preordning = djupet först Exempel: innehållsförteckning för dokument med kapitelstruktur 1 3 2 Make Money Fast! 1. Motivations 2. Methods References 4 1.1 Greed 1.2 Avidity 2.1 Stock Fraud ( preorder(v Algorithm ( visit(v for each child w of v ( w ) preorder 5 6 7 8 2.2 Ponzi Scheme 2.3 Bank Robbery 9 Maps 3
Utskrift av träd i preordning ( print(offset,v Algorithm for i = 0 to offset print a blank print data in v for each child w of v ( offset+3,w ) print Maps 4
Exempel på utskrift av träd print(0,root) ger Make Money Fast 1. Motivations 1.1 Greed 1.2 Avidity 2. Methods 2.1 Stock Fraud 2.2 Ponzi Scheme 2.3 Bank Robbery 3. References 2 1 Make Money Fast! 5 1. Motivations 2. Methods References 9 3 1.1 Greed 1.2 Avidity 4 6 7 2.1 Stock Fraud 2.2 Ponzi Scheme 8 2.3 Bank Robbery Maps 5
Postordningstraversering Varje nod besöks efter sina delträd Djupet-först! Exempel: beräkning av hur mycket plats en viss katalog och dess underkataloger tar i minnet 1 h1c.doc 3K 3 homeworks/ h1nc.doc 2K 9 DDR.java 10K cs16/ ( postorder(v Algorithm for each child w of v ( w ) postorder ( visit(v programs/ 2 4 5 6 7 Stocks.java 25K Robot.java 20K 8 todo.txt 1K Maps 6
Inordningstraversering av binärt träd Varje nod besöks efter sitt vänstra delträd och före sitt högra delträd Förutsätter alltså att trädet är binärt 2 6 ( inorder(v Algorithm () v.isinternal if (() v.left ) inorder ( visit(v () v.isinternal if (() v.right ) inorder 8 1 4 7 9 3 5 Maps 7
Inordertraversering av binära sökträd Om man gör en inordertraversering av ett binärt sökträd besöker man noderna i växande ordning 2 5 7 1 3 6 4 Maps 8
Utskrift av aritmetiska uttryck Inordertraversering Skriv ut en nod när den besöks Skriv ( innan vänster delträd besöks Skriv ) efter höger delträd besökts 2 - a 1 + 3 b ( printexpression(v Algorithm () v.isinternal if ( ) ) print (() printexpression(v.left (() print(v.element () v.isinternal if (() printexpression(v.right ( ( ) print (( b (a - 1)) + (3 ((2 Maps 9
Beräkning av aritmetiska uttryck Beräkna delträd i postordning 2-5 1 + 3 2 ( evalexpr(v Algorithm () v.isexternal if () v.element return else (() evalexpr(v.left x (() evalexpr(v.right y o operator stored at v if o = + return x + y if o = * return x*y if o = - return x-y if o = / return x/y Maps 10
Hur implementerar man träd? Hur implementerar man träd? Hur implementerar man binära träd? Hur genomsöker (traverserar) man ett träd? Hur genomsöker man ett binärt träd? Maps 11
Enkellänkade binära träd En nod innehåller (Pekare till) element Pekare till vänster barn Pekare till höger barn B A D C E Maps 12
Dubbellänkade binära träd En nod innehåller Pekare till element Pekare till vänster barn Pekare till höger barn Pekare till föräldern Notera att vi här använder vaktposter ( sentinels ). Man kan förstås implementera dubbellänkade träd utan vaktposter och enkellänkade träd med vaktposter om man vill. B D vaktpost Maps 13
Att lagra binära träd i fält exempel 2 Ett binärt träd 5 6 Samma träd lagrat i ett fält 9 7 2 5 6 9 7 Maps 14
Att lagra binära träd i fält - exempel 0 Ett binärt träd 1 2 Samma träd lagrat i ett fält 3 5 6 0 1 2 3 5 6 8 8 Maps 15
Att lagra binära träd i fält allmän princip Roten lagras i cell 0 Om en viss nod lagras i cell i så lagras vänster barn i cell 2i + 1 höger barn i cell 2i + 2 ( 1 + 2i (Obs. G&T lägger roten i 1 och barnen i 2i och Ett binärt träd är fullständigt om noderna lagras i cellerna 0, 1, 2,, n-1 Om det binära trädet kan växa obegränsat behöver vi dynamiskt fält. 08-11-11 12:42
Implementering av allmänna träd En nod i ett allmänt träd kan ha godtyckligt många barn, fler än 2. Implementeringsmetod 1. Låt varje nod ha en lista av (pekare till) sina barn! Implementeringsmetod 2. Transformera trädet till ett binärt träd och använd implementering av binära träd! Maps 17
Allmänna träd som binära träd A A B C D B E F G H E C H I J H F G H D I ett allmänt träd J transformerat till ett binärt träd Maps 18
Implementering av allmänna träd en Javaklass Alt 2. Transformera till binärt träd! Använd sedan t ex länkad stuktur för binära träd. Om vi döper om tillståndsvariablerna blir det lättare att se vad som händer: class TreeNode<E> { E elem; TreeNode<E> eldestchild; TreeNode<E> nextsibling; } Maps 19
Prioritetsköer Sell 100 IBM $122 Sell 300 IBM $120 Buy 500 IBM $119 Buy 400 IBM $118 Maps 20
Prioritetsköer Hur implementerar man en datastruktur om man ofta vill veta vilket element som har högst prioritet? Exempel: lägsta säljkurs eller högsta köpkurs för en aktie. Exempel: närmaste spårvagnshållplats i lab 3. Maps 21
Vad är en prioritetskö? En prioritetskö lagrar par <k,v> av nycklar (k) och värden (v) Det finns en ordningsrelation på nycklarna: k1 < k2 betyder k1 har högre prioritet än k2. Den viktigaste operationen minkey returnerar nyckeln med högst prioritet, eller motsvarande värde minelem Man vill göra dessa operationer effektiva. 08-11-11 12:42
En ADT för prioritetsköer De viktigaste operationerna är minkey() () minelement () removemin ( v insertitem(k, () isempty Maps 23
Prioritetsköer: två enkla implementeringar Osorterade listor (loggfiler): ( O(n minkey är ( O(1 insertitem är Sorterade listor: ( O(1 minkey är ( O(n insertitem är Maps 24
Finns det någon mer effektiv implementering av prioritetsköer? Hur gör vi så att alla operationerna blir effektiva? Även insättning och borttagning bör vara effektiva! Maps 25
Heapar Fullständiga binära träd Har heapegenskapen, dvs föräldrarnas nycklar är mindre än eller lika med barnens 5 2 6 9 7 8 12 11 10 08-11-11 12:42
Heapar och prioritetsköer Vi kan implementera prioritetsköer effektivt med hjälp av heapar Heapen implementeras med dynamiskt fält eftersom vi gör insättningar ( Sue,2) ( Pat,5) ( Mark,6) ( Anna,7) ( Jeff,9) Maps 27
En heap lagrad i ett fält exempel 2 träd En heap är ett fullständigt binärt 5 6 Heapen lagrad i ett fält 9 7 2 5 6 9 7 Maps 28
Fullständiga binära träd igen Låt h vara höjden på ett fullständigt binärt träd. Då är nivå i = 0,, h-1 fulla, dvs de innehåller 2 i noder Nivå h är fylld från vänster 2 5 6 9 7 Maps 29
Höjden på ett fullständigt binärt träd fullständigt binärt träd med ( n n element har höjden O(log Bevis: n 1 + 2 + 4 + + 2 h-1 + 1 = 2 h Alltså, n 2 h och h log n djup 0 1 h-2 h-1 noder 1 2 2 h-2 2 h-1 h Maps 30
Hur implementerar man prioritetsköoperationerna med hjälp av en heap? Maps 31
Insättning av nytt element - Sätt först in det nya elementet på första lediga plats på sista raden! - Återställ heapegenskapen! Se nästa bild. 9 5 5 9 7 1 7 2 2 6 6 ny nod 08-11-11 12:42
Bubbla uppåt En ny nod som satts in sist kan ha en nyckel som är mindre än förälderns! Heap-egenskapen gäller då inte längre. Återställ heap-egenskapen genom att bubbla uppåt : jämför den nya nodens nyckel k med förälderns nyckel, om k är mindre byter vi plats med föräldern, sedan jämför vi med förälderns förälder, etc. Bubblingen avbryts när vi kommer till en förälder vars nyckel är mindre än eller lika med k. Tidskomplexiteten är O(log n) eftersom heapens höjd är det 2 1 5 9 7 6 z 1 5 z 9 7 6 2 Maps 33
Borttagning av minsta elementet 2 5 6 Minsta elementet ligger i roten Ta bort det och ersätt med sista elementet Återställ heapegenskapen genom att bubbla ned 9 9 5 7 7 sista noden blir ny rot 6 08-11-11 12:42
Bubbla nedåt Den nya roten har antagligen inte minst nyckel längre Återställ därför heapegenskapen genom att bubbla nedåt En bubbling utförs genom att en förälder jämförs med båda barnen Högst prioriterat (dvs den som har minst nyckel) barn byter plats med föräldern 08-11-11 12:42