PODSTAWY INFORMATYKI wykład 5. Adrian Horzyk Web: http://home.agh.edu.pl/~horzyk/ E-mail: horzyk@agh.edu.pl Google: Adrian Horzyk Gabinet: paw. D13 p. 325 Akademia Górniczo-Hutnicza w Krakowie WEAIiE, Katedra Automatyki http://www.agh.edu.pl Mickiewicza Av. 30, 30-059059 Cracow, Poland
Porządek, uporządkowanie, kolejność i sortowanie Efektywność różnych działań zwykle wzrasta, gdy dane, na których pracujemy są w pewien sposób uporządkowane (posortowane). Zbiór posortowany to taki zbiór, w którym kolejne elementy są poukładane w pewnym porządku (kolejności), który określamy za pomocą pewnej relacji porządkowej (np. <, <=, >, >=), która jednoznacznie wyznacza kolejność elementów w zbiorze. Możemy mówić o: porządku rosnącym: D = {1,2,2,4,4,5,6,8,8,9} porządku malejącym: D = {9,8,8,6,5,4,4,2,2,1} Wykład 5. Strona 2.
Porządek, uporządkowanie, kolejność i sortowanie Sortowanie jest to proces układania elementów zbioru w kolejności wg pewnego porządku, czyli ma zatem prowadzić do znalezienia odpowiedniej permutacji elementów zbioru nieuporządkowanego, aby w wyniku tego działania spełniały założony porządek. Sortować możemy cokolwiek (liczby, znaki, ciągi znaków, kolory, obrazy ) jeśli tylko wyznaczona jest relacja porządkująca te elementy. Sortowanie stosuje się w celu ułatwienia późniejszego wyszukiwania elementów sortowanego zbioru. Sortowanie jest bardzo powszechnym działaniem w wielu różnych dziedzinach. Sortowane są obiekty w listach płac, książka telefonicznych i adresowych, w bibliotekach, słownikach, magazynach i wszędzie tam, gdzie występuje potrzeba szybkiego przeszukiwania i dostępu do składowanych obiektów. Wykład 5. Strona 3.
Podział algorytmów sortowania Wybór algorytmu sortowania zależny jest od wykorzystywanej struktury danych, złożoności pamięciowej, zachowania kolejności elementów o tej samej wartości: Sortowanie wewnętrzne (tablic, które są przechowywane w szybkiej, o dostępie swobodnym wewnętrznej pamięci komputerów zwykle RAM) Sortowanie zewnętrzne (plików sekwencyjnych, które są zazwyczaj przechowywane w wolniejszej pamięci zewnętrznej z dostępem bezpośrednim tylko do wierzchu każdej sterty danych). Sortowanie stabilne - zachowują kolejność elementów o równych wartościach. Oznacza to, że elementy o równych wartościach będą występowały w tej samej kolejności w zbiorze posortowanym, w jakiej występowały w zbiorze nieposortowanym. Jest to istotne w sytuacji, gdy nie chcemy, żeby elementy o równych wartościach klucza zmieniały swoje względne położenie, np. pracując na rekordach baz danych. Sortowanie niestabilne - kolejność wynikowa elementów o równych wartościach jest nieokreślona, czyli względne uporządkowanie elementów o równych wartościach zwykle nie zostaje zachowane. Wykład 5. Strona 4.
Podział algorytmów sortowania Wybór algorytmu sortowania zależny jest od wykorzystywanej struktury danych, złożoności pamięciowej, zachowania kolejności elementów o tej samej wartości: Sortowanie w miejscu (in place) - wymagają stałej liczby dodatkowych struktur danych, która nie zależy od liczby elementów sortowanego zbioru danych (ani od ich wartości). Dodatkowa złożoność pamięciowa jest zatem klasy O(1). Sortowanie odbywa się wewnątrz zbioru. Ma to bardzo istotne znaczenie w przypadku dużych zbiorów danych, gdyż mogłoby się okazać, iż posortowanie ich nie jest możliwe z uwagi na brak pamięci w systemie. Sortowanie nie w miejscu - wymagają zarezerwowania w pamięci dodatkowych obszarów, których wielkość jest uzależniona od liczby sortowanych elementów lub od ich wartości. Tego typu algorytmy są zwykle bardzo szybkie w działaniu, jednakże okupione to jest dodatkowymi wymaganiami na pamięć. Zatem w pewnych sytuacjach może się okazać, iż taki algorytm nie będzie w stanie posortować dużego zbioru danych, ponieważ system komputerowy nie posiada wystarczającej ilości pamięci RAM. Wykład 5. Strona 5.
Ocena efektywności algorytmów sortowania iech sortowanie będzie działaniem na obiektach a 1, a 2,..., a n i polega na takim ponumerowaniu tych obiektów a k1, a k2,..., a kn, że dla dla zdanej funkcji porządkującej f spełniona jest: f(a k1 ) f(a k2 )... f(a kn ). Często obiekty rzeczywiste a i sortowane są według pewnego określonego klucza służącego identyfikacji obiektów, które zdefiniujemy sobie następująco: type obiekt = record klucz: integer; {deklaracje innych składowych} end gdzie inne składowe reprezentują właściwe dane dotyczące obiektu. Wykład 5. Strona 6.
Ocena efektywności algorytmów sortowania Do najważniejszych kryteriów oceny jakości metod sortowania należą: złożoność pamięciowa - ilość potrzebnej pamięci (oszczędność pamięci) złożoność czasowa ilość potrzebnych operacji: liczba koniecznych porównań kluczy liczba koniecznych przesunięć/przestawień obiektów. Dobre algorytmy sortowania wymagają porównań rzędu: n log n. Metody proste wymagają zazwyczaj porównań rzędu: n 2. Do dużych zbiorów danych stosujemy metody skomplikowane o złożoności obliczeniowej O(n log n), jednak dla dostatecznie małych n metody proste są często bardziej efektywne ze względu na swoją prostotę. Istnieją też algorytmy o złożoności O(n) przy dodatkowych warunkach! Wykład 5. Strona 7.
Sortowanie bąbelkowe (Bubble Sort) Sortowanie bąbelkowe (przez zamianę) polega na cyklicznym porównywaniu par sąsiadujących elementów (bąbelków) oraz zmianie ich kolejności w przypadku niespełnienia relacji porządkującej pomiędzy nimi. Operację tą powtarzamy, dopóki cały zbiór nie zostanie posortowany. Złożoność obliczeniowa algorytmu sortowania bąbelkowego O(n 2 ): Po = (n 2 -n)/2 Pr min = 0 Pr śr = 3*(n 2 -n)/4 Pr max = 3*(n 2 -n)/2 Sortowanie stabilne, w miejscu, wewnętrzne. Wykład 5. Strona 8.
Sortowanie bąbelkowe (Bubble Sort) Wykład 5. Strona 9.
Sortowanie bąbelkowe z jednostronnym pominięciem pustych operacji Algorytm sortowania bąbelkowego w każdym obiegu przepycha element maksymalny na koniec, wobec czego nie ma sensu sprawdzać takich elementów. Ponadto wykonuje dwa rodzaje operacji: test bez i z zamianą miejsc elementów. Można zatem wyeliminować te operacje, które nie dokonują zamianę, a ponadto brak zamian w danym obiegu oznacza możliwość zakończenia algorytmu sortowania. Wykład 5. Strona 10.
Sortowanie bąbelkowe z jednostronnym pominięciem pustych operacji Wykład 5. Strona 11.
Sortowanie bąbelkowe z dwustronnym pominięciem pustych operacji Ponadto algorytm sortowania bąbelkowego dokonuje niepotrzebnych sprawdzeń już posortowanych elementów na początku tablicy, biorąc pod uwagę, iż elementy mniejsze w porównywanym bąbelku mogą zostać przepchnięte maksymalnie o 1 pozycję wstecz. Wykład 5. Strona 12.
Sortowanie bąbelkowe z dwustronnym pominięciem pustych operacji Wykład 5. Strona 13.
Sortowanie przez wstawianie (Insertion Sort) Algorytm ten można porównać do sposobu układania kart pobieranych z talii. Kolejne brane karty porównujemy z kartami już ułożonymi, które trzymamy w ręce i szukamy dla niej odpowiedniego miejsca, gdzie ją wkładamy rozsuwając pozostałe karty. Sortując w tablicy na jednym końcu (zwykle z tyłu) jest posortowana część zbioru, która sukcesywnie rozrasta się do całej tablicy. Złożoność obliczeniowa algorytmu sortowania przez wstawianie O(n 2 ): Po min = n 1 Po śr = (n 2 + n 2)/4 Po max = (n 2 + n)/2 1 Pr min = 2(n-1) Pr śr = (n 2 + 9n 10)/4 Pr max = (n 2 + 3n - 4)/2 Sortowanie stabilne, w miejscu, wewnętrzne. Wykład 5. Strona 14.
Sortowanie przez wstawianie (Insertion Sort) Wykład 5. Strona 15.
Sortowanie przez wstawianie połówkowe (Binary Insertion Sort) W tej wersji algorytmu wykorzystano fakt, iż elementy są posortowane w przedziale, gdzie wstawiany jest kolejny element, wobec czego można zastosować szybszy algorytm dziel i zwyciężaj do odnalezienia miejsca wstawienia tego elementu. Złożoność obliczeniowa algorytmu sortowania przez wstawianie O(n 2 ): Po = log 2 1 + log 2 2 +... + log 2 n n(log n c) + c; gdzie c = 1/ln 2 = 1,44 Pr min = 2(n-1) Pr śr = (n 2 + 9n 10)/4 Pr max = (n 2 + 3n - 4)/2 Sortowanie stabilne, w miejscu, wewnętrzne. Wykład 5. Strona 16.
Sortowanie przez wstawianie połówkowe (Binary Insertion Sort) Wykład 5. Strona 17.
Sortowanie przez wybieranie (Selection Sort) Jeśli zbiór sortujemy rosnąco, najmniejszy element powinien znaleźć się na pierwszej pozycji, wobec czego szukamy najmniejszy element w ciągu jeszcze nieposortowanym i zamieniamy go z elementem na pierwszej pozycji. W ten sposób element z pierwszej pozycji znajdzie się na pozycji najmniejszego elementu. Z pozostałego przedziału nieposortowanych elementów wybieramy następny najmniejszy element itd. Złożoność obliczeniowa algorytmu sortowania przez wybieranie O(n 2 ): Po = (n 2 -n)/2 Pr min = 3(n-1) Pr śr = n(ln n+γ) gdzie γ=0,577216 jest stałą Eulera Pr max = trunc(n/4) 2 + 3(n-1) Sortowanie niestabilne, w miejscu, wewnętrzne. Wykład 5. Strona 18.
Sortowanie przez wybieranie (Selection Sort) Wykład 5. Strona 19.
Literatura i bibliografia: Algorytmy sortujące: http://www.i-lo.tarnow.pl/edu/inf/alg/algsort/index.html Algorytmy sortujące: http://www.home.umk.pl/~abak/wdimat/s/index.html L. Banachowski, K. Diks, W. Rytter: Algorytmy i struktury danych, WNT, Warszawa, 2001 Z. Fortuna, B. Macukow, J. Wąsowski, Metody numeryczne, WNT, Warszawa, 1993. K. Jakubczyk, Turbo Pascal i Borland C++, Wydanie II, Helion, 2006. J. i M. Jankowscy, Przegląd metod i algorytmów numerycznych, WNT, Warszawa, 1988. A. Kiełbasiński, H. Schwetlick, Numeryczna algebra liniowa, WNT, Warszawa 1992. A. Kierzkowski, Turbo Pascal. Ćwiczenia praktyczne., Helion 2006. K. Koleśnik, Wstęp do programowania z przykładami w Turbo Pascalu, Helion, M. Sysło: Elementy Informatyki. A. Szepietowski: Podstawy Informatyki. R. Tadeusiewicz, P. Moszner, A. Szydełko: Teoretyczne podstawy informatyki. W. M. Turski: Propedeutyka informatyki. N. Wirth: Wstęp do programowania systematycznego. N. Wirth: ALGORYTMY + STRUKTURY DANYCH = PROGRAMY. Wykład 5. Strona 20.