Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

Prioritetskøer Binære heaper Venstrevridde heaper (Leftist) Skeive heaper (Skew) Binomialheaper Fibonacciheaper Prioritetskøer er viktige i bla. operativsystemer.

Liknende presentasjoner


Presentasjon om: "Prioritetskøer Binære heaper Venstrevridde heaper (Leftist) Skeive heaper (Skew) Binomialheaper Fibonacciheaper Prioritetskøer er viktige i bla. operativsystemer."— Utskrift av presentasjonen:

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


Laste ned ppt "Prioritetskøer Binære heaper Venstrevridde heaper (Leftist) Skeive heaper (Skew) Binomialheaper Fibonacciheaper Prioritetskøer er viktige i bla. operativsystemer."

Liknende presentasjoner


Annonser fra Google