1 / 20

ALGORYTMY I STRUKTURY DANYCH

ALGORYTMY I STRUKTURY DANYCH. WYKŁAD 02 Algorytmy wyszukiwania Grażyna Mirkowska PJWSTK, 2003. Plan wykładu. Wyszukiwanie w ciągu nieuporządkowanym. Wyszukiwanie w ciągu uporządkowanym. Metoda poszukiwań sekwencyjnych Metoda poszukiwań binarnych. Analiza poprawności i kosztu

Download Presentation

ALGORYTMY I STRUKTURY DANYCH

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ALGORYTMY I STRUKTURY DANYCH WYKŁAD 02 Algorytmy wyszukiwania Grażyna Mirkowska PJWSTK, 2003

  2. Plan wykładu • Wyszukiwanie w ciągu nieuporządkowanym. • Wyszukiwanie w ciągu uporządkowanym. • Metoda poszukiwań sekwencyjnych • Metoda poszukiwań binarnych. • Analiza poprawności i kosztu • Metoda poszukiwań „skokowych”(ćwiczenia) • Optymalna długość skoku • Wyszukiwanie minimum i maksimum • Algorytm naiwny • Analiza kosztu średniego G. Mirkowska, ASD_02 Algorytmy Wyszukiwania

  3. Wyszukiwanie w ciągu nieuporządkowanym Problem Niech E będzie daną przestrzenią, a X jej skończonym podzbiorem. Zbadać, czy dany element x przestrzeni E należy do wybranego podzbioru X. Metoda rozwiązania polega na porównywaniu kolejnych elementów ciągu, poczynając od pierwszego, z elementem x. Jeśli badany element jest równy x, to kończymy postępowanie; jeśli nie, to rozważamy następny element ciągu. Specyfikacja wp ={(ei ) ciąg n elementów przestrzeni E , n 1} wk ={ wynik  ( i n) ei = x} Zakładamy, że elementy ciągu są przechowywane w pewnej tablicy e[1], e[2],...,e[n]. G. Mirkowska, ASD_02 Algorytmy Wyszukiwania

  4. Diagram przepływu początek wynik := false; i := 1; x  {e[1],...,e[i-1]}, wynik=false , i=1 i n and not wynik koniec x  {e[1],...,e[i-1]}, in+1,wynik=false, in x= e[i] Tak Nie x  {e[1],...,e[i-1]}, in, x e[i] wynik := true i := i+1; x  {e[1],...,e[i-1]}, in+1, wynik=false x=e[i], in wynik=true G. Mirkowska, ASD_02 Algorytmy Wyszukiwania

  5. Algorytm Wersja 1 { i :=1; wynik := false; while ( i  n and not wynik) { if x=e[i] then wynik := true else i := i+1 fi; } } Wersja 2 { e[n+1]:= x; i:=1; while (e[i] x ) { i := i+1; } wynik := (i  n ); } wynik= true, i  n , e[i]=x lub wynik=false, i=n+1, x  {e[1],...,e[i-1]} wynik = true wttw dla pewnego i  n , e[i]=x G. Mirkowska, ASD_02 Algorytmy Wyszukiwania

  6. Koszt algorytmu Operacja dominująca = porównywanie elementów W najlepszym razie algorytm wykona 1 porównanie.W najgorszym razie n- porównań. Prawdopodo-bieństwo wystąpienia danych d Koszt średni A(n)=Sd Dn p(d) * t(d) Koszt realizacji algorytmu dla danych d Niech p(xX)= p i załóżmy, że jest jednakowo prawdopodobne, że x znajduje się na 1szym, 2gim czy i-tym miejscu. Wtedy p(x=e[i]) = p/n. A koszt pamięciowy? Zatem A(n) =1* p/n+ 2*p/n +...+n*p/n +n*(1-p) = n - (n-1)*p/2. G. Mirkowska, ASD_02 Algorytmy Wyszukiwania

  7. Przedział 1 Przedział n-1 Przedział 0 Przedział n ... e[1] e[2] e[3] e[n-1] e[n] Wyszukiwanie w ciągu uporządkowanym Problem Dany jest ciąg rosnący e[1],..,e[n] oraz element x pewnej przestrzeni liniowo uporządkowanej <E, >. Chcemy ustalić przedział e[i], e[i+1], w którym ewentualnie mieści się x. Specyfikacja : wp= {(i<n) e[i]<e[i+1] , n>0 } wk= {wynik= i wttw x należy do itego przedziału} Metoda sekwencyjna1. Zbadamy przypadki skrajne: przedział 0 i przedział n-ty i ew. kończymy .2. Następnie porównujemy x z kolejnymi elementami ciągu poczynając od e[2]. Jeśli x jest mniejsze prawego końca rozważanego i-tego przedziału, to znaczy , że x znajduje się w tym przedziale, e[i] x <e[i+1]. Jeśli tak nie jest, to trzeba zbadać następny przedział. G. Mirkowska, ASD_02 Algorytmy Wyszukiwania

  8. Metoda poszukiwań sekwencyjnych Koszt algorytmu { if x<e[1] then i := 0 else if x e[n] then i := n else i := 1; while x e[i+1] { i := i+1; } fi; fi; wynik := i;} e[i]x  e[n], 1i  n e[i]x , xe[i+1], i+1  n xe[i] , i n W skrajnych przypadkach mamy 1 lub 2 porównania W najgorszym razie 2 + (n-1) porównań.Czyli W(n) = O(n). e[i] x  e[i+1], i n A koszt średni? G. Mirkowska, ASD_02 Algorytmy Wyszukiwania

  9. Koszt średni algorytmu sekwencyjnego Rozszerzamy dany ciąg o elementy a i b, tzn. przyjmujemy e[0] = a i e[n+1] =b, gdzie [a,b] jest przedziałem, w którym mieszczą się elementy ciągu oraz x. Załóżmy, że prawdopodobieństwo tego, że x przyjmuje jakąś wartość z przedziału [a,b] jest zawsze takie samo. Mamy p(x [e[i],e[i+1])) = (e[i+1] – e[i])/(b-a) Koszt oczekiwany algorytmu A(n) = Jeśli długości przedziałów są takie same, to A(n) = n/2 +c, gdzie c<2 G. Mirkowska, ASD_02 Algorytmy Wyszukiwania

  10. Skoki „co 4” omiń Idea Porównujemy element x z co czwartym elementem danego ciągu tak długo aż znajdziemy element większy od x. Wtedy szukamy x sekwencyjnie wśród czterech poprzedzających go elementach ciągu. Metoda dokładniej: 1 krok: Zbadać czy x [e[1],e[n]). Jeśli nie, to ustalić wynik zgodnie ze specyfikacją, a jeśli tak to wykonać krok 2. 2 krok: Porównywać x z kolejnymi elementami o indeksach 4i, tak długo aż (a) znajdziemy element e[4i]>x lub (b) aż przekroczymy n (a) szukamy wyniku sekwencyjnie w przedziale [e[4i- 4], e[4i]), (b) szukamy wyniku sekwencyjnie w przedziale [e[4i- 4], e[n]). G. Mirkowska, ASD_02 Algorytmy Wyszukiwania

  11. Algorytm skoki „co 4” { if x < e[1] then i :=0 else if x  e[n] then i := n else i := 4; bool := false; while (i  n and not bool) do if x  e[i] then i := i + 4 else bool := true fi od; i := i- 4; while x  e[i+1] do i := i+1 od; fi; fi; wynik := i } e[1]  x  e[n] e[j]  x dla j=1,2,...,i-4,  bool e[j]  x dla j=1,2,...,i,  bool, in e[j]  x dla j=1,2,...,i-4,  bool , in+4 e[j]  x dla j=1,2,...,i-4, x<e[i], bool bool oraz e[i- 4]  x<e[i] lub  bool oraz e[i- 4]  x<e[n] Koszt pesymistyczny: W(n)= 2 +[n/4]+3 G. Mirkowska, ASD_02 Algorytmy Wyszukiwania

  12. Skoki „co k” { if x < e[1] then i :=0 else if x  e[n] then i := n else i := k; bool := false; while (i  n and not bool) do if x  e[i] then i := i + k else bool := true fi od; i := i-k; while x  e[i+1] do i := i+1 od; fi; fi; wynik := i } Niezmiennik: e[j]  x<e[n] dla j=1,2,...,i-k, i  n+k G. Mirkowska, ASD_02 Algorytmy Wyszukiwania

  13. Optymalne k Dla jakich wartości k algorytm ma najmniejszy koszt pesymistyczny? Koszt pesymistyczny wyraża się funkcją f(n) = 2 + n/k + ( k-1) Szukamy minimum tej funkcji: f’(k) = -n/k2 + 1 f’(k) = 0 dla k = n oraz f’’ ( n)>0 Koszt pesymistyczny będzie najmniejszy, gdy k =  n Wniosek G. Mirkowska, ASD_02 Algorytmy Wyszukiwania

  14. Algorytm bisekcji Metoda „dziel i zwyciężaj” Podziel dany ciąg na dwie części. Sprawdź, w której połowie ciągu znajduje się poszukiwany element i dalej szukaj tą samą metodą w tej właśnie połowie. wp : e[1] x < e[n], n>1 wk: e[wynik]  x< e[wynik+1] { i :=1; j := n; while j-i >1 do m := (i+j) div 2; if e[m]  x then i := m else j := m fi od; wynik := i} Niezmiennike[i]  x  e[j], i  j 1+i = j oraz e[i]  x  e[j] G. Mirkowska, ASD_02 Algorytmy Wyszukiwania

  15. Koszt algorytmu bisekcji Czy ten algorytm zatrzymuje się ? Niech k będzie liczbą wykonanych iteracji pętli oraz odl(k) = j - i. Przed wykonaniem pętli mamy k=0 i odl(k) = n-1. odl(k+1) = odl(k)/2, jeśli odl(k) jest liczbą parzystą(odl(k)-1)/2  odl(k+1)  (odl(k)+1)/2 , jeśli odl(k) jest liczbą nieparzystą Odl(k) jest liczbą całkowitą z przedziału [1,n-1 ] i ze wzrostem k maleje! Istnieje zatem takie k, że odl(k)=1. A więc algorytm zatrzymuje się. A jaka jest największa wartość k? k =[ lg n] G. Mirkowska, ASD_02 Algorytmy Wyszukiwania

  16. Minimum i maksimum Dany jest ciąg elementów e[i] i = 1,...,n należących do pewnego zbioru E liniowo uporządkowanego przez relację . Znaleźć największy i najmniejszy element tego ciągu. Problem Specyfikacja algorytmu Wp = { e[i]  e[j] dla i  j} Wk = { e[min] e[i] oraz e[max]  e[i] dla wszystkich i =1,2...n}. Znajdź minimum metodą sekwencyjnego przeglądania ciągu. Znajdź maksimum, tą samą metodą. Algorytm naiwny T(A,n)= 2n-2 G. Mirkowska, ASD_02 Algorytmy Wyszukiwania

  17. { min :=1; max :=1; for i := 2 to n do if e[i] >e[max] then max := i else if e[i]< e[min] then min := i fi fi od;} Niezmiennik ( 1j<i)(e[max]  e[j]  e[min]e[j]) Algorytm 2 Modyfikacja algorytmu naiwnego Algorytm naiwny nie jest optymalny! Jeśli e[i] jest większe od e[max], to nie ma potrzeby porównywać e[i] z e[min]. Koszt pesymistyczny:W(n) = 2n-2 G. Mirkowska, ASD_02 Algorytmy Wyszukiwania

  18. Analiza kosztu średniego Uwaga 1 Pierwsze porównanie jest wykonywane w każdym przebiegu pętli. Uwaga 2 Drugie porównanie jest wykonywane tylko wtedy, gdy odpowiedź w pierwszym porównaniu jest negatywna. A(n) = Sd Dn p(d)* t(d) Dn - zbiór wszystkich danych rozmiaru n. Założymy, że wszystkie permutacje są jednakowo prawdopodobne. Zbiór wszystkich permutacji p(d) = 1/n! G. Mirkowska, ASD_02 Algorytmy Wyszukiwania

  19. Koszt średni c.d. Niech d = a1...an będzie daną permutacją liczb 1...n i b = b1,...bn będzie ciągiem takim, że bi = liczba elementów większych niż ai na lewo od ai , tzn. o mniejszych indeksach w ciągu d. Przykład Niech d = 6752314, wtedy b = 0023353. Obserwacja (a) Ciąg b jest jednoznacznie wyznaczony przez d. (b) 0 bi < i Drugiego porównania w algorytmie nie wykonujemy tylko wtedy, gdy na lewo od i-tego elementu nie było liczby większej, czyli tylko wtedy gdy bi =0. G. Mirkowska, ASD_02 Algorytmy Wyszukiwania

  20. Koszt średni c.d. Prawdopodobieństwo tego, że bi =0 wynosi 1/i, ponieważ bi przyjmuje tylko wartości od 0 do i-1. Stąd prawdopodobieństwo wykonania drugiego porównania wynosi 1-1/i. Średni koszt dla danych d: t(d) = (n-1) + S i =2...n 1* p(drugie porównanie) = (n-1) + Si=2...n (1-1/i) = 2n-2 - lg n +c 1/x dx= ln|x| Ostatecznie A(n) = S d 1/n! t(d) = 2n - lg n + c G. Mirkowska, ASD_02 Algorytmy Wyszukiwania

More Related