Laboratorium 11
Transkrypt
Laboratorium 11
Nazwa przedmiotu: Algorytmy i złoŜoność (Laboratorium) Prowadzący zajęcia: mgr inŜ. Przemysław Pardel Laboratorium 11 LP 7. Zakres materiału Czas realizacji Abstrakcyjne struktury danych i ich implementacje: stosy, kolejki, listy, drzewa, grafy, słowniki, haszowanie, kolejki priorytetowe, drzewa poszukiwań binarnych. 9 Czas realizacji zadań: 3 godziny Teoria: Kolejki Pojęciem kolejka określa się strukturę z ograniczonym dostępem, dla której określono początek i koniec. Prostą ilustracją może być kolejka osób do kasy, w której nowe osoby mają prawo ustawić się na końcu, a obsługiwana jest zawsze osoba z początku. Tak jak w przypadku stosu, procedura obsługi kolejki ma ogólnie przyjętą nazwę. Mówimy, że elementy są obsługiwane według porządku FIFO (First In First Out), co oznacza „pierwszy wszedł , pierwszy wyszedł”. Podobnie jak dla stosu przyjmiemy tablicową implementację kolejki zakładając, że elementy kolejki są pamiętane w tablicy jednowymiarowej Q[0..n]. Posłużymy się następującymi atrybutami tablicy Q: head[Q] – indeks elementu znajdującego się na początku kolejki (głowa) tail[Q] – indeks pierwszego wolnego elementu na końcu kolejki (ogon) 0 1 Q 2 3 4 5 6 7 8 9 15 6 7 8 head[Q]=2 tail[Q]=6 Q[2]=15 Procedury dostępne w kolejce: • wstawianie elementu (enqueue) • usuwanie elementu (dequeue) W procedurach wstawiania i usuwania elementu z kolejki zakłada się zazwyczaj, że tablica Q[0..n] jest cykliczna, tzn. po elemencie Q[n] następuje element Q[0]. Na początku przyjmuje się head[Q] = tail[Q] = 0. Spełnienie warunku head[Q] = tail[Q] oznacza, że kolejka jest pusta. Jeśli natomiast zachodzi równość head[Q] = tail[Q] + 1, to kolejka jest pełna. Przyjmując tablicową reprezentację kolejki operację umieszczania nowego elementu x w kolejce Q można napisać w postaci procedury enqueue(Q,x), a operację usuwania z kolejki jako funkcję dequeue(Q): Pseudokod enqueue(Q,x) Q[tail[Q]=x jeśli tail[Q] = length[Q] to tail[Q]=0 inaczej tail[Q]=tail[Q]+1 dequeue(Q) x= Q[head[Q] jeśli head[Q] = length[Q] to head[Q]=0 inaczej head[Q]=head[Q]+1 zwróć x Kolejkę spotyka się przede wszystkim w sytuacjach związanych z róŜnego rodzaju obsługą zdarzeń. W szczególności w systemach operacyjnych ma zastosowanie kolejka priorytetowa, przydzielająca zasoby sprzętowe uruchomionym procesom. Specjalną modyfikacją kolejki jest kolejka priorytetowa – kaŜda ze znajdujących się w niej danych dodatkowo ma przypisany priorytet, który modyfikuje kolejność późniejszego wykonania. Oznacza to, Ŝe pierwsze na wyjściu niekoniecznie pojawią się te dane, które w kolejce oczekują najdłuŜej, lecz te o największym priorytecie. Zadania do realizacji: 1. Zaimplementować tablicową implementację kolejki i podstawowe procedury wstawiania i usuwania elementu z kolejki. Bibliografia: 1. Świder K.: Algorytmy i struktury danych 2. Wikipedia, Wolna encyklopedia, http://www.wikipedia.pl