Algorytmy przeszukiwania

Transkrypt

Algorytmy przeszukiwania
Algorytmy przeszukiwania
Przeszukiwanie liniowe
Algorytm stosowany do poszukiwania elementu w zbiorze, o
którym nic nie wiemy. Aby mieć pewność, że nie pominęliśmy
żadnego elementu zbioru przeszukujemy go element po elemencie.
Oznacza to, że elementy zbioru zostają ustawione w ciąg i ciąg ten
jest przeszukiwany od jednego z jego końców.
a1
↑
a2
a3
a4
a5
a6
a7
a8
a9 a10 a11 a12 a13 a14 a15 a16
Przeszukiwanie binarne
Algorytm ten stosuje się w sytuacji, gdy elementy zbioru maja
pewną strukturę, np. są uporządkowane. W sytuacji takiej
wykorzystujemy tą dodatkowa informację.
Przykład:
Chcemy odgadnąć liczbę naturalną z przedziału [1, N]. W każdej
chwili dysponujemy podpowiedzią w postaci: „tak”, „za mało”, „za
dużo”.
1
2
3
4
5
6
7
8
9
10 11 12 13 14 15 16 17 18 17 20
↑
11 12 13 14 15 16 17 18 17 20
↑
16 17 18 17 20
_______ ↑
⎢16 ⎢17 ⎢
↑ ____
⎜ 17 ⎜ !
↑
W pojedynczym wypadku algorytm liniowy może dać szybciej
odpowiedź niż algorytm binarny, ale przy wielu próbach prawie
zawsze algorytm binarny jest szybszy.
Dane w tym przykładzie to uporządkowany ciąg liczb w tablicy
a[k],...,a[l] , gdzie k ≤ l oraz element y spełniający równość a[k] ≤ y ≤
a[l] . Trzeba znaleźć takie s (k≤ s ≤ l ), że a[s]=y (chyba, że taki
element nie istnieje).
Algorytm (punkty):
1. Wprowadzenie tablicy a[k],a[k+1], ... , a[l]
2. Przypisujemy końce przedziału lewy=k, prawy=l
3. Jeśli lewy>prawy to „brak szukanej liczby” i koniec
4. W przeciwnym przypadku s=INT( (lewy+prawy)/2 )
5. Jeśli a[s] = y to wyprowadzamy s, a[s] i koniec
6. Jeśli a[s]<y to lewy=s+1, a w przeciwnym przypadku prawy=s-1 i
wracamy do pkt. 3
Algorytmy porządkowania (sortowania)
Porządkowanie występuje niemal w każdej dziedzinie wiedzy.
Jeśli elementy w zbiorze są posortowane zgodnie z jakąś regułą, np.
według liter, dat, długości itd. , to wykonywanie wielu operacji na
zbiorze staje się łatwiejsze. Dotyczy to szczególnie:
- sprawdzanie czy dany element, tzn. element o ustalonej wartości
cechy według której uporządkowano zbiór, znajduje się w zbiorze
- znalezienie elementu jeśli jest w zbiorze
- dołączenie nowego elementu w danym miejscu, tak aby zbiór
pozostał uporządkowany
Algorytm bąbelkowy
1) Algorytm opiera się na obserwacji według której, jeśli ciąg nie
jest uporządkowany, to znajdują się w nim co najmniej dwa
elementy, które są w niewłaściwych miejscach.
2) Każdą parę elementów stojącą obok siebie w niewłaściwym
porządku należy przestawić.
3) Algorytm należy skonstruować tak, aby nie pominąć żadnej pary
i porządkowanie było jak najbardziej efektywne.
4) Należy pamiętać, że po każdym porządkowaniu należy sprawdzić
czy zamiana nie spowodowała niewłaściwego uporządkowania
między innymi elementami.
5) Maksymalna ilość etapów porządkowania dla N elementów
wynosi N-1, przy czym w każdym etapie porządkowany jest co
najmniej jeden element.
Linia przerywana wskazuje miejsce powyżej którego w danym
etapie nie trzeba przeszukiwać par. Jest to miejsce, gdzie ostatnio
zamieniono parę liczb w poprzednim etapie.
Algorytm porządkowania przez wybór
1) Jeśli chcemy ustawić elementy ciągu w kolejności od
najmniejszego do największego to można wybrać najmniejszy
element ciągu i umieścić go na początku.
2) W drugim etapie należy znaleźć element najmniejszy z
pozostałych elementów (poza tymi już ustawionymi) i umieścić
go na drugim miejscu itd. .
3) Elementy należy ustawiać ekonomicznie, najlepiej w ramach tej
samej struktury danych, tzn. przestawiać elementy na właściwe
miejsca.
4) Algorytm wymaga dla N elementów N-1 etapów przy czym w
każdym etapie porządkowany jest dokładnie jeden element.
Linia przerywana wskazuje miejsce poniżej którego w danym etapie
elementy są ustawione . Jest to miejsce, w którym ustawiono
element w wyniku zamiany w poprzednim etapie.