Professional Documents
Culture Documents
do Informatyki
Rok 2004-2005
Marek Zawadowski
Wydzia Matematyki, Informatyki i Mechaniki
Uniwersytet Warszawski
3 stycznia 2005
Spis treci
1 Wstp (1/2)
2 Wprowadzenie (2 1/2)
1.1 Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Zaliczenie i egzamin . . . . . . . . . . . . . . . . . . . . . . .
1.3 Historia Informatyki . . . . . . . . . . . . . . . . . . . . . . .
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
Algorytm Euklidesa . . . . . . . . . . . . . . . .
Problem algorytmiczny . . . . . . . . . . . . . . .
Sortowanie liczb . . . . . . . . . . . . . . . . . . .
Analiza zoonoci algorytmu . . . . . . . . . . .
Wiee Hanoi . . . . . . . . . . . . . . . . . . . . .
Wyszukiwanie sowa w sowniku . . . . . . . . . .
Tablice rzeczywistego czasu dziaania algorytmw
Komputer od rodka . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
4
4
. 5
. 6
. 6
. 7
. 8
. 10
. 10
. 12
.
.
.
.
.
.
14
14
14
16
17
18
20
3.7
3.8
3.9
3.10
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
21
29
34
40
43
43
48
52
54
59
63
67
69
69
71
73
74
76
79
82
82
86
91
95
101
105
105
108
110
117
122
123
129
Problemy decyzyjne . . . . . . . . . . . . .
Algorytmy werykujce . . . . . . . . . . .
Redukowalno problemw i problem P=NP
Problemy nieobliczalne . . . . . . . . . . . .
Metody przyblione . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
133
133
134
136
138
139
146
146
146
150
154
154
Wstp (1/2)
1.1 Literatura
1. Oglne wprowadzenie: D. Harel, Rzecz o istocie informatyki
2. Algorytmy:
T.H. Cormen, C.E. Leiserson, R.L. Rivest, Introduction to Algo-
syn Musy z Kworyzmu), algorytmy dodawania odejmowania, mnoenia, i dzielenia liczb dziesitnych.
Charls Babbage, maszyna rnicowa do obliczania wzorw matematycznych i projekt maszyny analitycznej, mechanicznego prototypu
komputera.
1920-30 r. Alan Turing, Emil Post, John von Neuman, Kurt Gdel, Alnzo
Church, Stephen Kleene: badania pojcia funkcji obliczalnej.
Wprowadzenie (2 1/2)
ciowych.
i:=i-1;
A[i+1]:=k;
Przykad.
Dane :
2
2
2
W ynik : 1
7
4
4
2
4
7
5
4
5
5
7
5
1
1
1
7
czas
| n
| n-1
| n-1
| t_2+...+t_n
| (t_2-1)+...+(t_n-1)
| (t_2-1)+...+(t_n-1)
| n-1
n
X
j=2
(j 1) +
n
X
j1=
j=2
n(n 1) n(n + 1)
3
7
+
1 = n2 + n 4
2
2
2
2
7
To jest cigle 'za dokadnie', skadniki 2 n i 4 oraz staa 32 nie maj
wikszego znaczenia, przy duych n. To co jest wane to n2 . Mwimy, e al= 3(n 1) + n + 2
B
8
Przykad. n = 3. ...
Rwnanie rekurencyjne:
(
a1 = 1
an+1 = an + 1 + an = 2an + 1
Rozwizanie: an = 2n 1.
Dowd indukcyjny. Dla n = 1, 21 1 = 1 = a1 . Zamy, e an = 2n 1.
Wtedy
an+1 = 2an + 1 = 2(2n 1) + 1 = 2n+1 2 + 1 = 2n+1 1
Dane wejciowe: liczba naturalna n i cig sw w1 , . . . , wn uporzdkowany w porzdku leksykogracznym (alfabetycznym) oraz sowo w.
Wynik: TAK, gdy dla pewnego 1 i n, w = wi ; NIE, w przeciwnym
przypadku.
Przykad. Dane: w
~ =0 a0 ,0 ala0 ,0 b0 ,0 bela0 ,0 hela0 , w =0 bela0 . Wynik: TAK.
p1 = 1
p2n = pn + 1
Rozwizanie: pn log n.
Liczba porwna jest rzdu log n. Algorytm dziaa w czasie O(log n).
nr
Algorytm
Zoono
A1
szukanie sowa
O(log n)
w sowniku
A2
znajdowanie
O(n)
maksimum
w tablicy
A3
sortowanie
O(n log n)
przez 'scalanie',
'kopcowanie'
A4
sortowanie
O(n2 )
przez 'wkadanie',
A5
n3
A6
Wiee Hanoi
O(2n )
6 104
3.6 106
140
4893
2 105
31
244
1897
10
9
39
15
153
21
Algorytm
Zoono
A1
szukanie sowa
O(log n)
w sowniku
A2
znajdowanie
O(n)
maksimum
w tablicy
A3
sortowanie
O(n log n)
przez 'scalanie',
'kopcowanie'
A4
sortowanie
O(n2 )
przez 'wkadanie',
A5
n3
A6
Wiee Hanoi
O(2n )
11
Maksymalny
Maksymalny
rozmiar
rozmiar
zadania przed
zadania po
przyspieszeniem. przyspieszeniu.
s1
s10
1
s2
10 s2
s3
okoo 10 s3
dla duych n
s4
3.16 s4
s5
s7 6
2.15 s5
s6 + 3.3
Pami
wewntrzna:
Arytmometr
Jednostka
sterujca
staa (ROM)
operacyjna
(RAM)
Rejestry
Magistrale komunikacyjne
Monitor
Dyski
Drukarka
Klawiatura
Sie
temu.
13
14
@
@
@
@
@
R
@
...
@
@
@
@
@
R
R
@
@
@
@
@
R
@
R
@
liczba
cyfra dziesitna
@
R
@
R
15
identykator
litera
litera
*
H
6 H
j
H
cyfra dziesitna
?
- program - identykator - ; - blok
16
- .
blok
- type
6
identykator
- var
66
identykator
;
- =
typ
- :
- ;
typ
- ;
6
- ;
- begin
6
instrukcja
;
- end
identykator typu
*
HH
j
H
H
H
H
opis typu
3.4 Zmienne
1. Zmienna i jej nazwa: zmienn moemy utosamia z obszarem pamici,
w ktrym przechowywana jest pewna warto (warto tej zmiennej w postaci kodu dwjkowego). Nazwa zmiennej (identykator) to
mnemotechniczny adres tego obszaru pamici.
NB. Dla rnych zmiennych obszar pamici moe by rny.
17
Typy standardowe
18
typ
identykator przykadowe
funkcje
typu
elementy typu
i relacje
logiczny
boolean
true, false
and, or, not
cakowity
integer
-2, 1, 1000
+,-,*, div, mod,< !
znakowy
char
'a','1','+'
rzeczywisty
real
10,1.7,1,2E4
+,-,*,/
acuchowy
string
'ala'
+,<
Typy logiczny, cakowity i znakowy s typami porzdkowymi. Na elementach typu porzdkowego T s okrelone funkcje ord przeksztacajc typ T
w typ integer oraz funkcje poprzednika i nastpnika
succ, pred : T T
(succ nie jest zdeniowany dla ostatniego elementu typu T , a pred nie jest
zdeniowany dla pierwszego elementu typu T ).
Przykad deklaracji zmiennych:
var x,y,z : real;
p,q : boolean;
litera : char;
s1,s2 : string;
m,n : integer;
Typy wyliczeniowe
Typy okrojone
Tablice
Deklaracja tablicy:
type tablica=array[T1,...,Tn] of T;
gdzie T 1, . . . T n s typami porzdkowymi a T dowolnym typem. Teoriomonogociowo tablicom typu tablica odpowiadaj funkcje z produktu
kartezjaskiego T1 . . . Tn w T.
Przykad denicji typw tablicowych:
type tablica1 = array[1..10] of char;
tablica2 = array[dzien_roboczy,mala_liczba] of real;
tablica3 = array['a'..'z'] of integer;
Wtedy tablica1[7] jest znakiem, tablica2[wt,3] jest liczb rzeczywist, a tablica3['c'] jest liczb cakowit.
Rekordy
Deklaracja rekordu:
type rekord1=record p1:T1;
p2:T2;
...
pn:Tn
end;
20
Instrukcja przypisania
Instrukcja ma posta
a:=w
(1)
gdzie P jest dowoln formu, a P (a\w) jest formu powsta z P przez zastpienie wszystkich1 wystpie zmiennej a wyraeniem w. Caa formula (1)
oznacza, e jeli przed wykonaniem instrukcji a:=w speniony jest warunek
P [a\w] to po wykonaniu instrukcji a:=w speniony jest warunek P .
Przykady zastosowania aksjomatu (1):
(b = (x + n) + 1){a := x + n}(b = a + 1)
czyli, jeli przed wykonaniem instrukcji n := n+1 zachodzi (n+1 < kn+1 >
0) to po jej wykonaniu zachodzi (n < k n > 0).
1
S tu pewne ograniczenia ktre nas w praktyce nie bd dotyczy. Gdy formua P
ma kwantykatory to wyraenie w wstawiamy na tak zwane wolne wystpienia zmiennej
a. Ponadto, takie podstawienie nie moe wiza adnej ze zmiennych wystpujcych w
wyraeniu w.
22
(2)
P 0 { I }Q, Q Q0 , Q0 { J }R,
P { I; J }S
R R0
(3)
Instrukcja pusta
Instrukcja pusta to pusty cig znakw i znaczy 'nic nie rb'. Jej znaczenie
opisuje si aksjomatem
P { }P
24
Instrukcja zoona
Instrukcja zoona czy cig instrukcji w jedn instrukcj i ma posta
begin I1; ... ; In end gdzie I1, ... , In s instrukcjami. Znaczenie tej
instrukcji opisuje regua
Pi { Ii } Pi+1 i = 1, . . . , n
P1 { begin I1 ; . . . ; In end } Pn+1
(4)
Instrukcje warunkowe
Mamy dwie instrukcje warunkowe. Pierwsza ma posta
if w then I
(5)
gdzie w jest wyraeniem typu boolowskiego a I1 i I2 s instrukcjami. Znaczenie tej instrukcji opisuje regua
P w { I1 } Q P w { I2 } Q
P {if w then I1else I2} Q
(6)
25
(7)
(8)
26
x:=0;
while k<a do begin
x:=m+x;
k:=k+1
end;
if n<0 then iloczyn:=-x
else iloczyn:=x
Mamy
T { if n<0 then a:=-n else a:=n } (a = |n|)
oraz
(a = |n|) { k:=0; x:=0 } (k = 0 x = 0 (a = |n|)).
Ponadto mamy te
(x = a m a = |n|) { if n<0 then iloczyn:=-x else iloczyn:=x }
(iloczyn = n m).
27
(9)
Instrukcje wejcia-wyjcia
Instrukcje wejcia-wyjcia
zewntrznym'. Instrukcja
su
do
komunikacji
ze
'wiatem
write(w)
28
Program srednia;
var n,i:integer;
x,s:real;
begin
read(n);
s:=0;
for i:=1 to n do begin
read(x);
s:=s+x;
end;
write(s/n)
end.
3.8 Procedury
Programy nawet w jzyku wysokiego poziomu, jeli nie s podzielone na
mniejsze moduy szybko staj si nieczytelne. By temu zapobiec moe je
dzieli na mniejsze moduy ktre wykonuj poszczeglne fragmenty zadania
i maj bardziej przejrzyst form. Do modularyzacji wikszych programw
su procedury. Rozwamy nastpujce zadanie.
Zadanie.
Dane: tablica A liczb cakowitych.
Wynik: Liczba wystpie liczby 1 po liczbie 0.
29
{wczytanie wartoci A}
{inicjalizacja zmiennych}
{ptla gwna}
{szukanie kolejnego 0 w A}
{jeli znalazl 0 to...}
{szukanie kolejnego 1 w A}
n:=n+1;
if A[n]=1 then s:=s+1; {jeli znalazl 1 to zwikszamy s}
end;
end;
write(s);
{wypisanie wynikw}
end.
30
write(s);
end.
{wypisanie wynikw}
Majc taki program mona go teraz atwo poprawi by szuka rnych kombinacji liczb na przykad 0, 1 i 2, 3.
const m=100;
var A : array[1..m] of integer;
s,n : integer;
procedure dane;{wczytanie wartoci A}
var i:integer;
begin
for i:=1 to m do
read(A[i]);
end;
procedure szukaj(var j:integer;x:integer);
{szukanie w tablicy A wartosci x od miejsca j}
begin
while (j<m) and (A[j]<>x) do
j:=j+1;
end;
function kombinacja(k,l:integer):integer;
{liczy ile razy k wystepuje przed l w tablicy A}
var s,n:integer;
begin
s:=0; n:=1;
{inicjalizacja zmiennych}
while n<m do begin
{ptla gwna}
szukaj(n,k); {wywolanie procedury szukaj z parametrami
aktualnymi n oraz k}
if A[n]=k then begin
{jeli znalazl k to...}
szukaj(n,l); {wywolanie procedury szukaj z parametrami
aktualnymi n oraz l}
if A[n]=l then s:=s+1; {jeli znalazl l to zwikszamy s}
end;
end;
kombinacja:=s;
end;
31
Zmienne w procedurach
Globalne
Lokalne
(zmienne uywane
(zmienne zadeklarowane
w procedurze ale
w procedurze i istniejce
nie zadeklarowane w tej
tylko podczas dziaania
procedurze i nie bdce
tej procedury)
parametrami formalnymi)
Zmienne:
Zmienne globalne s zadeklarowane w nagwku programu i istniej w
32
Parametry procedur
Formalne
Aktualne
(wyliczone w nagwku
procedury i uywane
w ciele procedury)
wyraenia typw
odpowiadajcych parametrom
formalnym
zmienne typw
odpowiadajcych parametrom
formalnym
Parametry:
Parametry formalne procedury to zmienne zadeklarowane w nagwku
do zmiennych globalnych. Dokadniej, parametr aktualny odpowiadajcy parametrowi formalnemu woanemu przez zmienn musi by zmienn i wszystkie operacje dotyczce tego parametru formalnego w czasie wykonywania procedury s wykonywane na odpowiadajcym mu
parametrze aktualnym.
33
n! =
1
n (n 1)!
gdy n = 0
gdy n > 0
34
function silnia(n:integer):integer;
begin
if n=0 then silnia:=1
else silnia:=n*silnia(n-1)
end;
wart. zm.
35
, n = 5
, wart. zm.
, n = 4
, n = 5
, wart. zm.
36
, n = 1
, n = 2
, n = 3
, n = 4
, n = 5
, wart. zm.
i kontynuujemy obliczenie w miejscu z wartoci n = 1, tzn. kontynuujemy obliczanie wartoci funkcji silnia z wartoci n = 1 i obliczan wanie
wartoci silnia(0) rwn 1. Teraz wyliczamy, e silnia(1) ma warto
1 i koczymy wykonywanie tego woania funkcji silnia i ponownie wracamy
do obliczania w miejscu i z wartoci zmiennych, ktre s zapamitane teraz
na wierzchu stosu. Zdejmujemy zatem z wierzchu stosu dane i n = 2
i kontynuujemy obliczenie funkcji silnia a do momentu gdy zakoczymy
obliczanie wartoci silnia(5) rwnej 120. W tym momencie stos wyglda
tak:
,
wart. zm.
silnia(5)
silnia(4)
silnia(3)
silnia(2)
silnia(1)
silnia(0)
tzn. silnia(5) woa silnia(4) a do silnia(0), a ta ostatnia jest wyliczania bez adnych dodatkowych woa.
Tak zapisana funkcja jest nieco mniej czytelna ale obliczania przy jej uyciu bdzie nieco efektywniejsze. Natomiast w przypadku obliczania cigu
Fibbonacciego zdeniowanego nastpujco:
fn =
f
n2 + fn1
gdy n = 0
gdy n = 1
gdy n > 1
38
end;
to wyglda ona elegancko ale jest bardzo nieefektywna, gdy wiele wartoci
bdzie wyliczaa wielokrotnie. Drzewo odwoa dla woania Fibb(5) bdzie
wygldao tak:
Fibb(5)
Fibb(3)
Fibb(1)
@
@
Fibb(2)
Fibb(0)
@
@
Fibb(1)
XX
XXX
X
Fibb(4)
Fibb(2)
Fibb(0)
@
@
Fibb(1)
@
@
Fibb(3)
Fibb(1)
@
@
Fibb(2)
C
C
Fibb(0) Fibb(1)
dane wejciowe.
Przykad 1.
Pokaemy, e fragment programu S1
silnia:=1;
k:=1;
while k<n do begin
k:=k+1;
silnia:=silnia*k
end;
Czyli pokazalimy, e
r (k < n){S}r
41
jeli m1 = 2 k + 1 to y2 = y1 z1 oraz
xn = y1 z1 m1 = (y1 z1 ) (z1 z1 )k = y2 z2 m2 .
42
Ustawie jest
64
8
43
H
H
H
H
44
kol[i] =
(
lewy[i] =
prawy[i] =
true
f alse
true
f alse
true
f alse
OK =
true
f alse
array[1..n] of integer;
array[1..n] of boolean;
array[2..2*n] of boolean;
array[1-n..n-1 of boolean;
boolean;
procedury tak:
procedure probuj(i:integer; var q : boolean);
var k:integer;
begin
k:=0; {k - kolejna prbowana pozycja}
45
repeat
k:=k+1;
if kol[k] and lewy[k+i] and prawy[k-i] then begin
het[i]:=k; kol[k]:=false;
lewy[k+i]:=false; prawy[k-i]:=false;
if i<n then begin
probuj(i+1,q);
if not q then begin
het[i]:=0; kol[k]:=true;
lewy[k+i]:=true; prawy[k-i]:=true;
end;
end
else q:=true;
end;
until q or (k=n)
end;
46
lewy[k+i]:=false; prawy[k-i]:=false;
if i<n then probuj1(i+1)
else wypisz(het);
het[i]:=0; kol[k]:=true;
lewy[k+i]:=true; prawy[k-i]:=true;
end;
end;
47
b1 , b 2 , . . . , bm
jeli mamy
a1 b1
a2 6 b1
a2 6 b2
a2 b3 . . .
By
posortowa
sortowanie(T,1,n).
tak:
T (n) =
0
2 T (n/2) + (n 1)
gdy n = 1
gdy n > 1
Notacja O(f (n)), (f (n)) i (f (n)) . Niech f : N N funkcja. Przypomnijmy, e funkcja g : N N jest (klasy) O(f (n)) jeli istniej stale
a, b R takie, e dla n > a, g(n) b f (n). Jeli funkcja 'g(n) O(f (n))'
mwimy czsto, e g(n) jest O(f (n)) i piszemy: g(n) = O(f (n)).
Mwimy, e funkcja g : N N jest (klasy) (f (n)) jeli istniej stale
a, b R takie, e dla n > a, b f (n) g(n). Podobnie jeli funkcja 'g(n)
(f (n))' mwimy czsto, e g(n) jest (f (n)) i piszemy: g(n) = (f (n)).
Mwimy, e funkcja g : N N jest (klasy) (f (n)) jeli g jest klasy
O(f (n)) i (f (n)).
Mamy
T (n) =
b
a T (n/c) + b n
gdy n = 1
gdy n > 1
O(n)
O(n ln n)
O(nlogc a )
gdy a < c
gdy a = c
gdy a > c
1
c
2. a - liczba podproblemw;
3. b n - czas budowania rozwizania problemu rozmiaru n z rozwiza
podproblemw;
to powyszy Fakt mona uy do obliczania zoonoci wielu algorytmw
zbudowanych metod 'dziel i rzd', take algorytmu sortowania przez
scalanie. W tym przypadku a = b = c = 2 a zatem T (n) = O(n ln(n)).
Pniej pokaemy te, e T (n) = (n ln(n)).
50
m
X
ri
(10)
i=0
0
X
ri .
i=0
def T
a T (cm ) + b cm+1
=anb
m
X
ind.
ri + b cm+1 =
i=0
m
X
a m+1
c
b
ri + b cm+1 =
c
i=0
m
a X
= b cm+1 (
ri + 1) =
c i=0
m+1
X
= b cm+1 (
ri + r0 ) =
i=1
= b cm+1
m+1
X
ri
i=0
m
X
i=0
ri
i=0 r
1
1
a
c
b n = O(n).
Pm
51
T (n) = n b
ri = b n
i=0
r1+logc n 1
=
r1
b
a
(n ( )1+logc n n) =
r1
c
b
a1+logc n
(n (
) n) =
r1
cn
ab
cn
=
(alogc n
)=
c (r 1)
a
cn
= const (nlogc a
) = O(nlogc a )
a
=
a1 < a2
a2 < a3
T
a1 < a2 < a3
T
XXXN
XX
X
@ N
@
a1 < a3
T
a1 < a3 < a2
a3 < a2
a3 < a2 < a1
@ N
@
@ N
@
a1 < a3
a3 < a1 < a2
a2 < a1 < a3
@ N
@
a2 < a1 < a3
Jedno obliczenie w takim drzewie odpowiada jednej gazi drzewa. W liciach drzewa znajduj si wszystkie moliwe odpowiedzi, tzn. permutacje
zbioru {a1 , a2 , a3 } (kada co najmniej raz). Zatem wysoko drzewa - to
pesymistyczna zoono algorytmu. Mamy
n ele-
i
log2 (n!) H(n).
Poniewa n! ( n3 )n to
n
H(n) log2 (n!) log2 ( )n = n log2 n n log 3 = (n ln n).
3
Q.E.D.
53
~y =< B, B, D, C, B, A, A >
~z =< B, D, A >,
54
Cig dugoci n ma 2n podcigw. Zatem sprawdzenie wszystkich podcigw jest kosztowne. Ale problem N W P ma wasno optymalnej podstruktury.
Niech ~x =< x1 , . . . , xm > bdzie cigiem, i n. i-tym preksem cigu
~x nazywamy cig ~xi =< x1 , . . . , xi >.
Przykad.
~x =< A, B, C, B, D, A, B >, ~x4 =< A, B, C, B >, ~x0 =
Mamy
55
c(i 1, j 1) + 1
gdy i = 0 lub j = 0,
gdy xi = yj ,
gdy xi 6= yj .
56
end;
~x
A
B
C
B
D
A
B
0
1
2
3
4
5
6
~y
B
D
C
A
B
A
0
0
0
0
0
0
0
0
x, 0 x, 0 x, 0 xy, 1 y, 1 xy, 1
0
xy, 1 y, 1 y, 1 x, 1 xy, 2 y, 2
0
x, 1 x, 1 xy, 2 y, 2 x, 2 x, 2
0
xy, 1 x, 1 y, 2 y, 2 xy, 3 y, 3
0
x, 1 xy, 2 x, 2 x, 2 x, 3 x, 3
0
x, 1 x, 2 x, 2 xy, 3 x, 3 xy, 4
0
xy, 1 x, 2 x, 2 x, 3 xy, 4 x, 4
57
write(x[i])
end else
if b[i,j]='x' then drukuj_NWP(i-1,j)
else drukuj_NWP(i,j-1);
end;
end;
58
Opis algorytmu.
59
(11)
60
1. trwaj najkrcej,
2. koliduj z najmniejsz liczb pozostaych zaj
nie daje optymalnego rozwizania. Ponisze przykady wyjaniaj dlaczego.
W tym przypadku
wybierajc zajcia kolidujce z najmniejsz liczb pozostaych zaj, zaczniemy od zaj oznaczonych i w efekcie wybierzemy trzy, gdy mona by
wybra cztery.
Problemy plecakowe.
iA wi
w oraz warto
61
Dla problemu 01 nie jest znane istotnie lepsze rozwizanie ni przegldanie wszystkich moliwych podzbiorw przedmiotw. Natomiast problem
uamkowy mona rozwiza 'zachannie' w nastpujcy sposb:
1. Porzdkujemy przedmioty wzgldem malejcej wartoci
2. WybieramPpierwsze k przedmiotw tak, e
oraz w ki=1 wi z k + 1-go przedmiotu.
62
Pk
i=1 wi
vi
wi .
w <
Pk+1
i=1
wi
11
10
@
@
XX
XXX
X
15
@
@
14
@
@
@
@
13
@
@
7
C
C
63
korze
2i 2i + 1
lewy syn
wierzchoek
prawy syn
Wtedy:
1. A[1] jest etykiet korzenia;
2. synowie i-tego wierzchoka maj numery 2i oraz 2i + 1;
3. i jest liciem gdy n < 2i;
4. warunek kopca wyraa nierwno: A[i] A[bi/2c] dla i = 1, . . . , n.
Program bdzie uywa dwch procedur: kopcuj oraz buduj_kopiec.
Procedura buduj_kopiec buduje kopiec.
Wywoanie procedury
kopcuj(i,j) odtwarza struktur kopca we fragmencie tablicy od itego do j -tego miejsca zakadajc, e w elementy tablicy od i + 1-ego do
j -tego miejsca speniaj wasno kopca.
procedure kopcuj(i,j);
begin
l:=2*i; r:=2*i+1; {l, r -synowie i}
if (l<=j) and (A[l]>A[i]) then w:=l
else w:=i;
if (r<=j) and (A[r]>A[w]) then w:=r;
{po tych zamianach A[w] ma najwieksza wartosc z A[l], A[r], A[i]}
if w<>i then begin
zamien(A[i],A[w]);
kopcuj(w,j)
end;
end;
64
Program gwny, uywajc powyszych procedur, realizuje algorytm sortowania przez kopcowanie:
begin{program gwny}
buduj_kopiec;
for i:=n downto 2 do begin
zamien(A[i],A[1]);
kopcuj(1,i-1)
end;
end.
65
Std
W (n) =
m
X
i hn (i)
i=1
= 2m
m
X
i hn0 (i) =
i=1
m
X
i=1
m
X
i 2mi =
i=1
i
c n = O(n)
2i
Q.E.D.
66
4.7 Podsumowanie
Mamy cztery metody konstrukcji rozwiza problemw optymalizacyjnych:
1. Metoda powrotw: rozszerzamy czciowe poprawne rozwizanie a
do uzyskania penego poprawnego rozwizania. Jeli si nie da rozszerzy czciowego rozwizania to wracamy i poprawiamy czciowe
rozwizanie w pierwszym moliwym miejscu.
Przykady.
(a) Ustawienia Hetmanw
(b) Konik szachowy
(c) Kwadrat magiczny
2. Metoda 'dziel i rzd' : problem dzielimy na mniejsze podproblemy,
ktre rozwizujemy rekurencyjnie, i z tych rozwiza podproblemw
budujemy rozwizanie caego problemu. By taka metoda bya efektywna problemy powinny by w 'sensowny sposb' rozczne. Przykady.
(a) Sortowanie przez scalanie
(b) Wypenienie tablicy 2n 2n ksztatem L tak by dokadnie jedno
ustalone pole zostao nie pokryte.
3. Programowanie dynamiczne: Jeli przy rozwizaniu problemu musimy
si odwoywa wielokrotnie do rozwizania tych samych podproblemw
to metoda 'dziel i rzd' moe nie by efektywna. Jeli podproblemw
jest 'stosunkowo niewiele' (wielomianowo wiele) w stosunku do rozmiaru problemu to mona je wszystkie 'rozwiza' (lub jako zapamita
sposb ich rozwizania) od dou go gry w sposb efektywny.
Konstrukcja algorytmu:
(a) Charakteryzacja struktury optymalnego rozwizania.
(b) Rekurencyjna denicja optymalnego rozwizania.
(c) Obliczenie kosztu i sposobu konstrukcji optymalnego rozwizania
metod 'od dou do gry' (bottom-up).
(d) Konstrukcja optymalnego rozwizania przy uyciu informacji
obliczonej w punkcie 3.
By taka metoda bya skuteczna liczba podproblemw nie moe by
zbyt du. Przykady.
67
(a)
(b)
(c)
(d)
68
Cyfry: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Liczba 764.5 oznacza 7 102 + 6 101 + 4 100 + 5 101 .
System ten jest wygodny dla czowieka a dla maszyny mniej. Reprezentacja cyfry dziesitnej zajmuje cztery bity pamici komputera:
cyf ra reprezentacja
0
0000
1
0001
2
0010
3
0011
4
0100
5
0101
6
0110
7
0111
8
1000
9
1001
System dwjkowy
Cyfry: 0, 1
Liczba (1010.1.5)2 oznacza 1 23 + 0 22 + 1 21 + 0 20 + 1 21 .
System dwjkowy dobrze pasuje do maszyny gdy reprezentacja jednej
cyfry zajmuje dokadnie jeden bit. n-cyfrowa liczba (bez znaku) pamitana
jest w sowie n-bitowym. Natomiast dla czowieka jest on zbyt rozwleky.
Przypomnijmy, e istnieje prosty sposb konwersji zapisu dziesitnego
liczby na dwjkowy:
69
43
21
10
5
2
1
0
1
1
0
1
0
1
625
1 250
0 500
1 000
i otrzymujemy
x = (101011.101)2
1
1
0
0
0
0
1
...
1
0
1
0
0
0
1
76
52
04
08
16
32
64
28
...
System szesnastkowy
Cyfry: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
Liczba E9B.F oznacza 14 162 + 9 161 + 11 160 + 15 161 .
System ten w zasadzie czy dobre cechy systemu dwjkowego i dziesitnego. Jest bardziej zwizy od dwjkowego i lepiej wykorzystuje pami ni
system dziesitkowy. Reprezentacja cyfry szesnastkowej zajmuje cztery bity
70
pamici komputera:
cyf ra reprezentacja
0
0000
1
0001
2
0010
3
0011
4
0100
5
0101
6
0110
7
0111
cyf ra reprezentacja
8
1000
9
1001
A
1010
B
1011
C
1100
D
1101
E
1110
F
1111
i kada kombinacja 4-bitowa odpowiada pewnej cyfrze szesnastkowej. Dlatego czsto system szesnastkowy jest stosowany do zapisu liczb liczb
dwjkowych. Na przykad kody ASCII znakw s czsto podawane przy uyciu dwucyfrowych liczb szesnastkowych. Natomiast ludzkie przyzwyczajenie
do operowania w systemie dziesitkowym jest tak ugruntowane, e aden
inny system pozycyjny nie moe mie szerszego znaczenia w komunikacji
midzy ludmi.
n = 8.
bit znaku
reprezentacja moduu liczby
@
@
0 = '+' @
@
@
R
R
@
1 = '-'
0 1 0 0 1 1 0 1
Nieujemna liczba cakowita jest pamitana jako znak i modu liczby zapisany
w systemie dwjkowym. Powysze sowo reprezentuje liczb 77. Natomiast
jeli liczba jest ujemna to istnieje kilka sposobw jej reprezentacji:
1. znak-modu: wygodny dla czowieka, ale przy operacjach arytmetycznych trzeba porwnywa znaki i 0 ma dwie reprezentacje4 ('dodatni'
i 'ujemn').
2. znak-uzupenienie do 1: ta reprezentacja jest mniej wygodna dla
czowieka i w niej te 0 ma dwie reprezentacje.
To, e 0 ma dwie reprezentacje nie jest tylko spraw estetyki. Gdy jeden obiekt
ma rne reprezentacje, sprawdzenie rwnoci dwch obiektw staje si niepotrzebnie
skomplikowana procedur.
4
71
01100111
1
01101000
do 2 (n = 8):
1. dla 0 x 127
bit znaku
moduu liczby x
zapisanej w systemie dwjkowym
@
@
R
@
@
@
R
@
2. dla 128 x 1
bit znaku
@
@
R
@
@
@
R
@
72
Przykad. Sowo
0 1 0 1 0 0 0 0
0 0 0 1 1 0 1 0
x = 26 1 1 1 0 0 1 1 0
0 0 0 1 1 0 0 0
y = 40 1 1 0 1 1 0 0 0
x + y = 16 1 1 1 1 0 0 0 0
73
gdzie 0.1 |m| < 1, c - liczba cakowita. Liczb m nazywamy cech a liczb
c - mantys liczby x.
Dla x rwnego 0 przyjmuje si m = 0 i c = 0.
Przykad. Dla
x = 0.00354
po znormalizowaniu otrzymujemy
x = 0.354 102
przyblienie
x
a1 = 0.1667 100
a2 = 0.4254 102
a3 = 0.6043 104
a4 = 0.7674 101
74
a
aa
|=
|a|
a
aa
0.5 10t 10c
0.5 10t 10c
|
= 5 10t
a
m 10c
0.1 10c
aa
|u
a
gdzie || u.
Uwaga. Zwykle bd wzgldny jest lepsz miara przyblienia.
niedomiar
k 0 k = 0.1 1099
75
nadmiar
K = 0.9999 1099
dla || u.
2. Dzielenie wykonujemy podobnie
(a) dzielimy mantysy,
(b) odejmujemy cechy,
(c) normalizujemy.
76
tys
0.036
0.268
0.304
oraz |1 |, |2 | u.
4. Odejmowanie jest wykonywane podobnie do dodawania.
Oszacujemy teraz bd wzgldny mnoenia i dodawania.
Dla mnoenia mamy
a b a b a b a b(1 + )
= || u
=
ab
ab
Zatem bd wzgldny mnoenia nie przekracza wzgldnej dokadnoci komputera. Jeli ju liczby mnoone s przyblione to bdy si kumuluj.
(a(1 + 1 ) b(1 + 2 ))(1 + ) a b
=
ab
a b((1 + 1 + 2 + 1 2 ))(1 + ) a b
=
ab
= |(1 + 2 + 1 2 )(1 + )| 2 u
Czyli bd wyniku mnoenia jest rzdu 2 u, o ile bd reprezentacji argumentw nie przekracza wzgldnej dokadnoci komputera.
77
|a| |1 | + |b| |2 |
|a| + |b|
u
|a + b|
|a + b|
b = 0.10079 102
Bd wzgldny przyblie a i b
a a 4 106 102
=
a =
< 4 105 u(= 5 105 )
a 10.0726
b b
106 102
b =
< 105 u
=
b
10.0789
4
0.3
> 4 102 = 103 u
6.3
5
78
ma pierwiastki
x1 =
p2 4q
2
x1 =
p +
p2 4q
2
q = 0.009474.
Obliczenie x1 :
1. = (6.433)2 = 41.38,
2. = 4q = 0.03790,
3. = = 41.34,
4. = = 6.430,
5. 1 = p = 6.433 6.430 = 0.003,
6. x1 =
1
2
= 1.5 103 .
2. x2 =
2
2
= 6.43.
x1 =
0.009474
6.430
Mora z tych rozwaa jest taki, e jeeli p > 0 to x1 jest liczone dokadniej a jeeli p < 0 to x2 jest liczone dokadniej.
3. . . .
4. P1 = P2 x + a0 - 1 mnoenie i 1 dodawanie.
Zatem takie obliczenie wymaga tylko n mnoe i n dodawa. Oprcz tego,
e ta metoda obliczania wartoci wielomianu jest szybsza to jest te dokadniejsza.
81
Modykacje (przykady):
1. dodaj(S,x) - dodaj element (wskazywany przez) x do zbioru S ;
2. usun(S,x) - usu element (wskazywany przez) x ze zbioru S .
Pytania (przykady):
1. szukaj(S,k) - sprawd czy element x naley do zbioru S ; jeli tak to
wska ten element, jeli nie to wska Nil;
2. minimum(S) - (pytanie na zbiorze liniowo uporzdkowanym) zwraca
element najmniejszy zbioru S ;
3. maksimum(S) - (pytanie na zbiorze liniowo uporzdkowanym) zwraca
element najwikszy zbioru S ;
4. nastepny(S,x) - (pytanie na zbiorze liniowo uporzdkowanym) zwraca
element nastpny po x w zbioru S ;
5. poprzedni(S,x) - (pytanie na zbiorze liniowo uporzdkowanym)
zwraca element poprzedni przed x w zbioru S .
Zwykle potrzeba tylko czci spord tych operacji. Wane jest by operacje wykonywane byy szybko, tzn. w czasie staym lub co najwyej logarytmicznym w stosunku do rozmiaru zbioru S .
82
D
C
B
A
Operacje na stosie:
empty(S) =
true
false
Jak ju wczeniej pokazalimy, przy pomocy stosw mona implementowa procedury rekurencyjne. Stos S , jeli ma ograniczon wysoko,
mona implementowa w tablicy:
S : array[1..n] of typ;
topS : integer;
function empty :boolean;
begin
empty:=(topS=0)
end;
procedure push(x:typ);
begin
topS:=topS+1;
S[topS]:=x;
end;
procedure pop(var x:typ);
begin
x:=S[topS];
topS:=topS-1;
end;
83
Kolejka
head(glowa)
?
Operacje na kolejce:
empty(Q) =
true
false
Kolejk Q, jeli ma ograniczon dugo, mona implementowa w tablicy, ale w bardziej skomplikowany sposb ni stos.
Q : array[0..n] of typ;
headQ,tailQ : integer;
tailQ
Q:
headQ
?
84
else tailQ:=tailQ+1;
end;
Listy.
x1
HH
H
j
x2
-
x3
-
xn
-
...
- N IL
x1
HH
H
H
j
x2
-
N IL
x3
Drzewa binarne
xn
...
- N IL
85
rootP
PP
P
q
P
x1
HH
H
j
x2
x3
H
x4
N IL
N IL
N IL
H
HH
H
j
H
HH
H
j
x5
N IL
N IL
x6
N IL
N IL
A
3
71
u
?
v
?
71
u
-
10
v
?
Po wykonaniu instrukcji 2:
A
3
u
71
u
10
87
Po wykonaniu instrukcji 3:
A
3
u
71
u
10
1
v
Po wykonaniu linii 4:
A
3
u
71
v
10
@
@
@
R
@
u
8
Po wykonaniu instrukcji 5:
A
3
u
71
v
10
@
@
R
@
u
3
71
Po wykonaniu linii 6:
88
A
3
71
10
@
@
R
@
u
3
71
Po wykonaniu instrukcji 7:
A
3
u
71
u
v
?
?
3
71
Procedura new(v):
aktualne
procedur
mog
by
typu
W nastpnym paragrae poka jak mona implementowa listy uywajc typw wskanikowych. Ale typy wskanikowe mog si te przyda do
innych celw, na przykad do deklaracji duych zmiennych. Deklaracja
type Wektor = array[1..10000] of real;
var A,B,C:Wektor;
mamy dostp do trzech zmiennych dynamicznych typu Wektor: u^, v^, w^.
90
Lista jednokierunkowa
type lista=^element;
element=record
nazwisko : string;
wiek : integer;
next :lista
end;
91
head:=v
end;
function szukaj(s:string):lista;
var v:lista;
begin
v:=head; szukaj:=Nil;
while (v<>Nil) do
if v^.nazwisko=s then begin
szukaj:=v; v:=Nil
end
else v:=v^.next
end;
procedure druk;
var v:lista;
begin v:=head;
while v<>Nil do begin
writeln(v^.Nazwisko,' ',v^.wiek);
v:=v^.next
end;
end;
Lista dwukierunkowa
type lista2=^element2;
element2=record
nazwisko : string;
wiek : integer;
next,prev :lista
end;
92
s nieco skomplikowane, gdy musimy sprawdza czy lista jest pusta przy
dodawaniu oraz czy s przed i za usuwanym elementem s inne elementy
przy usuwaniu. Mona te procedury uproci dodajc do listy wartownika
'sztuczny element', ktry powoduje, e lista nigdy nie jest pusta. W efekcie,
na licie z wartownikiem, dodawanie i usuwanie odbywa si bez sprawdzania
adnych warunkw.
procedure ini3;
93
94
var v:lista2;
begin
while head<>head^.next do begin
v:=head^.next;
usun3(v);
dispose(v)
end;
end;
function minimum(w:wsk):wsk;
begin
if w<>Nil then
while w^.lewy<>Nil then w:=w^.lewy;
minimum:=w
end;
97
w^.lewy:=Nil; w^.prawy:=Nil;
if r=Nil then
begin w^.ojciec:=Nil; r:=w end
else
if r^.klucz<w^.klucz then
if r^.prawy<>Nil then dodaj(r^.prawy,w)
else
begin r^.prawy:=w; w^.ojciec:=r end
else
if r^.lewy<> Nil then dodaj(r^.lewy,w)
else begin r^.lewy:=w; w^.ojciec:=r end
end;
B:
w=y
C:
A
A
w=y
A
A
AA
A
A
D:
w=y
x=Nil
AA
A
A
100
var u1,u2:wsk;
d1,d2,h1,h2:integer;
begin
if r=Nil then begin u:=Nil; d:=0; h:=0 end
else begin
roznica1(r^.lewy,u1,d1,h1);
roznica1(r^.prawy,u2,d2,h2);
{obliczamy rekurencyjnie wartosci dla obu
poddrzew}
if h1>h2 then begin h:=h1+1; d:= h1-h2 end
else begin h:=h2+1; d:=h2-h1 end;
if (d>d1) and (d>d2) then u:=r
{jestesmy w miejscu gdzie jest najwieksza
roznica poddrzew}
else if d1>d2 then begin d:=d1; u:=u1 end
else begin d:=d2; u:=u2 end;
{wstawiamy warosci poprzednie}
end;
end;
begin{cialo funkcji roznica}
roznica1(w,u,d,h);
roznica:=u
end;
zbir. Dodawanie bdzie polegao na czeniu list. By przyspieszy dodawanie list bdziemy te pamitali w reprezentancie zbioru dugo listy
(by dodawa krtsz list do duszej) i wskanik do ostatniego elementu
listy. Wskaniki do elementw bdziemy pamitali w osobnej tablicy. Na
obrazku mona to przedstawi tak:
V:
k1 :
nazwa:
dugo:
next:
k2 :
rep:
last:
k3 :
k2
3
k3
?
k?
1
?
- N il
W V [k] jest wskanik do elementu k lub Nil, jeli jeli k nie naley do
adnego zbioru.
procedure make-set(k:integer);
var u:wsk;
begin
new(u); V[k]:=u;
with u^ do begin
nazwa:=k;
next:=Nil;
rep:=u;
102
dlugosc:=1;
last:=u
end;
end;
function find(k:integer):wsk;
begin
find:=V[k]^.rep
end;
procedure union(k,l:integer);
var u,w,z:wsk;
begin
u:=find(k); w:=find(l);
{u i w wskazuja na reprezentantow zbiorow
do ktorych naleza k i l, odpowiednio}
if w^.dlugosc<u^.dlugosc then begin
z:=u; u:=w; w:=z
end;
{teraz w wskazuje na reprezentanta dluzszej listy}
w^.last^.next:=u; {polaczenie list}
w^.dlugosc:=w^.dlugosc+u^.dlugosc; {uaktualnienie dlugosci}
w^.last:=u^.last; {uaktualnienie ostatniego elementu}
while u<>Nil do begin {uaktualnienie reprezentanta}
u^.rep:=w;
u:=u^.next;
end;
end;
Fakt 6.1
103
104
-2
?
?
-5
i 6
P
7P
i
Wiele denicji dla obu rodzajw grafw s identyczne, nawet jeli ich
znaczenie jest rne. Jeli kontekst nie okrela jasno czy dany graf jest
zorientowany czy nie, to znaczy, e chodzi mi w takim przypadku o oba
rodzaje grafw.
105
M [i, j] =
1
0
gdy (vi , vj ) E;
w przeciwnym przypadku.
Wtedy atwo jest sprawdzi czy (vi , vj ) jest krawdzi w grae G. Ale
zwykle jest to reprezentacja bardzo pamiciochonna. Reprezentacja grafu o
n wierzchokach, niezalenie od liczby krawdzi, zuywa ona O(n2 ) pamici.
Uywajc macierzy incydencji atwo jest obliczy liczb cieek danej
dugoci k pomidzy wierzchokami. W tym celu wystarczy obliczy k-krotny
iloczyn macierzy A przez siebie, tzn. Ak . Jeli nas interesuj
cieki dugoci
Pk
i
co najwyej k, to moemy je obliczy nastpujco i=1 A .
- 1 - 2 - 7 - 9 N il
- 1 - 4 N il
- 2 - 3 - 5 - 6 N il
1. Sie pocze drogowych, komputerowych, telefonicznych (i wielu innych) na danym terenie to graf... (czasem zorientowany, czasem nie).
2. Schemat montau dowolnego urzdzenia to graf skierowany. Oglniej, nastpstwo w procesach, ktre czciowo mog by wykonywane
rwnolegle jest grafem skierowanym. Na przykad, dla wykonania dziaa:
s1:
s2:
s3:
s4:
s5:
s6:
a:=0;
b:=1;
c:=a+1;
d:=b+a;
e:=d+c;
d:=d+1;
107
s1
s2
@
R ?
?@
s3
s4
s5
s6
Micha
@
R
@
Sta
Bartek
XXX
X
HH
X
HH
H
Opos H
Mysz
Sowa
Jastrzb
Wiewirka
HH
H
Wrona
HH
HH
H
H
H
HH
Ryjwka
XXX
Dzicio
procedure skladowe_spojne(G:graf);
begin
for v in V(G) do {tzn. 'dla kazdego wierzcholka grafu G'}
make-set(v);
{tworzymy zbiory jedno-elemenotowe dla kazdego wierzcholka grafu}
for (u,v) in E do {tzn. 'dla kazdej krawedzi grafu G'}
if find(u)<>find(v) then union(u,v);
end;
109
J
^
JJ
J
J
^
J
J
^
J
Niech D = (V, E) bdzie drzewem. Jeli (v, w) E to v jest poprzednikiem w a w jest nastpnikiem v . Jeli istnieje droga z v do w, to w jest potomkiem v (a v jest przodkiem w). Jeli ponadto v 6= w, to w jest potomkiem
waciwym v . Liciem nazywamy wierzchoek bez potomkw waciwych.
Podgraf peny drzewa D zawierajcy wierzchoek v wraz z jego potomkami
nazywamy poddrzewem drzewa D o korzeniu v . Gbokoci wierzchoka v w
drzewie nazywamy dugo drogi od korzenia do v . Wysokoci wierzchoka
v w drzewie nazywamy dugo najduszej drogi od v do jakiego licia.
Wysokoci drzewa nazywamy wysoko korzenia tego drzewa.
Algorytm przeszukiwania grafu wszerz systematycznie bada krawdzie
grafu G, by dotrze do kadego wierzchoka osigalnego z s. Oblicza drzewo
przeszukiwania wszerz z wierzchoka s i odlego od s do kadego wierzchoka osigalnego z s.
Drzewem przeszukiwania wszerz grafu G = (V, E) z wierzchoka s V
nazywamy podgraf D = (V 0 , E 0 ) grafu G bdcy drzewem o korzeniu s taki,
e:
1. V 0 zawiera wszystkie wierzchoki osigalne z s w G;
2. dla kadego wierzchoka v V 0 cieka z s do v w drzewie D jest
najkrtsz ciek z s do v w grae E .
Problem (przeszukiwanie grafu wszerz).
110
bialy
szary
czarny
i kolejki:
1. kolejka<=v - wstaw v do kolejki na koniec;
2. v<=kolejka - wstaw pierwszy element kolejki na v ;
3. usun_z_kolejki - usu pierwszy element z kolejki;
4. kolejka<>0 - - test pustoci kolejki.
Zakadamy, e graf G jest reprezentowany przez listy incydencji. LI[v]
jest list kocw krawdzi o pocztku v .
procedure BFS(G,s);
begin
for v in V-{s} do begin
{inicjalizacja}
P[v]:=Nil; d[v]:=-1; kolor[v]:=bialy
end;
d[s]:=0; kolor[s]:=szary; kolejka<=s;
while kolejka<>0 do begin
{petla glowna}
u<=kolejka;
for v in LI[u] do {przegladamy nastepniki u}
if kolor[v]=bialy then begin {wlasnie odkrylismy v}
d[v]:=d[u]+1; P[v]:=u;
kolor[v]:=szary; kolejka<=v;
end;
usun_z_kolejki; kolor[u]:=czarny; {opuszczamy wierzcholek u}
end;
end;
end;
111
1 3 2
- 3 2 6
- 4 3 3
2 2 6
odlego
od 7
poprzedni na
3
3
Q
Q
6
J najkrtszej
Q
Q
numer
Q
Q
J ciece do 7
wierzchoka
Q
Q
s ?
Q
s
Q
?
?
? QQ JJ
^
s
Q
- 6 1 7
4 1
7 0 Nil
8 3 3
9 Nil
O(|V | + |E|).
112
Lemat 7.3
dla v V
(12)
Zaoenie jest prawdziwe po wstawieniu pierwszego wierzchoka (s) do kolejki. Wtedy mamy
(s, s) = d[s],
(s, v) = d[v],
dla v V \ {s}
Krok indukcyjny. Rozwamy teraz biay wierzchoek v odkryty podczas przeszukiwania listy incydencji wierzchoka u. Z zaoenia indukcyjnego mamy [s, u] d[u]. Po odkryciu v wykonujemy podstawienie
d[v] := d[u] + 1. Wtedy uywajc punktu 1. mamy:
d[v] = d[u] + 1 (s, u) + 1 (s, v).
oraz
d[vi ] d[vi+1 ]
dla i = 1, . . . , r.
113
oraz
EP = {(P [v], v) : v VP \ {s}}
115
end;
write(v)
end;
116
J
^
JJ
J
^
JJ
J
^
J
J
^
JJ
3 8
4 13 16 Nil
Q
k
Q
Q
Q
Q
?
4 7
moment
opuszczenia
moment
odkrycia
ojciec w lesie
A przeszukiwania
w gb
numer
J A
wierzchoka
A
? QQ JJ
^
U
A
s
Q
8 14 15 4
9 17 18 Nil
1. numer wierzchoka x;
2. moment odkrycia wierzchoka d[x];
3. moment opuszczenia wierzchoka f [x];
4. ojciec wierzchoka w lesie przeszukiwania w gb P [x].
Las przeszukiwania w gb powyszego grafu wyglda tak:
1
Q
s
Q
+
Ad 2. Gdy f [u] < d[v], to przedziay < d[v], f [v] > i < d[u], f [u] >
s rozczne. Ponadto aden z wierzchokw nie zostanie odkryty podczas
przeszukiwania potomkw drugiego. Q.E.D.
120
Wniosek 7.8 Wierzchoek v jest potomkiem wierzchoka u w lesie przeszukiwania w gb grafu G wtedy i tylko wtedy gdy d[u] < d[v] < f [v] < f [u].
Z Faktu 7.7 mamy, e przedzia < d[v], f [v] > jest zawarty w < d[u], f [u] >.
A zatem, z Wniosku 7.8, v jest jednak potomkiem u. Q.E.D.
121
Przykad. Wierzchokami poniszego grafu acyklicznego s czci garderoby. Krawd x y oznacza, e ubierajc si x naley woy przed
y . Poniewa na raz moemy woy tylko jedn cze garderoby to by si
ubra musimy (mniej lub bardziej wiadomie) zastosowa algorytm sortowania topologicznego.
koszula
marynarka
skarpetki
buty
6
krawat
?
zegarek
majtki
spodnie
122
123
kolejno przeszukujemy grafy G i GT procedur DF S z tym, e przeszukujc graf GT , tak jak jest to powiedziane w algorytmie, w procedurze DF S
przeszukujemy wierzchoki w kolejnoci malejcych wartoci f . atwo te
sprawdzi, e wierzchoki drzew lasu przeszukiwania w gb grafu GT tworz
silnie spjne skadowe grafu G (i GT ).
Przeszukanie w gb grafu G procedur DF S(G):
1 1 10 Nil
2 2 9
+
5 3 4
3 5 8
4 11 16 Nil
moment
opuszczenia
moment
ojciec w lesie
3 6
3
odkryciaA przeszukiwania
w gb
A
numer
J
wierzchoka
A
J
+
?
? QQ J
^
A
U
s
Q
6 7 3
7 13 14 8
8 12 15 4
9 17 18 Nil
Q
s
Q
+
2
2 10 11 1
3
?
5 12 13 1
3 15 18 Nil
4 3 8 Nil
3
+
+
?
- 7 4 7 4
6 16 17 3
8
6
moment
odkrycia
ojciec w lesie
A przeszukiwania
w gb
A
numer
J
wierzchoka
A
J
Q
^
J
U
A
Q
s
Q
5 6
moment
opuszczenia
9 1 2 Nil
Q
s
Q
+
2
Lemat 7.10 Jeeli dwa wierzchoki nale do tej samej silnie spjnej skad-
S.
Lemat 7.11 Procedura DFS umieszcza wszystkie wierzchoki tej samej silnie
spjnej skadowej grafu w jednym drzewie lasu przeszukiwania w gb.
Dowd. Niech S bdzie silnie spjn skadow grafu G, r bdzie pierwszym wierzchokiem z S odkrytym podczas przeszukiwania grafu G, oraz
v dowolnym wierzchokiem z S . Zatem momencie d[r] odkrycia r wszystkie
wierzchoki z S s biae. Poniewa r, v S to istnieje cieka z r do v . Z
Lematu 7.10 cieka ta biegnie tylko po wierzchokach z S , zatem tylko po
biaych wierzchokach. Z Faktu 7.9 (Twierdzenie o biaej ciece) v jest potomkiem r w drzewie lasu przeszukiwania w gb grafu G. Z dowolnoci v ,
wszystkie wierzchoki z S s potomkami r, zatem skadowa S jest umieszczona w jednym drzewie lasu przeszukiwania w gb grafu G. Q.E.D.
Notacja. Niech f bdzie tablic obliczon w czasie wykonania procedury DFS dla grafu G. Deniujemy funkcj : V V tak, e (u) = w
jeli u mona doj do w i f [w] jest maksymalnym momentem opuszczenia
wierzchoka do ktrego mona doj z u, tzn.
u 7 w oraz f (w) = max{f (v) : u 7 v}.
(u) nazywamy praojcem u.
125
oraz
f ((v)) = max{f (w) : v 7 w}.
Poniewa u 7 v to
{f (w) : u 7 w} {f (w) : v 7 w}.
Zatem
f ((u)) = max{f (w) : u 7 w} {f (w) : v 7 w} = f ((v)).
Ad 3. Z 1. mamy, e
f ((u)) f ((u)).
Zatem
f ((u)) = f ((u)).
Q.E.D.
{z
biae
u (u).
Q.E.D.
127
bdzie silnie spjn skadow wierzchoka r. Pokaemy, e v jest wierzchokiem T wtedy i tylko wtedy gdy v S(r).
. Poniewa wierzchoki v i r le w tej samej silnie spjnej skadowej to
DF S(GT ) umieszcza je na tym samym drzewie. Poniewa r jest korzeniem
T , to v jest wierzchokiem T .
. Pokaemy, e jeli w V oraz
1. f ((w)) > f (r) lub
2. f ((w)) < f (r)
to w nie jest umieszczone w drzewie T .
Ad 1. Z zaoenia indukcyjnego gdy r zosta wybrany na korze T , to w
zosta ju wczeniej odkryty i wstawiony do drzewa o korzeniu (w).
Ad 2. Jeli w zostanie wstawiony do drzewa T , to r 7 w w grae GT .
Zatem w 7 r w grae G. A to jest sprzeczne z denicj (w), poniewa
w 7 r i f ((w)) < f (r).
Q.E.D.
128
W (e)
eT
jest minimalna.
Poniszy algorytm uywa struktury danych dla rodziny zbiorw
rozcznych. Jest to algorytm zachanny. Pochodzi on od Kruskala.
Opis algorytmu Kruskala znajdowania minimalnego drzewa rozpinajcego:
1. T := ;
2. dla kadego wierzchoka z V tworzymy zbir {v};
3. sortujemy krawdzie grafu G wzgldem niemalejcych wag;
4. przegldamy krawdzie (u, v) E w porzdku niemalejcych wag i
jeeli f ind(u) 6= f ind(v) to wykonujemy
(a) T := T {(u, v)};
(b) union(u, v) (dodajemy zbiory do ktrych nale wierzchoki u i
v ).
129
Fakt 7.17 Czas dziaania algorytmu Kruskala dla spjnego niezorientowanego grafu z wagami G = (V, E) jest rwny O(|E| log(|E|).
Przykad. W grae z wagami
7
1
6
Q
8
Q 2
Q
Q
Q
Q
3
3
2
4
6
6
Q
Q
3
Q
Q
Q
Q
5
X
eT 0
W (e)
eT
Q.E.D.
132
Problem
Zoono
Szukanie sowa w sowniku
O(ln n)
Minimum w tablicy
O(n)
Sortowanie
O(n ln n)
Sortowanie topologiczne
O(|V | + |E|)
Znajdowanie silnie spjnych skadowych O(|V | + |E|)
Pierwszo liczb
O(n12 ) (2002)
S to problemy wielomianowe. Uwaa si, e tylko takie problemy s efektywnie obliczalne na komputerach. Poniej przytocz trzy powody dlaczego
tak jest.
1. Algorytm o zoonoci O(n100 ) nie jest efektywny ale takich zoonoci
w praktyce 'nie ma'. Zwykle wykadnik jest niewikszy ni 3 lub 4.
2. To czy algorytm dziaa w czasie wielomianowym czy nie nie zaley od
modelu oblicze (komputera).
3. Problemy wielomianowe maj dobre wasnoci (np. zoenie problemw wielomianowych jest problemem wielomianowym).
eby mc atwiej porwnywa problemy musimy je troch ujednolici,
tzn. popatrze na nie troch abstrakcyjniej.
Abstrakcyjny problem algorytmiczny jest to relacja binarna Q I S
gdzie I - jest zbiorem poprawnych danych wejciowych a S zbiorem moliwych rozwiza. Jeli (i, s) Q to s jest poprawnym rozwizaniem problemu
dla danych i.
Przykad. Problem znajdowania najkrtszej cieki w grae pomidzy
dwoma wierzchokami mona w abstrakcyjny sposb przedstawi tak:
I = {(G, x, y) : G graf , x, y V (G)},
S jest zbiorem cieek w grafach (skoczone cigi). Wtedy ((G, x, y), s)
QN S i s jest najkrtsz ciek w G z x do y .
133
Problemy decyzyjne s atwiejsze ale czsto abstrakcyjne problemy algorytmiczne mona do nich zredukowa. Ponadto, jeeli umiemy szybko rozwiza problem algorytmiczny to te umiemy szybko rozwiza
odpowiadajcy mu problem decyzyjny. Na og jest te odwrotnie. W
szczeglnoci, jeli problem decyzyjny nie daje si szybko rozwiza to
problem algorytmiczny odpowiadajcy mu tym bardziej nie ma szybkiego
rozwizania.
Jak zwykle, zakadamy, e na danych wejciowych I kadego problemy
jest okrelona rozsdna funkcja | | : I N przyporzdkowujca danym
i I rozmiar |i| N .
Problem decyzyjny Q jest wielomianowo obliczalny jeli istnieje algorytm
dziaajcy w czasie wielomianowym sprawdzajcy czy Q(i) = 1 dla i I .
Klas takich problemw oznaczamy P.
1. HAM NP.
2. k-kolorowanie. k Kolor Graf . G k Kolor jeli istnieje takie
pokolorowanie wierzchokw grafu G, k kolorami, e adne dwa incydentne ze sob wierzchoki nie s pokolorowane tym samym kolorem.
k Kolor NP.
3. Kliki. k Klika Graf . G k Klika jeli istnieje zbir k wierzchokw w grae G, w ktrym kade dwa wierzchoki s ze sob incydentne. k Klika NP.
4. Spenialno. I -zbir formu klasycznego rachunku zda, SAT
I . SAT jeeli istnieje wartociowanie v zmiennych z takie, e
v() = 1. Na przykad x x, x (y z) SAT , x x 6 SAT .
SAT NP.
5. Tautologie. I -zbir formu klasycznego rachunku zda, T AU T I .
T AU T jeeli dla dowolnego wartociowania v zmiennych z mamy
v() = 1. T AU T co NP.
6. Izomorzm grafw. I = Graf Graf . GIzo I . (G, G0 ) GIzo gdy
G jest izomorczny z G0 . GIzo NP.
7. Pokrycie wierzchokowe grafu. k P W Graf . G k P W
gdy istnieje k-elementowy zbir wierzchokw W taki, e dla dowolnej krawdzi (i, j) w G, i W lub j W . k P W NP.
8. Liczby pierwsze. P RIM E N . n P RIM E gdy n jest liczb
pierwsz. P RIM E P (2002).
9. 3 CN F SAT NP.
135
Q0 to
1. jeeli Q0 P to Q P;
2. jeeli Q 6 P to Q0 6 P;
Przykad redukcji kKolor P SAT .
Niech G = (V, E) bdzie grafem, V = {1, . . . , n}. Skonstruujemy formu klasycznego rachunku zda G rozmiaru wielomianowego w stosunku
do rozmiaru G tak, e G jest spenialna wtedy i tylko wtedy gdy G jest
k -kolorowalny.
Formua G ma zmienne
xij dla i = 1, . . . , n, j = 1, . . . , k.
n
^
^
k
_
_
i=1
j=1
xi,j
n
^
^
k
_
_
i=1
j,j 0 =1,j6=j 0
(xi,j xi,j 0 )
^
^
(i,i0 )E
k
_
_
j=1
136
(xi,j xi0 ,j )
Problemy decyzyjne
Problemy obliczalne
co-NP
NP
Problemy
NP
-zupene
1. HAM .
2. k Kolor.
3. k Klika.
4. SAT .
5. GIzo.
6. kP W .
7. 3 CN F SAT .
Stop[s1,s2] =
false
Ten problem jest NP-zupeny, zatem nie moemy oczekiwa, e skonstruujemy algorytm znajdujcy efektywnie optymalne rozwizanie. Natomiast
istnieje prosty algorytm zachanny, ktry znajduje rozwizanie rozmiaru co
najwyej dwa razy wikszego od optymalnego rozwizania:
procedure approx-PW(G:graf);
begin
140
W:=[]; F:=E;
while F<>[] do begin
niech (u,v) pierwszy element z F;
W:=W+{u,v};
wyrzuc wszystkie krawedzie z F o koncu u lub v;
end;
141
Procedura swiadekMR(n,w) sprawdza czy wn1 n 1 a trakcie obliczania wartoci wn1 mod n sprawdza przy okazji czy nie ma nietrywialnego
(rnego od 1 i 1) pierwiastka z 1.
By zobaczy, jak jest liczona potga wn1 mod n, zauwamy, e formua
d = we oraz e = (bk , . . . , bi+1 )2 6 jest niezmiennikiem ptli while.
Jeli dla jednej liczby w liczba n przesza pozytywnie prb to z prawdopodobiestwem 21 jest liczb pierwsz. Ale nic nie stoi na przeszkodzie
6
Czyli, e e = 2i
Pk
j:=i+1
bj 2j
142
143
Wynik:
Opis algorytmu.
1. Niech A bdzie (n n)-macierz tak, ktrej wyrazy s rnymi zmiennymi albo rwne 0.
(
ai,j =
xi,j
0
gdy (i, n + j E)
w przeciwnym przypadku
dla i, j = 1, . . . , n.
2. Niech d(< xi,j >(i,n+j)E ) bdzie wielomianem, ktry jest wyznacznikiem (formalnym) macierzy A.
3. Wybieramy losowo liczby ri,j dla (i, n + j) E) wielomianie d.
4. Obliczamy warto w = d(< ri,j >(i,n+j)E ).
5. Jeeli w 6= 0 to zgodny wybr par istnieje na pewno i odpowiadamy
TAK. Jeeli w = 0 to zgodny wybr par nie istnieje 'prawie na pewno'
i odpowiadamy NIE.
Powyszy algorytm opiera si na obserwacji, e d(< xi,j >(i,n+j)E ) jest
wielomianem tosamociowo rwnym 0 wtedy i tylko wtedy gdy nie istnieje zgodny wybr par. Natomiast sprawdzenie czy d(< xi,j >(i,n+j)E
) jest wielomianem tosamociowo rwnym 0 ma charakter probabilistyczny. Korzystamy ze wspomnianego wyej faktu, e jeeli wielomian d(<
xi,j >(i,n+j)E ) nie jest tosamociowo rwny zero, to przypadkowe traenie
na punkt w ktrym si zeruje jest mao prawdopodobne.
Przypomnijmy, e wyznacznik (nn)-macierzy mona obliczy ze wzory:
detA =
Sn
par.
Poniewa wyznacznik (n n)-macierzy mona obliczy efektywnie (patrz
nastpny rozdzia) to cay algorytm jest efektywny.
Przykad. Niech G = (V, E) bdzie nastpujcym grafem:
1 H
5
*
H
J
H
2
3
4
j
J H
J
*
J
J
^
J
H
*
HH
j
H
-
6
7
8
A=
0 x1,2 x1,3
0
x2,1
0
0
0
0 x3,2
0 x3,4
0
0 x3,4 x4,4
a jej wyznacznik
d(< xi,j >(i,n+j)E ) = detA = x1,2 x2,1 x3,4 x4,3 + x1,3 x2,1 x3,2 x4,4
oraz
{(1, 7), (2, 5), (3, 6), (4, 8)}.
145
Po wykonaniu tej procedury C = A B . Istnieje te bardziej skomplikowany i bardziej efektywny algorytm mnoenia macierzy pochodzcy od
Strassena i dziaajcy w czasie O(nlg 7 O(n2.81 ).
gdzie
1. L jest doln macierz trjktn z jedynkami na gwnej przektnej, tzn.
nad przektn w L wystpuj same zera a na przektnej same jedynki;
2. U jest grn macierz trjktn, tzn. pod przektn w U wystpuj
same zera;
3. P jest macierz permutacji, tzn. kadej kolumnie i kadym wierszu
macierzy P wystpuje dokadnie jedna jedynka a poza tym same zera.
Przykad rozkadu LUP. Niech
1 2 3
A= 2 4 2
1 1 2
Wtedy (3 3)-macierze
1 0 0
1 0 0
1 2
3
P = 0 0 1 L = 1 1 0 U = 0 1 1
0 1 0
2 0 1
0 0 4
(13)
P A ~xT = P ~bT
(14)
(15)
U ~xT = ~y T
148
Niech macierz
1 2 3
A= 2 4 2
1 1 2
1 0 0
1 0 0
1 2
3
P = 0 0 1 L = 1 1 0 U = 0 1 1
0 1 0
2 0 1
0 0 4
ma posta
y1
y + y2
+ y3
2y
1
=2
=3
=1
majce posta
x1 + 2x2 + 3x3
=2
x2 x3 = 1
4x3 = 3
a1,1
A = ...
an,1
#
"
. . . a1,n
a1,1 w
~
... ... =
~v T A0
. . . an,n
gdzie w
~ i ~v s wierszowymi (n 1)-wymiarowymi wektorami rzeczywistymi.
Tak przedstawion macierz A, o ile a1,1 6= 0 moemy rozoy w nastpujcy
sposb
"
A=
a1,1 w
~
T
~v
A0
"
~0
1
T
~v /a1,1 In1
# "
a1,1
w
~
~0T A0 ~v T w/a
~ 1,1
150
A=
~0
1
T
~v /a1,1 In1
"
# "
# "
~0
1
T
~v /a1,1 In1
"
a1,1
w
~
~0T A0 ~v T w/a
~ 1,1
~0
1
T
~v /a1,1 L0
# "
a1,1
w
~
~0T L0 U 0
a1,1 w
~
~0T U 0
=LU
151
QA=
ak,1 w
~
~v T A0
A=
ak,1 w
~
T
~v
A0
"
~0
1
T
~v /ak,1 In1
# "
ak,1
w
~
~0T A0 ~v T w/a
~ k,1
Wtedy kadc
"
P =
1
~0T
152
~0
P0
P A=
# "
~0
1
0
T
P ~v /ak,1 L0
ak,1 w
~
~0T U 0
=LU
P A=
"
~0
P0
1
~0T
"
"
# "
~0
1
0
T
P ~v /ak,1 In1
"
# "
# "
ak,1
w
~
~0T A0 ~v T w/a
~ k,1
ak,1
w
~
~0T A0 ~v T w/a
~ k,1
~0
1
P 0 ~v T /ak,1 L0
# "
# "
ak,1
w
~
~0T L0 U 0
ak,1 w
~
~0T U 0
ak,1
w
~
~0T P 0 (A0 ~v T w/a
~ k,1 )
~0
1
0
T
P ~v /ak,1 In1
"
QA=
# "
~0
1
T
~v /ak,1 In1
~0
1
0
T
P ~v /ak,1 P 0
~0
P0
1
~0T
=LU
153
dla i = 1, . . . , n, to wtedy
A1 = [X1 , . . . , Xn ].
154
n
Y
L[i, i].
i=1
155
Indeks
instrukcja
ptli for, 27
ptli while, 26
przypisania, 22
pusta, 24
warunkowa, 25
wejcia-wyjcia, 28
zoona, 25
iteracja
ograniczona, 27
warunkowa, 26
cieka, 106
algorytm, 6
-iczne rozwizanie, 6
-iczny problem, 6
aproksymacyjny, 140
Euklidesa, 5
probabilistyczny, 140
sortowania przez kopcowanie,
63
werykujcy, 134
zachanny, 59
analiza
numeryczna, 6
poprawnoci, 6
zoonoci, 6
jzyk
Pascal, 14
wysokiego poziomu, 14
klasa
NP, 135
P, 134
coNP, 135
kolejka, 84
kopiec, 63
bd
bezwzgldny, 75
wzgldny, 75
blok, 17
cecha, 74
cykl, 106
rozkazw, 12
lista
dwukierunkowa, 92
dwukierunkowa z wartownikiem, 93
jednokierunkowa, 91
listy
incydencji grafu, 106
diagramy skadniowe, 14
drzewo, 110
binarne, 85, 95
binarnych poszukiwa, 95
przeszukiwania wszerz, 110
graf
macierz
incydencji grafu, 106
magistrale komunikacyjne, 12
mantysa, 74
metoda
'dziel i rzd', 48
powrotw, 43
acykliczny, 106
niezorientowany, 105
skadowe spjne -u, 106
spjny, 106
zorientowany, 105
156
sortowania, 6
sortowania topologicznego,
122, 123
TAUT, 135
wie Hanoi, 9
wielomianowo obliczalny, 134
wyboru zaj, 59
wyszukiwania w sowniku, 10
znajdowania cyklu Hamiltona,
134
znajdowania
minimalnego
drzewa
rozpinajcego,
129
znajdowania
najkrtszej
cieki w grae, 133
znajdowania silnie spjnych
skadowych, 123
procedura, 29
dispose, 89
new, 89
rekurencyjna, 34
procesor, 12
program, 16
-owanie dynamiczne, 54
czciowo poprawny, 40
poprawny, 40
nadmiar, 76
niedomiar, 76
niezmiennik ptli, 5, 26, 28
notacja
O(f (n)), 8, 50
(f (n)), 50
(f (n)), 50
pami, 12
parametr
aktualny, 33
formalny, 33
procedury, 32
praojciec, 125
Problem
P=NP, 137
problem
hetmanw, 43
-w redukowalno, 136
abstrakcyjny - algorytmiczny,
133
algorytmiczny, 6
decyzyjny, 134
izomorzmu grafw, 135
kliki, 135
kolorowania grafu, 135
najduszego wsplnego podcigu, 54
NP-zupeny, 137
plecakowy
0-1, 61
uamkowy, 61
pokrycia
wierzchokowego,
135
przeszukiwania grafu w gb,
117
przeszukiwania grafu wszerz,
110
SAT, 135
scalania, 48
-modu, 71
uzupenienie do 1, 71
uzupenienie do 2, 72
wierzchoka, 106
wyjciowy wierzchoka, 106
stos, 35, 82
system
dwjkowy, 69
dziesitny, 69
szesnastkowy, 70
tablica, 20
typ
acuchowy, 19
cakowity, 19
logiczny, 19
okrojony, 20
prosty, 18
rekordowy, 20
rzeczywisty, 19
standardowy, 18
strukturalny, 20
tablicowy, 20
wskanikowy, 86
wyliczeniowy, 19
znakowy, 19
ukad wejcia-wyjcia, 12
warunek
kocowy, 40
pocztkowy, 40
wzgldn dokadnoci komputera, 75
zoono algorytmu, 7
zapis logiczny, 23
zmienna, 17
dynamiczna, 86
globalna, 32
lokalna, 32
statyczna, 86
w procedurze, 32
znak
158