24.11.2012 Views

Algorytmy przeszukiwania Przeszukiwanie liniowe - UJK

Algorytmy przeszukiwania Przeszukiwanie liniowe - UJK

Algorytmy przeszukiwania Przeszukiwanie liniowe - UJK

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Algorytmy</strong> <strong>przeszukiwania</strong><br />

<strong>Przeszukiwanie</strong> <strong>liniowe</strong><br />

Algorytm stosowany do poszukiwania elementu w zbiorze, o<br />

którym nic nie wiemy. Aby mieć pewność, że nie pominęliśmy<br />

żadnego elementu zbioru przeszukujemy go element po<br />

elemencie. Oznacza to, że elementy zbioru zostają ustawione w<br />

ciąg, który jest przeszukiwany od jednego z jego końców.<br />

a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16<br />


<strong>Przeszukiwanie</strong> binarne<br />

Algorytm ten stosuje się w sytuacji, gdy elementy zbioru maja<br />

pewną strukturę, np. są uporządkowane. W takiej sytuacji<br />

wykorzystujemy tą dodatkowa informację.<br />

Przykład<br />

Chcemy odgadnąć liczbę naturalną z przedziału [1, N]. W każdej<br />

chwili dysponujemy podpowiedzią w postaci: „tak”, „za mało”,<br />

„za dużo”.<br />

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20<br />

↑<br />

11 12 13 14 15 16 17 18 19 20<br />

↑<br />

16 17 18 19 20<br />

_______ ↑<br />

⎢16 ⎢17 ⎢<br />

↑ ____<br />

⎜ 17 ⎜ !<br />

↑<br />

W pojedynczym wypadku algorytm liniowy może dać szybciej<br />

odpowiedź niż algorytm binarny, ale przy wielu próbach prawie zawsze<br />

algorytm binarny jest szybszy.<br />

Dane w tym przykładzie to uporządkowany ciąg liczb w tablicy<br />

a[k],...,a[l] , gdzie k ≤ l oraz element y spełniający równość a[k] ≤ y ≤<br />

a[l] . Trzeba znaleźć takie s (k≤ s ≤ l ), że a[s]=y (chyba, że taki element<br />

nie istnieje).<br />

Algorytm (język naturalny - punkty):<br />

1. Wprowadzenie tablicy a[k],a[k+1], ... , a[l]<br />

2. Przypisujemy końce przedziału lewy=k, prawy=l<br />

3. Jeśli lewy>prawy to „brak szukanej liczby” i koniec


4. W przeciwnym przypadku s=INT( (lewy+prawy)/2 )<br />

5. Jeśli a[s] = y to wyprowadzamy s, a[s] i koniec<br />

6. Jeśli a[s]


<strong>Algorytmy</strong> porządkowania (sortowania)<br />

Porządkowanie występuje niemal w każdej dziedzinie wiedzy.<br />

Jeśli elementy w zbiorze są posortowane zgodnie z jakąś regułą, np.<br />

według liter, dat, długości itd. , to wykonywanie wielu operacji na<br />

zbiorze staje się łatwiejsze. Dotyczy to szczególnie:<br />

- sprawdzanie czy dany element, tzn. element o ustalonej wartości<br />

cechy według której uporządkowano zbiór, znajduje się w zbiorze<br />

- znalezienie elementu jeśli jest w zbiorze<br />

- dołączenie nowego elementu w danym miejscu, tak aby zbiór pozostał<br />

uporządkowany<br />

Algorytm bąbelkowy<br />

1) Algorytm opiera się na obserwacji według której, jeśli ciąg nie jest<br />

uporządkowany, to znajdują się w nim co najmniej dwa elementy, które<br />

są w niewłaściwych miejscach.<br />

2) Każdą parę elementów stojącą obok siebie w niewłaściwym porządku<br />

należy przestawić.<br />

3) Algorytm należy skonstruować tak, aby nie pominąć żadnej pary i<br />

porządkowanie było jak najbardziej efektywne.<br />

4) Należy pamiętać, że po każdym porządkowaniu należy sprawdzić czy<br />

zamiana nie spowodowała niewłaściwego uporządkowania między<br />

innymi elementami.<br />

5) Maksymalna ilość etapów porządkowania dla N elementów wynosi<br />

N-1, przy czym w każdym etapie porządkowany jest co najmniej jeden<br />

element.


Linia przerywana wskazuje miejsce powyżej którego w danym etapie nie<br />

trzeba przeszukiwać par. Jest to miejsce, gdzie ostatnio zamieniono parę<br />

liczb w poprzednim etapie.<br />

Algorytm porządkowania przez wybór<br />

1) Jeśli chcemy ustawić elementy ciągu w kolejności od najmniejszego<br />

do największego to można wybrać najmniejszy element ciągu i<br />

umieścić go na początku.<br />

2) W drugim etapie należy znaleźć element najmniejszy z pozostałych<br />

elementów (poza tymi już ustawionymi) i umieścić go na drugim<br />

miejscu itd. .<br />

3) Elementy należy ustawiać ekonomicznie, najlepiej w ramach tej<br />

samej struktury danych, tzn. przestawiać elementy na właściwe<br />

miejsca.


4) Algorytm wymaga dla N elementów N-1 etapów przy czym w<br />

każdym etapie porządkowany jest dokładnie jeden element.<br />

Linia przerywana wskazuje miejsce poniżej którego w danym etapie<br />

elementy są ustawione . Jest to miejsce, w którym ustawiono element w<br />

wyniku zamiany w poprzednim etapie.


Porządkowanie kubełkowe i pozycyjne<br />

W porządkowaniu kubełkowym kolejne elementy zbioru, który<br />

sortujemy umieszczamy w odpowiednich kubełkach.<br />

By zbiór został całkowicie uporządkowany , kubełki wypełnione<br />

w pierwszym etapie, muszą być opróżniane w drugim etapie,<br />

według kolejności przypisanych im nazw. Kolejność opróżniania<br />

kubełków jest kolejnością posortowanych elementów<br />

rozważanego zbioru.<br />

Kubełki są napełniane i opróżniane od dołu tworząc strukturę<br />

danych zwaną kolejką. Kolejki pracują według zasady FIFO<br />

(First-In, First-Out).<br />

Inna wykorzystywana strukturą jest stos. W stosie elementy są<br />

składowane jeden na drugim i opróżnianie stosu następuje od<br />

góry, tj. od elementu najpóźniej wprowadzonego do stosu. Stosy<br />

pracują według zasady LIFO (Last-In, First-Out). Stos<br />

najczęściej występuje w iteracyjnych realizacjach algorytmów<br />

rekurencyjnych. Częstym błędem pojawiającym się przy<br />

programowaniu jest przepełnienie stosu („stack overflow”).<br />

Porządkowanie kubełkowe liter wyrazu ABRAKADABRA.


Porządkowanie pozycyjne to sortowanie słów zgodnie z<br />

porządkiem słownikowym, czyli tak jak w słownikach i<br />

encyklopediach. Należy zachować dwie zasady:<br />

- jeśli dwa słowa mają jednakową długość , to szukamy w nich<br />

pierwszej pozycji, na której się różnią i pierwsze jest to słowo,<br />

które ma na tej pozycji „wcześniejszą” literę (np. ARAB –<br />

ARAK)<br />

- jeśli słowa mają nierówną długość , to albo szukamy pierwszej<br />

pozycji, na której się różnią i litera na tej pozycji decyduje o<br />

miejscu ustawienia słowa, albo jedno słowo jest częścią<br />

drugiego i wtedy występuje w słowniku przed każdym słowem<br />

, w którym jest zawarte na początku (np. BAR – BARD).<br />

Porządkowanie słów jednakowej długości polega na<br />

porządkowaniu ich od końca, pozycja po pozycji, z<br />

zastosowaniem do każdej pozycji algorytmu kubełkowego.<br />

Porządkowanie słów czteroliterowych powstałych z liter słowa<br />

ABRAKADABRA .

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!