Listy, kolejki, stosy
abc Lista O Struktura danych składa się z węzłów, gdzie mamy informacje (dane) i wskaźniki do następnych węzłów. Zajmuje tyle miejsca w pamięci ile mamy węzłów O Gdzie można wykorzystać: O stos O kolejka, O grafy
abc Lista jednokierunkowa Head głowa Dane nast Dane nast Dane nast Węzeł Dane nast Tail Ogon Dane nast nil
abc Lista dwukierunkowa Head głowa Dane nast pop Dane nast pop Dane nast pop Dane nast pop Tail Ogon Dane nast pop nil nil
abc Lista cykliczna jednokierunkowa Head głowa Tail Ogon Dane nast Dane nast Dane nast Dane nast Dane nast
abc Lista cykliczna dwukierunkowa Head głowa Tail Ogon Dane nast pop Dane nast pop Dane nast pop Dane nast pop Dane nast pop
abc Lista z przeskokami 1 2 3 4 5 6 7 8 z równo rozmieszczonymi węzłami 1 3 4 2 5 6 7 8 z nierówno rozmieszczonymi węzłami
abc Listy samoorganizujące się Zalety: Czas dostępu do elementów zwykle szybszy niż w tradycyjnych listach.
abc Listy samoorganizujące się metody O Metoda przesuwania na początek znaleziony element umieszczamy na początku O Metoda transpozycji znaleziony element jest zamieniony z tym, który go poprzedza. Wówczas elementy najczęściej używane znajdują się na początku listy. O Metoda zliczania każdy element ma pole licznik, które się zwiększa po znalezieniu elementów, pola te służą do porządkowania.
abc Operacja na listach O Zakładamy, że operujemy na listach nieposortowanych i dwukierunkowych.
abc Przeszukiwanie listy
abc Wstawianie elementów
abc Usuwanie elementów
abc Upraszcza warunki brzegowe Oznaczenie nil(l) Wstawiamy na koniec lub początek listy jednokierunkowej Wartownik Jest to element listy Łatwo znajdziemy początek lub koniec listy Spina końce listy dwukierunkowej
abc Przeszukiwanie listy z wartownikiem
abc Wstawianie elementów z wartownikiem
abc Usuwanie elementów
klucz następny poprzed. abc Lista jako tablica O Wielowymiarowa tablica 1 2 3 4 5 6 7 następny 3 7 / 5 klucz 4 2 8 6 poprzedni / 2 7 3 O Jednowymiarowa tablica 1 2 3 4 5 6 7 8 9 1 0 11 12 13 14 15 16 17 18 19 20 21 4 7 / 2 19 4 8 / 19 6 13 7
Kolejka Dostęp z dwóch końców FIFO First in First Out Podobnie jak w sklepie
Operacje na kolejkach enqueue wstawienie do kolejki 3 Wynik 1 2 1 2 3 Wynik dequeue pobranie elementu z kolejki 1 2 3 2 3
Operacje - pseudokod Dokładanie elementu Usuwanie elementu kolejki
Stos Dostęp z jednego końca LIFO Last in First Out Podobnie jak stos książek, naleśników itd..
Operacje na stosie push połóż 3 Wynik 3 pop zdejmij 3 Wynik 2 2 2 2 1 1 1 1
Operacje - pseudokod Sprawdzanie czy stos jest pusty Operacja push
Operacje - pseudokod Operacja pop
Drzewa ukorzenione Korzeń Węzeł T.root / / / / / / / / / / Liście
Drzewo binarne / - brak wskaźnika T.root - korzeń / p wskaźnik na ojca / right prawy syn / / / / / / / / left lewy syn
Podejście na lewo syn na prawo brat Liczba synów Nie przekracza pewnej stałej liczby Każdy węzeł ma p wskaźnik na ojca x.left-child wskaźnik na najbardziej lewego syna x.right-sibling wskaźnik na najbliższego na prawo brata
Reprezentacja na lewo syn, na prawo brat T.root / / / / / / / / / / / / /
Drzewa wyszukiwań binarnych BST binary search tree. Struktura Węzeł x ma elementy Własność klucza węzła x Key (klucz) Drzewo binarne left lewy syn right prawy syn klucz (left) klucz(x) oraz klucz(right) klucz(x) p - ojciec
Drzewa wyszukiwań binarnych x 5 y z 4 6 1 4 9
Operacje na drzewach wyszukiwań binarnych
BST wypisanie elementów O Metoda inorder- klucz korzenia wypisuje się pomiędzy wartościami z jego lewego poddrzewa oraz prawego podrzewa. O metoda preorder - klucz korzenia wypisanyj jest przed wypisaniem wartości znajdujących się w obu poddrzewach. O metoda postorder - klucz korzenia po wypisaniu wartości znajdującech się w poddrzewach.
BST - Preorder PREORDER-TREE-WALK(x) if x!= NIL wypisz x.klucz PREORDER-TREE-WALK(x.left) PREORDER-TREE-WALK(x.right)
BST - Inorder INORDER-TREE-WALK(x) if x!= NIL INORDER-TREE-WALK(x.left) wypisz x.klucz INORDER-TREE-WALK(x.right) Twierdzenie O Jeśli x jest korzeniem poddrzewa o n węzłach, to wykonanie INORDER-TREE- WALK(x) odbywa się w czasie (n).
BST - Postorder POSTORDER-TREE-WALK(x) if x!= NIL POSTORDER-TREE-WALK(x.left) POSTORDER-TREE- WALK(x.right) wypisz x.klucz
BST - przechodzenie drzewa zaczynamy od korzenia 14 6 20 4 9 18 21 2 5 11 O Preorder: O 14, 6, 4, 2, 5, 9, 11, 20, 18, 21 O Inorder: O 2, 4, 5, 6, 9, 11, 14, 18, 20, 21, O Postorder: O 2, 5, 4, 11, 9, 6, 18, 21, 20, 14
BST wyszukiwanie - rekurencyjnie
BST wyszukiwanie - iteracyjne
BST wyszukiwanie - przykład 14 6 20 4 9 18 21 2 5 11 Szukamy węzła o wartości klucza 9. TREE-SEARCH(14,9) 9<14 TREE-SEARCH(6,9) 9>6 TREE-SEARCH(9,9) 9=9 return 9
BST Minimum, Maksimum Koszt = O(h), gdzie h to wysokość drzewa.
BST Poprzednik
BST Następnik
BST - wstawianie
BST wstawianie - przykład 14 14 <17 6 20 17 <20 4 9 18 21 2 5 11 17 17<18
BST Usuwanie (3 przypadki) 1. Jeśli z nie ma lewego syna to zastępujemy z przez jego prawego syna (być może równego NIL). Jeśli prawy syn jest równy NIL to z jest liściem a jeśli jest różny od NIL to z ma tylko jednego prawego syna. 2. Jeśli z ma tylko jednego lewego syna, to zastępujemy z przez jego lewego syna.
BST Usuwanie, przypadek 1 i 2 q q NIL z r r Przypadek 2. q q z l l NIL
BST - Usuwanie 3. Jeśli nie ma zarówno lewego, jak i prawego syna znajdujemy węzeł y będący następnikiem z w prawym poddrzewie z. Węzeł y nie ma lewego syna. Chcemy wyłuskać y z jego aktualnego położenia i zastąpić nim węzeł z w drzewie. a) Jeśli y jest prawym synem z, to zastępujemy z przez y, pozostawiając prawego syna y bez zmian. b) W przeciwnym razie y znajduje się w prawym poddrzewie z, ale nie jest prawym synem z. W tym przypadku najpierw zastępujmy y przez jego prawego syna, a potem zastępujemy z przez y.
BST usuwanie, przypadek 3 Przypadek 3.a q q z y l y l x NIL x Przypadek 3.b q q q z z y y l r l NIL r l r y x x NIL x
BST przesuwanie poddrzew procedura TRANPLANT
BST Usuwanie węzła
Bibliografia Książki Cormen Thomas; Leiserson Charles; Rivest Ronald; Stein Clifford, Wprowadzenie do Algorytmów, Wydawnictwo Naukowe PWN, Warszawa 2012 Sedgewick Robert, Algorytmy w C++, Wydawnictwo RM, Warszawa 1999, Drozdek Adam, C++. Algorytmy i Struktury Danych, Wydawnictwo Helion, Gliwice 2004, Wróblewski Piotr, Algorytmy, Struktury Danych i Techniki Programowania, Wydawnictwo Helion, Gliwice 2010, Rysunki: Slajdy 20 i 24: demotywatory.pl, Dostęp: [28.10.2017] Pozostałe: opracowanie własne