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.