Struktury danych (I): kolejka, stos itp.
Transkrypt
Struktury danych (I): kolejka, stos itp.
Letnie Warsztaty Matematyczno-Informatyczne Algorytmy i struktury danych Struktury danych (I): kolejka, stos itp. Struktury danych (I): kolejka, stos itp. Struktura danych stanowi sposób uporządkowania danych w komputerze. Na strukturach danych możemy wykonywać pewne operacje. Przykładem struktury danych jest tablica, która przechowuje pewną liczbę liczb w ustalonej kolejności. Pozwala na szybki odczyt i modyfikację pojedynczych wartości. Struktury danych (I): kolejka, stos itp. Abstrakcyjny typ danych Abstrakcyjny typ danych (ang. abstract data type, ADT ) stanowią sposób reprezentacji struktur danych bez zagłębiania się w detale implementacyjne. Na ADT składa się lista operacji, które możemy wykonać na danej strukturze, oraz słowny opis ich działania. Struktury danych (I): kolejka, stos itp. Stos Stos (ang. stack) działa na zasadzie LIFO (Last In First Out, czyli „Ostatni wchodzi, pierwszy wychodzi”). Struktury danych (I): kolejka, stos itp. Stos ADT Stack: Push(v ) — umieszcza v na szczycie stosu Top() — zwraca wartość na szczycie stosu Pop() — zdejmuje wartość ze szczytu stosu Empty?() — zwraca prawdę, jeżeli na stosie nie znajdują się żadne elementy Struktury danych (I): kolejka, stos itp. Maszyna stosowa Stos stanowi podstawę maszyny stosowej. Program maszyny stosowej to ciąg wartości i operacji. Elementy ciągu są przetwarzane po kolei. Wartości umieszczane są na szczycie stosu. Operacje modyfikują szczyt stosu. Struktury danych (I): kolejka, stos itp. Maszyna stosowa Zdefiniujmy na przykład operacje: 1. mul, która zdejmuje dwie wartości ze szczytu, przemnaża je i umieszcza wynik na szczycie stosu 2. add, podobnie jak wyżej, ale dodawanie Wtedy 2 2 mul 2 add jest programem obliczającym wartość wyrażenia 2 + 2 · 2. Struktury danych (I): kolejka, stos itp. Kolejka Kolejka (ang. queue) operuje według zasady FIFO (First In First Out, czyli „Pierwszy wchodzi, pierwszy wychodzi”). Struktury danych (I): kolejka, stos itp. Kolejka ADT Queue: Push(v ) — umieszcza v na końcu kolejki Top() — zwraca wartość z początku kolejki Pop() — zdejmuje wartość z początku kolejki Empty?() — zwraca prawdę, jeżeli w kolejce nie znajdują się żadne elementy Struktury danych (I): kolejka, stos itp. Kolejka zdarzeń W programowaniu aplikacji graficznych spotkać się można z kolejką zdarzeń. System operacyjny umieszcza na końcu takiej kolejki zdarzenia, czyli kliknięcia i ruch myszy, wciśnięcia klawiszy klawiatury itp. Aplikacja zdejmuje zdarzenia z przodu kolejki i przetwarza je. Dzięki temu zdarzenia przetwarzane są w takiej kolejności, w jakiej się wydarzyły. Struktury danych (I): kolejka, stos itp. Kolejka priorytetowa Kolejka priorytetowa (ang. priority queue) jest strukturą podobną do kolejki, jednakże zdejmowany jest z niej nie element, który został na niej umieszczony jako pierwszy, tylko ten, który ma największy priorytet. ADT Priority-Queue: Push(v , p) — umieszcza wartość v o priorytecie p na kolejce Top() — zwraca wartość elementu o najwyższym priorytecie Extract-Minimum() — usuwa z kolejki element o najwyższym priorytecie i zwraca jego wartość Decrease-Priority(v , p) — zmniejsza priorytet wartości v na p (opcjonalnie) Struktury danych (I): kolejka, stos itp. Zbiór Zbiór (ang. set) operuje podobnie do zbioru matematycznego: kolejność elementów ani ich dokładna liczba wystąpień nie ma znaczenia. ADT Set: Add(v ) — umieszcza v w zbiorze Member?(v ) — zwraca prawdę, jeżeli v znajduje się w zbiorze Remove(v ) — usuwa v ze zbioru (opcjonalnie) Struktury danych (I): kolejka, stos itp. Tablica asocjacyjna Tablica asocjacyjna (inaczej: słownik, mapa; ang. associative array, dictionary, map) — struktura podobna do tablicy, z tym że indeksami mogą być nie tylko liczby, ale dowolne wartości. Letnie Warsztaty Matematyczno-Informatyczne Algorytmy i struktury danych Struktury danych (II): haszowanie Struktury danych (II): haszowanie Funkcja haszująca Istotą haszowania jest redukcja rozmiaru dziedziny. Funkcja haszująca (funkcja skrótu) przyjmuje wartość z oryginalnej dziedziny (nawet nieskończonej!) i zwraca wartość z dziedziny zredukowanej (skończonej). Taką wartość nazywamy haszem. Idealna funkcja haszująca to taka, w której rozkład haszy jest jednostajny, niezależnie od rozkładu wartości w oryginalnej dziedzinie. Struktury danych (II): haszowanie Funkcja haszująca Przykładem funkcji haszującej jest: h(x) = x mod 128 Nie jest to jednak dobra funkcja haszująca. W praktyce używa się gotowych rozwiązań, takich jak na przykład Murmur3. Murmur3 pozwala generować wiele różnych funkcji haszujących w krótkim czasie, co jest przydatne. Struktury danych (II): haszowanie Kryptograficzne funkcje haszujące Funkcji haszujących używanych do konstrukcji omawianych struktur danych nie należy mylić z kryptograficznymi funkcjami skrótu (np. MD5, SHA-1). Takie funkcje wymagają dodatkowych właściwości, jak nieodwracalność czy odporność na kolizje. To spowalnia działanie funkcji haszującej, podczas gdy szybkość jest priorytetowa w algorytmice. Struktury danych (II): haszowanie Tablica haszująca Tablica haszująca (ang. hash table) jest strukturą danych, dzięki której możemy zaimplementować zbiory i słowniki. Struktury danych (II): haszowanie Haszowanie kukułcze Haszowanie kukułcze stanowi rozwiązanie problemu kolizji w tablicach haszujących. Potrzebne będą nam 2 (lub więcej) funkcje haszujące: h1 i h2 . Haszowanie kukułcze gwarantuje, że nasza wartość będzie pod indeksem pierwszego lub drugiego haszu. Struktury danych (II): haszowanie Haszowanie kukułcze procedure Insert(H, v ) if H[H.h1 (v )].Empty? then H[H.h1 (v )] ← v else if H[H.h2 (v )].Empty? then H[H.h2 (v )] ← v else Cascade-Insert(H, H[H.h1 (v )]) H[H.h1 (v )] ← v end if end procedure Struktury danych (II): haszowanie Haszowanie kukułcze procedure Cascade-Insert(H, v ) if not H[H.h2 (v )].Empty? then Cascade-Insert(H, H[H.h2 (v )]) end if H[H.h2 (v )] ← v end procedure Struktury danych (II): haszowanie Filtr Blooma Filtr Blooma (ang. Bloom’s filter ) jest probabilistyczną strukturą danych. Umożliwia zaimplementowanie zbioru, który jednak nie zawsze jest w stanie dać definitywną odpowiedź na pytanie „czy dany element znajduje się w zbiorze?”