Understanding Priority Queues in Data Structures
Learn about priority queues, a key data structure in operating systems and search algorithms. Explore binary, leftist, skew, binomial, and Fibonacci heaps with essential operations like insertion, deletion, and merging.
Understanding Priority Queues in Data Structures
E N D
Presentation Transcript
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