Algorytmy i Struktury Danych. - Metoda ``Dziel i zwyciezaj``. Problem

Transkrypt

Algorytmy i Struktury Danych. - Metoda ``Dziel i zwyciezaj``. Problem
Algorytmy i Struktury Danych.
Metoda “Dziel i zwycieżaj”.
˛
Problem Sortowania, cd.
Bożena Woźna-Szcześniak
[email protected]
Jan Długosz University, Poland
Wykład 2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
1 / 47
Metoda “dziel i zwycieżaj”
˛
Idea
Metoda dziel i zwycieżaj
˛
(ang. divide and conquer) jest metoda˛
projektowania algorytmów, w której dany problem jest dzielony na
kilka mniejszych podproblemów podobnych do poczatkowego
˛
problemu.
Problemy te sa˛ rozwiazywane
˛
rekurencyjnie, a nastepnie
˛
rozwiazania
˛
wszystkich podproblemów sa˛ łaczone
˛
w celu
utworzenia rozwiazania
˛
całego problemu.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
2 / 47
Metoda “dziel i zwycieżaj”
˛
W podejściu dziel i zwycieżaj
˛
każdy poziom rekursji składa sie˛ z
nastepuj
˛ acych
˛
trzech etapów:
Dziel: Dzielimy problem na podproblemy.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
3 / 47
Metoda “dziel i zwycieżaj”
˛
W podejściu dziel i zwycieżaj
˛
każdy poziom rekursji składa sie˛ z
nastepuj
˛ acych
˛
trzech etapów:
Dziel: Dzielimy problem na podproblemy.
Zwycieżaj:
˛
Rozwiazujemy
˛
podproblemy rekurencyjnie, chyba że
sa˛ one małego rozmiaru i już nie wymagaja˛ zastosowania rekursji
- używamy wtedy bezpośrednich metod.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
3 / 47
Metoda “dziel i zwycieżaj”
˛
W podejściu dziel i zwycieżaj
˛
każdy poziom rekursji składa sie˛ z
nastepuj
˛ acych
˛
trzech etapów:
Dziel: Dzielimy problem na podproblemy.
Zwycieżaj:
˛
Rozwiazujemy
˛
podproblemy rekurencyjnie, chyba że
sa˛ one małego rozmiaru i już nie wymagaja˛ zastosowania rekursji
- używamy wtedy bezpośrednich metod.
Połacz:
˛
Łaczymy
˛
rozwiazania
˛
podproblemów, aby otrzymać
rozwiazanie
˛
całego problemu.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
3 / 47
Dziel i Zwycieżaj
˛
- przykłady zastosowań
Znajdowanie najwiekszego
˛
i najmniejszego elementu zbioru.
Wyszukiwanie binarne
Potegowanie
˛
liczb
Sortowanie szybkie
Sortowanie przez scalanie
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
4 / 47
Element minimalny i maksymalny zbioru
Definicja problemu:
Dane:
n - liczba elementów zbioru
a1 , a2 , a3 , . . . , an - ciag
˛ elementów
Szukane: Elementy najwiekszy
˛
i najmniejszy zbioru.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
5 / 47
Element minimalny i maksymalny zbioru
Require: tablica A o rozmiarze n {A=[0,. . . ,n-1]}
Algorytm: MIN
1: min = 0;
2: for all i = 1 to n do
3:
if A[i] < A[min] then
4:
min = i;
5:
end if
6:
i = i + 1;
7: end for
8: return min;
Algorytm: MAX
1: max = 0;
2: for all i = 1 to n do
3:
if A[i] > A[max] then
4:
max = i;
5:
end if
6:
i = i + 1;
7: end for
8: return max;
Bożena Woźna-Szcześniak (AJD)
Naiwne rozwiazanie
˛
problemu:
Najpierw wyszukujemy
element najwiekszy
˛
metoda˛
bezpośrednia,
˛ a potem
element najmniejszy.
Złożoność obliczeniowa: O(n)
Algorytm MAX : n - 1
operacji porównania
Algorytm MIN : n - 1 operacji
porównania
Razem MAX i MIN : 2n - 2
operacji porównania
Przykład: 2 5 3 1 8 9 1 5 4 - 16
porównań
Algorytmy i Struktury Danych.
Wykład 2
6 / 47
Element minimalny i maksymalny zbioru
Można spróbować usprawnić rozwiazanie
˛
naiwne, znajdujac
˛
najpierw kandydatów na Min i Max.
Takie wyszukanie realizowane jest poprzez porównywanie
elementów parami.
Nastepnie
˛
stosowany jest algorytm MIN, a potem Max (lub
odwrotnie), na odpowiednim zbiorze kandydatów.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
7 / 47
Element minimalny i maksymalny zbioru
Przykład:
Zbiór wejściowy: 2, 5, 3, 1, 8, 9, 1, 5, 4
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
8 / 47
Element minimalny i maksymalny zbioru
Przykład:
Zbiór wejściowy: 2, 5, 3, 1, 8, 9, 1, 5, 4
Porównywanie parami: 2 < 5, 3 < 1, 8 < 9, 1 < 5, 4
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
8 / 47
Element minimalny i maksymalny zbioru
Przykład:
Zbiór wejściowy: 2, 5, 3, 1, 8, 9, 1, 5, 4
Porównywanie parami: 2 < 5, 3 < 1, 8 < 9, 1 < 5, 4
Kandydaci na MIN: 2, 1, 8, 1, 4.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
8 / 47
Element minimalny i maksymalny zbioru
Przykład:
Zbiór wejściowy: 2, 5, 3, 1, 8, 9, 1, 5, 4
Porównywanie parami: 2 < 5, 3 < 1, 8 < 9, 1 < 5, 4
Kandydaci na MIN: 2, 1, 8, 1, 4.
Na tym zbiorze stosowany jest algorytm MIN.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
8 / 47
Element minimalny i maksymalny zbioru
Przykład:
Zbiór wejściowy: 2, 5, 3, 1, 8, 9, 1, 5, 4
Porównywanie parami: 2 < 5, 3 < 1, 8 < 9, 1 < 5, 4
Kandydaci na MIN: 2, 1, 8, 1, 4.
Na tym zbiorze stosowany jest algorytm MIN.
Kandydaci na MAX: 5, 3, 9, 5, 4.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
8 / 47
Element minimalny i maksymalny zbioru
Przykład:
Zbiór wejściowy: 2, 5, 3, 1, 8, 9, 1, 5, 4
Porównywanie parami: 2 < 5, 3 < 1, 8 < 9, 1 < 5, 4
Kandydaci na MIN: 2, 1, 8, 1, 4.
Na tym zbiorze stosowany jest algorytm MIN.
Kandydaci na MAX: 5, 3, 9, 5, 4.
Na tym zbiorze stosowany jest algorytm MAX.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
8 / 47
Element minimalny i maksymalny zbioru
Przykład:
Zbiór wejściowy: 2, 5, 3, 1, 8, 9, 1, 5, 4
Porównywanie parami: 2 < 5, 3 < 1, 8 < 9, 1 < 5, 4
Kandydaci na MIN: 2, 1, 8, 1, 4.
Na tym zbiorze stosowany jest algorytm MIN.
Kandydaci na MAX: 5, 3, 9, 5, 4.
Na tym zbiorze stosowany jest algorytm MAX.
Ostatni - nieparzysty element został dodany do obu zbiorów.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
8 / 47
Element minimalny i maksymalny zbioru
Przykład:
Zbiór wejściowy: 2, 5, 3, 1, 8, 9, 1, 5, 4
Porównywanie parami: 2 < 5, 3 < 1, 8 < 9, 1 < 5, 4
Kandydaci na MIN: 2, 1, 8, 1, 4.
Na tym zbiorze stosowany jest algorytm MIN.
Kandydaci na MAX: 5, 3, 9, 5, 4.
Na tym zbiorze stosowany jest algorytm MAX.
Ostatni - nieparzysty element został dodany do obu zbiorów.
Wykorzystujemy tu własność podziału mówiac
˛ a,
˛ iż w każdym
zbiorze skończonym zawsze znajduje sie˛ element najwiekszy
˛
i
element najmniejszy.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
8 / 47
Element minimalny i maksymalny zbioru
Szacowanie:
Przy rozdzielaniu elementów wykonano 4 porównania.
Algorytm MIN na zbiorze {2, 1, 8, 1, 4} wykonał 4 porównania i
zwrócił wartość 1.
Algorytm MAX również na zbiorze {5, 3, 9, 5, 4} wykonał 4
porównania i zwrócił wartość 9.
W sumie wykonano 4 + 4 + 4 = 12 porównań, co oznacza 25%
wzrost wydajności w porównaniu z podejściem naiwnym (tam
potrzebnych było 16 porównań)!
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
9 / 47
Element minimalny i maksymalny zbioru
Require: tablica A o rozmiarze n
{A = [0, . . . , n − 1]}
Algorytm: MIN-MAX
1: min = 0; max = 0;
2: for i = 0 to n − 2 do
3:
if A[i] < A[i + 1] then
4:
if A[i] < A[min] then
5:
min = i;
6:
end if
7:
if A[i + 1] > A[max] then
8:
max = i + 1;
9:
end if
10:
else
11:
if A[i + 1] < A[min] then
12:
min = i + 1;
13:
end if
14:
if A[i] > A[max] then
15:
max = i;
16:
end if
17:
end if
18:
i = i + 2;
19: end for
Bożena Woźna-Szcześniak (AJD)
20: if n is odd then
21:
if A[n − 1] < A[min] then
22:
min = n − 1;
23:
end if
24:
if A[n − 1] > A[max] then
25:
max = n − 1;
26:
end if
27: end if
28: return A[min] and A[max];
Algorytmy i Struktury Danych.
Wykład 2
10 / 47
Wyszukiwanie binarne
Wyszukiwanie binarne pozwala na szybkie wyszukiwanie wartości w
posortowanych zbiorach (np. tablicy). Skuteczność wyszukiwania
binarnego wynika z tego, że zamiast przegladać
˛
wszystkie elementy
posortowanego zbioru po kolei, wykorzystujemy informacje˛ o tym, że
jest on uporzadkowany.
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
11 / 47
Wyszukiwanie binarne
Wyszukiwanie binarne pozwala na szybkie wyszukiwanie wartości w
posortowanych zbiorach (np. tablicy). Skuteczność wyszukiwania
binarnego wynika z tego, że zamiast przegladać
˛
wszystkie elementy
posortowanego zbioru po kolei, wykorzystujemy informacje˛ o tym, że
jest on uporzadkowany.
˛
Algorytm:
Dana jest tablica A oraz poszukiwany element key.
Sprawdź środkowy element tablicy. Jeśli jest równy key, to koniec.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
11 / 47
Wyszukiwanie binarne
Wyszukiwanie binarne pozwala na szybkie wyszukiwanie wartości w
posortowanych zbiorach (np. tablicy). Skuteczność wyszukiwania
binarnego wynika z tego, że zamiast przegladać
˛
wszystkie elementy
posortowanego zbioru po kolei, wykorzystujemy informacje˛ o tym, że
jest on uporzadkowany.
˛
Algorytm:
Dana jest tablica A oraz poszukiwany element key.
Sprawdź środkowy element tablicy. Jeśli jest równy key, to koniec.
Jeśli środkowy element jest wiekszy
˛
niż key, to poszukiwany
element jeśli jest w tablicy, to jest w jej lewej cz˛eści.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
11 / 47
Wyszukiwanie binarne
Wyszukiwanie binarne pozwala na szybkie wyszukiwanie wartości w
posortowanych zbiorach (np. tablicy). Skuteczność wyszukiwania
binarnego wynika z tego, że zamiast przegladać
˛
wszystkie elementy
posortowanego zbioru po kolei, wykorzystujemy informacje˛ o tym, że
jest on uporzadkowany.
˛
Algorytm:
Dana jest tablica A oraz poszukiwany element key.
Sprawdź środkowy element tablicy. Jeśli jest równy key, to koniec.
Jeśli środkowy element jest wiekszy
˛
niż key, to poszukiwany
element jeśli jest w tablicy, to jest w jej lewej cz˛eści.
Jeśli środkowy element jest mniejszy niż key, to poszukiwany
element jeśli jest w tablicy, to jest w jej prawej cz˛eści.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
11 / 47
Wyszukiwanie binarne - przykład
Znaleźć liczbe˛ 9 w ciagu:
˛
3, 5, 7, 8, 9, 12, 15 .
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
12 / 47
Twierdzenie 1– Cormen T.H., Leiserson Ch.E., Rivest
R.L. Wprowadzenie do algorytmów, Roz. 4 (str. 73)
T (n) = a ∗ T (n/b) + f (n)
n - rozmiar problemu; rozmiar danych wejściowych.
a - liczba podproblemów w rekurencji.
n/b - rozmiar każdego podproblemu; w zasadzie zakłada sie,
˛ że
wszystkie podproblemy sa˛ tego samego rozmiaru.
f(n) - koszt operacji poza rekurencyjnym wywołaniem zawierajacy
˛
koszt podziału probelmu na podproblemy i koszt operacji scalenia
rozwiaza
˛ ń.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
13 / 47
Twierdzenie 1– Cormen T.H., Leiserson Ch.E., Rivest
R.L. Wprowadzenie do algorytmów, Roz. 4 (str. 73)
T (n) = a ∗ T (n/b) + f (n)
n - rozmiar problemu; rozmiar danych wejściowych.
a - liczba podproblemów w rekurencji.
n/b - rozmiar każdego podproblemu; w zasadzie zakłada sie,
˛ że
wszystkie podproblemy sa˛ tego samego rozmiaru.
f(n) - koszt operacji poza rekurencyjnym wywołaniem zawierajacy
˛
koszt podziału probelmu na podproblemy i koszt operacji scalenia
rozwiaza
˛ ń.
A. f (n) = O(nlogb (a)−ǫ ) implikuje, że
T (n) = Θ(nlogb (a) ) dla pewnego ǫ > 0
B. f (n) = Θ(nlogb (a) log2k (n)) implikuje, że
T (n) = Θ(nlogb (a) ∗ log2k +1 (n)) dla pewnego k ≥ 0.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
13 / 47
Wyszukiwanie binarne - złożoność
nlogb (a) = nlog2 (1) = n0 = 1 ⇒ (Przypadek2)
T (n) = Θ(log2 (n))
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
14 / 47
Wyszukiwanie binarne - Koszt algorytmu
Złożoność pesymistyczna:
Operacja dominujaca:
˛
porównywanie elementów.
Koszt: T (n) = O(log2 (n))
Złożoność optymistyczna:
Operacja dominujaca:
˛
porównywanie elementów.
Koszt: T (n) = O(log2 (n)).
Złożoność pamieciowa:
˛
O(1).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
15 / 47
Wyszukiwanie binarne - implementacja
i n t binSearch ( i n t a [ ] , i n t n , i n t key )
{
i n t l e f t = 0 , r i g h t = n − 1;
w h i l e ( l e f t <= r i g h t ) {
i n t curr = ( l e f t + r i g h t ) / 2;
i f ( key == a [ c u r r ] ) {
return curr ;
} e l s e i f ( key < a [ c u r r ] ) {
r i g h t = curr − 1;
} else {
l e f t = curr + 1;
}
}
r e t u r n ( −1);
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
16 / 47
Wyszukiwanie binarne
Uwagi o przeszukiwaniu liniowym i binarnym
Niech n=20 000
Algorytm wyszukiwania liniowego – czyli przegladaj
˛ acy
˛ cała˛
tablice˛ element po elemencie – wykona 20 000 porównań.
Algorytm przeszukiwania binarnego wykona tylko
log2 (20000) = 14 porównań.
Algorytm wyszukiwania binarnego wymaga jednak przekazania
posortowanych danych.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
17 / 47
Potegowanie
˛
liczby
Problem: Oblicz an , dla n ∈ N.
Algorytm naiwny: an = |a · a {z
· . . . · a}
n
Złożoność: Θ(n)
Algorytm dziel i zwycieżaj:
˛
n/2 n/2
a ·a ,
gdy n jest parzyste
n
a =
an−1/2 · an−1/2 · a, gdy n jest nieparzyste
Złożoność: T (n) = T (n/2) + Θ(1) ⇒ θ(log2(n))
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
18 / 47
Sortowanie szybkie
Algorytm sortowania szybkiego (ang. quick sort) opracowany
przez C.A.R. Hoarea w 1962.
Algorytm QuickSortjest typowym algorytmem rekurencyjnym,
pracujacym
˛
w oparciu o technik˛e dziel i zwycieżaj.
˛
Algorytm zakłada dekompozycje˛ tablicy na mniejsze podtablice,
które łatwiej jest posortować.
Najcz˛eściej stosowany algorytm sortujacy
˛ w praktyce.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
19 / 47
Sortowanie szybkie
Idea
Rozdzielić elementy danego ciagu
˛ na dwie cz˛eści wzgledem
˛
pewnego ustalonego elementu, tzw. elementu osiowego (ang.
pivot), tak aby na lewo od niego znajdowały sie˛ elementy
mniejsze, a na prawo elementy wieksze.
˛
xx
xx
!! xx
Conquer:posortować
Recursively
thei na
two
subarrays.
Rekurencyjnie
elementysort
na lewo
prawo
od
elementu osiowego.
Połaczyć
˛
posortowane podtablice.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
20 / 47
Algorytm QuickSort -
Sortowanie szybkie - przykład
29
40
2
1
6
18
20
32
23
34
39
41
29
2
1
6
18
20
23
40
32
2
32
6
2
2010-02-16
Bożena Woźna-Szcześniak (AJD)
39
41
40
1
1
34
6
18
18
20
20
34
39
41
23
23
29
32
34
39
40
41
-
Algorytmy i Struktury Danych.
51
Wykład 2
21 / 47
Sortowanie szybkie
W celu podzielenia tablicy konieczne jest wykonanie dwóch
operacji:
znalezienie elementu osiowego i podzieleniu tablicy na dwie
podtablice.
przejrzeniu tablicy w celu umieszczenia jej elementów we
właściwych podtablicach.
Wybór dobrego elementu osiowego nie jest zadaniem łatwym –
(obie podtablice powinny mieć zbliżona˛ wielkość).
Najcz˛eściej stosowane strategie wyboru elementu osiowego:
wybranie pierwszego elementu tablicy.
wybranie elementu znajdujacego
˛
sie˛ pośrodku tablicy.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
22 / 47
Sortowanie szybkie - procedura podziału
Require: tablica A[p..q]
1: PARTITION(A, p, q)
2: x = A[p]; {element osiowy = A[p]}
3: i = p;
4: for all j = p + 1 to q do
5:
if A[j] ≤ x then
6:
i = i + 1;
7:
zamien(A[i],A[j]);
8:
end if
9: end for
10: zamien (A[p], A[i]);
11: return i
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
23 / 47
Sortowanie szybkie - procedura podziału, przykład
6
i
Bożena Woźna-Szcześniak (AJD)
10
j
13
5
8
3
Algorytmy i Struktury Danych.
2
11
Wykład 2
24 / 47
Sortowanie szybkie - procedura podziału, przykład
6
i
10
j
13
5
8
3
2
11
6
i
10
→
13
j
5
8
3
2
11
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
24 / 47
Sortowanie szybkie - procedura podziału, przykład
6
i
10
j
13
5
8
3
2
11
6
i
10
→
13
j
5
8
3
2
11
6
i
10
13
→
5
j
8
3
2
11
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
24 / 47
Sortowanie szybkie - procedura podziału, przykład
6
i
10
j
13
5
8
3
2
11
6
i
10
→
13
j
5
8
3
2
11
6
i
10
13
→
5
j
8
3
2
11
6
→
5
i
10
j
8
3
2
11
Bożena Woźna-Szcześniak (AJD)
13
Algorytmy i Struktury Danych.
Wykład 2
24 / 47
Sortowanie szybkie - procedura podziału, przykład
6
i
10
j
13
5
8
3
2
11
6
i
10
→
13
j
5
8
3
2
11
6
i
10
13
→
5
j
8
3
2
11
6
→
5
i
13
10
j
8
3
2
11
6
5
i
13
10
→
8
j
3
2
11
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
24 / 47
Sortowanie szybkie - procedura podziału, przykład
6
Bożena Woźna-Szcześniak (AJD)
5
i
13
10
8
→
3
j
Algorytmy i Struktury Danych.
2
11
Wykład 2
25 / 47
Sortowanie szybkie - procedura podziału, przykład
6
5
i
13
10
8
→
6
5
→
3
i
10
8
Bożena Woźna-Szcześniak (AJD)
3
j
2
11
13
j
2
11
Algorytmy i Struktury Danych.
Wykład 2
25 / 47
Sortowanie szybkie - procedura podziału, przykład
6
5
i
13
10
8
→
6
5
→
3
i
10
6
5
3
i
10
Bożena Woźna-Szcześniak (AJD)
3
j
2
11
8
13
j
2
11
8
13
→
2
j
11
Algorytmy i Struktury Danych.
Wykład 2
25 / 47
Sortowanie szybkie - procedura podziału, przykład
6
5
i
13
10
8
→
6
5
→
3
i
10
6
5
3
i
10
6
5
3
→
2
i
Bożena Woźna-Szcześniak (AJD)
3
j
2
11
8
13
j
2
11
8
13
→
2
j
11
10
j
11
8
13
Algorytmy i Struktury Danych.
Wykład 2
25 / 47
Sortowanie szybkie - procedura podziału, przykład
6
5
i
13
10
8
→
6
5
→
3
i
10
6
5
3
i
10
6
5
3
→
2
i
8
6
5
3
2
i
8
Bożena Woźna-Szcześniak (AJD)
3
j
2
11
8
13
j
2
11
8
13
→
2
j
11
13
10
j
11
13
10
→
11
j
Algorytmy i Struktury Danych.
Wykład 2
25 / 47
Sortowanie szybkie - procedura podziału, przykład
6
Bożena Woźna-Szcześniak (AJD)
5
3
2
i
8
13
10
Algorytmy i Struktury Danych.
11
→
j
Wykład 2
26 / 47
Sortowanie szybkie - procedura podziału, przykład
6
5
2
Bożena Woźna-Szcześniak (AJD)
3
5
2
i
3
8
6
i
13
8
10
13
Algorytmy i Struktury Danych.
10
11
→
j
11
Wykład 2
26 / 47
Sortowanie szybkie - algorytm
QuickSort (A, p, r)
Jeśli p = r , to koniec
Jeśli p < r , to
q = PARTITION(A, p, r).
QuickSort(A, p, q-1).
QuickSort(A, q+1, r).
Wywołanie: QuickSort(A, 1, n)
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
27 / 47
Sortowanie szybkie - Złożoność pesymistyczna:
Najgorszy przpadek dla algorytmu sortowania szybkiego to ciag
˛
danych już uporzadkowanych
˛
w kolejności odwrotnej do pożadanej.
˛
Jeśli Split jako mediane˛
wybiera zawsze pierwszy
element, to w wyniku
rozdzielenia, jedna cz˛eść
„młodsza” bedzie
˛
pusta , a
druga „starsza” bedzie
˛
zawierała o jeden element
mniej niż w poprzednim
kroku.
Koszt Operacji rozdzielania
dla n elementowego ciagu
˛
wynosi n − 1 porównań.
Bożena Woźna-Szcześniak (AJD)
T (n) = T (n − 1) + cn
T (n − 1) = T (n − 2) + c(n − 1)
T (n − 2) = T (n − 3) + c(n − 2)
..
.
T (2) = T (1) + c(2)
P
T (n) = T (1) + c ni=2 i = O(n2 )
Algorytmy i Struktury Danych.
Wykład 2
28 / 47
Sortowanie szybkie - Złożoność optymistyczna:
Podział jest zawsze perfekcyjnie zbalansowany.
Element osiowy jest zawsze po środku.
T (n) QuickSort (A, p, r)
Θ(1) Jeśli p = r , to koniec
Jeśli p < r , to
Θ(n) (1) q = PARTITION(A, p, r ).
2 · T (n/2) (2) rekurencyjnie posortuj A[p..q − 1] i A[q + 1..r ].
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
29 / 47
Sortowanie szybkie - Złożoność optymistyczna:
Podział jest zawsze perfekcyjnie zbalansowany.
Element osiowy jest zawsze po środku.
T (n) QuickSort (A, p, r)
Θ(1) Jeśli p = r , to koniec
Jeśli p < r , to
Θ(n) (1) q = PARTITION(A, p, r ).
2 · T (n/2) (2) rekurencyjnie posortuj A[p..q − 1] i A[q + 1..r ].
Θ(1)
n=1
T (n) =
2 · T (n/2) + Θ(n) n > 1
Na podstawie Twierdzenia 1 można pokazać, że powyższe równanie
rekurencyjne ma nastepuj
˛ ace
˛ rozwiazanie:
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
29 / 47
Sortowanie szybkie - Złożoność optymistyczna:
Podział jest zawsze perfekcyjnie zbalansowany.
Element osiowy jest zawsze po środku.
T (n) QuickSort (A, p, r)
Θ(1) Jeśli p = r , to koniec
Jeśli p < r , to
Θ(n) (1) q = PARTITION(A, p, r ).
2 · T (n/2) (2) rekurencyjnie posortuj A[p..q − 1] i A[q + 1..r ].
Θ(1)
n=1
T (n) =
2 · T (n/2) + Θ(n) n > 1
Na podstawie Twierdzenia 1 można pokazać, że powyższe równanie
rekurencyjne ma nastepuj
˛ ace
˛ rozwiazanie:
˛
nlogb (a) = nlog2 (2) = n1 = n ⇒ (Przypadek2)
T (n) = Θ(n · log2 (n))
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
29 / 47
Sortowanie szybkie - Koszt algorytmu
Złożoność pesymistyczna:
Operacja dominujaca:
˛
porównywanie elementów.
Koszt: T (n) = O(n2 )
Złożoność optymistyczna:
Operacja dominujaca:
˛
porównywanie elementów.
Koszt: T (n) = Θ(n · log2 (n)).
Złożoność pamieciowa:
˛
O(1).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
30 / 47
Sortowanie szybkie - implementacja
void quickSort ( i n t a [ ] , i n t l e f t , i n t r i g h t ) {
i f ( left < right ){
/ / podział t a b l ic y
int m = left ;
f o r ( i n t k = l e f t + 1 ; k <= r i g h t ; ++k ) {
i f ( a [ k ] < a [ l e f t ] ) swap ( a [++m] , a [ k ] ) ;
}
swap ( a [ l e f t ] , a [m ] ) ;
/ / Rekurencja
quickSort (a , l e f t , m − 1 ) ;
quickSort (a , m + 1 , r i g h t ) ;
}
}
v o i d swap ( i n t ∗ x , i n t ∗ y ) {
i n t tmp = ∗ x ; ∗ x = ∗y ; ∗y = tmp ;
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
31 / 47
Sortowanie przez scalanie
Jeden z pierwszych algorytmów sortowania.
Autor metody: John von Neumann
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
32 / 47
Sortowanie przez scalanie
Jeden z pierwszych algorytmów sortowania.
Autor metody: John von Neumann
Idea:
Dzielimy zadanie posortowania całego ciagu
˛ na dwa podzadania:
posortowania jego lewej i prawej połowy.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
32 / 47
Sortowanie przez scalanie
Jeden z pierwszych algorytmów sortowania.
Autor metody: John von Neumann
Idea:
Dzielimy zadanie posortowania całego ciagu
˛ na dwa podzadania:
posortowania jego lewej i prawej połowy.
Gdy obie cześci
˛
tworza˛ już ciagi
˛ uporzadkowane,
˛
wtedy scalamy je
otrzymujac
˛ rozwiazanie.
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
32 / 47
Sortowanie przez scalanie - przykład
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
33 / 47
Sortowanie przez scalanie - algorytm
MergeSort A[1..n]
Jeśli n = 1, to koniec
Jeśli n ≥ 2, rekurencyjnie posortuj A[1..n/2] i A[n/2+1..n].
Scal obie połowy A w jedna posortowana tablice.
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
34 / 47
Sortowanie przez scalanie - Operacja scalania
Zapamietujemy
˛
pozycje najmniejszego elementu w każdej
posortowanej połówce.
Wstawiamy najmniejszy z dwóch wskazywanych elementów do
tablicy pomocniczej.
Operacje powtarzamy dopóty, dopóki nie posortujemy wszystkich
elementów.
1 7 11 14 16
Najmniejszy nieprzetworzony: 1
8 9 12 18 20
Najmniejszy nieprzetworzony: 8
Minimum z 1 i 8 1
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
35 / 47
Sortowanie przez scalanie - Operacja scalania
Zapamietujemy
˛
pozycje najmniejszego elementu w każdej
posortowanej połówce.
Wstawiamy najmniejszy z dwóch wskazywanych elementów do
tablicy pomocniczej.
Operacje powtarzamy dopóty, dopóki nie posortujemy wszystkich
elementów.
1 7 11 14 16
Najmniejszy nieprzetworzony: 7
1
Bożena Woźna-Szcześniak (AJD)
8 9 12 18 20
Najmniejszy nieprzetworzony: 8
Minimum z 7 i 8
7
Algorytmy i Struktury Danych.
Wykład 2
36 / 47
Sortowanie przez scalanie - Operacja scalania
Zapamietujemy
˛
pozycje najmniejszego elementu w każdej
posortowanej połówce.
Wstawiamy najmniejszy z dwóch wskazywanych elementów do
tablicy pomocniczej.
Operacje powtarzamy dopóty, dopóki nie posortujemy wszystkich
elementów.
1 7 11 14 16
Najmniejszy nieprzetworzony: 11
1
Bożena Woźna-Szcześniak (AJD)
8 9 12 18 20
Najmniejszy nieprzetworzony: 8
Minimum z 11 i 8
7 8
Algorytmy i Struktury Danych.
Wykład 2
37 / 47
Sortowanie przez scalanie - Operacja scalania
Zapamietujemy
˛
pozycje najmniejszego elementu w każdej
posortowanej połówce.
Wstawiamy najmniejszy z dwóch wskazywanych elementów do
tablicy pomocniczej.
Operacje powtarzamy dopóty, dopóki nie posortujemy wszystkich
elementów.
1 7 11 14 16
Najmniejszy nieprzetworzony: 11
1
Bożena Woźna-Szcześniak (AJD)
8 9 12 18 20
Najmniejszy nieprzetworzony: 9
Minimum z 11 i 9
7 8 9
Algorytmy i Struktury Danych.
Wykład 2
38 / 47
Sortowanie przez scalanie - Operacja scalania
Zapamietujemy
˛
pozycje najmniejszego elementu w każdej
posortowanej połówce.
Wstawiamy najmniejszy z dwóch wskazywanych elementów do
tablicy pomocniczej.
Operacje powtarzamy dopóty, dopóki nie posortujemy wszystkich
elementów.
1 7 11 14 16
Najmniejszy nieprzetworzony: 11
1
Bożena Woźna-Szcześniak (AJD)
8 9 12 18 20
Najmniejszy nieprzetworzony: 12
Minimum z 11 i 12
7 8 9 11
Algorytmy i Struktury Danych.
Wykład 2
39 / 47
Sortowanie przez scalanie - Operacja scalania
Zapamietujemy
˛
pozycje najmniejszego elementu w każdej
posortowanej połówce.
Wstawiamy najmniejszy z dwóch wskazywanych elementów do
tablicy pomocniczej.
Operacje powtarzamy dopóty, dopóki nie posortujemy wszystkich
elementów.
1 7 11 14 16
Najmniejszy nieprzetworzony: 14
1
Bożena Woźna-Szcześniak (AJD)
7
8 9 12 18 20
Najmniejszy nieprzetworzony: 12
Minimum z 14 i 12
8 9 11 12
Algorytmy i Struktury Danych.
Wykład 2
40 / 47
Sortowanie przez scalanie - Operacja scalania
Zapamietujemy
˛
pozycje najmniejszego elementu w każdej
posortowanej połówce.
Wstawiamy najmniejszy z dwóch wskazywanych elementów do
tablicy pomocniczej.
Operacje powtarzamy dopóty, dopóki nie posortujemy wszystkich
elementów.
1 7 11 14 16
Najmniejszy nieprzetworzony: 14
1
Bożena Woźna-Szcześniak (AJD)
7
8 9 12 18 20
Najmniejszy nieprzetworzony: 18
Minimum z 14 i 18
8 9 11 12 14
Algorytmy i Struktury Danych.
Wykład 2
41 / 47
Sortowanie przez scalanie - Operacja scalania
Zapamietujemy
˛
pozycje najmniejszego elementu w każdej
posortowanej połówce.
Wstawiamy najmniejszy z dwóch wskazywanych elementów do
tablicy pomocniczej.
Operacje powtarzamy dopóty, dopóki nie posortujemy wszystkich
elementów.
1 7 11 14 16
Najmniejszy nieprzetworzony: 16
1
Bożena Woźna-Szcześniak (AJD)
7
8 9 12 18 20
Najmniejszy nieprzetworzony: 18
Minimum z 16 i 18
8 9 11 12 14 16
Algorytmy i Struktury Danych.
Wykład 2
42 / 47
Sortowanie przez scalanie - Operacja scalania
Zapamietujemy
˛
pozycje najmniejszego elementu w każdej
posortowanej połówce.
Wstawiamy najmniejszy z dwóch wskazywanych elementów do
tablicy pomocniczej.
Operacje powtarzamy dopóty, dopóki nie posortujemy wszystkich
elementów.
1 7 11 14 16
Najmniejszy nieprzetworzony: 1
7
Bożena Woźna-Szcześniak (AJD)
8
9
11
8 9 12 18 20
Nieprzetworzone: 18 i 20
12
14
Algorytmy i Struktury Danych.
16
18
20
Wykład 2
43 / 47
Sortowanie przez scalanie - implementacja
MergeSort ( i n t A [ ] , i n t l e f t , i n t r i g h t )
{
i f ( right > l e f t ) {
mid = ( l e f t + r i g h t ) / 2 ;
MergeSort ( A , l e f t , mid ) ;
MergeSort ( A , mid +1 , r i g h t ) ;
merge ( A , l e f t , mid , r i g h t )
}
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
44 / 47
Sortowanie przez scalanie - implementacja
v o i d merge ( T∗ a , i n t l e f t , i n t mid , i n t r i g h t )
{
i n t ∗ t = c a l l o c ( r i g h t +1 , s i z e o f ( i n t ) ) ;
i n t n = r i g h t − l e f t + 1;
i n t i = l e f t , j = mid + 1 , k = 0 ;
w h i l e ( i <= mid && j <= r i g h t ) {
i f (a[ i ] < a[ j ] )
t [ k ++] = a [ i + + ] ;
e l s e t [ k ++] = a [ j + + ] ;
}
w h i l e ( i <= mid ) { / / Dolaczanie koncowki p i e r w s z e j p o d t a b l i c y
t [ k ++] = a [ i + + ] ;
}
w h i l e ( j <= r i g h t ) { / / Dolaczanie koncowki d r u g i e j p o d t a b l i c y
t [ k ++] = a [ j + + ] ;
}
/ / Kopiowanie t a b l i c y pomocniczej
f o r ( k = 0 ; k < n ; ++k ) a [ l e f t + k ] = t [ k ] ;
free ( t )
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
45 / 47
Sortowanie przez scalanie - Koszt algorytmu
T (n)
Θ(1)
2 · T (n/2)
Θ(n)
MergeSort A[1..n]
Jeśli n = 1, to koniec
Jeśli n ≥ 2, rekurencyjnie posortuj A[1..n/2] i A[n/2+1..n].
Scal obie połowy A w jedna posortowana tablice.
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
46 / 47
Sortowanie przez scalanie - Koszt algorytmu
T (n)
Θ(1)
2 · T (n/2)
Θ(n)
MergeSort A[1..n]
Jeśli n = 1, to koniec
Jeśli n ≥ 2, rekurencyjnie posortuj A[1..n/2] i A[n/2+1..n].
Scal obie połowy A w jedna posortowana tablice.
˛
T (n) =
Θ(1)
n=1
2 · T (n/2) + Θ(n) n > 1
Na podstawie Twierdzenia 1 można pokazać, że powyższe równanie
rekurencyjne ma nastepuj
˛ ace
˛ rozwiazanie:
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
46 / 47
Sortowanie przez scalanie - Koszt algorytmu
T (n)
Θ(1)
2 · T (n/2)
Θ(n)
MergeSort A[1..n]
Jeśli n = 1, to koniec
Jeśli n ≥ 2, rekurencyjnie posortuj A[1..n/2] i A[n/2+1..n].
Scal obie połowy A w jedna posortowana tablice.
˛
T (n) =
Θ(1)
n=1
2 · T (n/2) + Θ(n) n > 1
Na podstawie Twierdzenia 1 można pokazać, że powyższe równanie
rekurencyjne ma nastepuj
˛ ace
˛ rozwiazanie:
˛
nlogb (a) = nlog2 (2) = n1 = n ⇒ (Przypadek2)
T (n) = Θ(n · log2 (n))
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
46 / 47
Sortowanie przez scalanie - Koszt algorytmu
Złożoność pesymistyczna:
Operacja dominujaca:
˛
porównywanie elementów.
Koszt: T (n) = Θ(n · log2 (n))
Złożoność optymistyczna:
Operacja dominujaca:
˛
porównywanie elementów.
Koszt: T (n) = Θ(n · log2 (n)).
Złożoność pamieciowa:
˛
O(1).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 2
47 / 47