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.

Podobne dokumenty