Algorytmy i Struktury Danych, 1. ¢wiczenia
2008-10-06
1 Plan zaj¦¢
• Dolne granice dla min, min i max, second min
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«)
• Q = ∅
• 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,
1
• 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.
2