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