Prezentowane materiały są przeznaczone dla uczniów szkół ponadgimnazjalnych Autor artykułu: mgr Jerzy Wałaszek |
©2014 mgr
Jerzy Wałaszek
|
Kolejka (ang. queue) jest sekwencyjną strukturą danych o takiej własności, iż element zapisany jako pierwszy jest również odczytywany jako pierwszy. Taka struktura w literaturze informatycznej nosi nazwę FIFO (ang. First In First Out – pierwszy wchodzi, pierwszy wychodzi). Kolejkę możemy sobie wyobrazić jako tubę – elementy wstawiamy do tuby z jednej strony, po czym przesuwają się one wewnątrz i wychodzą z drugiej strony w tej samej kolejności, w jakiej zostały do tuby włożone.
Dla kolejki są zdefiniowane operacje:
Jeśli porównasz te operacje z operacjami dostępnymi dla stosu, to okaże się, że obie te struktury są bardzo do siebie podobne. Różnią się jedynie kolejnością dostępu do elementów. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Kolejka jako tablicaNaturalną strukturą danych dla kolejek jest
lista, jednakże w prostszych
przypadkach kolejkę da się zrealizować w tablicy. W takim przypadku
musimy założyć z góry maksymalny rozmiar kolejki
(ilość przechowywanych w niej elementów). Będziemy potrzebowali
trzech zmiennych:
Kolejkę tworzą kolejne elementy o indeksach rozpoczynających się od qptr. Na początku qptr wskazuje pierwszy element tablicy o indeksie 0:
Koniec kolejki wyznacza indeks równy qptr + qcnt. Jeśli indeks ten wykracza poza ostatni element tablicy, to należy go zmniejszyć o n. Dopisanie elementu zwiększa licznik qcnt o 1:
Odczyt elementu z kolejki polega na przetworzeniu elementu o indeksie qptr. Usunięcie elementu z kolejki polega na zwiększeniu o 1 indeksu qptr. Jeśli po zwiększeniu qptr wskazuje poza ostatni element tablicy, to qptr należy wyzerować – kolejka znów rozpocznie się od początku tablicy. Licznik qptr zawsze zmniejszamy o 1.
Zwróć uwagę, że w tej implementacji kolejka nie zajmuje stałego położenia w tablicy. Co więcej, jej elementy mogą być rozdzielone:
Kolejka w tablicy – algorytm sprawdzania, czy kolejka jest pustaWejście
Wyjście:True, jeśli kolejka jest pusta, inaczej false Lista kroków:
Kolejka w tablicy – algorytm odczytu kolejkiWejście
Wyjście:Wartość elementu na początku kolejki lub wartość specjalna, jeśli kolejka jest pusta. Lista kroków:
Kolejka w tablicy – algorytm zapisu do kolejkiWejście
Wyjście:Jeśli w tablicy jest miejsce, to do kolejki zostaje dopisana nowa wartość. Inaczej kolejka nie jest zmieniana. Elementy pomocnicze:
Lista kroków:
Kolejka w tablicy – algorytm usuwania z kolejkiWejście
Wyjście:Kolejka pomniejszona o pierwszy element. Lista kroków:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Kolejka jako listaDo realizacji kolejki posłużymy się lekko zmodyfikowaną
listą jednokierunkową. Będziemy potrzebowali dwóch wskaźników:
Nowe elementy dodajemy na koniec listy – dzięki wskaźnikowi tail szybko będziemy mogli znaleźć ostatni element i dołączyć za nim element wstawiany. Pobieranie elementów będzie się odbywało z początku listy. Budowa elementów listy jest typowa: każdy zawiera pole next, które wskazuje kolejny element na liście, oraz pole data, które zawiera przechowywane dane: Typ elementu listy
Kolejka na liście – algorytm sprawdzania, czy kolejka jest pustaWejście
Wyjście:True, jeśli kolejka jest pusta, inaczej false Lista kroków:
Kolejka na liście – algorytm odczytu kolejkiWejście
Wyjście:Wartość elementu na początku kolejki lub wartość specjalna, jeśli kolejka jest pusta. Lista kroków:
Kolejka na liście – algorytm zapisu do kolejkiWejście
Wyjście:Kolejka z dopisanym na końcu elementem o wartości v. Elementy pomocnicze:
Lista kroków:
Kolejka na liście – algorytm usuwania z kolejkiWejście
Wyjście:Kolejka pomniejszona o pierwszy element. Elementy pomocnicze:
Lista kroków:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Przechodzenie drzewa wszerzPrzechodzenie drzewa binarnego wszerz (ang. breadth-first search, BFS) polega na odwiedzaniu kolejnych węzłów leżących na kolejnych poziomach.
Najpierw odwiedzamy korzeń drzewa – węzeł nr 0, który znajduje się na poziomie 0. Dalej przechodzimy do jego synów i odwiedzamy węzły nr 1 i 2 na poziomie 1. W kolejnym kroku przechodzimy do poziomu 2 i odwiedzamy kolejno węzły nr 3, 4, 5 i 6. Operację tę kontynuujemy, aż do przejścia przez wszystkie węzły drzewa. Tego typu przejście wymaga zapamiętywania wskazań węzłów w kolejce. Kolejka pozwala odczytywać umieszczone w niej elementy w tej samej kolejności, w jakiej zostały do niej wstawione, czyli jest jakby buforem opóźniającym. Prześledźmy przejście BFS przedstawione w poniższej tabelce (dane dopisujemy na koniec kolejki, czyli z prawej strony, a pobieramy z początku kolejki, czyli z lewej strony):
Na poniższym rysunku zaznaczyliśmy linię przejścia przez kolejne węzły drzewa.
Rozmiar kolejki nie przekracza 2h, gdzie h jest wysokością drzewa.
Algorytm kolejkowy BFS dla drzewa binarnegoWejście
Wyjście:
przetworzenie wszystkich węzłów drzewa kolejnymi poziomami od strony lewej do
prawej.
Elementy pomocnicze:
Lista kroków:
|
I Liceum Ogólnokształcące |
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe