Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

ALGORYTMY I STRUKTURY DANYCH

Podobne prezentacje


Prezentacja na temat: "ALGORYTMY I STRUKTURY DANYCH"— Zapis prezentacji:

1 ALGORYTMY I STRUKTURY DANYCH
WYKŁAD 02 Wyszukiwanie Grażyna Mirkowska PJWSTK, 2003/2004

2 G. Mirkowska, ASD_02 Wyszukiwanie
Plan wykładu Wyszukiwanie w dowolnym ciągu Algorytm naiwny Analiza kosztu średniego Wyszukiwanie w ciągu uporządkowanym Algorytm sekwencyjny Algorytm ze skokami algorytm binarnych poszukiwań Problem optymalności G. Mirkowska, ASD_02 Wyszukiwanie

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 Wyszukiwanie

4 G. Mirkowska, ASD_02 Wyszukiwanie
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 Wyszukiwanie

5 G. Mirkowska, ASD_02 Wyszukiwanie
Algorytm Wersja 1 { i :=1; wynik := false; while ( i  n and not wynik) { if x=e[i] then wynik := true else i := i 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 Wyszukiwanie

6 G. Mirkowska, ASD_02 Wyszukiwanie
Analiza kosztu 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)=S d 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 Wyszukiwanie

7 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. e[1] e[2] e[n-1] e[n] ... Przedział 0 Przedział 1 Przedział n-1 Przedział n e[3] Specyfikacja : wp= {(i<n) e[i]<e[i+1] , n>0 } wk= {wynik= i wttw x należy do itego przedziału} Metoda sekwencyjna 1. 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ł. Na kolejnych slajdach pokażemy kilka rozwiązań tego samego problemu: wyszukiwania w ciągu uporządkowanym. Przykład ten ma tę zaletę, że jest prosty i łatwo pokazać różnicę w kosztach kolejnych wersji rozwiązania problemu. G. Mirkowska, ASD_02 Wyszukiwanie

8 Metoda poszukiwań sekwencyjnych
Poniważ x  e[i+1], to i+1 nie może być równe n,bo z wcześniejszych porównań wiemy, że x<e[n]. Czyli i+1<n Koszt algorytmu { if x<e[1] then i := 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). Chociaż zadanie zostało sformułowane ogólnie, to ograniczymy się w tej chwili do struktury liczb rzeczywistych. Oczywiście nie zmienia to ogólności postępowania, ale zamieszczony tutaj tekst używa standardowego rozumienia relacji niewiększości. W ogólnym przypadku należałoby napisać funkcję o wartościach booleowskich, która realizowałaby porównywanie elementów i odpowiednio jej użyć w testach programu. e[i] x  e[i+1], i n A koszt średni? G. Mirkowska, ASD_02 Wyszukiwanie

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) = Przedział został podzielony na (n+1) kawałków. Skoro mają być takie same, to długość jednego wynosi (b-a)/(n+1). Oznaczmy to przez x. Zatem A(x)= 1+ (m-1)x/nx + Suma{ ((n-i) x)/(n x) : i=1...n-1} = 1 + 1/n{ n n-1} = 1+ 1/n {(n-1) + n (n-1)/2} = n/ /n Jeśli długości przedziałów są takie same, to A(n) = n/2 +c, gdzie c<2 G. Mirkowska, ASD_02 Wyszukiwanie

10 G. Mirkowska, ASD_02 Wyszukiwanie
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 Wyszukiwanie

11 G. Mirkowska, ASD_02 Wyszukiwanie
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 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 Wyszukiwanie

12 G. Mirkowska, ASD_02 Wyszukiwanie
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 Wyszukiwanie

13 G. Mirkowska, ASD_02 Wyszukiwanie
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/k f’(k) = 0 dla k = n oraz f’’ ( n)>0 Koszt pesymistyczny będzie najmniejszy, gdy k =  n Wniosek G. Mirkowska, ASD_02 Wyszukiwanie

14 Algorytm binarnych poszukiwań
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 } Niezmiennik e[i]  x  e[j], i  j W tym algorytmi pominiemy przypadek, że x nie należy do żadnego z przedziałów wyznaczonych przez nasz ciąg e1,...en. Uprościmy i skrócimy tym samym algorytm. Oczywiście, dopisując takie same testy jak w poprzednich algorytmach łatwo przekształcimy podany tu algorytm do przypadku ogólnego. W związku z powyższym, specyfikacja wygląda tym razem nieco inaczej. Łatwo też wykryć niezmiennik pętli. Zaproponowana formuła jest rzeczywiście niezmiennikiem pętli w tym programie. Skoro x jest między i-tym i jty, elementem to znajduje się albo w lewej albo w prawej połowie tego przedziału. Po ustaleniu (porównanie w instrukcji if) , w której części znajduje się nasz element , przesuwamy jeden z końców przedziału. Zatem po wykonaniu treści pętli, znów x znajduje się miedzy i-tym i j-tym elementem. Po wykonaniu całej pętli mamy j-i=1 zatem ustaliliśmy przedział. 1+i = j oraz e[i]  x  e[j] G. Mirkowska, ASD_02 Wyszukiwanie

15 Koszt algorytmu binarnych poszukiwań
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ą Aby ustalić jaka jest najwieksza możliwa liczba k, wystarczy spytać ile razy daną liczbę całkowitą możemy podzielić na 2 tak by iloraz był jeszcze liczbą naturalną. 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 Wyszukiwanie


Pobierz ppt "ALGORYTMY I STRUKTURY DANYCH"

Podobne prezentacje


Reklamy Google