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?”