Prioritetskøer

82
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.).

description

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. - PowerPoint PPT Presentation

Transcript of Prioritetskøer

Page 1: Prioritetskøer

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.).

Page 2: Prioritetskøer

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

Page 3: 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”.

Page 4: Prioritetskøer

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.

a b c d e f g h i j

0 1 2 3 4 5 6 7 8 9 10 11 12 13

1 2 3 4

a

b c

d e

h i j

f g

1

2

3

4

Page 5: Prioritetskøer

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.

a b c d e f g h i j

0 1 2 3 4 5 6 7 8 9 10 11 12 13

1 2 3 4

1

2

3

42i

a

b c

d e

h i j

f g

Page 6: Prioritetskøer

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.

a b c d e f g h i j

0 1 2 3 4 5 6 7 8 9 10 11 12 13

1 2 3 4

1

2

3

42i+1

a

b c

d e

h i j

f g

Page 7: Prioritetskøer

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.

a b c d e f g h i j

0 1 2 3 4 5 6 7 8 9 10 11 12 13

1 2 3 4

1

2

3

4

i / 2

a

b c

d e

h i j

f g

Page 8: Prioritetskøer

Binære heaper (vanligst)

13

21 16

24 31

65 26 32

19 68

1

2

3

4

13 21 16 24 31 19 68 65 26 32

0 1 2 3 4 5 6 7 8 9 10 11 12 13

1 2 3 4

Page 9: Prioritetskøer

Binære heaper (vanligst)

13

21 16

24 31

65 26 32

19 68

1

2

3

4

insert(14)

13 21 16 24 31 19 68 65 26 32

0 1 2 3 4 5 6 7 8 9 10 11 12 13

1 2 3 4

Page 10: Prioritetskøer

Binære heaper (vanligst)

13

21 16

24 31

65 26 32

19 68

1

2

3

4

insert(14)

13 21 16 24 31 19 68 65 26 32 14

0 1 2 3 4 5 6 7 8 9 10 11 12 13

1 2 3 4

14

Page 11: Prioritetskøer

Binære heaper (vanligst)

13

21 16

24 31

65 25 32

19 68

1

2

3

4

insert(14)

13 21 16 24 31 19 68 65 26 32 14

0 1 2 3 4 5 6 7 8 9 10 11 12 13

1 2 3 4

14

Page 12: Prioritetskøer

Binære heaper (vanligst)

13

21 16

24 14

65 26 32

19 68

1

2

3

4

insert(14)

13 21 16 24 14 19 68 65 26 32 31

0 1 2 3 4 5 6 7 8 9 10 11 12 13

1 2 3 4

31

Page 13: Prioritetskøer

Binære heaper (vanligst)

13

21 16

24 14

65 26 32

19 68

1

2

3

4

insert(14)

13 21 16 24 14 19 68 65 26 32 31

0 1 2 3 4 5 6 7 8 9 10 11 12 13

1 2 3 4

31

Page 14: Prioritetskøer

Binære heaper (vanligst)

13

14 16

24 21

65 26 32

19 68

1

2

3

4

insert(14)

13 14 16 24 21 19 68 65 26 32 31

0 1 2 3 4 5 6 7 8 9 10 11 12 13

1 2 3 4

31

Page 15: Prioritetskøer

Binære heaper (vanligst)

13

14 16

24 21

65 26 32

19 68

1

2

3

4

insert(14)

13 14 16 24 21 19 68 65 26 32 31

0 1 2 3 4 5 6 7 8 9 10 11 12 13

1 2 3 4

31

Page 16: Prioritetskøer

Binære heaper (vanligst)

13

14 16

23 21

65 26 32

19 68

1

2

3

4

insert(14)

13 14 16 24 21 19 68 65 26 32 31

0 1 2 3 4 5 6 7 8 9 10 11 12 13

1 2 3 4

31

”percolateUp()”

Page 17: Prioritetskøer

Binære heaper (vanligst)

13

14 16

19 21

65 26 32

19 68

1

2

3

4

deleteMin()

13 14 16 19 21 19 68 65 26 32 31

0 1 2 3 4 5 6 7 8 9 10 11 12 13

1 2 3 4

31

Page 18: Prioritetskøer

Binære heaper (vanligst)

14 16

19 21

65 26 32

19 68

1

2

3

4

deleteMin()

14 16 19 21 19 68 65 26 32 31

0 1 2 3 4 5 6 7 8 9 10 11 12 13

1 2 3 4

31

Page 19: Prioritetskøer

Binære heaper (vanligst)

31

14 16

19 21

65 26 32

19 68

1

2

3

4

deleteMin()

31 14 16 19 21 19 68 65 26 32

0 1 2 3 4 5 6 7 8 9 10 11 12 13

1 2 3 4

Page 20: Prioritetskøer

Binære heaper (vanligst)

14

31 16

19 21

65 26 32

19 68

1

2

3

4

deleteMin()

14 31 16 19 21 19 68 65 26 32

0 1 2 3 4 5 6 7 8 9 10 11 12 13

1 2 3 4

Page 21: Prioritetskøer

Binære heaper (vanligst)

14

19 16

31 21

65 26 32

19 68

1

2

3

4

deleteMin()

14 19 16 19 21 31 68 65 26 32

0 1 2 3 4 5 6 7 8 9 10 11 12 13

1 2 3 4

Page 22: Prioritetskøer

Binære heaper (vanligst)

14

19 16

26 21

65 31 32

19 68

1

2

3

4

deleteMin()

14 19 16 19 21 26 68 65 31 32

0 1 2 3 4 5 6 7 8 9 10 11 12 13

1 2 3 4

Page 23: Prioritetskøer

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.

Page 24: Prioritetskøer

Venstrevridde heaper

1 0

0 0

0

IKKE LEFTIST

LEFTIST

1

1 0

0 1

0

1

0

Page 25: Prioritetskøer

Venstrevridde heaper

10 8

21 14

23

17

26

12 7

18 24

33

37 18

merge() 3 6

Page 26: Prioritetskøer

Venstrevridde heaper merge()

10 8

21 14

23

17

26

12 7

18 24

33

37 18

3 6

Page 27: Prioritetskøer

Venstrevridde heaper merge()

10 8

21 14

23

17

26

12 7

18 24

33

37 18

3 6

Page 28: Prioritetskøer

Venstrevridde heaper merge()

10 8

21 14

23

17

26

12 7

18 24

33

37 18

3 6

Page 29: Prioritetskøer

8

17

26

18

Venstrevridde heaper merge()

10 8

21 14

23

17

26

12 7

18 24

33

37 18

3 6

Page 30: Prioritetskøer

8

17

26

18

7

37

Venstrevridde heaper merge()

10 8

21 14

23

17

26

12 7

18 24

33

37 18

3 6

Page 31: Prioritetskøer

8

17

26

18

7

37

Venstrevridde heaper merge()

10 8

21 14

23

17

26

12 7

18 24

33

37 18

3 6

Page 32: Prioritetskøer

8

17

26

18

7

37

6

12

18 24

33

Venstrevridde heaper merge()

10 8

21 14

23

17

26

12 7

18 24

33

37 18

3 6

Page 33: Prioritetskøer

Venstrevridde heaper merge()

10 8

21 14

23

17

26

12 7

18 24

33

37 18

3 6

3

10

21 14

23 8

17

26

18

7

37

6

12

18 24

33

Page 34: Prioritetskøer

Venstrevridde heaper

3

10

21 14

23

merge()

10 8

21 14

23

17

26

12 7

18 24

33

37 18

3 6

8

17

26

18

7

37

6

12

18 24

33

Page 35: Prioritetskøer

Venstrevridde heaper

5 3

7 6

10

5 3

7 6

10

deleteMin()

insert(3) merge()

11

merge()

1

Page 36: Prioritetskøer

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.

Page 37: Prioritetskøer

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).

Page 38: Prioritetskøer

Skeive heaper merge()

10 8

21 14

23

17

26

12 7

18 24

33

37 18

3 6

Page 39: Prioritetskøer

merge()Skeive heaper

10 8

21 14

23

17

26

12 7

18 24

33

37 18

3 6

Page 40: Prioritetskøer

merge()Skeive heaper

10 8

21 14

23

17

26

12 7

18 24

33

37 18

3 6

Page 41: Prioritetskøer

merge()Skeive heaper

10 8

21 14

23

17

26

12 7

18 24

33

37 18

3 6

8

17

26

18

Page 42: Prioritetskøer

merge()Skeive heaper

10 8

21 14

23

17

26

12 7

18 24

33

37 18

3 6

8

18

26

17

Page 43: Prioritetskøer

merge()Skeive heaper

10 8

21 14

23

17

26

12 7

18 24

33

37 18

3 6

7

37 8

18

26

17

Page 44: Prioritetskøer

merge()Skeive heaper

10 8

21 14

23

17

26

12 7

18 24

33

37 18

3 6

7

378

18

26

17

Page 45: Prioritetskøer

merge()Skeive heaper

10 8

21 14

23

17

26

12 7

18 24

33

37 18

3 6

6

12

18 24

22

7

378

18

26

17

Page 46: Prioritetskøer

merge()Skeive heaper

10 8

21 14

23

17

26

12 7

18 24

33

37 18

3 6

6

12

18 24

22

7

378

18

26

17

Page 47: Prioritetskøer

merge()Skeive heaper

10 8

21 14

23

17

26

12 7

18 24

33

37 18

3 6

3

10

21 14

23

6

12

18 24

22

7

378

18

26

17

Page 48: Prioritetskøer

3

merge()Skeive heaper

10

21 14

23

6

12

18 24

22

7

378

18

26

17

10 8

21 14

23

17

26

12 7

18 24

33

37 18

3 6

Page 49: Prioritetskøer

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.

Page 50: Prioritetskøer

Binomialheaper Binomialtrær

B0

Page 51: Prioritetskøer

Binomialheaper Binomialtrær

B0B1

Page 52: Prioritetskøer

Binomialheaper Binomialtrær

B0B1

B2

Page 53: Prioritetskøer

Binomialheaper Binomialtrær

B0B1

B2

B3

Page 54: Prioritetskøer

Binomialheaper Binomialtrær

B0B1

B2

B3

B4

Page 55: Prioritetskøer

Binomialheaper Binomialtrær

B0B1

B2

B3

B4

Et tre av høyde k har:

2k noder,

antall noder på nivå d er

dk

Page 56: Prioritetskøer

Binomialheaper Binomialheap

16

18

12

21 24

65

Page 57: Prioritetskøer

Binomialheaper Binomialheap

16

18

12

21 24

65

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

Page 58: Prioritetskøer

merge() 16

18

12

21 24

65

14

26

23

51 24

65

13

Binomialheaper

Page 59: Prioritetskøer

merge() 16

18

12

21 24

65

14

26

23

51 24

65

13

Binomialheaper

Page 60: Prioritetskøer

merge() 16

18

12

21 24

65

14

26

23

51 24

65

13

13

Binomialheaper

Page 61: Prioritetskøer

merge() 16

18

12

21 24

65

14

26

23

51 24

65

13

13

16

18

14

26

Binomialheaper

Page 62: Prioritetskøer

merge() 16

18

12

21 24

65

14

26

23

51 24

65

13

13

16

18

14

26

12

21 24

65

23

51 24

65

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

Binomialheaper

Page 63: Prioritetskøer

deleteMin() 13

16

18

14

26

12

21 24

65

23

51 24

65

Binomialheaper

Page 64: Prioritetskøer

deleteMin()

13

16

18

14

26

21 24

65

23

51 24

65

merge()

Binomialheaper

13

16

18

14

26

12

21 24

65

23

51 24

65

Page 65: Prioritetskøer

Implementsjon

13

16

18

14

26

12

21 24

65

23

51 24

65

Binomialheaper Dobbeltlenkede, sirkulære lister

Page 66: Prioritetskøer

Implementsjon

13

16

18

14

26

12

21 24

65

23

51 24

65

23

61 27

88

Binomialheaper Dobbeltlenkede, sirkulære lister

Page 67: Prioritetskøer

Implementsjon

13

16

18

14

26

12

21 24

65

23

51 24

65

23

61 27

88

Binomialheaper Dobbeltlenkede, sirkulære lister

Page 68: Prioritetskøer

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

Fibonacciheaper

2

11

12 17

18

4

5

8 6

11

9

1018

31

21

15

Page 69: Prioritetskøer

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

Fibonacciheaper

2

11

12 17

18

4

5

8 6

11

0

1018

31

21

15

Page 70: Prioritetskøer

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

Fibonacciheaper

2

11

12 17

18

4

5

8 6

11

0

1018

31

21

15

Leftist

Ikke leftist

Page 71: Prioritetskøer

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

Fibonacciheaper

2

11

12 17

18

4

5

8 6

11

0

1018

31

21

15

Leftist

Ikke leftist

Page 72: Prioritetskøer

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

Fibonacciheaper

2

4

12 17

18

11

5

8 6

11

0

1018

31

21

15

Leftist

Leftist

Page 73: Prioritetskøer

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

Fibonacciheaper

2

4

12 17

18

11

5

8 6

11

0

10

18

31

21

15

Page 74: Prioritetskøer

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

23 17

30

18

39 21

52

41

min

Page 75: Prioritetskøer

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

23 17

30

18

39 21

52

41

min

Page 76: Prioritetskøer

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

157

23 17

30

18

39 21

52

41

min

Page 77: Prioritetskøer

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

157

23 17

30

18

39 21

52

41

min

Page 78: Prioritetskøer

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

157

23 17

30

18

39 21

52

41

min

Page 79: Prioritetskøer

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 5 26

24

157

23 17

30

18

39 21

52

41

min

Page 80: Prioritetskøer

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 24 265 157

23 17

30

18

39 21

52

41

min

Page 81: Prioritetskøer

Vi bruker lazy merging / lazy binomial queue.

Fibonacciheaper

18 7

8

5

8 6

11

8

9

4

9 6

32

Page 82: Prioritetskøer

Vi bruker lazy merging / lazy binomial queue.

Fibonacciheaper

18 7

8

5

8 6

11

8

9

4

9 6

32

18 7

8

5

8 6

11

8

9

4

9 6

32