O(n - Wkuwanko.pl
Transkrypt
O(n - Wkuwanko.pl
Dr Aleksander Klosow PWSZ Legnica, 2003 www.strony.wp.pl/wp/klosov/ Algorytmy i Struktury Danych Wykład 4 SORTOWANIE POWTÓRZENIE Funkcja nazywa się rekurencyjną, jeżeli w trakcie wykonania odwołuje się do samej siebie Istnieją różne typy rekurencji: - Naturalna; Terminalna; Z parametrem; Wielokrotna i inne. Derekursywacją nazywamy proces przekształcenia programu rekurencyjnego na program iteracyjny ! Rozwiązać samodzielnie: - W sposób rekurencyjny odwrócić kolejność elementów w tablicy T[N] - Znaleźć sumę elementów tablicy T[N] w sposób rekurencyjny SORTOWANIE SORTOWANIE Definicja - Sortowaniem nazywamy proces ustawiania zbioru obiektów w określonym porządku. Motywacja - Ułatwić wyszukiwanie danych Wymaganie - Oszczędne korzystanie z pamięci (n.p., sortując tablicę liczb nie można korzystać z dodatkowej tablicy) KLASYFIKACJA METOD SORTOWANIA Sortowanie proste Sortowanie szybkie - Proste wybieranie (selection sort) - Proste wstawianie (insertion sort) - Prosta zamiana (exchange sort) - Metoda Shell'a (malejących przyrostów) - Scalanie ciągów - Kopcowanie (stogowe, heap sort) - Quicksort (sortowanie przez podział) Zalety prostych metod: 1) Programy są krótkie, łatwe do zrozumienia, zajmują mniej pamięci 2) Są szybsze dla małej liczby elementów 3) Lepiej nadają się do wyjaśnienia zasad sortowania MIARA EFEKTYWNOŚCI SORTOWANIA Kryterium: oszczędne zużycie czasu Miara: liczba koniecznych porównań + liczba koniecznych przesunięć PO + PR Metody proste Metody szybkie O( n2 ) O( n log2(n) ) O() - funkcja złożoności teoretycznej algorytmów z asymptotyczną granicą górną ...istnieją również : Θ() - ... z asymptotyczną granicą górną oraz dolną o() - ... z górną granicą asymptotycznie nie dokładna ZŁOŻONOŚĆ TEORETYCZNA ALGORYTMÓW Dokładna liczbą operacji porównania oraz przepisania stanowi praktyczną złożoność algorytmu T(n). Typ funkcji matematycznej, która w największym stopniu wyznacza wielkość T(n) nazywamy złożonością teoretyczną O(f(n)) T(n) 2n+5 5n+8 2n2+3n+2 an3+2n2+8 2n+n2+2 O() - klasa algorytmu O(n) O(n) O(n2) O(n3) O(2n) SORTOWANIE metodą prostej zamiany bąbelkowe 2 5 4 1 3 6 1. Sprawdzamy całą tablicę od początku do końca, porównując zawsze dwa sąsiednie elementy 2. Jeżeli trafimy na parę elementów, w której większy poprzedza mniejszy to zamieniamy je miejscami. 3. Czynność powtarzamy tak długo aż podczas sprawdzania całej tablicy, nie zajdzie ani jedna zamiana elementów SORTOWANIE metodą prostej zamiany Realizacja klasyczna - C void bubble_sort(int *tab, int n) { int zmiana; do { zmiana = 0; // brak zmian for(int i=1;i<n; i++) if(tab[i-1]>tab[i]) { // zamiana sąsiednich elementów int tmp=tab[i-1]; tab[i-1] = tab[i]; tab[i] = tmp; zmiana = 1; // jest zmiana } } while(zmiana); } SORTOWANIE metodą prostej zamiany Realizacja zmodyfikowana - Pascal procedure bubble_sort(var tab: array[1..n] of integer); var i,j,tmp:integer; begin for i:=2 to n do begin for j:=n downto i do if tab[j-1]>tab[j] then begin tmp:=tab[j-1]; tab[j-1]:=tab[j]; tab[j]:=tmp; end end end SORTOWANIE metodą prostej zamiany Analiza złożoności min śr max PO 0.5(n2-n) 0.5(n2-n) 0.5(n2-n) Złożoność teoretyczna: O(n2) PR 0 0.75(n2-n) 1.5(n2-n) T(n) 0.5(n2-n) 1.25(n2-n) 2(n2-n) SORTOWANIE metodą prostego wybierania 2 5 4 1 3 6 1. Wybieramy najmniejszy element tablicy 2. Wymieniamy go z pierwszym elementem 3. Powtarzamy operacje 1-2 dla pozostałych n-1 elementów, następnie dla n-2 i t.d. aż pozostanie 1 element. SORTOWANIE metodą prostego wybierania Realizacja - Pascal procedure proste_wybieranie(var tab:array[1..n] of integer) var i,j,k,min:integer; BEGIN for i:=1 to n-1 do begin k:=i; // pozycja najmniejszego elementu min:=a[i]; // najmniejszy element for j:=i+1 to n do // pętla wyznaczająca najmniejszy element if a[j]<min then begin k:=j; min:=a[j]; end; a[k]:=a[i]; // wymiana pierwszego z najmniejszym a[i]:=min; end END SORTOWANIE metodą prostego wybierania Analiza złożoności min śr max PO 0.5(n2-n) 0.5(n2-n) 0.5(n2-n) Złożoność teoretyczna: O(n2) PR 3(n-1) n(ln(n)+0.57) 0.25n2+3(n-1) T(n) 0.5n2+2.5n-3 0.5n2+n(ln(n)+0.07) 0.75n2+2.5n-3 SORTOWANIE metodą prostego wstawiania 2 5 4 1 3 6 1. Elementy są podzielone umownie na ciąg wynikowy oraz ciąg źródłowy 2. W każdym kroku począwszy od i=2 i zwiększając i o jeden, i-ty element ciągu źródłowego przenosi się do ciągu wynikowego, wstawiając go w odpowiednie miejsce. 3. Proces przenoszenia i-go elementu kończy się kiedy: a) znaleziono j-ty element mniejszy niż i-ty element b) osiągnięto lewy koniec ciągu wynikowego SORTOWANIE metodą prostego wstawiania Realizacja - Pascal procedure proste_wstawianie(var tab:array[1..n] of integer) var i,j,tmp:integer; BEGIN for i:=2 to n do // element wstawiany begin tmp:=a[i]; a[0]:=tmp; // wartownik j:=i -1; // element ciągu wynikowego while tmp<a[j] do begin a[j+1]:=a[j]; // przesunięcie w prawo j:=j-1; // następny element end; a[j+1]:=tmp; // wstawienie elementu end END SORTOWANIE metodą prostego wstawiania Analiza złożoności min śr max PO n-1 0.25(n2+n-2) 0.5(n2+n)-1 Złożoność teoretyczna: O(n2) PR 2(n-1) 0.25(n2+9n-10) 0.5(n2+3n-4) T(n) 3(n-1) 0.5(n2+5n-6) n2+2n-3 PORÓWNANIE METOD SORTOWANIA PROSTEGO Metoda sortowania Prosta zamiana Proste wybieranie Proste wstawianie Metoda sortowania Prosta zamiana Proste wybieranie Proste wstawianie Klasa O(n2) O(n2) O(n2) Klasa O(n2) O(n2) O(n2) Najlepszy wynik T(100) Najgorszy wynik T(100) 9950 5247 297 19800 7747 10197 Najlepszy wynik T(10) Najgorszy wynik T(10) 45 72 27 180 97 117 JAK POLICZYĆ ZŁOŻONOŚĆ PRAKTYCZNĄ? void bubble_sort(int *tab, int n) { int zmiana; int po=0, pr=0; do { pr++, zmiana = 0; for(pr++, int i=1; po++, i<n; i++) if(po++, tab[i-1]>tab[i]) { pr+=4; int tmp=tab[i-1]; tab[i-1] = tab[i]; tab[i] = tmp; zmiana = 1; } } while(po++, zmiana); } WNIOSKI 1. Najszybszą jest metoda prostego wybierania 2. Metoda bąbelkowa jest najpowolniejsza w większości wypadkach 3. Metoda prostego wstawiania jest najlepsza dla częściowo lub całkowicie uporządkowanych ciągów 4. Metoda bąbelkowa najlepiej się nadaje dla ciągów długości < 30