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.