820 likes | 901 Views
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.). Prioritetskøer.
E N D
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.).
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
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”.
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. 1 a 2 b c 3 d e f g 4 h i j
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. 1 a 2 b c 3 d e f g 2i 4 h i j
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. 1 a 2 b c 3 d e f g 2i+1 4 h i j
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. 1 a 2 i / 2 b c 3 d e f g 4 h i j
Binære heaper(vanligst) 1 13 2 21 16 3 31 19 68 24 26 65 32 4
Binære heaper(vanligst) insert(14) 1 13 2 21 16 3 19 68 24 31 26 65 32 4
Binære heaper(vanligst) insert(14) 1 13 2 21 16 3 19 68 24 31 26 14 65 32 4
Binære heaper(vanligst) insert(14) 1 13 2 21 16 3 19 68 24 31 25 14 65 32 4
Binære heaper(vanligst) insert(14) 1 13 2 21 16 3 19 68 24 14 26 31 65 32 4
Binære heaper(vanligst) insert(14) 1 13 2 21 16 3 19 68 24 14 26 31 65 32 4
Binære heaper(vanligst) insert(14) 1 13 2 14 16 3 19 68 24 21 26 31 65 32 4
Binære heaper(vanligst) insert(14) 1 13 2 14 16 3 19 68 24 21 65 26 31 32 4
Binære heaper(vanligst) insert(14) 1 13 2 14 16 3 19 68 23 21 26 31 65 32 4 ”percolateUp()”
Binære heaper(vanligst) deleteMin() 1 13 2 14 16 3 19 68 19 21 26 31 65 32 4
Binære heaper(vanligst) deleteMin() 1 2 14 16 3 19 68 19 21 26 31 65 32 4
Binære heaper(vanligst) deleteMin() 1 31 2 14 16 3 19 68 19 21 26 65 32 4
Binære heaper(vanligst) deleteMin() 1 14 2 31 16 3 19 68 19 21 26 65 32 4
Binære heaper(vanligst) deleteMin() 1 14 2 19 16 3 19 68 31 21 26 65 32 4
Binære heaper(vanligst) deleteMin() 1 14 2 19 16 3 19 68 26 21 31 65 32 4
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.
Venstrevridde heaper 1 1 0 0 0 LEFTIST 1 0 1 0 0 1 0 0 IKKE LEFTIST
Venstrevridde heaper merge() 3 6 10 8 12 7 21 14 18 24 18 17 37 23 33 26
Venstrevridde heaper merge() 3 6 10 8 12 7 21 14 18 24 18 17 37 23 33 26
Venstrevridde heaper merge() 3 6 10 8 12 7 21 14 18 24 18 17 37 23 33 26
Venstrevridde heaper merge() 3 6 10 8 12 7 21 14 18 24 18 17 37 23 33 26
Venstrevridde heaper merge() 3 6 10 8 12 7 21 14 18 24 18 17 37 23 33 26 8 18 17 26
Venstrevridde heaper merge() 3 6 10 8 12 7 21 14 18 24 18 17 37 23 33 26 7 37 8 18 17 26
Venstrevridde heaper merge() 3 6 10 8 12 7 21 14 18 24 18 17 37 23 33 26 7 37 8 18 17 26
Venstrevridde heaper merge() 3 6 10 8 12 7 21 14 18 24 18 17 37 23 33 26 6 12 7 18 24 37 8 18 33 17 26
Venstrevridde heaper merge() 3 6 10 8 12 7 21 14 18 24 18 17 37 23 33 26 3 10 6 21 14 12 7 23 18 24 37 8 18 33 17 26
Venstrevridde heaper merge() 3 6 10 8 12 7 21 14 18 24 18 17 37 23 33 26 3 6 10 21 14 12 7 23 18 24 37 8 18 33 17 26
Venstrevridde heaper 5 3 insert(3) merge() 7 6 10 1 deleteMin() merge() 5 3 7 6 11 10
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.
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).
Skeive heaper merge() 3 6 10 8 12 7 21 14 18 24 18 17 37 23 33 26
Skeive heaper merge() 3 6 10 8 12 7 21 14 18 24 18 17 37 23 33 26
Skeive heaper merge() 3 6 10 8 12 7 21 14 18 24 18 17 37 23 33 26
Skeive heaper merge() 3 6 10 8 12 7 21 14 18 24 18 17 37 23 33 26 8 18 17 26
Skeive heaper merge() 3 6 10 8 12 7 21 14 18 24 18 17 37 23 33 26 8 17 18 26
Skeive heaper merge() 3 6 10 8 12 7 21 14 18 24 18 17 37 23 33 26 7 37 8 17 18 26
Skeive heaper merge() 3 6 10 8 12 7 21 14 18 24 18 17 37 23 33 26 7 37 8 17 18 26
Skeive heaper merge() 3 6 10 8 12 7 21 14 18 24 18 17 37 23 33 26 6 12 7 18 24 37 8 22 17 18 26
Skeive heaper merge() 3 6 10 8 12 7 21 14 18 24 18 17 37 23 33 26 6 7 12 37 18 24 8 17 18 22 26
Skeive heaper merge() 3 6 10 8 12 7 21 14 18 24 18 17 37 23 33 26 3 10 6 21 14 7 12 23 37 18 24 8 17 18 22 26
Skeive heaper merge() 3 6 10 8 12 7 21 14 18 24 18 17 37 23 33 26 3 10 6 21 14 7 12 23 37 18 24 8 17 18 22 26
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.
Binomialheaper Binomialtrær B0