Instrukcja IEF Algorytmy i struktury danych - prz
Transkrypt
Instrukcja IEF Algorytmy i struktury danych - prz
Instrukcja IEF Algorytmy i struktury danych Laboratorium 3: ”Przeszukiwanie tablic liniowe i binarne”. 1. Wstęp. Algorytmy szukania liniowego i binarnego służą do wyszukiwania w n-elementowej tablicy elementu o podanej wartości. Element ten może wystąpić w szukanej tablicy więcej niż jeden raz. Możemy wtedy znaleźć wszystkie wystąpienia. Możliwe jest również, że podany element nie występuje w tablicy ani razu. 2. Szukanie liniowe. Wyszukiwanie liniowe (ang. linear search), zwane również sekwencyjnym (ang. sequential search) polega na przeglądaniu kolejnych elementów tablicy TAB. Jeśli przeglądany element posiada odpowiednie własności (np. jest liczbą o poszukiwanej wartości), to zwracamy jego pozycję w zbiorze i kończymy. W przeciwnym razie kontynuujemy poszukiwania aż do przejrzenia wszystkich pozostałych elementów zbioru Z. W przypadku pesymistycznym, gdy poszukiwanego elementu nie ma w zbiorze lub też znajduje się on na samym końcu zbioru, algorytm musi wykonać przynajmniej n obiegów pętli sprawdzającej poszczególne elementy. Wynika z tego, iż pesymistyczna klasa złożoności obliczeniowej jest równa O(n), czyli jest liniowa - stąd pochodzi nazwa metody wyszukującej. Często chcemy znaleźć wszystkie wystąpienia w zbiorze poszukiwanej wartości elementu. W takim przypadku algorytm powinien stworzyć tablicę indeksów, do której będzie zapisywał znalezione wartości indeksów. • nagłówek funkcji 1 int szukanie_liniowe_1(int TAB[], int n, int x) gdzie: TAB - tablica n-elementowa, w której szukamy zadanego elementu n – rozmiar tablicy TAB x - szukany element Funkcja zwraca indeks znalezionego elementu lub (-1 ), jeśli go brak. • nagłówek funkcji 2 int* szukanie_liniowe_2(int TAB[], int n, int x, int *ilosc) gdzie: TAB - tablica n-elementowa, w której szukamy zadanego elementu n – rozmiar tablicy TAB x - szukany element ilosc – wskaźnik, którego wartością jest ilość znalezionych wartości x w tablicy TABtablica n-elementowa, której wartościami są indeksy wartości równych szukanemu Funkcja zwraca wskaźnik do tablicy indeksów 3. Szukanie binarne. Wyszukiwanie binarne jest algorytmem opierającym się na metodzie dziel i zwyciężaj, który w czasie logarytmicznym stwierdza, czy szukany element znajduje się w uporządkowanej tablicy i jeśli się znajduje, podaje jego indeks. Przeszukiwanie binarne, zwane też połówkowym, jest algorytmem sprawdzającym czy uporządkowany rosnąco ciąg liczbowy zawiera podaną liczbę x. Algorytm przeszukiwania binarnego korzysta z uporządkowania ciągu liczbowego dzieląc go każdorazowo na połowy. Poszukiwaną liczbę x porównuje się z liczbą środkową ciągu i w zależności od wyniku tego porównania przeszukiwana jest albo lewa, albo prawa część tablicy. Obszar poszukiwania wyznaczają dwa indeksy: left i right oznaczające odpowiednio: początek i koniec przeszukiwanego fragmentu tablicy - rozpoczynając przeszukiwanie zmiennym tym przypisujemy wartości left = 0 i right = n-1. Sprawdzamy, czy left<=right. Jeśli tak, to: obliczamy indeks elementu środkowego mid = (left + right)/2.. Wówczas testowane jest, czy element zapisany pod indeksem mid jest tym poszukiwanym — jeśli tak, to algorytm w tym miejscu kończy działanie. W przeciwnym razie przedział jest zawężany dzięki uporządkowaniu danych wiadomo, że albo poszukiwany element może znajdować się gdzieś przed indeksem mid albo za nim. Innymi słowy wybór ogranicza się do przedziału [left , mid − 1], gdy poszukiwany element jest mniejszy od zapisanego pod indeksem mid, albo [mid + 1 , right] w przeciwnym razie. Algorytm kończy się niepowodzeniem, jeśli przedział będzie pusty, tzn. left > right (lewy koniec przedziału "znajdzie się" za prawym końcem). Zostanie wtedy zwrócona wartość -1. • nagłówek funkcji int szukanie_binarne (int TAB[], int n, int x) gdzie: TAB - tablica n-elementowa, w której szukamy zadanego elementu n – rozmiar tablicy TAB x - szukany element Funkcja zwraca indeks znalezionego elementu lub (-1 ), jeśli go brak. • Przykład: tablica posortowana Indeks 2 wartość szukana x = 15 0 1 2 5 6 10 11 13 15 19 22 30 35 40 left=0 right=11 A[mid]≠x 3 4 5 6 7 8 9 10 11 czy left<=right ->tak mid=(left+right)/2=5 A[mid]<x A[mid]=13 left=mid+1=6 tablica brana do analizy: Indeks 6 7 8 9 10 11 15 19 22 30 35 40 czy left<=right ->tak mid=(left+right)/2=8 A[mid]=22 A[mid]≠x A[mid]>x right=mid-1=7 tablica brana do analizy: Indeks 6 7 15 19 czy left<=right ->tak mid=(left+right)/2=6 A[mid]=15 A[mid]=x zwróć indeks znalezionego elementu: mid=6 4. Zadania do wykonania: • Proszę napisać funkcję, która wyszukuje liniowo zadany element w podanej tablicy. W main należy zadeklarować odpowiednie zmienne, wczytać ilość elementów tablicy, zarezerwować pamięć, wczytać wartości do tablicy i szukaną wartość, wywołać funkcję szukanie_liniowe_1, wypisać otrzymane wyniki. Napisać funkcję szukanie_liniowe_2 i pokazać jej działanie w main(). • Proszę napisać funkcję sortowania tablicy numerycznej. • Proszę napisać funkcję, która wyszukuje binarnie zadany element w podanej posortowanej tablicy. W main należy zadeklarować odpowiednie zmienne, wczytać wartości do tablicy i szukaną wartość, wywołać funkcję sortowania, wywołać funkcję szukanie_binarne, wypisać otrzymane wyniki.