Algorytmy przeszukiwania Przeszukiwanie liniowe - UJK
Algorytmy przeszukiwania Przeszukiwanie liniowe - UJK
Algorytmy przeszukiwania Przeszukiwanie liniowe - UJK
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 .