problemów Katedra Informatyki Politechniki Świętokrzyskiej Kielce, 16 stycznia 2007
problemów Plan wykładu 1 2 algorytmów 3 4 5 6 problemów
problemów Plan wykładu 1 2 algorytmów 3 4 5 6 problemów
problemów Plan wykładu 1 2 algorytmów 3 4 5 6 problemów
problemów Plan wykładu 1 2 algorytmów 3 4 5 6 problemów
problemów Plan wykładu 1 2 algorytmów 3 4 5 6 problemów
problemów Plan wykładu 1 2 algorytmów 3 4 5 6 problemów
problemów Efektywność - dodatkowa własność algorytmów D.E.Knuth Sztuka programowania : Algorytm powinien być określony efektywnie w tym sensie, że jego operacje powinny być wystarczająco proste, by (przynajmniej teoretycznie) można było je dokładnie i w skończonym czasie wykonać za pomocą ołówka i kartki.
problemów Efektywność - dodatkowa własność algorytmów Definicja efektywności: Efektywnością algorytmu będziemy nazywać zapotrzebowanie jego implementacji (programu komputerowego) na zasoby (pamięć, czas procesora) zgromadzone w konkretnym systemie komputerowym.
problemów Efektywność algorytmu zależy od: Czynniki wpływające na efektywność algorytmów Maszyna wzorcowa Analiza algorytmów architektury systemu komputerowego,
problemów Efektywność algorytmu zależy od: Czynniki wpływające na efektywność algorytmów Maszyna wzorcowa Analiza algorytmów architektury systemu komputerowego, konfiguracji sprzętowej systemu komputerowego
problemów Efektywność algorytmu zależy od: Czynniki wpływające na efektywność algorytmów Maszyna wzorcowa Analiza algorytmów architektury systemu komputerowego, konfiguracji sprzętowej systemu komputerowego rozmiaru danych wejściowych,
problemów Efektywność algorytmu zależy od: Czynniki wpływające na efektywność algorytmów Maszyna wzorcowa Analiza algorytmów architektury systemu komputerowego, konfiguracji sprzętowej systemu komputerowego rozmiaru danych wejściowych, porządku danych wejściowych.
Problemy Plan problemów Czynniki wpływające na efektywność algorytmów Maszyna wzorcowa Analiza algorytmów 1 Jakiej miary użyć do wyrażenia efektywności (sekundy,cykle,bajty)?
Problemy Plan problemów Czynniki wpływające na efektywność algorytmów Maszyna wzorcowa Analiza algorytmów 1 Jakiej miary użyć do wyrażenia efektywności (sekundy,cykle,bajty)? 2 Jak porównywać poszczególne platformy systemowe?
problemów Maszyna wzorcowa Czynniki wpływające na efektywność algorytmów Maszyna wzorcowa Analiza algorytmów Maszyna o dostępie swobodnym do pamięci Chcąc wyznaczyć efektywność działania algorytmu niezależnie od języka programowania, ani sprzętu na którym zostanie on zrealizowany, należy przyjąć jakąś maszynę wzorcową, która będzie wykonywała ten algorytm. Taką maszyną może być maszyna Turinga lub maszyna RAM. Ta ostatnia jest abstrakcyjnym, jednoprocesorowym komputerem, który dysponuje nieograniczoną pamięcią o dostępie swobodnym. Dostęp swobodny oznacza, że odwołanie do dowolnej lokacji tej pamięci (komórki) jest realizowane w takim samym czasie, niezależnie od jej położenia. Procesor tej maszyny ma krótką listę rozkazów, z których każdy jest zawsze wykonywany w takim samym czasie jak pozostałe.
problemów Czynniki wpływające na efektywność algorytmów Maszyna wzorcowa Analiza algorytmów Definicja wyznacza wielkość zasobów jakie potrzebne są do wykonania algorytmu w dowolnym systemie komputerowym.
problemów Rodzaje złożoności obliczeniowej Czynniki wpływające na efektywność algorytmów Maszyna wzorcowa Analiza algorytmów Złożoność czasowa Złożoność czasowa jest to zależność między rozmiarem i porządkiem danych wejściowych algorytmu, a czasem wykonania algorytmu. Rozmiar danych najczęściej jest wyrażany w liczbie elementów stanowiących dane wejściowe, natomiast czas jest wyrażany w przybliżonej liczbie kroków, jakie musi wykonać maszyna z pamięcią o dostępie swobodnym, by zakończyć wykonanie algorytmu.
problemów Rodzaje złożoności obliczeniowej Czynniki wpływające na efektywność algorytmów Maszyna wzorcowa Analiza algorytmów Złożoność czasowa Złożoność czasowa jest to zależność między rozmiarem i porządkiem danych wejściowych algorytmu, a czasem wykonania algorytmu. Rozmiar danych najczęściej jest wyrażany w liczbie elementów stanowiących dane wejściowe, natomiast czas jest wyrażany w przybliżonej liczbie kroków, jakie musi wykonać maszyna z pamięcią o dostępie swobodnym, by zakończyć wykonanie algorytmu. Złożoność pamięciowa Złożoność pamięciowa jest to zależność pomiędzy rozmiarem i porządkiem danych wejściowych algorytmu, a jego zapotrzebowaniem na pamięć niezbędną do jego realizacji. Wielkość tej pamięci wyrażana jest w liczbie elementów, które należy przechować.
problemów Analiza złożoności algorytmów Czynniki wpływające na efektywność algorytmów Maszyna wzorcowa Analiza algorytmów nie zależy od architektury i konfiguracji sprzętowej komputerów (wyznaczamy ją dla maszyny z pamięcią o dostępie swobodnym), ale zależy od rozmiaru i uporządkowania danych wejściowych. Wyznaczając złożoność obliczeniową algorytmu badamy trzy przypadki.
problemów Czynniki wpływające na efektywność algorytmów Maszyna wzorcowa Analiza algorytmów Analizowane przypadki wykonania algorytmów Przypadek optymistyczny Zakładamy takie wstępne uporządkowanie danych wejściowych, że algorytm jest wykonywany najszybciej i wymaga najmniej pamięci do swojego działania.
problemów Czynniki wpływające na efektywność algorytmów Maszyna wzorcowa Analiza algorytmów Analizowane przypadki wykonania algorytmów Przypadek pesymistyczny Zakładamy takie wstępne uporządkowanie danych wejściowych, że algorytm jest wykonywany najwolniej i wymaga najwięcej pamięci do swojego działania.
problemów Czynniki wpływające na efektywność algorytmów Maszyna wzorcowa Analiza algorytmów Analizowane przypadki wykonania algorytmów Przypadek średni Badamy zapotrzebowanie algorytmu na pamięć i czas procesora dla najczęściej spotykanych uporządkowań danych wejściowych. Im ta złożoność jest bliższa złożoności przypadku optymistycznego, tym lepiej.
problemów Notacja wielkie theta Notacja wielkie o Notacja wielkie omega Notacje małe o i małe omega Najczęściej nie interesuje nas dokładne wyznaczenie złożoność obliczeniowej, wystarcza nam jej oszacowanie. Wynik takiego oszacowania najlepiej przedstawić za pomocą jednej z notacji asymptotycznych.
Notacja Θ Plan problemów Notacja wielkie theta Notacja wielkie o Notacja wielkie omega Notacje małe o i małe omega Θ(g(n)) = {f (n) : istnieją dodatnie stałe c 1, c 2, n 0 takie, że 0 c 1 g(n) f (n) c 2 g(n) dla wszystkich n n 0 }
Notacja Θ Plan problemów Notacja wielkie theta Notacja wielkie o Notacja wielkie omega Notacje małe o i małe omega Θ(g(n)) = {f (n) : istnieją dodatnie stałe c 1, c 2, n 0 takie, że 0 c 1 g(n) f (n) c 2 g(n) dla wszystkich n n 0 }
Notacja Θ Plan problemów Notacja wielkie theta Notacja wielkie o Notacja wielkie omega Notacje małe o i małe omega Θ(g(n)) = {f (n) : istnieją dodatnie stałe c 1, c 2, n 0 takie, że 0 c 1 g(n) f (n) c 2 g(n) dla wszystkich n n 0 }
Notacja Θ Plan problemów Notacja wielkie theta Notacja wielkie o Notacja wielkie omega Notacje małe o i małe omega Θ(g(n)) = {f (n) : istnieją dodatnie stałe c 1, c 2, n 0 takie, że 0 c 1 g(n) f (n) c 2 g(n) dla wszystkich n n 0 }
Notacja Θ Plan problemów Notacja wielkie theta Notacja wielkie o Notacja wielkie omega Notacje małe o i małe omega Θ(g(n)) = {f (n) : istnieją dodatnie stałe c 1, c 2, n 0 takie, że 0 c 1 g(n) f (n) c 2 g(n) dla wszystkich n n 0 }
Notacja O Plan problemów Notacja wielkie theta Notacja wielkie o Notacja wielkie omega Notacje małe o i małe omega O(g(n)) = {f (n) : istnieją dodatnie stałe c, n 0 takie, że 0 f (n) c g(n) dla wszystkich n n 0 }
Notacja O Plan problemów Notacja wielkie theta Notacja wielkie o Notacja wielkie omega Notacje małe o i małe omega O(g(n)) = {f (n) : istnieją dodatnie stałe c, n 0 takie, że 0 f (n) c g(n) dla wszystkich n n 0 }
Notacja O Plan problemów Notacja wielkie theta Notacja wielkie o Notacja wielkie omega Notacje małe o i małe omega O(g(n)) = {f (n) : istnieją dodatnie stałe c, n 0 takie, że 0 f (n) c g(n) dla wszystkich n n 0 }
Notacja O Plan problemów Notacja wielkie theta Notacja wielkie o Notacja wielkie omega Notacje małe o i małe omega O(g(n)) = {f (n) : istnieją dodatnie stałe c, n 0 takie, że 0 f (n) c g(n) dla wszystkich n n 0 }
Notacja Ω Plan problemów Notacja wielkie theta Notacja wielkie o Notacja wielkie omega Notacje małe o i małe omega Ω(g(n)) = {f (n) : istnieją dodatnie stałe c, n 0 takie, że 0 c g(n) f (n) dla wszystkich n n 0 }
Notacja Ω Plan problemów Notacja wielkie theta Notacja wielkie o Notacja wielkie omega Notacje małe o i małe omega Ω(g(n)) = {f (n) : istnieją dodatnie stałe c, n 0 takie, że 0 c g(n) f (n) dla wszystkich n n 0 }
Notacja Ω Plan problemów Notacja wielkie theta Notacja wielkie o Notacja wielkie omega Notacje małe o i małe omega Ω(g(n)) = {f (n) : istnieją dodatnie stałe c, n 0 takie, że 0 c g(n) f (n) dla wszystkich n n 0 }
Notacja Ω Plan problemów Notacja wielkie theta Notacja wielkie o Notacja wielkie omega Notacje małe o i małe omega Ω(g(n)) = {f (n) : istnieją dodatnie stałe c, n 0 takie, że 0 c g(n) f (n) dla wszystkich n n 0 }
Notacje o i ω Plan problemów Notacja wielkie theta Notacja wielkie o Notacja wielkie omega Notacje małe o i małe omega Notacja o o(g(n)) = {f (n) : dla każdej dodatniej stałej c > 0, istnieje stała n 0 > 0 taka, że 0 f (n) < c g(n) dla wszystkich n n 0 } Notacja ω ω(g(n)) = {f (n) : dla każdej dodatniej stałej c > 0, istnieje stała n 0 > 0 takie, że 0 c g(n) < f (n) dla wszystkich n n 0 }
problemów Przykład pierwszy Przykład drugi Złożoność czasowa algorytmu insertionsort koszt liczba wykonań for j:=low(t)+1 to high(t) do c 1 n begin key:=t[j]; c 2 n-1 i:=j-1; c 3 n-1 n while (i>0) and (t[i]>key) do c 4 j=2 t j begin t[i+1]:=t[i]; c 5 i:=i-1; c 6 n j=2 (t j 1) n j=2 (t j 1) end; t[i+1]:=key; c 7 n-1 end;
problemów Przykład pierwszy Przykład drugi Ogólne równanie na czas działania algorytmu insertionsort T (n) = c 1 n + c 2 (n 1) + c 3 (n 1) + c 4 n j=2 t j + c 5 nj=2 (t j 1) + c 6 n j=2 (t j 1) + c 7 (n 1)
problemów Przykład pierwszy Przykład drugi Przypadek optymistyczny dla insertionsort Algorytm sortowania przez wstawianie najszybciej jest wykonywany, kiedy musi posortować tablicę już posortowaną (t j = 1): T (n) = c 1 n + c 2 (n 1) + c 3 (n 1) + c 4 (n 1) + c 7 (n 1) = (c 1 + c 2 + c 3 + c 4 + c 7 ) n (c 2 + c 3 + c 4 + c 7 ) Jeśli teraz przyjmiemy, że a = c 1 + c 2 + c 3 + c 4 + c 7, a b = c 2 + c 3 + c 4 + c 7 to możemy powyższe równanie zapisać jako T (n) = a n b
problemów Przypadek pesymistyczny Przykład pierwszy Przykład drugi Algorytm sortowania przez wstawianie wykonywany jest najwolniej, kiedy musi posortować tablicę posortowaną odwrotnie (t j = j). W takim przypadku nj=2 t j = n j=2 j = n (n+1) 2 1 i n j=2 (t j 1) = n j=2 (j 1) = n (n 1) 2
problemów Przypadek pesymistyczny Przykład pierwszy Przykład drugi Zatem: ( T (n) = c 1 n + c 2 (n 1) + c 3 (n 1) + c n (n+1) 4 2 1 ) + c 5 ( n (n 1) ) 2 + c6 ( n (n 1) ) 2 + c7 (n 1) = ( c4 2 + c 5 2 + c 6 2 ) n 2 + ( c 1 +c 2 +c 3 + c 4 2 c 5 2 c 6 2 +c 7 ) n (c2 +c 3 +c 4 +c 7 ) Jeżeli przyjmiemy, że a = c 4 2 + c 5 2 + c 6 2, b = c 1 + c 2 + c 3 + c 4 2 c 5 2 c 6 2 + c 7 i c = c 2 + c 3 + c 4 + c 7 To możemy zapisać powyższe równianie jako: T (n) = a n 2 + b n c
problemów Użycie notacji asymptotycznych Przykład pierwszy Przykład drugi Używając notacji asymptotycznych zwracamy uwagę na ten człon równania opisującego czas, który ma największe znaczenie i pomijamy wszelkie stałe. W przypadku optymistycznego przypadku czas działania algorytmu insertionsort możemy wyrazić jako T o (n) = Θ(n), w przypadku pesymistycznym jako T p (n) = Θ(n 2 ). Ogólnie możemy napisać, że czas działania algorytmu insertionsort wynosi T (n) = O(n 2 ) (jest to asymptotyczna granica górna czasu działania tego algorytmu - wiemy, że gorzej być nie może).
problemów Przypadek średni Przykład pierwszy Przykład drugi Analiza przypadku średniego (lub oczekiwanego) może być złożona, ze względu na określenie średnich danych wejściowych. Dosyć często przyjmuje się (jeśli jest to uzasadnione), że przypadek średni jest równy przypadkowi pesymistycznemu.
problemów Przykład pierwszy Przykład drugi Oszacowanie rzeczywistego czasu wykonania Załóżmy, że mamy algorytm sortowania, którego złożoność czasowa wynosi O(n 2 ). Dla tablicy o stu elementach (n=100) wykonywał się on przez dwie sekundy. Ile będzie wykonywał się ten algorytm dla jeśli tablica będzie miała 10 6 elementów? Czas ten obliczamy następująco: t = ( 2 106 10 2 ) 2 = (2 10 4 ) 2 = 4 10 8 sekund.
problemów Zależność między notacjami O, Θ i Ω Jeśli asymptotyczna granica dolna (notacja O) i asymptotyczna granica dolna (notacja Ω) są sobie równe, to możemy podać asymptotycznie dokładne oszacowanie czasu działania algorytmu (notacja Θ).
problemów Pułapki stosowania notacji asymptotycznych Stosując notacje asymptotyczne podajemy oszacowania czasu działania algorytmu lub jego wymagania co do pamięci, dla rozmiaru danych dążącego do nieskończoności, dlatego wolno nam zaniedbać stałe i niektóre mniej ważne człony w równaniach. Niestety te nieistotne stałe mogą mieć bardzo duży wpływ na np. czas działania algorytmu, jeśli jest on wykonywany dla danych o niewielkim rozmiarze. W ten sposób algorytm o złożoności czasowej O(n 2 ) może okazać się wydajniejszy od O(n).
problemów Pułapki stosowania notacji asymptotycznych Podając złożoność obliczeniową algorytmów z zastosowaniem notacji asymptotycznej podajemy jedynie rząd wielkości. Może się więc okazać, że dwa algorytmy należące do tej samej klasy złożoności nie zachowują się tak samo w codziennych zastosowaniach (np. bubblesort i selectionsort). W takich wypadkach konieczna jest dokładniejsza ocena ich złożoności (np. poprzez policzenie liczby porównań lub liczby wymian).
problemów Porównanie różnych klas złożoności algorytmów O(1) - 1µs O(n) - 1s O(n 2 ) - 11,6 dni O(n 3 ) - 32000 lat O(2 n ) - 10 301006 wiek wszechświata
problemów problemów jest nie tylko cechą algorytmów, ale również cechą problemów, które one rozwiązują.
problemów problemów Problemy zaliczane do klasy P są rozwiązywane przez deterministyczne algorytmy działające w czasie wielomianowym. Problemy klasy NP są problemami rozwiązywanymi przez algorytmy niedeterministyczne działające w czasie wielomianowym. Podklasą tych problemów są problemy należące do klasy NP-zupełnych (ang. NP-complete). Zakłada się, że znalezienie algorytmu deterministycznego, który rozwiązywałby choć jeden z tych problemów w czasie wielomianowym, mogłoby doprowadzić do znalezienia algorytmów działających w tym czasie dla wszystkich pozostałych problemów należących do tej klasy.
problemów problemów Problemy należące do klasy PSPACE mają wielomianową złożoność pamięciową. Zakłada się, że są one trudniejsze od problemów należących do klasy NP. Klasa PSPACE-zupełne (PSPACE-complete) jest odpowiednikiem klasy NP-complete. Największą złożoność obliczeniową (wykładniczą) mają problemy należące do klasy EXPTIME.