Matematyczne Podstawy Informatyki
Transkrypt
Matematyczne Podstawy Informatyki
Matematyczne Podstawy Informatyki dr inż. Andrzej Grosser Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska Rok akademicki 2013/2014 Algorytm 1. Termin algorytm jest używany w informatyce do opisania: 1.1 skończonego, 1.2 deterministycznego, 1.3 efektywnego sposobu rozwiązania określonego problemu. 2. Najczęściej algorytmem jest ściśle określona procedura obliczeniowa, która na podstawie danych wyjściowych są tworzone dane wyjściowe. Algorytm Euklidesa 1 2 3 4 5 i n t gcd ( i n t p , i n t q ) { i f ( q == 0 ) r e t u r n p ; r e t u r n gcd ( q , p % q ) ; } Analiza algorytmów 1. Analiza algorytmu polega na określeniu zasobów, jakie są niezbędne do jego wykonania. 2. Zasobem może być: 2.1 czas obliczeń, 2.2 wielkość pamięci, 2.3 przepustowość kanału komunikacyjnego lub sprzętu. 3. Analiza zapotrzebowania prowadzi do wyboru rozwiązania (algorytmu) najefektywniejszego. 4. W analizie dokonuje się wyboru modelu realizowania obliczeń - najczęściej maszyna o dostępie swobodnym do pamięci. Rozmiar danych wejściowych i czas działania algorytmu 1. Na ogół czas działania algorytmu rośnie wraz z rozmiarem danych wejściowych - czas, można powiedzieć, jest funkcją rozmiaru danych wejściowych. 2. Rozmiar danych wejściowych - jest zależny od rozwiązywanego problemu: 2.1 W rozważanym dalej problemie sortowania rozmiarem jest liczba danych do posortowania. 2.2 W problemach kryptograficznych liczba bitów, na których wymagane jest wykonanie operacji. 3. Czas działania algorytmu dla konkretnych danych wejściowych jest wyrażony liczbą wykonanych elementarnych operacji. 3.1 Na ogół definiuje się go niezależnie od konkretnego komputera - przyjmuje się, że wykonanie jednego wiersza kodu wymaga stałego czasu. Przypadek pesymistyczny i średni 1. Najczęściej wyznacza się pesymistyczny i średni przypadek dla określonego algorytmu. 2. Pesymistyczny czas działania jest górną granicą możliwego czasu działania algorytmu dla każdych danych wejściowych. Daje gwarancję, że algorytm nie będzie działał dłużej. 3. Przypadek średni (zwany również oczekiwanym) jest zbliżony do pesymistycznego - wyznacza się oczekiwany porządek elementów i na tej podstawie dokonuje analizy. Rząd wielkości funkcji 1. W trakcie analizy algorytmów dokonuje się wielu uproszczeń np. pomija się stałe współczynniki - prowadzi to uzyskania pewnej wielkości wyznaczającej efektywność algorytmu np O(n2 ) czy O(n). 2. Dany algorytm jest efektywniejszy od innego, jeśli jego pesymistyczny czas działania jest funkcją niższego rzędu. Funkcje Funkcje Złożoność obliczeniowa i asymptotyczna I Złożoność asymptotyczna jest miarą wydajności używaną podczas odrzucania pewnych składowych funkcji nieistotnych lub takich, dla których możliwe jest wyznaczenie jedynie przybliżeń. Miara ta pozwala na szacowanie tempa wzrostu funkcji. Notacja asymptotyczna O(·) I I Najpowszechniej używana notacja opisująca złożoność asymptotyczną (P. Bachmann, 1894 r.) I Niech f (n), g (n), n ∈ N będą funkcjami ze zbioru liczb naturalnych w zbiór liczb rzeczywistych. I Powiemy, że funkcja f (n) jest rzędu najwyżej g (n), co oznaczamy O(g (n)), jeżeli istnieją stałe dodatnie c1 ∈ R, n0 ∈ N takie, że: ∀n > n0 , f (n) 6 c1 · g (n) I na przykład: I I f (n) = 3 · n3 + n2 − n + 113 f (n) = O(n3 ) f (n) = const f (n) = O(1) Notacja asymptotyczna O(·) II I Podana definicja oznacza, że f ma złożoność rzędu g , jeśli istnieje taka liczba dodatnia c1 , że f jest niewiększa od c1 g dla dostatecznie dużych n, czyli dla dla wszystkich n większych od pewnej ustalonej liczby n0 . Związek między f i g oznacza, że albo g jest kresem górnym dla f , albo że od pewnego miejsca f rośnie nie szybciej niż g . I I Przykład: f (n) = n2 + 100n + log10 n + 1000 Dla małych wartości n ostatni wyraz jest największy. Kiedy n = 10, drugi i ostatni wyraz są tego samego rzędu, zaś pozostałe mają do wyniku niewielki wkład. Kiedy n osiąga wartość 100 , pierwszy i drugi wyraz mają taki sam wkład w wynik; kiedy n przekracza 100, drugi wyraz też traci na znaczeniu. Wobec tego dla dużych wartości n, z uwagi na kwadratowy postęp pierwszego wyrazu (n2 ), wartość funkcji f zależy głównie od niego, a pozostałe wyrazy na dłuższą metę tracą na znaczeniu. Notacja asymptotyczna O(·) III Sortowanie Problem, który polega na uporządkowaniu ciągu liczb w odpowiedniej kolejności jest nazywany sortowaniem. 1. Dane wejściowe: Ciąg n liczb (a1 , a2 , ..., an ), 2. Dane wyjściowe: Permutacja (zmiana kolejności) a10 , a20 , ..., an0 ciągu wejściowego, w której: a10 <= a20 <= ... <= an0 . Sortowanie bąbelkowe 2 2 2 2 0 4 0 0 0 1 0 1 1 1 2 1 4 4 4 3 5 3 3 3 4 3 5 5 5 5 7 6 6 6 6 6 7 7 7 7 Sortowanie bąbelkowe 1 2 3 4 5 6 v o i d zamien ( i n t& x , i n t& y ) { i n t tmp = x ; x = y; y = tmp ; } 7 8 9 10 11 12 13 14 v o i d s o r t b a b e l ( v e c t o r <i n t >& tab , unsigned rozmiar ) { f o r ( unsigned i = 0 ; i < r o z m i a r ; ++i ) f o r ( unsigned j = 0 ; j < r o z m i a r − i − 1 ; ++j ) i f ( tab [ j ] > tab [ j + 1 ] ) zamien ( t a b [ j ] , t a b [ j + 1 ] ) ; } Sortowanie przez wstawianie 2 2 2 2 2 2 2 0 4 4 4 4 4 4 0 1 0 0 0 0 0 0 1 2 1 1 1 1 1 1 3 3 5 5 5 3 3 3 4 4 3 3 3 5 5 5 5 5 7 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 Sortowanie przez wstawianie 1 2 3 4 5 6 7 8 9 10 11 v o i d s o r t w s t a w ( v e c t o r <i n t >& tab , unsigned rozmiar ) { f o r ( i n t i = r o z m i a r − 2 ; i >= 0 ; −− i ) { i n t elem = t a b [ i ] ; unsigned j = i + 1 ; f o r ( ; t a b [ j ] < elem && j < r o z m i a r ; ++j ) tab [ j − 1] = tab [ j ] ; t a b [ j − 1 ] = elem ; } } Dziel i zwyciężaj 1. Podział problemu na podproblemy. 2. Rozwiązanie podproblemów rekurencyjnie, chyba że są one małego rozmiaru i już nie wymagają zastosowania rekursji używa się wtedy bezpośrednich metod. 3. Scalanie rozwiązań podproblemów w celu uzyskania rozwiązania całego problemu. Sortowanie przez scalanie I 1 2 3 4 v o i d s o r t s c a l ( v e c t o r <i n t >& tab , unsigned rozmiar ) { scal pomoc (0 , rozmiar − 1 , tab ) ; } Sortowanie przez scalanie II 1 2 3 4 5 6 7 8 9 10 v o i d s c a l p o m o c ( unsigned pocz , unsigned kon , v e c t o r <i n t >& t a b ) { i f ( p o c z < kon ) { c o u t << p o c z << ” ” << kon << e n d l ; s c a l p o m o c ( pocz , ( kon + p o c z ) / 2 , t a b ) ; s c a l p o m o c ( ( kon + p o c z ) /2 + 1 , kon , tab ) ; s c a l a j ( pocz , kon , t a b ) ; } } Sortowanie przez scalanie III 1 2 3 v o i d s c a l a j ( unsigned pocz , unsigned kon , v e c t o r <i n t >& t a b ) { v e c t o r <i n t > pom ( kon − p o c z + 1 ) ; 4 5 6 7 unsigned i = p o c z ; unsigned s r o d e k = ( kon + p o c z ) / 2 ; unsigned j = s r o d e k + 1 ; Sortowanie przez scalanie IV 1 2 3 4 5 6 7 8 1 2 unsigned k = 0 ; f o r ( ; i <= s r o d e k { i f ( tab [ i ] < pom [ k ] = else pom [ k ] = } && j <= kon ; ++k ) tab [ j ] ) t a b [ i ++]; t a b [ j ++]; w h i l e ( i <= s r o d e k ) pom [ k++] = t a b [ i ++]; 3 4 5 w h i l e ( j <= kon ) pom [ k++] = t a b [ j ++]; Sortowanie przez scalanie V f o r ( i = p o c z ; i <= kon ; ++i ) t a b [ i ] = pom [ i −p o c z ] ; 1 2 3 } Sortowanie kubełkowe 1 2 3 4 5 6 v o i d s o r t k u b e l ( v e c t o r <i n t >& tab , unsigned rozmiar ) { i n t maxi = 1 0 0 ; v e c t o r <i n t > pom ( maxi , 0 ) ; f o r ( i n t i = 0 ; i < r o z m i a r ; ++i ) pom [ t a b [ i ]]++; 7 f o r ( i n t i = 0 , j =0; i < maxi + 1 ; ++i ) i f ( pom [ i ] > 0 ) f o r ( i n t k = 0 ; k < pom [ i ] ; ++k ) t a b [ j ++] = i ; 8 9 10 11 12 13 } Sortowanie - złożoność I I Sortowanie bąbelkowe - O(n2 ), I Sortowanie przez wstawianie - O(n2 ), I Sortowanie przez scalanie - O(nlog (n)), I Sortowanie kubełkowe - O(n). Sortowanie - złożoność II Literatura 1. T.H. Cormen, Ch. E. Leiserson, R. Rivest, C. Stein ”Wprowadzenie do algorytmów”, WNT 2004 2. R. Sedgewick, K. Wayne ”Algorithms”, Addison-Wesley Professional 2011 3. E. Gawrońska ”Podstawy informatyki” - wykład.