• Nie Znaleziono Wyników

Struktury danych

N/A
N/A
Protected

Academic year: 2021

Share "Struktury danych"

Copied!
48
0
0

Pełen tekst

(1)

Struktury danych

i złożoność obliczeniowa Wykład 3.

Prof. dr hab. inż. Jan Magott

(2)

Struktury danych:

• stosy,

• kolejki,

• listy,

• kopce

zbudowane z użyciem tablic.

(3)

Podstawowe struktury danych (stosy)

PUSH(S,17)

PUSH(S,3)

(4)

Podstawowe struktury danych (stosy)

(5)

Podstawowe struktury danych (stosy)

POP(S)

(6)

Podstawowe struktury danych (stosy)

(7)

Podstawowe struktury danych (kolejki)

ENQUEUE(Q,17) ENQUEUE(Q,3) ENQUEUE(Q,5)

[Źródło CLRS, Wprowadzenie do

algorytmów]

(8)

Podstawowe struktury danych (kolejki)

DEQUEUE(Q)

(9)

Podstawowe struktury danych (kolejki)

(10)

Podstawowe struktury danych (kolejki)

(11)

Podstawowe struktury danych (listy)

Listy ze wskaźnikami (dynamiczne struktury danych):

• Jednokierunkowe,

• Dwukierunkowe,

• Posortowane,

• Nieposortowane.

(12)

Podstawowe struktury danych (listy)

7 4 2 11

(13)

Podstawowe struktury danych (listy)

Listy dwukierunkowe nieposortowane

(14)

Podstawowe struktury danych (listy)

Jaki jest koszt wstawienia elementu do listy

dwukierunkowej posortowanej?

(15)

Podstawowe struktury danych (listy)

Listy dwukierunkowe nieposortowane

(16)

Podstawowe struktury danych (listy)

Listy dwukierunkowe nieposortowane

(17)
(18)

Implementacja tablicowa w postaci:

• trzech tablic,

• jednej tablicy.

(19)

Kopce

Kopiec binarny jest prawie pełnym drzewem binarnym.

Pełne drzewo binarne

[1]

[2]

[6]

[4] [5]

[3]

[10]

[9]

[8]

[7]

[11] [12] [13] [14] [15]

(20)

[1]

[2]

[4] [5] [6]

[3]

[10]

[9]

[8]

[7]

Kopiec binarny jest prawie pełnym drzewem binarnym.

Prawie pełne drzewo binarne

(21)

Kopce

Kopiec binarny jest to prawie pełne drzewo binarne.

Rodzaje kopców:

typu max (wartość rodzica jest nie mniejsza niż dziecka),

typu min (wartość rodzica jest nie większa niż dziecka).

[1]

[2]

[6]

[4] [5]

[3]

[10]

[9]

[8]

[7]

17

14 11

8 14 5 4

2 6 9

Kopiec typu max

(22)

Kopce

[1]

[2]

[6]

[4] [5]

[3]

[10]

[9]

[8]

[7]

17

11 14

8 14 5 4

2 6 9

(23)

Kopce

[1]

[2]

[6]

[4] [5]

[3]

[10]

[9]

[8]

[7]

17

11 14

8 14 5 4

2 6 9

17 14

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 11 8 14 5 4 2 6 9

(24)

Kopce

[1]

[2]

[4] [5] [6]

[3]

[10]

[9]

[8]

[7]

(25)

Kopce

[2] [1]

(26)

Kopce

Liście

Korzeń

(27)

Kopce

Liście

Korzeń

(28)

Kopce

[1]

[2]

[6]

[4] [5]

[3]

[10]

[9]

[8]

[7]

17

11 14

16 14 5 4

2 6 9

17 14

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 11 16 14 5 4 2 6 9

Własność

Operacje zamiany elementów rodzica i dziecka w tablicy nie zmieniają relacji incydencji

LEFT, RIGHT, PARENT między

pozycjami w tablicy.

(29)

Kopce

Przywracanie własności kopca

[1]

[2]

[6]

[4] [5]

[3]

[10]

[9]

[8]

17

11 i 5

l 8 14 r 5 4

2 6 9

[7]

[Źródło: CLRS, Wprowadzenie do algorytmów]

(30)

Kopce

Przywracanie własności kopca

[1]

[2]

[6]

[4] [5]

[3]

[10]

[9]

[8]

17

14 11

8 i 5 4

2 6 9

[7]

[1]

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

17

i 5 11

l 8 14 r 5 4

2 6 9

[7]

(31)

Kopce

Przywracanie własności kopca

[1]

[2]

[6]

[4] [5]

[3]

[10]

[9]

[8]

17

14 11

8 i 5 4

2 6 9

[7]

(32)

Kopce

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

17

14 11

8 i 5 4

2 6 9

[7]

[1]

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

17

14 11

8 9 4

2 6 5 i

[7]

(33)

Kopce

Przywracanie własności kopca

[1]

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

17

14 11

8 9 4

2 6 5 i

[7]

(34)

Kopce

14 17

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

[1]

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

11

14 17

5 11 12

9 6 16

[7]

5

To nie jest kopiec

typu max

(35)

Kopce

Budowanie kopca typu max (od dołu

budowane są coraz to większe kopce)

[1]

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

11

14 17

5 i 11 12

9 6 16

[7]

5 [Źródło: CLRS, Wprowadzenie do

algorytmów]

(36)

Kopce

Budowanie kopca typu max

[1]

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

11

14 17

5 i 11 12

9 6 16

[7]

5

[1]

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

11

14 17

5 i 16 12

9 6 11

[7]

5

(37)

Kopce

[1]

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

11

14 17

5 i 16 12

9 6 11

[7]

5

[1]

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

11

14 17

i 5 16 12

9 6 11

[7]

5

(38)

[1]

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

11

14 17

i 5 16 12

9 6 11

[7]

5

[1]

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

11

i 17 14

9 16 12

5 6 11

[7]

5

(39)

[1]

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

11

i 17 14

9 16 12

5 6 11

[7]

5

[1]

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

11

i 14 17

9 16 12

5 6 11

[7]

5

(40)

[1]

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

11

i 14 17

9 16 12

5 6 11

[7]

5

[1]

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

11

i 14 17

9 16 12

5 6 11

[7]

5

(41)

[1]

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

11

i 14 17

9 16 12

5 6 11

[7]

5

[1]

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

i 11

16 17

9 14 12

5 6 11

[7]

5

(42)

[1]

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

i 11

16 17

9 14 12

5 6 11

[7]

5

[1]

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

17

16 11

9 14 12

5 6 11

[7]

5

(43)

[1]

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

17

16 11

9 14 12

5 6 11

[7]

5

(44)

[1]

[2]

[6]

[4] [5]

[3]

[10]

[8] [9]

17

16 12

9 14 11

5 6 11

[7]

5

(45)

[Źródło: CLRS,

Wprowadzenie do

algorytmów]

(46)
(47)
(48)

Cytaty

Powiązane dokumenty

● wstawienie elementu do kolejki (push, enqueue), operacja możliwa gdy kolejka nie jest zapełniona (dotyczy typu o ograniczonym rozmiarze). ● pobranie elementu ze kolejki

przedostatniego węzła (ostatniego węzła, którego wskaźnik next jest niepusty) (3) ustawiamy dedykowany wskaźnik (killer) na ostatni węzeł używając adresu. zapisanego we

(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head) i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik

(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head) i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik pred

(2) za pomocą pary pomocniczych wskaźników pred i succ wybieramy węzeł do przeniesienia i przenosimy go do listy tymczasowej za pomocą wskaźnika mover (aktulizując wskaźniki head

● szablony pozwalają na wielokrotne wykorzystanie istniejącego kodu źródłowego struktury danych dla wielu wersji tej struktury z tym samym interfejsem, ale różnymi typami

● strumienie wejścia/wyjścia: iostream, fstream, sstream, iomanip. ●

(3) przestawiamy wskaźnik next w węźle wskazywanym przez pred (lub wskaźnik head gdy pred jest pusty) oraz wskaźnik prev w węźle wskazywanym przez succ (lub wskaźnik tail gdy