ALGORYTMY I STRUKTURY DANYCH WYKŁAD 03 Minimum i maksimum Grażyna Mirkowska PJWSTK, ITN semestr letni 2002
G. Mirkowska, ASD_03 Minimum i maksimum Plan wykładu Minimum i maksimum Algorytm naiwny Jak poprawić algorytm naiwny Analiza kosztu średniego Algorytm optymalny Algorytm rekurencyjny 20 marca 2002 G. Mirkowska, ASD_03 Minimum i maksimum
Specyfikacja algorytmu Minimum i maksimum Problem 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. Specyfikacja algorytmu Wp ={e[i] e[j] dla ij, e[i] E dla i =1...n, liniowy porządek w E } Wk = { e[min]e[i] oraz e[max] e[i] dla wszystkich i=1,2...n} Algorytm naiwny może wyglądać następująco: { max := 1; for i := 2 to n do if e[i] >e[max] then max := i fi od; min := 1; if e[i] <e[min] then min := i fi } Oczywiści operacja dominującą jest to operacja porównywania Koszt algorytmu nie zależy od wartości elementów ciągu a tylko od wzajemnej relacji między elementami. poprawność tego algorytmu można wykazać przez indukcje ze względu na długość ciągu. 20 marca 2002 G. Mirkowska, ASD_03 Minimum i maksimum
G. Mirkowska, ASD_03 Minimum i maksimum Algorytm naiwny Krok 1 Znajdź minimum metodą sekwencyjnego przeglądania ciągu. Krok 2 Znajdź maksimum, tą samą metodą. { min :=1; max :=1; i:= 2; while i n do if e[i] >e[max] then max := i fi; if e[i]< e[min] then min := i fi; i:= i+1; od; } Koszt : T(min_max1,n) = 2n-2 min_max1 e[max] e[j] , e[min] e[j] dla j< i Niezmiennik 20 marca 2002 G. Mirkowska, ASD_03 Minimum i maksimum
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]. { 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 ( 1j<i)(e[max] e[j] e[min]e[j]) min_max2 Koszt pesymistyczny: W(n) = 2n-2 20 marca 2002 G. Mirkowska, ASD_03 Minimum i maksimum
Analiza kosztu min-max 2 { 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; } 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. powrót 20 marca 2002 G. Mirkowska, ASD_03 Minimum i maksimum
Analiza kosztu średniego min-max 2 A(n) = S d Dn p(d)* t(d) Dn - zbiór wszystkich danych rozmiaru n. Jeśli założymy, że wszystkie permutacje są jednakowo prawdopodobne, to p(d) = 1/n! Zbiór wszystkich permutacji 20 marca 2002 G. Mirkowska, ASD_03 Minimum i maksimum
G. Mirkowska, ASD_03 Minimum i maksimum 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. Min-max2 20 marca 2002 G. Mirkowska, ASD_03 Minimum i maksimum
G. Mirkowska, ASD_03 Minimum i maksimum 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. t(d) = (n-1) + S i =2...n 1* p(drugie porównanie) = (n -1) + S i=2...n (1-1/i) = 2n-2 - lg n +c S i=2...n (1/i) 1/x dx= ln|x| Ostatecznie A(n) = S i =2...n 1/n! t(d) = 2n - lg n +c 20 marca 2002 G. Mirkowska, ASD_03 Minimum i maksimum
G. Mirkowska, ASD_03 Minimum i maksimum Algorytm min-max 3 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 Wspomnij o różnych wersjach tego algorytmu: Np.. bez pomocniczych tablic ale z zamianami , z innym ustawieniem par, np.:pierwszy-ostatni itd 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, 20 marca 2002 G. Mirkowska, ASD_03 Minimum i maksimum
G. Mirkowska, ASD_03 Minimum i maksimum 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ń 20 marca 2002 G. Mirkowska, ASD_03 Minimum i maksimum
G. Mirkowska, ASD_03 Minimum i maksimum 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-1 istnieje takie u<k, że e[m[j]] e[w[u]] Dla każdego j=1...k-1 istnieje 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. 20 marca 2002 G. Mirkowska, ASD_03 Minimum i maksimum
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 20 marca 2002 G. Mirkowska, ASD_03 Minimum i maksimum
G. Mirkowska, ASD_03 Minimum i maksimum Min-max 4 -- przykład Założenie: n = 2 k Dany ciąg: 4, 5, 1, 8, 33, 11, 44, 4, 7, 2, 13, 22, 3, 55, 9, 6 4, 5, 1, 8, 33, 11, 44, 4 min= max= 7, 2, 13, 22, 3, 55, 9, 6 min= max= 1 44 7, 2, 13, 22 min= max= 3, 55, 9, 6 min= max= 4, 5, 1, 8 min= max= 33, 11, 44, 4 min= max= 1 8 4 44 4,5 33,11 44,4 7,2 13,22 1,8 3,55 9,6 20 marca 2002 G. Mirkowska, ASD_03 Minimum i maksimum
G. Mirkowska, ASD_03 Minimum i maksimum 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, 4, 7, 2, 13, 22, 3, 55, 9, 6 4, 5, 1, 8, 33, 11, 44, 4 min= max= 7, 2, 13, 22, 3, 55, 9, 6 min=2 max=55 1 44 7, 2, 13, 22 min=2 max=22 3, 55, 9, 6 min=3 max=55 4, 5, 1, 8 min= max= 33, 11, 44, 4 min= max= 1 8 4 44 4,5 33,11 44,4 7,2 13,22 1,8 3,55 9,6 20 marca 2002 G. Mirkowska, ASD_03 Minimum i maksimum
G. Mirkowska, ASD_03 Minimum i maksimum 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 } min max obiekt i x j Tu również znajduje zastosowanie zasada podziału zadania na podzadania: metoda „dziel i zwyciężaj”. Jak już się przekonaliśmy metoda ta często pozwala wykonać zadanie szybciej, z mniejszym kosztem, niż inne metody. W podanym rozwiązaniu, dany ciąg e jest informacja zewnętrzną. Funkcja, którą opiszemy zwraca w wyniku dwie wartości przechowywane w obiekcie obiekt. Oczywiście klasa obiekt musi być zdefiniowana w programie, który będzie wykorzystywał funkcję min-max4 20 marca 2002 G. Mirkowska, ASD_03 Minimum i maksimum
G. Mirkowska, ASD_03 Minimum i maksimum Poprawność min-max 4 Wp = {( m) n= 2 m, e[i] <E, > dla i=1,...n} Wk = {(i) e[min] e[i] , (i) 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 20 marca 2002 G. Mirkowska, ASD_03 Minimum i maksimum
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+j=1 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 20 marca 2002 G. Mirkowska, ASD_03 Minimum i maksimum
G. Mirkowska, ASD_03 Minimum i maksimum 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 konskwencji 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. 20 marca 2002 G. Mirkowska, ASD_03 Minimum i maksimum
G. Mirkowska, ASD_03 Minimum i maksimum 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 oraz e[k] e[prawy.max] dla x+1 k j Po wykonaniu instrukcji : Mamy : e[k] e[result.max] dla i k j 20 marca 2002 G. Mirkowska, ASD_03 Minimum i maksimum
Ostatecznie: Koszt min_max4 T(min_max4, 2) = 1 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 Ostatecznie: T(min_max4, n) = 3/2 n - 2 20 marca 2002 G. Mirkowska, ASD_03 Minimum i maksimum
Czy można zrobić lepiej? min_max4 jest optymalnym rozwiązaniem problemu min-max Twierdzenie Każdy algorytm wyznaczający dla 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. 20 marca 2002 G. Mirkowska, ASD_03 Minimum i maksimum