Algorytmy i Struktury Danych, 2. ¢wiczenia
2009-10-13
1 Plan zaj¦¢
• Dolna granica dla wyszukiwania minimum spo±ród n-elementów przez po- równania (argument grafowy).
• Pokaza¢, »e w pesymistycznym przypadku min musi by¢ porównywane co najmniej dlog ne razy.
• Wywnioskowa¢ st¡d, »e policzenie drugiego co do wielko±ci wymaga co najmniej n − 1 + dlog ne − 1 porówna«.
• Zaproponowa¢ algorytm na drugi co do wielko±ci w czasie z 4 i ugólni¢ go na k-ty co wielko±ci (algorytm Hadiana-Sobela).
• ShellSort: k-sortowanie zachowuje h-posortowanie, algorytm Pratta z kro- kami postaci 2p3q
• MergeSort w miejscu dla ci¡gów dªugo±ci p(n) i n − p(n)
• sortowanie ci¡gów 0-1 w miejscu i stabilnie
• optymalne sortowanie 5 elementów w modelu drzew decyzyjnych
• sortowanie permutacji (¢wiczenie ilustruj¡ce rol¦ modelu oblicze«)
2 Dowód, »e n − 1 porówna« jest potrzebne do znajdowania minimum
We¹my algorytm, A, powiedzmy, za ka»dym razem, gdy porównuje on dwa elementy, to ª¡czymy je kraw¦dzi¡. Je±li A u»yª mniej ni» n − 1 porówna«, to istniej¡ dwa elementy, które nie s¡ ze sob¡ porównywalne.
3 Optymalny algorytm do znajdowania min i max jednocze±nie
Algorytm dziel i rz¡d¹. (3dn/2e − 2 porówna«)
• for i = 1 to dn/2e do Q.push(pair(min(A[2i − 1], A[2i]), max(A[2i − 1], A[2i])))
• while |Q| > 1 do
(a1, b1) = Q.P OP,
(a2, b2) = Q.P OP,
Q.P USH(min(a1, a2), max(b1, b2))
• return Q.P OP
Jest to równie» optymalna liczba porówna«. (Knuth, Tom 3, ¢wiczenie 16, strona 231). Niech (a, b, c, d) oznacza stan oblicze« algorytmu,
• a liczba elementów, które nie byªy jeszcze porównywane,
• b liczba elementów, które byªy porównywane i nie przegraªy »adnego porównania,
• c liczba elementów, które byªy porównywane i przegraªy wszystkie po- równania,
• d liczba elementów, które wygraªy co najmniej jedno porównanie, i przegraªy co najmniej jedno porównanie.
Dowolny algorytm zaczyna obliczenia w stanie (n, 0, 0, 0) i powinien ko«czy¢ w (0, 1, 1, n − 2)(je±li ko«czy w innym to ªatwo poda¢ kontprzykªad).
Konstrukcja przeciwnika dla algorytmu. Dla zapytania (x, y) postaci:
• (a1, a2) odpowiada a1< a2, zmiana (−2, +1, +1, 0)
• (b1, b2) odpowiada b1< b2, zmiana (0, −1, 0, +1)
• (c1, c2) odpowiada c1< c2, zmiana (0, 0, −1, +1)
• (a1, b1) odpowiada a1< b1, zmiana (−1, 0, +1, 0)
• (a1, c1) odpowiada a1> c1, zmiana (−1, +1, 0, 0)
• (a1, d1) odpowiada a1> d1, zmiana (−1, +1, 0, 0)
• (d1, d2) odpowiada d1< d2, zmiana (0, 0, 0, 0)
• (b1, c1) odpowiada b1> c1, zmiana (0, 0, 0, 0)
• (b1, d1) odpowiada b1> d1, zmiana (0, 0, 0, 0)
• (c1, d1) odpowiada c1< d1, zmiana (0, 0, 0, 0)
Dowolny algorytm musi zada¢ co najmniej dn/2e zapyta« typu (a, ∗), aby zmniejszy¢ licznik a o n, a co za tym idzie liczniki b i c zostan¡ sumarycznie zwi¦kszone o n. eby zmniejszy¢ liczniki b i c o n−2 nale»y wykona¢ co najmniej n − 2zapyta« typu (b|c, ∗).
4 Optymalne znajdowanie drugiego co wielko±ci elementu
• budujemy drzewo turniejowe (porównujemy s¡siednie elementy, dalej prze- chodzi wygrany) ten krok zabiera n − 1 porówna«,
• niech S zbiór elementów które przegraªy z liderem, |S| = dlog ne
• wybierz lidera w±ród elementów S ten krok zabiera |S|−1 = dlog ne−1 porówna«.
• razem n + dlog ne − 2
Dowód, »e algorytm jest optymalny. Knuth, tom III, 5.3.3. strona 221.
5 Optymalne sortowanie 5ciu elementów
Niech A = (a, b, c, d, e).
• compare(a, b), (niech a < b)
• compare(c, d), (niech c < d)
• compare(a, c), (niech a < c)
• teraz wkªadamy, e pomi¦dzy a, c, d,
if (e > c) then compare(e, a) else compare(e, d)
• mo»emy otrzyma¢ jeden z nast¦puj¡cych posetów:
ka»dy z nich mo»na posortowa¢ u»ywaj¡c 2 porówna«.
6 Sortowanie metod¡ Shella, dowody
Lemat 1 Niech m, n, r b¦d¡ nieujemnymi liczba caªkowitymi i niech (x1, . . . , xm+r) oraz (y1, . . . , yn+r)b¦d¡ dowolnymi ci¡gami liczbowymi takimi, »e yi≤ xm+idla 1 ≤ i ≤ r. Je±li elementy x oraz y posortujemy niezale»nie tak, »e x1 ≤ . . . ≤ xm+r oraz y1≤ . . . ≤ yn+r to nadal b¦dziemy mieli yi≤ xm+i dla 1 ≤ i ≤ r.
Po posortowaniu element xm+ijest wi¦kszy b¡d¹ równy od co najmniej m+i elementów z x, w±ród nich jest co najmniej i elementów które przed sortowaniem byªy na pozycjach m, . . . , m + r, ka»dy z tych elementów ma w±ród y element od którego jest wi¦kszy, st¡d xm+ijest wi¦kszy b¡d¹ równy od i najmniejszych elementów y.
Lemat 2 Je±li tablica jest h posortowana i k posortujemy, to nadal b¦dzie h posortowana.
Niech ai i ai+h elementy które po sortowaniu nie s¡ h posortowane. Niech Y ci¡g zawieraj¡cy ai, ai+k, ai+2k, . . .. Niech X ci¡g zawieraj¡cy ai+h, ai+h+k, ai+h+2k, . . .. Po k posortowaniu ci¡gi Y i X s¡ uporz¡dkowane, z poprzedniego
lematu mamy jednak, »e ai≤ ai+h sprzeczno±¢. qued
Lemat 3 Liczba porówna« wymagana przy h posortowaniu tablicy rozmiaru n wynosi O(n2/h).
Mamy h ci¡gów, ka»dy o dªugo±ci n/h st¡d caªkowity czas wynosi h ·
n2/h2= n2/h. qued
Lemat 4 Liczba porówna« wymagana przy hiposortowaniu tablicy rozmiaru n, która jest hi+1 i hi+2 posortowana wynosi O(nhi+1hi+2/hi)(przy zaªo»eniu, »e hi+1 i hi+2 s¡ wzgl¦dnie pierwsze)
TODOTrzeba pokaza¢, »e je±li ci¡g jest hi+1 i hi+2 posortowany, to je±li k ≥
hi+1hi+2, to ai≤ ai+k. qued
Lemat 5 Dla ci¡gu h = {2i− 1 : i ∈ N } algorytm ShellSort ma zªo»ono±¢
O(n√ n).
(Knuth, tom III, strona 95)
Niech Bi koszt itej fazy, t = dlog ne. Dla pierwszy t/2 przebiegów h ≥ sqrtn, poniewa» koszt jednej fazy jest ograniczona przez O(n2/h) st¡d suma- ryczny koszt jest rz¦du O(n1.5). Dla pozostaªych przebiegów mo»emy skorzysta¢
z poprzedniego lematu, koszt pojedynczej fazy jest równy Bi = O(nhi+2hi+1/hi),
wi¦c sumaryczny koszt tych faz jest równie» rz¦du O(n1.5). qued
Lemat 6 Dla ci¡gu h = {2i3j : i, j ∈ N } algorytm ShellSort ma zªo»ono±¢
O(n log2n).
Wszystkich faz algorytmu jest O((log n)2). Trzeba pokaza¢, »e ka»da z nich zajmuje O(n) czasu. Obserwacja je±li ci¡g jest 2 i 3 uporz¡dkowany, to jego 1posortowanie wymaga O(n) czasu. Analogicznie je±li ci¡g jest 2i i 3i posorto-
wany to jego i posortowanie wymaga O(n). qued
7 Algorytm generowania kroków postaci 2
p3
qon- line
Algorytm 1: GenSequence() h = emptyHeap(); seq = ∅ ;
1
h.add(1); ;
2
while true do
3
x = h.extractM in();
4
seq.add(x);
5
h.add(3 · x);
6
if h mod 3 6= 0 then
7
h.add(2 · x);
8
8 Sortowanie ci¡gu 01
Stabilne sortowanie tablicy 0/1 w miejscu.
Rozwi¡zanie O(n log n):
Algorytm 2: Sort01()
/* merge(l, m, r) scala dwa ci¡gi (l..m − 1) i (m..r) postaci
0∗1∗ w jeden ciag (l, r) */
for i = 0 to dlog ne do
1
b = 2i; j = 1;
2 while j < n do
3
merge(j, j + b, j + 2 · b − 1);
4
j = j + 2 · b;
5
9 Scalanie w miejscu dla ci¡gów dªugo±ci √ n i n − √
n
Algorytm 3: Merge(A)
Dana jest tablica A zawieraj¡ca dwa uporz¡dkowane rosn¡co ci¡gi:
1
1..n −√
ni n −√
n + 1..n. ;
Posortuj (u»ywaj¡c alg. insertion sort) ci¡g n − 2√
n + 1..n;
2 Scal ci¡g 1..n − 2√
ni n − 2√
n + 1..n −√
nu»ywaj¡c obszaru
3
n −√
n + 1..njako bufor ;
Posortuj (u»ywaj¡c alg. insertion sort) ci¡g n −√
n + 1..n;
4