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 a bc de hij fg

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 i2i 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 i+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  i / 2  a bc de hij fg

8 Binære heaper (vanligst)

9 Binære heaper (vanligst) insert(14)

10 Binære heaper (vanligst) insert(14)

11 Binære heaper (vanligst) insert(14)

12 Binære heaper (vanligst) insert(14)

13 Binære heaper (vanligst) insert(14)

14 Binære heaper (vanligst) insert(14)

15 Binære heaper (vanligst) insert(14)

16 Binære heaper (vanligst) insert(14) ” percolateUp() ”

17 Binære heaper (vanligst) deleteMin()

18 Binære heaper (vanligst) deleteMin()

19 Binære heaper (vanligst) deleteMin()

20 Binære heaper (vanligst) deleteMin()

21 Binære heaper (vanligst) deleteMin()

22 Binære heaper (vanligst) deleteMin()

23 Binære heaper (vanligst) deleteMin() ” 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 IKKE LEFTIST LEFTIST

27 Venstrevridde heaper merge() 36

28 Venstrevridde heaper merge()

29 Venstrevridde heaper merge()

30 Venstrevridde heaper merge()

31 Venstrevridde heaper merge()

32 Venstrevridde heaper merge()

33 Venstrevridde heaper merge()

34 Venstrevridde heaper merge()

35 Venstrevridde heaper merge()

36 Venstrevridde heaper merge()

37 Venstrevridde heaper 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()

41 merge() Skeive heaper

42 merge() Skeive heaper

43 merge() Skeive heaper

44 merge() Skeive heaper

45 merge() Skeive heaper

46 merge() Skeive heaper

47 merge() Skeive heaper

48 merge() Skeive heaper

49 merge() Skeive heaper

50 3 merge() Skeive heaper

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

59 Binomialheaper Binomialheap Lengden av rot-listen for en heap med N elementer er O(log N). (Dobbelt lenket, sirkulær liste.)

60 merge() Binomialheaper

61 merge() Binomialheaper

62 merge() Binomialheaper

63 merge() Binomialheaper

64 merge() Trærne (rotlisten) holdes sortert etter høyde. Binomialheaper

65 deleteMin() Binomialheaper

66 deleteMin() merge() Binomialheaper

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 Binomialheaper Dobbeltlenkede, sirkulære lister

69 Implementsjon Binomialheaper Dobbeltlenkede, sirkulære lister

70 Implementsjon 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

73 Fra venstrevridde heaper tar vi med en smart decreaseKey() metode. Fibonacciheaper

74 Fra venstrevridde heaper tar vi med en smart decreaseKey() metode. Fibonacciheaper Leftist Ikke leftist

75 Fra venstrevridde heaper tar vi med en smart decreaseKey() metode. Fibonacciheaper Leftist Ikke leftist

76 Fra venstrevridde heaper tar vi med en smart decreaseKey() metode. Fibonacciheaper Leftist

77 Fra venstrevridde heaper tar vi med en smart decreaseKey() metode. Fibonacciheaper

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 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 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 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 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 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 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 min

85 Vi bruker lazy merging / lazy binomial queue. Fibonacciheaper

86 Vi bruker lazy merging / lazy binomial queue. Fibonacciheaper

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