1 / 29

ALGORYTMY I STRUKTURY DANYCH

ALGORYTMY I STRUKTURY DANYCH. WYKŁAD 03 Minimum i maksimum Grażyna Mirkowska PJWSTK, II rok semestr letni 2003. Plan wykładu. Minimum i maksimum Algorytm optymalny Algorytm rekurencyjny Drugi co do wielkości element Algorytm turniej K-ty co do wielkości element ciągu Algorytm Hoare.

mattox
Télécharger la présentation

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 03 Minimum i maksimum Grażyna Mirkowska PJWSTK, II rok semestr letni 2003

  2. Plan wykładu • Minimum i maksimum • Algorytm optymalny • Algorytm rekurencyjny • Drugi co do wielkości element • Algorytm turniej • K-ty co do wielkości element ciągu • Algorytm Hoare G. Mirkowska, ASD_03 Minimum i maksimum

  3. Algorytm min-max 3 Uwaga. Nie musimy przenosić samych elementów do tablic M i W. Wystarczy zapamiętać pozycje tych elementów. Idea algorytmu: Porównaj parami elementy danego ciągu. Mniejszy z każdej pary wstaw do ciągu M, a większy z każdej pary do ciągu W. Mniejsze: Większe: 5 8 34 44 7 4 1 11 4 2 Wybierz minimum Wybierz maksimum Dany ciąg: 4, 5, 1, 8, 34, 11, 44, 4, 7, 2, 4, 5, 1, 8, 34, 11, 44, 4, 7, 2, G. Mirkowska, ASD_03 Minimum i maksimum

  4. Analiza kosztu { // min-max 3 i:=1; k:=1; while i< n do if e[i] >e[i+1] then w[k] :=i; m[k] :=i+1 else w[k] :=i+1; m[k] :=i fi i := i+2; k := k+1; od; min := m[1]; max :=w[1]; for i := 2 to k-1 do if e[m[i]] < e[min] then min := m[i] fi; if e[w[i]]> e[max] then max := w[i] fi; od;} Operacja dominująca : porównywanie. Załóżmy, że n jest liczbą parzystą. 1szy krok = n/2 porównań Wybranie minimum = n/2 - 1 porównań Wybranie maksimum = n/2 - 1 porównań. Razem = 3n/2 -2 porównań G. Mirkowska, ASD_03 Minimum i maksimum

  5. Analiza poprawności Niezmiennik { //rozdzielanie i:=1; k:=1; while i< n do if e[i] >e[i+1] then w[k] :=i; m[k] :=i+1 else w[k] :=i+1; m[k] :=i fi i := i+2; k := k+1; od;} Dla każdego j=1...k-1istnieje takie u<k, że e[m[j]]  e[w[u]] Dla każdego j=1...k-1istnieje takie u<k, że e[w[j]]  e[m[u]] Żaden indeks w tablicy w[i] nie może wskazywać minimum ciągu e. Żaden indeks w tablicy m[i] nie może wskazywać maksimum ciągu e. G. Mirkowska, ASD_03 Minimum i maksimum

  6. Analiza poprawności c.d. Wśród indeksów m[1], ...m[k] istnieje taki indeks min, że e[min]  e[i] dla wszystkich i =1,...n Wśród indeksów m[1], ...m[k] istnieje taki indeks max, że e[i]  e[max] dla wszystkich i =1,...n min := m[1]; max :=w[1]; for i := 2 to k-1 do if e[m[i]] <e[min] then min := m[i] fi; if e[w[i]]> e[max] then max := w[i] fi;od; e[min]  e[i] dla wszystkich i =1,...n e[i]  e[max] dla wszystkich i =1,...n G. Mirkowska, ASD_03 Minimum i maksimum

  7. Min-max 4 -- przykład Założenie: n = 2 k Dany ciąg: 4, 5, 1, 8, 33, 11, 44, 10, 7, 2, 13, 22, 3, 55, 9, 6 4, 5, 1, 8, 33, 11, 44, 10min= max= 7, 2, 13, 22, 3, 55, 9, 6min= max= 1 44 7, 2, 13, 22min= max= 3, 55, 9, 6min= max= 4, 5, 1, 8min= max= 33, 11, 44, 10 min= max= 1 8 10 44 4,5 33,11 44,10 7,2 13,22 1,8 3,55 9,6 G. Mirkowska, ASD_03 Minimum i maksimum

  8. Min-max 4 -- przykład Założenie: n = 2 k Dany ciąg: min = 1 max = 55 4, 5, 1, 8, 33, 11, 44, 10, 7, 2, 13, 22, 3, 55, 9, 6 4, 5, 1, 8, 33, 11, 44, 10min= max= 7, 2, 13, 22, 3, 55, 9, 6min=2 max=55 1 44 7, 2, 13, 22min=2 max=22 3, 55, 9, 6min=3 max=55 4, 5, 1, 8min= max= 33, 11, 44, 10 min= max= 1 8 10 44 4,5 33,11 44,10 7,2 13,22 1,8 3,55 9,6 G. Mirkowska, ASD_03 Minimum i maksimum

  9. obiekt minmax x j i Algorytm min-max 4 obiekt function min_max4 (int i, j);//deklaracja i tworzenie obietktów result, lewy, prawy;{ if ( i+1=j ) then if e[j] > e[i] then result.max := j; result.min := i else result.min := j; result.max :=i fi else x:= (i+j-1) div 2; lewy := min_max4( i, x); prawy := min_max4( x+1, j); if e[prawy.min]<e[lewy.min] then result.min := prawy.min else result.min := lewy.min fi; if e[lewy.max]< e[prawy.max] then result.max := prawy.max else result.max := lewy.max fi; fi} G. Mirkowska, ASD_03 Minimum i maksimum

  10. Poprawność min-max 4 wp = {( m) n = 2 m, e[i] <E,  > dla i=1,...n} wk = {(i n) e[min]  e[i] , (i n) e[i]  e[max]} Jeżeli spełniony jest warunek początkowy wp , to po wykonaniu następujących instrukcji {wynik := min_max4(1,n); min := wynik.min; max := wynik.max;} spełniony będzie warunek końcowy wk. Twierdzenie G. Mirkowska, ASD_03 Minimum i maksimum

  11. Czy algorytm min-max4 zatrzymuje się? W każdym wywołaniu funkcji min_max4(i,j) parametry aktualne i, j spełniają warunek j-i+1 = 2 k dla pewnego k, 1 k  m Lemat j = n, i =1 Dla pierwszego wywołania własność jest oczywiście spełniona. bo i+1=j Jeżeli w ciągu są tylko 2 elementy, tzn. k=1. Wtedy nie wywołujemy powtórnie funkcji min-max4. Jeżeli k>1 oraz j-i+1 = 2 k , to funkcja zostanie wywołana dla nowych argumentów: i, x oraz x+1, j, ale wtedy x-i+1 = (i+j-1)/2 – i +1 = (j-i+1)/2 = 2 k-1 Min-max4 j-(x+1)+1 = j – ((i+j-1)/2 +1) +1 =(j-i+1)/2 = 2 k-1 G. Mirkowska, ASD_03 Minimum i maksimum

  12. C.d. ‘stop’ dla min-max4 jest 2 razy mniejsza Długość rozważanego przez funkcję min-max4 ciągu maleje w kolejnych wywołaniach. W konsekwencji proces musi się zakończyć dla k=1. Wniosek Jeśli spełniony jest warunek początkowy wp, to algorytm min_max4 zatrzymuje się dla dowolnych danych. G. Mirkowska, ASD_03 Minimum i maksimum

  13. Poprawność min-max4 Dowód przez indukcję ze względu na liczbę wywołań rekurencyjnych funkcji min_max4. Analogicznie dla minimum Dla jednego tylko wywołania , tzn. gdy m=1 wynik algorytmu jest poprawny. Załóżmy, że wynik algorytmu jest poprawny dla wewnętrznych wywołań, czyli if e[lewy.max]<e[prawy.max] then result.max := prawy.max else result.max := lewy.max fi; e[k]  e[lewy.max] dla i  k  x oraze[k]  e[prawy.max] dla x+1  k  j Po wykonaniu instrukcji : Mamy :e[k]  e[result.max] dla i  k  j G. Mirkowska, ASD_03 Minimum i maksimum

  14. Koszt min_max4 Operacja dominująca - porównywanie elementów Jeśli w ciągu są tylko 2 elementy, to wykonujemy 1 porównanie T(min_max4, 2) = 1 T(min_max4, 2 k)= 2* T(min_max4,2 k-1) +2 Min- max4 Dla k>1 wykonujemy 2 wywołania rekurencyjnie Dwa dodatkowe porównania dla ustalenia ostatecznego wyniku T(2k) = 3*2 k-1 - 2 Ostatecznie: T(min_max4, n) = 3/2 n - 2 G. Mirkowska, ASD_03 Minimum i maksimum

  15. Czy można zrobić lepiej? min_max4 jest optymalnym rozwiązaniem problemu min-max Twierdzenie Każdy algorytm wyznaczający minimum i maksimum dowolnego ciągu e[1],...e[n] elementów dowolnej liniowo uporządkowanej przestrzeni musi wykonać w przypadku pesymistycznym co najmniej [3/2 n] – 2 porównania. G. Mirkowska, ASD_03 Minimum i maksimum

  16. Drugi największy element Problem Dany jest ciąg e elementów e[1],...,e[n] pewnej przestrzeni liniowo uporządkowanej < E,  >. Znaleźć drugi co do wielkości element tego ciągu. WP = { e[i]  e[j] dla i  j , n>0}, WK = {1 wynik n, e[j]  e[wynik] < e[max] dla j=1,2,...,n } e[wynik] = maximum({e[1]...,e[n]} - maximum{e[1],...,e[n]}) Algorytm naiwny : 1. Znaleźć element maksymalny. 2. Usunąć go z rozważań . 3. Znaleźć element maksymalny w pozostałym zbiorze. G. Mirkowska, ASD_03 Minimum i maksimum

  17. Algorytm naiwny { i := 2; max :=1; while i  n do if e[i] > e[max] then max := i fi; i := i+1; od; pom := e[1]; e[1] := e[max]; e[max] := pom; i:=3; wynik := 2; while i n do if e[i] > e[wynik] then wynik := i fi; i := i+1; od;} Max := maximum(1,n); • Max: = 1;for ( i =2; i<= n; i++){ if (e[i]>e[max]){max:=i;}} Swap(e[1], e[max]); • wynik := 2;for ( i =3; i<= n; i++){ if (e[i]>e[wynik]){wynik:=i;}} Wynik := maximum(2,n); Koszt T(n) = 2n -3 G. Mirkowska, ASD_03 Minimum i maksimum

  18. 4 2 3 5 7 8 1 6 Czy to można zrobić lepiej? Metoda polega na porównywaniu sąsiednich elementów ciągu. Elementy większe (wygrywające) przechodzą do następnej ‘rundy’. Metoda - Turniej 4 5 8 6 5 8 8 G. Mirkowska, ASD_03 Minimum i maksimum

  19. Analiza metody Każdy element, z wyjątkiem maksymalnego przegrał co najwyżej raz. Element drugi co do wielkości przegrał jedynie z elementem maksymalnym. Gdzie szukać elementu "drugiego" ? Wśród elementów, które grały z największym! Por. przykład O implementacji tego algorytmu będzie mowa na ćwiczeniach i na następnym wykładzie. G. Mirkowska, ASD_03 Minimum i maksimum

  20. Koszt algorytmu „Turniej” Załóżmy, że n= 2k. n -1 porównań Krok1. Zbudowanie drzewa turnieju. Krok 2. Wybranie elementu drugiego największego. lg n -1 Tyle, ile było ‘rund’! A ile elementów przegrało z największym? Razem : T(n)= n + lg n -2 G. Mirkowska, ASD_03 Minimum i maksimum

  21. K-ty największy Problem: Dany jest ciąg n-elementów pewnej przestrzeni liniowo uporządkowanej <E,  >. Znaleźć k-ty największy element tego ciągu.. Przykład 2, 4, 6, 12, 78, 45, 3, 33, 17, 22 Element największy = 78element drugi co do wielkości = 453-ci największy = 334-ty największy = 22 G. Mirkowska, ASD_03 Minimum i maksimum

  22. Pierwsze rozwiązanie Krok1. Wyszukaj element e[max] największy wśród elementów e[i],...,e[n]; Krok 2. Zamień elementy na pozycjach i-tej i max . Krok 3. Powtórz postępowanie dla następnego i. Koszt : T(n) = (n-1) + (n-2) +... +(n-k) =k*n - k*(k+1)/2 G. Mirkowska, ASD_03 Minimum i maksimum

  23. Algorytm naiwny Zakładam, że elementy w ciągu e nie powtarzają się. { x := 1; while x k do max := x; for i := x+1 to n do if e[i] > e[max] then max := i fi od; swap(e[x], e[max]); x := x+1; od; wynik := e[k]} Niezmiennik e[1]>...>e[x-1] >{e[x],...,e[n] } e[max] {e[x],...,e[n]} e[1]>...>e[x-1] >{e[x],...,e[n] } G. Mirkowska, ASD_03 Minimum i maksimum

  24. Czy można zrobić to taniej? M = mediana Rozdziel wszystkie elementy na większe od pewnego elementu M(część starsza) i na mniejsze od M (część młodsza). Umieść medianę tak by oddzielała cześć młodszą od starszej. Wynikiem jest mediana, jeśli w części starszej jest tylko k-1 elementów. W przeciwnym przypadku: jeśli elementów starszych jest >k-1, to szukaj k-tego elementu w części starszej. Jeśli elementów starszych jest mniej niż k-1, to szukaj elementu k-(liczba elementów starszych+1) wśród elementów młodszych. G. Mirkowska, ASD_03 Minimum i maksimum

  25. 5 7 9 4 3 2 6 1 11 12 Część młodsza Część starsza 4 3 2 1 7 9 6 Część młodsza Część starsza Przykład W podanym ciągu szukamy 7tego co do wielkości elementu 10 5 7 9 11 4 3 2 12 8 6 1 mediana 10 5 7 9 4 3 2 6 1 Szukam 4-go największego mediana 5 Wynikiem jest element 5 G. Mirkowska, ASD_03 Minimum i maksimum

  26. Algorytm Hoare Zakładam, że elementy w ciągu nie powtarzają się i, że algorytm zwraca jako wynik wartość k-tego największego elementu. function Hoare(l, p, k){ j := SPLIT(l, p); if ( p-j = k-1) then wynik := e[j] else if p-j>k-1 then Hoare(j+1, p, k) else Hoare(l,j-1, k-(p-j+1)) fi fi} {e[1]...,e[j-1]}< e[j]<{e[j+1],...,e[n]} K-ty największy znajduje się wśród elementów e[j+1],... e[p] K-ty największy znajduje się wśród elementów e[l],... e[j-1] G. Mirkowska, ASD_03 Minimum i maksimum

  27. Algorytm rozdzielania int function SPLIT(lewy,prawy){ mediana := e[lewy]; i := lewy+1; j := prawy; bool := true; while (bool) do while (j>lewy andif e[j] mediana ) do j := j-1 od; while (i<j andif e[i] < mediana) do i := i+1 od; if (i<j) then swap(e[i], e[j]); i := i+1; j := j-1; else bool := false fi od; swap(e[lewy],e[j]); return j; } (k, lewy< k <j) e[k] < e[j] (k, j < k  prawy) e[j]  e[k] G. Mirkowska, ASD_03 Minimum i maksimum

  28. i < j 10, 5, 9, 8, 3, 7, 12, 14, 11 mediana j i i > j 10, 5, 9, 8, 3, 7, 12, 14, 11 j i Jak to działa? 3 14 10, 5, 9, 8, 14, 7, 12, 3, 11 mediana i j 7 10 G. Mirkowska, ASD_03 Minimum i maksimum

  29. Koszt algorytmu Hoare Każdy element jest co najwyżej raz porównywany z medianą. Koszt algorytmu SPLIT Czyli T(SPLIT, n ) = n-1 = (n) Czyli W(n,k)= k*n – k(k+1)/2 W( n,k) = n-1 +W( n-1,k) A(n,k) = (n-1) + 1/n[ Sj=1...n-k A(n-j, k) + Sj=n-k+2... n A(j-1,k – (n-j+1)] Szukanie w części starszej Szukanie w części młodszej A(n,k) = O(n) G. Mirkowska, ASD_03 Minimum i maksimum

More Related