Mając dany zbiór elementów, chcemy znaleźć w nim element największy (maksimum), bądź najmniejszy (minimum). We wszystkich naturalnych metodach znajdywania najmniejszego i największego elementu obecne jest przeglądanie wszystkich elementów zbioru, bezpośrednie bądź pośrednie. Algorytm znajdywania największego elementu w zbiorze Dane: Zbiór na liczb Wynik: Największy element max w danym zbiorze. Krok 1: Przyjmij za max dowolny element ze zbioru Krok 2: Dla każdego innego elementu x zbioru wykonuj: jeśli x jest większe niż max to za max przyjmij x. Liczba porównań w tym algorytmie jest równa n-1. Czy istnieje algorytm, który pozwala na znalezienie największego elementu kosztem mniejszej liczby działań? Przedstawiony algorytm jest optymalny pod względem złożoności. 1
Algorytm znajdywania najmniejszego elementu w zbiorze Dane: Zbiór na liczb Wynik: Najmniejszy element min w danym zbiorze. Krok 1: Przyjmij za min dowolny element ze zbioru Krok 2: Dla każdego innego elementu x zbioru wykonuj: jeśli x jest mniejsze niż min to za min przyjmij x. Liczba porównań w tym algorytmie jest równa n-1. Czy istnieje algorytm, który pozwala na znalezienie największego elementu kosztem mniejszej liczby działań? NIE Przedstawiony algorytm jest optymalny pod względem złożoności. 2
Problem Hugo Steinhausa: jaka jest najmniejsza liczba meczów tenisowych do rozegrania w grupie zawodników, niezbędna do tego, aby wyłonić wśród nich najlepszego i drugiego najlepszego zawodnika. Czy pokonany w finale jest rzeczywiście drugim najlepszym zawodnikiem turnieju, a co za tym idzie lepszy od wszystkich pozostałych zawodników? Nic nie wiadomo bowiem, jak grałby zawodnik, który przegrał w finale z zawodnikami z poddrzewa, z którego został wyłoniony jego przeciwnik. Istnieje prosty sposób znalezienia drugiego najlepszego zawodnika: rozegrać pełen turniej z pominięciem zwycięzcy. Łączny koszt takiego rozwiązania to 2n-3 meczy. Na pytanie, jaka jest najmniejsza liczba meczów, potrzebnych do wyłonienia drugiego najlepszego zawodnika udzielił odpowiedzi Schreier w 1932. Aby wykorzystać w tym celu uzyskane dotychczas wyniki wstawiamy w miejsce zwycięzcy turnieju najsłabszego zawodnika X, który przegra swój pierwszy mecz. W przypadku 8 zawodników trzeba będzie rozegrać dodatkowo jedynie 2 mecze! 3
Złożoność tego algorytmu: najlepszy zawodnik wyłaniany jest w n-1 meczach, gdzie n jest liczbą wszystkich zawodników w turnieju; aby wyłonić drugiego najlepszego zawodnika trzeba rozegrać tyle meczów, ile jest poziomów w drzewie turnieju głównego minus jeden. Jaka jest wysokość drzewa turnieju? Przyjmijmy, że drzewo turnieju jest pełne, tzn. każdy z zawodników ma parę (liczba zawodników jest parzysta). W tej sytuacji mamy: n=2 k, gdzie k jest liczbą poziomów drzewa. k=log 2 n Liczba porównań wyniesie: (n-1)+(log 2 n-1)=n+log 2 n-2 Jeśli n nie jest potęgą 2 podana liczba jest oszacowaniem z góry liczby rozgrywanych meczów. Prezentowana metoda nosi nazwę porządkowania na drzewie i może być stosowana do szeregowania liczb. 4
Aby znaleźć rozpiętość zbioru n liczb wystarczy odszukać wśród nich nich maksimum i minimum a następnie obliczyć ich różnicę. Możemy zastosować w tym celu algorytmy Min i Max optymalne pod względem złożoności. Rozpiętość zbioru n liczb można wyznaczyć kosztem 2n-3 porównań. Nie jest to jednak metoda jednoczesnego wyznaczania minimum i maksimum!!! najpierw wyznaczamy jedną z wielkości, potem dopiero drugą. Idea: z każdego wykonanego sprawdzenia, czy x>y wyciągamy wniosek: x jest kandydatem na maksimum w algorytmie Max, y jest kandydatem na minimum w algorytmie Min. Realizując oba algorytmy niezależnie, jeden po drugim, sprawdzamy te nierówności dwukrotnie!!! Pomysł: porównajmy najpierw pary elementów (n/2 operacji), tworząc dwa podzbiory, w których będziemy następnie szukać kandydatów na minimum i maksimum. 5
Algorytm Max-i-Min - jednoczesne poszukiwanie minimum i maksimum Dane: Zbiór n liczb Wyniki: min i max - najmniejszy i największy element w zbiorze Krok 1: {podział na podzbiory}. Jeśli n jest nieparzyste to jeden z elementów pozostanie wolny - oznaczamy go przez z. Porównujemy elementy w parach: jeśli x>y to: x dołączamy do zbioru kandydatów na maksimum M y dołączamy do zbioru kandydatów na minimum N Krok 2: Znajdujemy max w zbiorze M Krok 3: Znajdujemy min w zbiorze N Krok 4: Jeśli n jest nieparzyste, to: jeśli z<min to za min przyjmujemy z jeśli z>max to za max przyjmujemy z. 6
Algorytm Max-i-Min jest prostym przykładem postępowania zgodnie z zasadą dziel i zwyciężaj. W pierwszym kroku algorytmu zbiór danych dzielony jest na dwa prawie równoliczne podzbiory danych. Dla tych podzbiorów w następnych krokach rozwiązywane są podobne problemy. Problem Max-i-Min rozpada się na dwa problemy Max i Min na rozłącznych podzbiorach o takiej samej liczbie elementów. (Podobne postępowanie realizowane jest w MES - podział na superelementy.) Złożoność obliczeniowa algorytmu: n parzyste: w 1 kroku n/2 porównań w krokach 2, 3 n/2-1 takich samych działań w każdym w sumie liczba porównań wynosi: 3n/2-2 Złożoność obliczeniowa algorytmu: n nieparzyste: liczba porównań wynosi: 3n/2-2 Powała x to najmniejsza liczba całkowita nie mniejsza niż x Podłoga x to największa liczba całkowita nie większa niż x. 7
Liderem w zbiorze nazywamy element, który występuje w zbiorze więcej niż połowę razy, czyli więcej, niż n/2 razy, gdy n jest mocą zbioru. Problem ten występuje w wyborach, w których zwycięzca musi uzyskać więcej niż połowę głosów. Znalezienie lidera w zbiorze można zastąpić określeniem innych miar centralności. Znalezienie modalnej (najczęściej występującej wielkości w zbiorze) i sprawdzenie, czy jej częstość w zbiorze jest większa niż wartość n/2. (Jest to pracochłonne, bo dla znalezienia modalnej trzeba najpierw uporządkować zbiór.) Znalezienie mediany, czyli elementu znajdującego się na pozycji n/2 i sprawdzenie, czy jest on liderem - jeśli zbiór ma lidera, to musi on być jego medianą!!! (Istnieje algorytm znajdywania mediany, który nie korzysta z porządkowania zbioru, ale jest on niezwykle złożony.) 8
Twierdzenie: Jeśli zbiór X zawiera lidera, a x i y są jego dwoma różnymi elementami, to zbiór Y=X-{x, y}, który powstał przez usunięcie elementów x i y ze zbioru X również zawiera lidera. Odwrotne twierdzenie nie jest prawdziwe. Zredukowany zbiór Y może zawierać lidera, choć go nie było w zbiorze X. X={1, 2, 2, 3, 4} nie ma lidera Y=X-{1, 3}={2, 2, 4} zawiera już lidera, którym jest liczba 2. Dowód (uzasadnienie) l -element X, który jest liderem, jeśli x i y są dwoma różnymi elementami X to co najwyżej jeden z nich = l, w zredukowanym zbiorze liczba elementów jest mniejsza o 2, częstość występowania l jest mniejsza co najwyżej o jeden, l pozostanie więc liderem w zbiorze Y. Musimy jedynie sprawdzić, czy lider Y jest liderem początkowego zbioru X. 9
Algorytm znajdywania lidera w zbiorze Dane: Zbiór X złożony z n elementów {x 1, x 2,, x n } Wynik: Lider l w zbiorze X lub informacja, że X nie zawiera lidera. Krok 1: Przyjmij x 1 za lidera l oraz niech c:=1 {Kroki 2-5 stanowią etap wykrywania kandydata na lidera w X} Krok 2: Dla kolejnych wartości i=2, 3,, n wykonaj kroki 3-5 a następnie przejdź do kroku 5. Krok 3: Jeśli c=0, to wykonujemy krok 4, a w przeciwnym wypadku wykonujemy krok 5. Krok 4: {Obieramy nowego kandydata na lidera} Przyjmujemy x i za lidera l i niech c:=1. Krok 5: {Porównujemy kolejny element zbioru X z kandydatem na lidera} Jeśli x i =l to zwiększamy c o 1 (c:=c+1) {kolejny element jest równy liderowi} W przeciwnym wypadku zmniejszamy c o 1 (c:=c-1) {kolejny element nie jest równy liderowi - usuwamy go wraz z jedną krotnością lidera} 10
{W krokach 6-8 sprawdzamy, czy l jest rzeczywiście liderem w zbiorze X} Krok 6: Jeśli c=0, to przejdź do kroku 7, a w przeciwnym wypadku przejdź do kroku 8. Krok 7: Zbiór X nie ma lidera. Zakończ algorytm. Krok 8: Wyznacz, ile razy kandydat na lidera występuje w zbiorze X. Jeśli ta liczba jest większa od n/2 to l jest liderem W przeciwnym razie ten zbiór nie zawiera lidera. Złożoność obliczeniowa algorytmu: W pierwszym etapie dla każdego elementu zbioru X (za wyjątkiem pierwszego) jest wykonywane jedno takie działanie jak w kroku 3 lub 5 W drugim etapie porównywania są wykonywane w kroku 6 (jedno) i w kroku 8 (n+1: n porównań, by obliczyć wielokrotność l w zbiorze X i jedno porównanie, by sprawdzić, czy ta wielokrotność jest większa od n/2). W sumie liczba porównań wynosi (n-1)+(1+n+1)=2n+1 11
12