Professional Documents
Culture Documents
- wykład
1
Organizacja
Terminarz zjazdów –
II semestr 2007/08 Algorytmy i struktury danych
EGZAMIN
☺
Wymagania:
Programowanie: C, Pascal ???
2
Plan zajęć
3
Literatura
Podstawowa:
Cormem TH., Leiserson CE., Rivest R.L., Wprowadzenie do algorytmów, WNT,
W-wa, 1997;
Wirth N., Algorytmy + struktury danych = program, W-wa, 1989;
Uzupełniająca:
Drozdek A., Simon D.L., Struktury danych w języku C, WNT, W-wa, 1996;
Sedgewick R., Algorytmy w C++, RM, W-wa, 1999;
Banachowski L., Diks K., Rytter W., Algorytmy i struktury danych, WNT, W-wa,
1996
http://www.algorytm.org/index.php
http://programex.risp.pl/?strona=main
http://wazniak.mimuw.edu.pl/
4
http://www.algorytm.org/
Podstawowe zasady analizy
algorytmów*
NWD Euklidesa,
Podział kąta na dwie równe części za pomocą cyrkla i
linijki
6
* Banachowski i inni, Algorytmy i struktury danych, WNT, W-wa, 1996
Algorytm
Nie kaŜda metoda, nie kaŜdy schemat jest algorytmem.
Przyjmuje się, Ŝe algorytm ma wyraźnie określony
początek (start), precyzyjnie określoną kolejność
wykonywania działań, wyróŜniony koniec.
7
Schemat przetwarzania danych
C – zbiór wszystkich moŜliwych zestawów danych wejściowych
Dane asercja
wejściowe
początkowa
P(c) –
Funkcja określająca Algorytm – końcowa
warunki, które muszą przetwarzanie
zostać spełnione danych
przez zestaw danych c,
c ∈ C
Q(d)
Dane
wyjściowe
D – zbiór wszystkich moŜliwych zestawów danych wyjściowych 8
Cechy algorytmu
Poprawność !!!
Określoność jednoznaczność określeń.
Jednoznaczność deterministyczny, w kaŜdym przypadku
jego zastosowania, dla tych samych danych uzyskamy ten sam wynik .
a := m; b := n
dopóki b ≠ 0, wykonuj C = N × N+
(a, b) = (b, a % b) D= N+
d := a
Funkcja P określa wymóg, aby danymi wejściowymi były dwie liczby
nieujemne, nie równe jednocześnie zeru.
Funkcja Q określa wymóg, aby danymi wyjściowymi była liczba
będąca największym wspólnym dzielnikiem liczb podanych na
wejściu. 10
Zapis algorytmu
Siec działań Opis algorytmu przy pomocy rysunku.
d:=a
WE/WYJ
B<>0
START/STOP
11
Przykład
START
STAN
POCZĄTKOWY
a=m
b=n
pętla
INSTRUKCJE
T c=a/b
a=b
=0
b!
b=c
WARUNEK
N PĘTLI
d=a STOP
12
Zapis algorytmu
- pseudokod
Opis algorytmu przy pomocy umownych wyraŜeń i
poleceń, zbliŜonych do wyraŜeń i poleceń języków
programowania, operujących jednak na wyŜszym,
niezaleŜnym od składni, bibliotek i platformy docelowej
języka, poziomie.
START: i0
WARUNEK: jeśli (i+1)2>n, to przejdź do KONIEC
ii+1;
przejdź do WARUNEK
KONIEC: qi 13
Zapis algorytmu - program
int nwd(int m, int n)
{
int a, b,c;
a=m; b=n;
Opis algorytmu w while (b!=0)
konkretnym języku {
c = a % b; // mod pascal
programowania
a = b;
b = c;
}
return a;
}
int main()
{
int d ;
d = nwd (45 ,12); 14
}
Instrukcja iteracyjna - pętla
typu „for”
Instrukcje iteracyjna "dla" stosuje się w celu
wykonania pewnej grupy instrukcji w przypadku, gdy
liczba powtórzeń jest z góry znana.
i=k
for(i=k;i<p;i++)
{ instrukacja2; } i++
instrukcja3;
T
for(i=k;i>p;i--) p instrukcja2
i<
{instrukcja2;}
N
instrukcja3;
instrukcja3 15
Instrukcja iteracyjna – pętla
„while/do while”
instrukcja1 instrukcja1
while (warunek) do
{ inst.1 {
Instrukcja2; Instrukcja2;
} }while (warunek);
Instrukcja3; Instrukcja1;
T
ek
inst.2
un
ar
w
N
inst.3 16
Warunek - C
== a równe b
!= a róŜne b
> a>b
>= a>=b
<= a<=b
< a<b
17
Instrukcje rozgałęzione – „if”
instrukcja1;
If (wyrazenie) Instrukcja1
instrukcja2;
Instrukcja3;
P
nie
Instrukcja2
ze
ra
wy
Instrukcja3
18
Instrukcje rozgałęzione
– „if –else”
instrukcja1;
If (wyrazenie) Instrukcja1
instrukcja2;
else
P
nie
Instrukcja3; F Instrukcja2
ze
Instrukcja3
ra
Instrukcja4;
wy
Instrukcja4
19
Instrukcje rozgałęzione
– „if –else”
instrukcja1;
If (wyrazenie1)
instrukcja2;
else if (wyrazenie2)
Instrukcja3;
else if (wyrazenie3)
Instrukcja4;
else
Instrukcja5; 20
WyraŜenia logiczne
- połączenie warunków
|| - lub OR
5==5 || 5==9 prawda
&& - i AND
int i; //integer;
printf(”podaj element”);
float f;//float
scanf(”%d”,&i);
printf(”%d”,i); wypisz
scanf(”%d”,&i); wpisz
printf(”podaj element %d”,i);
scanf(”%f”,&f);
printf(”%f”,f);
scanf(”%f”,&f);
22
Typ tablicowy
int tab[10];
float tab[5];
int tab[]={1,4,6,-9,10};
scanf(”%d”,&tab[2]);
23
printf(”%d”, tab[2]);
ZłoŜoność czasowa
Cecha tylko algorytmu jako metody rozwiązywania problemu.
NiezaleŜna od:
25
* Banachowski i inni, Algorytmy i struktury danych, WNT, W-wa, 1996
Pesymistyczna i oczekiwana
złoŜoność czasowa algorytmu*
W(n)= sup {t(c): c ∈ C}
A(n) = ∑ kp
k ≥0
nk
START
Rozmiar danych wejściowych: n = N+1
j=1;
Operacja dominująca: L[j] ?? a
L[N+1]=a;
Pesymistyczna złoŜoność czasowa: n+1
while(L[j]!=a)
{
j=j+1;
}
p=j;
END 27
Przykład
Fragment kodu programu:
START
Oczekiwana złoŜoność czasowa:
j=1;
zał.: prawdopodobieństwo znalezienia a na
L[N+1]=a; kaŜdym z n moŜliwych miejsc jest takie
samo i wiadomo, Ŝe a jest w L.
while(L[j]!=a)
1
{ pnk = , dla k = 1,2,..., n
n
n
j=j+1; 1 n
A(n) = ∑ kpnk = ∑ k =
} k =1 n k =1
1 n(n + 1) n + 1
p=j; = =
n 2 2
END 28
Analiza funkcji
F(n)=n2+100*n+log10n+1000
N F(N) N2 100*N log10N 1000
1 1101 0,1 % 9% 0 91 %
104 … 99 % 1% 0% 0,001 %
29
Notacja „O” – notacja asymptotyczna
f(n) jest O (g(n)), jeśli istnieją liczby dodatnie
c i N takie, Ŝe f(n) < c g(n) dla wszystkich n >= N.
f(n) ~ O(n2)
30
Wykres
100,0000%
90,0000%
80,0000%
70,0000%
60,0000% n*n
100*n
50,0000%
log10
40,0000%
1000
30,0000%
20,0000%
10,0000%
0,0000%
0
00
0
00
0
10
1
00
00
10
00
10
00
10
10
10
31
Przykład
3500000
3000000
2500000
2000000 x2+bx+c
1500000 3x2
1000000
500000
0
1 10 100 200 300 500 600 700 800 900 1000
32
Cechy notacji „O”:
Jeśli f(n) jest O(g(n)) i g(n) jest O(h(n)), to
f(n) jest O(h(n)).
34
jeśli f(n)=c g(n), to f(n) jest O(g(n)),
35
Przykład
mamy dwa algorytmy rozwiązujące pewien problem,
wykonywana przez nie liczba operacji to odpowiednio:
108n i 10n2.
Pierwsza funkcja jest O(n), druga O(n2).
ale dla n<107 drugi algorytm wykonuje mniej operacji niŜ pierwszy.
Istotna jest więc tez stała (108), która w tym przypadku jest zbyt duŜa
aby notacja była znacząca.
36
Algorytmy moŜna klasyfikować ze względu na złoŜoność czasową
lub pamięciową. W związku z tym wyróŜniamy wiele klas algorytmów.
37
Analiza złoŜoności - silnia
• 0! =1;
• n! = n*(n-1)!, n>=1.
38
• T(n)=tc+T(n-1);
• T(n-1)=tc+T(n-2);
• … T(n)=(n+1)tc
• T(1)=tc+T(0);
• T(0)=tc
39
Przykład zerowanie
elementów tablicy
ta - przypisanie
i=0;
while(i<n)
1 tc - porównanie
{
j=0;
while(j<=i)
{
A tab[i][j]=0;
j=j+1;
0 1 }
i=i+1;
}
40
N i
T (n) = tc + t a + ∑ (2t a + tc + t c + ∑ (tc + 2t a ))
i =1 j =1
Pętla wewnętrzna A
Pętla zewnętrzna
N
T (n) = tc + t a + ∑ (2t a + 2tc + i (tc + 2t a ))
i =1
41
N
T (n) = t c + t a + ∑ (2t a + 2t c + i (tc + 2t a ))
i =1
N ( N + 1)
1 + 2 + 3 + ... + N =
2
N
T (n) = tc + t a + ∑ (2t a + 2tc + i (tc + 2t a ))
i =1
2
N
T (n) = t a (1 + 3N + N 2 ) + tc (1 + 2.5tc + )
2 42
Wyznaczanie złoŜoności dla
najgorszego przypadku
Instrukcja:
Przypisanie O(1),
Wejście do funkcji/procedury O(1),
Wyjście z funkcji/procedury O(1),
Pętla suma czasów wykonania kaŜdej pętli O(Σ)
43
Analiza procedury sumowania
int i =0;
int suma=0;
for (i=0; i<n; i++) sum+=a[i];
Funkcje
47
ZłoŜoność obliczeniowa
algorytmu
czas działania,
ilość potrzebnej pamięci.
Rozmiar liczba pojedynczych danych wejściowych.
Sortowanie: liczba elementów w ciągu wejściowym
48
SORTOWANIE
DANE WEJŚCIOWE: tab[n]
i=0, min=tab[0]
i++
T T
n min>tab[i]
i< min=tab[i]
49
SORTOWANIE
- sortowanie przez wstawianie
DANE WEJŚCIOWE: tab[n]
tab[j] – bieŜący element,
tab[j+1…n] – karta ze stołu
tab[1…j-1] – karta w ręce
50
Pseudokod
for j 2 to length(tab)
do k tab[j]
ij-1
while i>0 and tab[i] > k
do tab[i+1] tab[i]
i i-1 tab[1…j-1] karty w ręce
51
Analiza sortowania przez
wstawianie
Czas działania sortowania przez wstawienie zaleŜy od:
danych wejściowych n;
stopień posortowania danych wejściowych;
ZałoŜenie:
- elementarna operacja jest maszynowo niezaleŜna
- wykonanie jednego wiersza programu wymaga stałego
czasu
52
Etapy metody „dziel i zwycięŜaj”
53
Algorytm sortowanie przez scalanie
54
Operacja sortowania przez scalanie
55
Sortowanie: Podziel + scalaj
56
Rekurencja
Ustalanie warunku początkowego
57
Stos
początek I poziom
stosu II poziom
III poziom
koniec n poziom
stosu
58
Rekurencja a iteracja
59
Implementacja obliczania silni
int silnia(int n)
{
if (n =< 1)
START (silnia(5))
return 1; //warunek początkowy 120
else
silnia(4) return n*silnia(n-1) // 24
}
silnia(3) 6
silnia(2) 2
silnia(1) 1
60
Co lepsze??? – liczby
Fibonacciego
LICZBY FIBONACCIEGO
F(n) = n, jeśli n <2
F(n) = F(n-2)+F(n-1), jeśli n > 2
F(4) F(5)
F(4)
F(2) F(3)
F(3) F(3)
F(2)
64
Dziel i zwycięŜaj
• (1) Dzielimy zadanie posortowania całego
ciągu na dwa podzadania: posortowania
jego lewej i prawej połowy.
65
Rekurencyjne dzielenie i scalanie
Dzielenie:
74289721
72971 4872
791 47 82
27
71 9 2 7
4 7 8 2
7 1
66
Rekurencyjne dzielenie i scalanie
Scalanie: 122477789
12779 2478
179 47 28
27
17 9 2 7 8 2
4 7
7 1 O(n+m)
67
WNIOSKI
68
• http://www.cs.ubc.ca/spider/harrison/Java/
sorting-demo.html
69