Więcej o sprawności algorytmów Porównanie czasów działania algorytmów sortowania przez wstawianie i scalanie Załóżmy, że możemy wykonać dane zadanie przy użyciu dwóch algorytmów: jednego o złożoności czasowej Θ(n 2 ), a drugiego o złożoności Θ(n log 2 n) na przykład sortowanie n-elementowej tablicy metodą przez wstawianie i scalanie. Sortowanie przez wstawianie wykonajmy na szybkim komputerze (mała stała przed Θ) a sortowanie przez scalanie na bardzo wolnym (duża stała przed Θ). 1
Niech np. F wst (n) = 0.01 n 2, natomiast F sc (n) = 100 n log 2 n. 4. 10 7 8. 10 8 3. 10 7 6. 10 8 2. 10 7 4. 10 8 1. 10 7 2. 10 8 5000 10 000 15000 20 000 25000 30000 50 000 100000 150 000 200 000 250 000 300000 Oś x: liczba elementów do posortowania Oś y: czas sortowania Wniosek: optymalniejszy algorytm wygrywa dla odpowiednio dużego rozmiaru problemu, mimo iż został uruchomiony na 10 000 razy wolniejszym komputerze! 2
Rozsądny a nierozsądny czas działania Liczba operacji potrzebna do rozwiązania problemu o danej złożoności obliczeniowej złożoność / n 10 50 100 300 1 000 log n 3 5 6 8 10 n 10 50 100 300 1 000 n log n 33 282 665 2 469 9 966 n 2 100 2 500 10 000 90 000 1 000 000 n 3 1 000 125 000 1 000 000 27 000 000 1 000 000 000 2 n 1 024 liczba 16-cyfr. liczba 31-cyfr. liczba 91-cyfr. liczba 302-cyfr. n! 3 600 000 liczba liczba liczba niewyobrażalnie n n 65-cyfr. 10 000 000 000 liczba 85-cyfr. 161-cyfr. liczba 201-cyfr. 623-cyfr. liczba 744-cyfr. duża niewyobrażalnie duża Dla porównania: liczba protonów we Wszechświecie liczba 126-cyfrowa; liczba mikrosekund od wielkiego wybuchu liczba 24-cyfrowa 3
Maksymalny rozmiar problemu możliwego do rozwiązania w danym czasie (przy założeniu 1 000 000 operacji na sekundę) złożoność / czas 1 s 1 min 1 godz 1 rok log n 2 1 000 000 2 60 000 000 2 36 000 000 000 2 n 10 6 6 x 10 7 3.6 x 10 9 3 x 10 13 n log n 62 746 2.8 x 10 6 1.3 x 10 8 8 x 10 11 n 2 1 000 7 746 60 000 5.6 x 10 6 2 n 19 25 31 44 n! 9 11 12 16 300 000 000 000 000 Wniosek: algorytmy o rozsądnym czasie wykonania to algorytmy o co najwyżej wielomianowej złożoności obliczeniowej. 4
Problemy zamknięte, luka algorytmiczna Górne ograniczenie (czasu, pamięci): O(f(n)), np. O(n), O(n 2 ), O(n!) Dolne ograniczenie (czasu, pamięci): Ω(f(n)), np. Ω(log n) Wyszukiwanie dolne ograniczenie: Ω(log n) algorytm wyszukiwania liniowego złożoność O(n) algorytm wyszukiwania binarnego złożoność O(log n) Sortowanie dolne ograniczenie: Ω(n log n) algorytm przez wstawianie złożoność O(n 2 ) algorytmy sortowania stogowego i szybkiego złożoność O(n log n) 5
Wieże Hanoi dolne ograniczenie: Ω(2 n ) algorytm rekurencyjny złożoność O(2 n ) Dla powyższych problemów znaleziono optymalne rozwiązania są to problemy zamknięte. W pozostałych przypadkach (gdy nie znaleziono optymalnego rozwiązania danego problemu) mówimy o luce algorytmicznej (np. problem komiwojażera). 6
Problemy decyzyjne Problemy, nie dające rzeczywistych wyników a jedynie odpowiedź tak lub nie. Ich rozwiązanie polega jedynie na zdecydowaniu, czy pewna własność zachodzi dla danych wejściowych. małpia układanka : czy istnieje rozwiązanie dla danej liczby kart? 7
problem ścieżki Hamiltona: czy istnieje ścieżka w grafie, przechodząca przez wszystkie punkty dokładnie raz? problem ścieżki Eulera: czy istnieje ścieżka w grafie, przechodząca przez wszystkie krawędzie dokładnie raz? 8
problem komiwojażera: czy istnieje cykl w grafie o całkowitym koszcie nie większym niż zadany? problem układania planu zajęć. Czy jest możliwe ułożenie optymalnego układu zajęć przy zadanych kryteriach? problem ustalania prawdy logicznej, np: ~(E F) (F (D ~E)) Dla powyższych problemów (oprócz ścieżki Eulera) występuje luka algorytmiczna najlepsze dolne ograniczenia są rzędu Ω(n), a znaleziono ich jedynie wykładnicze Ω(2 n ) rozwiązania. 9
Kłopotliwe pytania 1. Komputery są coraz szybsze może po prostu czekać na odpowiednie zwiększenie ich szybkości, zamiast szukać nowych algorytmów? 2. A może po prostu niekompetencja informatyków/matematyków w wymyślaniu nowych algorytmów? 3. Czy nikt nie próbował znaleźć wykładniczego dolnego ograniczenia dla tych problemów, aby mieć dowód, że nie istnieje rozsądny algorytm? 4. A może te problemy są odosobnionymi, specyficznymi problemami i nie warto sobie nimi zawracać głowy? 10
Klasyfikacja problemów algorytmicznych (klasy złożoności) Klasa złożoności to zbiór problemów obliczeniowych o podobnej złożoności obliczeniowej. Przykładowo, mówimy o problemach o liniowej złożoności pamięciowej, jeśli ilość potrzebnej pamięci rośnie liniowo względem rozmiaru danych; czy też o problemach o kwadratowej złożoności czasowej, jeśli liczba operacji podstawowych rośnie z kwadratem rozmiaru danych wejściowych. Stosujemy też szersze pojęcia takie jak klasa P, czy NP mając odpowiednio na uwadze decyzyjne problemy wielomianowe i decyzyjne problemy podlegające wielomianowej weryfikacji, jeśli odpowiedź jest twierdząca. Problem P (ang. deterministic polynomial deterministycznie wielomianowy) to problem decyzyjny, dla którego rozwiązanie można znaleźć w czasie wielomianowym. Problem NP (ang. nondeterministic polynomial nieokreślony wielomianowo) to problem decyzyjny, dla którego rozwiązanie można zweryfikować w czasie wielomianowym. 11
Różnica pomiędzy problemami P i NP polega na tym, że w przypadku P znalezienie rozwiązania ma złożoność wielomianową, podczas gdy dla NP sprawdzenie podanego z zewnątrz rozwiązania ma taką złożoność. W szczególności, wszystkie problemy klasy P są problemami klasy NP, ponieważ można je sprawdzić w czasie wielomianowym. Nie wiadomo natomiast, czy istnieje problem NP, który nie jest w klasie P. Jest to jedno z wielkich nierozwiązanych zagadnień matematyki i informatyki. Przykład: Czy jakikolwiek podzbiór zadanego zbioru (np. { 2, 6, 3, 72, 10, 11}) sumuje się do zera? Algorytm sprawdzenia wszystkich możliwych podzbiorów ma złożoność wykładniczą ze względu na liczebność zbioru. Nie znamy rozwiązania tego zagadnienia w czasie wielomianowym (ale być może ono istnieje). Nie wiadomo zatem, czy problem ten jest klasy P. Na pewno natomiast, uzyskawszy z zewnątrz kandydata na rozwiązanie (np. { 2, 6, 3, 10, 11}), możemy w liniowym (a zatem wielomianowym) czasie sprawdzić, czy sumuje się do zera. Jest to zatem problem NP. 12
Problemy NP-zupełne (NPC) to takie problemy klasy NP, że każdy inny problem klasy NP może zostać do nich zredukowany w czasie wielomianowym rozwiązanie jednego takiego problemu w czasie wielomianowym oznaczałoby, że P = NP. 13
Kolejna klasa problemów: problemy nierozstrzygalne (nieobliczalne) Wprowadź do komputera właściwe oprogramowanie a otrzymasz, co tylko zechcesz. Twoje chęci może ograniczać jedynie sama maszyna oprogramowanie nie stawia żadnych ograniczeń Time 1984 r. Czy to prawda? Czy mając dostatecznie dużo pieniędzy, czasu i rozumu potrafimy rozwiązać każdy problem programistyczny? Problem algorytmiczny, do którego nie ma żadnego algorytmu, nazywamy nieobliczalnym. Jeżeli jest to problem decyzyjny, nazywamy go nierozstrzygalnym. 14
Wąż domino Dane jest n opisów kart. Liczba kart danego opisu jest nieskończona. Czy możliwe jest poprowadzenie węża pomiędzy wybranymi punktami nie przekraczając zadanego obszaru Q? Q = obszar ograniczony: rozstrzygalny Q = płaszczyzna: rozstrzygalny Q = półpłaszczyzna: nierozstrzygalny 15
Inny problem: Czy mając n opisów kart domina, możemy nimi pokryć dowolną skończoną powierzchnię zgodnie z zasadami układania domina? problem nierozstrzygalny: nie ma i nie będzie algorytmu, który rozwiązywałby ten problem. 16