Laste ned presentasjonen
Presentasjon lastes. Vennligst vent
PublisertInge Andreassen Endret for 8 år siden
1
Prioritetskøer Binære heaper Venstrevridde heaper (Leftist) Skeive heaper (Skew) Binomialheaper Fibonacciheaper Prioritetskøer er viktige i bla. operativsystemer (prosesstyring i multitaskingssystemer), og søkealgoritmer (A, A*, D*, etc.).
2
Prioritetskøer Prioritetskøer er datastukturer som holder elementer med en prioritet (key) i en kø-aktig struktur, og som implementerer følgende operasjoner: insert() – Legge et element inn i køen deleteMin() – Ta ut elementet med høyest prioritet Og kanskje også: buildHeap() – Lage en kø av en mengde elementer increaseKey()/DecreaseKey() – Endre prioritet delete() – Slette et element merge() – Slå sammen to prioritetskøer
3
Prioritetskøer En usortert lenket liste kan brukes. insert() legger inn først i listen (O(1)) og deleteMin() søker igjennom listen etter elementet med høyest prioritet (O(n)). En sortert liste kan brukes. (Omvendt kjøretid.) – Ikke så veldig effektivt. For å lage en effektiv prioritetskø, holder det at elementene i køen er ”nogenlunde sorterte”.
4
Binære heaper (vanligst) En binærheap er organisert som et komplett binærtre. (Alle nivåer fulle, med evt. unntak av det siste nivået) I en binærheap skal elementet i roten ha en key som er mindre eller lik key’en til barna, i tillegg skal hvert deltre være en binærheap. abcdefghij 012345678910111213 1234 a bc de hij fg 1 2 3 4
5
Binære heaper (vanligst) En binærheap er organisert som et komplett binærtre. (Alle nivåer fulle, med evt. unntak av det siste nivået) I en binærheap skal elementet i roten ha en key som er mindre eller lik key’en til barna, i tillegg skal hvert deltre være en binærheap. abcdefghij 012345678910111213 1234 1 2 3 4 2i2i a bc de hij fg
6
Binære heaper (vanligst) En binærheap er organisert som et komplett binærtre. (Alle nivåer fulle, med evt. unntak av det siste nivået) I en binærheap skal elementet i roten ha en key som er mindre eller lik key’en til barna, i tillegg skal hvert deltre være en binærheap. abcdefghij 012345678910111213 1234 1 2 3 4 2i+1 a bc de hij fg
7
Binære heaper (vanligst) En binærheap er organisert som et komplett binærtre. (Alle nivåer fulle, med evt. unntak av det siste nivået) I en binærheap skal elementet i roten ha en key som er mindre eller lik key’en til barna, i tillegg skal hvert deltre være en binærheap. abcdefghij 012345678910111213 1234 1 2 3 4 i / 2 a bc de hij fg
8
Binære heaper (vanligst) 13 2116 24 31 65 26 32 1968 1 2 3 4 13211624311968652632 012345678910111213 1234
9
Binære heaper (vanligst) 13 2116 2431 65 26 32 1968 1 2 3 4 insert(14) 13211624311968652632 012345678910111213 1234
10
Binære heaper (vanligst) 13 2116 2431 65 26 32 1968 1 2 3 4 insert(14) 1321162431196865263214 012345678910111213 1234 14
11
Binære heaper (vanligst) 13 2116 2431 65 25 32 1968 1 2 3 4 insert(14) 1321162431196865263214 012345678910111213 1234 14
12
Binære heaper (vanligst) 13 2116 2414 65 26 32 1968 1 2 3 4 insert(14) 1321162414196865263231 012345678910111213 1234 31
13
Binære heaper (vanligst) 13 2116 2414 65 26 32 1968 1 2 3 4 insert(14) 13 21 162414196865263231 012345678910111213 1234 31
14
Binære heaper (vanligst) 13 1416 2421 65 26 32 1968 1 2 3 4 insert(14) 1314162421196865263231 012345678910111213 1234 31
15
Binære heaper (vanligst) 13 1416 2421 6526 32 1968 1 2 3 4 insert(14) 1314162421196865263231 012345678910111213 1234 31
16
Binære heaper (vanligst) 13 1416 2321 65 26 32 1968 1 2 3 4 insert(14) 1314162421196865263231 012345678910111213 1234 31 ” percolateUp() ”
17
Binære heaper (vanligst) 13 1416 1921 65 26 32 1968 1 2 3 4 deleteMin() 1314161921196865263231 012345678910111213 1234 31
18
Binære heaper (vanligst) 1416 1921 65 26 32 1968 1 2 3 4 deleteMin() 14161921196865263231 012345678910111213 1234 31
19
Binære heaper (vanligst) 31 1416 1921 65 26 32 1968 1 2 3 4 deleteMin() 31141619211968652632 012345678910111213 1234
20
Binære heaper (vanligst) 14 3116 1921 65 26 32 1968 1 2 3 4 deleteMin() 14311619211968652632 012345678910111213 1234
21
Binære heaper (vanligst) 14 1916 3121 65 26 32 1968 1 2 3 4 deleteMin() 14191619213168652632 012345678910111213 1234
22
Binære heaper (vanligst) 14 1916 2621 65 31 32 1968 1 2 3 4 deleteMin() 14191619212668653132 012345678910111213 1234
23
Binære heaper (vanligst) 14 1916 2621 65 31 32 1968 1 2 3 4 deleteMin() 14191619212668653132 012345678910111213 1234 ” percolateDown() ”
24
Binære heaper (vanligst) W.C. Avg C. insert() O(log N)O(1) deleteMin() O(log N)O(log N) buildHeap() O(N) (Legg elementene inn i tabellen i vilkårlig rekkefølge, og kjør percolateDown() på hver rot i deltrærne i heapen (treet) som oppstår, nedenifra og opp.) (Summen av høydene i et binærtre med N noder er O(N).) merge() O(N) (N = antall elementer)
25
Venstrevridde heaper For å implementere merge() effektivt, går vi bort fra tabell-metoden, og ser på såkalte venstrevridde heaper (leftist heaps), som rene trær. Tanken er å gjøre heapen (treet) skeivt, slik at vi kan gjøre det meste av arbeidet på den laveste delen av treet. En venstrevridd heap er et binærtre med heap-struktur (røttene i deltrærne skal ha lavere key enn barna.) og et ekstra skeivhetskrav. For alle noder X i treet, definerer vi nullsti-lengede(X) (null path length) som lengden av korteste sti fra X til en node som ikke har to barn. Kravet er at for alle noder, skal nullsti-lengden til det venstre barnet være minst like stor som nullsti-lengden til det høyre barnet.
26
Venstrevridde heaper 10 00 0 IKKE LEFTIST LEFTIST 1 10 01 0 1 0
27
Venstrevridde heaper 108 2114 23 17 26 127 1824 33 37 18 merge() 36
28
Venstrevridde heaper merge() 108 2114 23 17 26 127 1824 33 37 18 36
29
Venstrevridde heaper merge() 108 2114 23 17 26 127 1824 33 37 18 36
30
Venstrevridde heaper merge() 108 2114 23 17 26 127 1824 33 37 18 36
31
8 17 26 18 Venstrevridde heaper merge() 108 2114 23 17 26 127 1824 33 37 18 36
32
8 17 26 18 7 37 Venstrevridde heaper merge() 108 2114 23 17 26 127 1824 33 37 18 36
33
8 17 26 18 7 37 Venstrevridde heaper merge() 108 2114 23 17 26 127 1824 33 37 18 36
34
8 17 26 18 7 37 6 12 1824 33 Venstrevridde heaper merge() 108 2114 23 17 26 127 1824 33 37 18 36
35
Venstrevridde heaper merge() 108 2114 23 17 26 127 1824 33 37 18 36 3 10 2114 23 8 17 26 18 7 37 6 12 1824 33
36
Venstrevridde heaper 3 10 2114 23 merge() 108 2114 23 17 26 127 1824 33 37 18 36 8 17 26 18 7 37 6 12 1824 33
37
Venstrevridde heaper 53 76 10 53 76 deleteMin() insert(3)merge() 11 merge() 1
38
Venstrevridde heaper W.C. merge() O(log N) insert() O(log N) deleteMin() O(log N) buildHeap() O(N) (N = antall elementer) I venstrevridde heaper med N noder, er høyre sti maksimalt log (N+1) lang.
39
Skeive heaper Skeive heaper (skew heaps) er en selvbalanserende variant av venstrevridde heaper. Vi har ikke lengre noe eksplisitt skeivhetskrav, som for de venstrevridde heapene, og vi vedlikeholder ingen nullsti-lengde, heapen er selvjusterende (analogt med AVL/Splay-trær). For skeive heaper er merge() -rutinen den samme som for venstrevridde heaper, men vi bytter alltid om på barna, bortsett fra noden med høyest key i de høyre stiene (denne har ikke noe høyre barn).
40
Skeive heaper merge() 108 2114 23 17 26 127 1824 33 37 18 36
41
merge() Skeive heaper 108 2114 23 17 26 127 1824 33 37 18 36
42
merge() Skeive heaper 108 2114 23 17 26 127 1824 33 37 18 36
43
merge() Skeive heaper 108 2114 23 17 26 127 1824 33 37 18 36 8 17 26 18
44
merge() Skeive heaper 108 2114 23 17 26 127 1824 33 37 18 36 8 26 17
45
merge() Skeive heaper 108 2114 23 17 26 127 1824 33 37 18 36 7 37 8 18 26 17
46
merge() Skeive heaper 108 2114 23 17 26 127 1824 33 37 18 36 7 37 8 18 26 17
47
merge() Skeive heaper 108 2114 23 17 26 127 1824 33 37 18 36 6 12 1824 22 7 37 8 18 26 17
48
merge() Skeive heaper 108 2114 23 17 26 127 1824 33 37 18 36 6 12 1824 22 7 37 8 18 26 17
49
merge() Skeive heaper 108 2114 23 17 26 127 1824 33 37 18 36 3 10 2114 23 6 12 1824 22 7 37 8 18 26 17
50
3 merge() Skeive heaper 10 2114 23 6 12 1824 22 7 37 8 18 26 17 108 2114 23 17 26 127 1824 33 37 18 36
51
Binomialheaper Venstrevridde / skeive heaper: merge(), insert() og deleteMin() i tid O(log N). Binære heaper: insert() i tid O(1) i gjennomsnitt. Binomialheaper merge(), insert() og deleteMin() i tid O(log N) W.C. insert() i tid O(1) i gjennomsnitt. Binomialheaper er ikke trær, men en skog av trær, hvert tre en heap.
52
Binomialheaper Binomialtrær B0B0
53
Binomialheaper Binomialtrær B0B0 B1B1
54
Binomialheaper Binomialtrær B0B0 B1B1 B2B2
55
Binomialheaper Binomialtrær B0B0 B1B1 B2B2 B3B3
56
Binomialheaper Binomialtrær B0B0 B1B1 B2B2 B3B3 B4B4
57
Binomialheaper Binomialtrær B0B0 B1B1 B2B2 B3B3 B4B4 Et tre av høyde k har: 2 k noder, antall noder på nivå d er
58
Binomialheaper Binomialheap 16 18 12 2124 65
59
Binomialheaper Binomialheap 16 18 12 2124 65 Lengden av rot-listen for en heap med N elementer er O(log N). (Dobbelt lenket, sirkulær liste.)
60
merge() 16 18 12 2124 65 14 26 23 5124 65 13 Binomialheaper
61
merge() 16 18 12 2124 65 14 26 23 5124 65 13 Binomialheaper
62
merge() 16 18 12 2124 65 14 26 23 5124 65 13 Binomialheaper
63
merge() 16 18 12 2124 65 14 26 23 5124 65 13 16 18 14 26 Binomialheaper
64
merge() 16 18 12 2124 65 14 26 23 5124 65 13 16 18 14 26 12 2124 65 23 5124 65 Trærne (rotlisten) holdes sortert etter høyde. Binomialheaper
65
deleteMin() 13 16 18 14 26 12 2124 65 23 5124 65 Binomialheaper
66
deleteMin() 13 16 18 14 26 2124 65 23 5124 65 merge() Binomialheaper 13 16 18 14 26 12 2124 65 23 5124 65
67
W.C. Avg C. merge() O(log N) O(log N) insert() O(log N)O(1) deleteMin() O(log N)O(log N) buildHeap() O(N) O(N) (Kjør N insert() i en tom heap.) (N = antall elementer) Binomialheaper
68
Implementsjon 13 16 18 14 26 12 2124 65 23 51 24 65 Binomialheaper Dobbeltlenkede, sirkulære lister
69
Implementsjon 13 16 18 14 26 12 2124 65 23 51 24 65 23 61 27 88 Binomialheaper Dobbeltlenkede, sirkulære lister
70
Implementsjon 13 16 18 14 26 12 2124 65 23 51 24 65 23 61 27 88 Binomialheaper Dobbeltlenkede, sirkulære lister
71
Meget elegant, og i teorien effektiv, måte å implementere heaper på: De fleste operasjoner har amortisert kjøretid O(1). (Fredman & Tarjan ’87) insert(), decreaseKey() og merge() O(1) amortisert tid deleteMin() O(log N) amortisert tid Kombinerer elementer fra venstrevridde heaper og binomialheaper. I praksis litt komplisert å implementere, og enkelte skjulte konstanter er litt høye. Best egnet når det er få deleteMin() i forhold til de andre operasjonene. Datastrukturen utviklet i forbindelse med en korteste sti-algoritme. Også benyttet i spenntre-algoritmer. Fibonacciheaper
72
Fra venstrevridde heaper tar vi med en smart decreaseKey() metode. Fibonacciheaper 2 11 12 17 18 4 5 86 11 9 10 18 31 21 15
73
Fra venstrevridde heaper tar vi med en smart decreaseKey() metode. Fibonacciheaper 2 11 12 17 18 4 5 86 11 0 10 18 31 21 15
74
Fra venstrevridde heaper tar vi med en smart decreaseKey() metode. Fibonacciheaper 2 11 12 17 18 4 5 86 11 0 1018 31 21 15 Leftist Ikke leftist
75
Fra venstrevridde heaper tar vi med en smart decreaseKey() metode. Fibonacciheaper 2 11 12 17 18 4 5 86 11 0 1018 31 21 15 Leftist Ikke leftist
76
Fra venstrevridde heaper tar vi med en smart decreaseKey() metode. Fibonacciheaper 2 4 12 17 18 11 5 86 0 1018 31 21 15 Leftist
77
Fra venstrevridde heaper tar vi med en smart decreaseKey() metode. Fibonacciheaper 2 4 12 17 18 11 5 86 0 10 18 31 21 15
78
Fra venstrevridde heaper tar vi med en smart decreaseKey() metode. Metoden må imidlertid modifiseres litt, ettersom vi ønsker å bruke trær som nesten er binomialtrær. - Noder merkes første gang de mister ett barn. - Andre gang de mister ett barn blir noden kappet av og blir rot i et eget tre, og merket fjernes. Fibonacciheaper 38 26 35 24 46 7 2317 30 18 3921 52 41 min
79
Fra venstrevridde heaper tar vi med en smart decreaseKey() metode. Metoden må imidlertid modifiseres litt, ettersom vi ønsker å bruke trær som nesten er binomialtrær. - Noder merkes første gang de mister ett barn. - Andre gang de mister ett barn blir noden kappet av og blir rot i et eget tre, og merket fjernes. Fibonacciheaper 38 26 35 24 15 7 2317 30 18 3921 52 41 min
80
Fra venstrevridde heaper tar vi med en smart decreaseKey() metode. Metoden må imidlertid modifiseres litt, ettersom vi ønsker å bruke trær som nesten er binomialtrær. - Noder merkes første gang de mister ett barn. - Andre gang de mister ett barn blir noden kappet av og blir rot i et eget tre, og merket fjernes. Fibonacciheaper 38 26 35 24 15 7 2317 30 18 3921 52 41 min
81
Fra venstrevridde heaper tar vi med en smart decreaseKey() metode. Metoden må imidlertid modifiseres litt, ettersom vi ønsker å bruke trær som nesten er binomialtrær. - Noder merkes første gang de mister ett barn. - Andre gang de mister ett barn blir noden kappet av og blir rot i et eget tre, og merket fjernes. Fibonacciheaper 38 26 5 24 15 7 2317 30 18 3921 52 41 min
82
Fra venstrevridde heaper tar vi med en smart decreaseKey() metode. Metoden må imidlertid modifiseres litt, ettersom vi ønsker å bruke trær som nesten er binomialtrær. - Noder merkes første gang de mister ett barn. - Andre gang de mister ett barn blir noden kappet av og blir rot i et eget tre, og merket fjernes. Fibonacciheaper 38 26 5 24 15 7 2317 30 18 3921 52 41 min
83
Fra venstrevridde heaper tar vi med en smart decreaseKey() metode. Metoden må imidlertid modifiseres litt, ettersom vi ønsker å bruke trær som nesten er binomialtrær. - Noder merkes første gang de mister ett barn. - Andre gang de mister ett barn blir noden kappet av og blir rot i et eget tre, og merket fjernes. Fibonacciheaper 38 526 24 15 7 2317 30 18 3921 52 41 min
84
Fra venstrevridde heaper tar vi med en smart decreaseKey() metode. Metoden må imidlertid modifiseres litt, ettersom vi ønsker å bruke trær som nesten er binomialtrær. - Noder merkes første gang de mister ett barn. - Andre gang de mister ett barn blir noden kappet av og blir rot i et eget tre, og merket fjernes. Fibonacciheaper 38 2426515 7 2317 30 18 3921 52 41 min
85
Vi bruker lazy merging / lazy binomial queue. Fibonacciheaper 187 8 5 86 11 8 9 4 96 32
86
Vi bruker lazy merging / lazy binomial queue. Fibonacciheaper 187 8 5 86 11 8 9 4 96 32 187 8 5 86 11 8 9 4 96 32
87
Problemet med decreaseKey() -metoden vår og lazy merging er selvsagt at vi må rydde opp i etterkant. Dette gjøres i deleteMin(), som derfor får ”høy” kjøretid (O(log N) amortisert tid). Alle trærne gjennomgåes, de minste først, og slåes sammen, slik at vi får maks ett tre av hver størrelse. (Hver rot vet hvor mange barn den har.) Fibonacciheaper
88
Amortisert tid insert() O(1) decreaseKey() O(1) merge() O(1) deleteMin() O(log N) buildHeap() O(N) (Kjør N insert() i en tom heap.) (N = antall elementer) Fibonacciheaper
Liknende presentasjoner
© 2023 SlidePlayer.no Inc.
All rights reserved.