SZÁMÍTÁSTUDOMÁNY 2009/2010/II. félév, (el½oadás vázlat)
Prof. Dr. Galántai Aurél Óbudai Egyetem NIK IMRI Budapest 2010-05-6
2
Tartalomjegyzék
1. Bevezetés 2. Matematikai alapfogalmak 2.1. Jelölések . . . . . . . . . . . . . . . . 2.2. Relációk és függvények . . . . . . . . 2.3. Függvények aszimptotikus jellemzése 2.4. Gráfok . . . . . . . . . . . . . . . . . 2.5. Halmazok számossága . . . . . . . . 2.6. Nyelvek és szavak . . . . . . . . . . .
5
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
9 9 10 11 15 17 20
3. Algoritmusok, kiszámítható függvények és döntési problémák
25
4. Formális nyelvek és automaták 4.1. Formális nyelvek . . . . . . . . . . . . . . . . 4.1.1. Generatív nyelvtanok osztályozása . . . 4.2. Automaták . . . . . . . . . . . . . . . . . . . 4.2.1. Véges determinisztikus automaták . . . 4.2.2. Véges nem determinisztikus automaták 4.2.3. Verem automaták . . . . . . . . . . . .
. . . . . .
29 29 31 33 33 36 37
. . . . . . .
43 44 47 50 52 55 57 58
. . . . . .
61 61 68 70 72 72 76
5. Számítási modellek 5.1. Turing gépek . . . . . . . . . . . . . 5.1.1. Turing gépek programozása . 5.2. A Turing gép kiterjesztései . . . . . . 5.3. Regiszter gépek és a RAM modell . . 5.4. Boole-függvények és logikai hálózatok 5.5. Számítási modellek ekvivalenciája . . 5.6. Univerzális Turing gépek . . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . .
. . . . . . .
6. Algoritmikus eldönthet½oség és kiszámíthatóság 6.1. Nyelvek felismerése és eldöntése Turing gépekkel 6.2. Eldönthetetlen problémák . . . . . . . . . . . . 6.2.1. Néhány további eldönthetetlen probléma 6.3. Turing kiszámítható függvények . . . . . . . . . 6.3.1. Primitív rekurzív függvények . . . . . . . 6.3.2. Parciális rekurzív függvények . . . . . . TARTALOMJEGYZÉK
. . . . . .
. . . . . . .
. . . . . .
. . . . . .
. . . . . . .
. . . . . .
. . . . . .
. . . . . . .
. . . . . .
. . . . . .
. . . . . . .
. . . . . .
. . . . . .
. . . . . . .
. . . . . .
. . . . . .
. . . . . . .
. . . . . .
. . . . . .
. . . . . . .
. . . . . .
. . . . . .
. . . . . . .
. . . . . .
. . . . . .
. . . . . . .
. . . . . .
. . . . . .
. . . . . . .
. . . . . .
. . . . . .
. . . . . . .
. . . . . .
. . . . . .
. . . . . . .
. . . . . .
. . . . . .
. . . . . . .
. . . . . .
. . . . . .
. . . . . . .
. . . . . .
. . . . . .
. . . . . . .
. . . . . .
. . . . . .
. . . . . . .
. . . . . .
. . . . . .
. . . . . . .
. . . . . .
3
7. Algoritmusok analízise 7.1. Bevezetés . . . . . . . . . . . . . . . . . . . . . . 7.1.1. Elméleti eredmények és fogalmak . . . . . 7.1.2. Az oszd meg és uralkodj elv . . . . . . . . 7.1.3. A mester tétel . . . . . . . . . . . . . . . . 7.2. Keresési, rendezési és kiválasztási feladatok . . . . 7.2.1. Keresési feladatok . . . . . . . . . . . . . . 7.2.2. Rendezési feladatok . . . . . . . . . . . . . 7.2.3. Alsó becslés a rendezések bonyolultságára 7.2.4. Kiválasztási feladatok . . . . . . . . . . . . 7.3. Aritmetikai algoritmusok . . . . . . . . . . . . . . 7.3.1. Szorzás . . . . . . . . . . . . . . . . . . . . 7.3.2. Osztás . . . . . . . . . . . . . . . . . . . . 7.4. Mátrixalgoritmusok . . . . . . . . . . . . . . . . . 7.4.1. Mátrixok és vektorok szorzása . . . . . . . 7.4.2. Winograd mátrix szorzó algoritmusa . . . 7.4.3. Strassen mátrix szorzó algoritmusa . . . . 7.4.4. Megjegyzések a gyors mátrix szorzásokról . 7.5. A gyors Fourier-transzformáció . . . . . . . . . . 7.6. Párhuzamos algoritmusok . . . . . . . . . . . . . 7.6.1. Párhuzamos számítások modelljei . . . . . 7.6.2. Hatékonysági mutatók . . . . . . . . . . . 7.6.3. Esettanulmányok . . . . . . . . . . . . . . 7.6.4. Párhuzamos bonyolultsági osztályok . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
79 79 79 83 84 86 86 89 95 95 99 100 103 106 106 108 109 111 113 118 119 125 127 131
8. Számítási bonyolultság 135 8.1. Az NP osztály és NP-teljesség . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 8.1.1. Nem-determinisztikus Turing-gépek és az NP osztály . . . . . . . . . . . 136 8.1.2. NP-teljesség . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 9. Függelék 143 9.1. A programozás alapfogalmainak egy nemdeterminisztikus, relációelméleti leírása 143 9.2. Irodalom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
4
TARTALOMJEGYZÉK
1. fejezet Bevezetés "Amit hallok, elfelejtem. Amit látok, emlékezem. Amit csinálok, megértem." –Konfuciusz
Mi a számítástudomány? Ennek a kérdésnek a pontos megválaszolása - más tudomány területekhez hasonlóan - nehéz feladat, már csak az informatika rohamos mérték½u fejl½odése miatt is. Ide soroljuk az algoritmusok és problémák bonyolultság elméletét, a matematikai logikát, a formális nyelvek elméletét, a programozáselméletet és még sok más területet (lásd pl. ACM Computing Classi…cations System, Wikipédia). Az el½oadás f½oként számítási modellekkel, algoritmusok elemzésével (algoritmusok analízisével) és bonyolultságelmélettel foglalkozik. A bonyolultságelmélet számítógép korszak (von Neumann) el½otti el½ozményeit a matematikai logika fejl½odésében kereshetjük, nevezetesen a "bizonyítás" és a "kiszámítható függvény" fogalmának formalizálásával kapcsolatos kutatásokban. Gödel 1930-ban igazolta, hogy egy (aritmetikai, vagy aritmetizálható) logikai rendszeren belül megfogalmazhatók olyan állítások, amelyek igaz, vagy hamis volta (a rendszeren belül) nem igazolható (Gödel, K.: Über formal unentscheidbare Sätze der Principa Mathematica und verwandtere Systeme I (”On formally undecidable propositions of Principia Mathematica and related systems I”), Monatshefte für Mathematik und Physik, 38, 1931, 173–198 ). Ebben a munkájában Gödel de…niálta a (primitív) rekurzív függvény fogalmát is, amely alapvet½o a kiszámítható függvény fogalmának vizsgálatában. Turing 1936-ban bevezette a Turing gép fogalmát, amely mind a kiszámíthatóság-, mind pedig az algoritmuselméletben alapvet½o fontosságú eszköznek bizonyult. (Turing, A.M.: On computable numbers with an application to the Entscheidungsproblem, Proc. London Math. Soc., ser. 2, 42, 1936-7, 230–265 ). BEVEZETÉS
5
Kurt Gödel (1906-1978)
Alan Turing (1912-1954)
Az 1936-os évben két másik fontos fogalmat is bevezettek. Alonzo Church de…niálta a kalkulust1 (A. Church: An unsolvable problem in elementary number theory, American Journal of Mathematics, 58, 1936, 345–363 ). Church híres tézise azt a sejtést mondja ki, hogy minden ”számítás”az általa megadott rendszerben formalizálható. Ugyancsak 1936-ban S.C Kleene bevezette a -rekurzív függvényeket (S.C. Kleene: General recursive functions of natural numbers, Mathematische Annalen, 112, 1936, 727–742 ).
Alonzo Church (1903-1995)
S. C. Kleene (1909-1994)
Érdemes megjegyezni, hogy a LISP nyelvet a -kalkulusból fejlesztették ki. Az imperatív programnyelvek (pl. Pascal, C) pedig a -rekurzív függvények implementációinak tekinthet½ok. A rekurzív függvények elméletéhez Péter Rózsa (1936, k-szoros rekurzív függvények) és Kalmár László (1943, elemi függvények) is jelent½osen hozzájárult. A Neumann-elv½u számítógépek elterjedésével kezd½odött a számítástudomány kialakulása is. A bonyolultság elmélet kifejl½odésének f½obb kezdeti lépései S.A. Cook szerint (ACM Turing Award, 1982): 1
A -kalkulusban a függvények jelölése: x1 , x2 , . . . , xn és értéke [: : :].
6
x1 ; : : : ; xn [: : :] azt a függvényt jelöli, amelynek változói rendre
BEVEZETÉS
- Turing (1936): Turing gép, az e¤ektíven (algoritmikusan) kiszámítható függvény fogalma, kielégithet½oségi probléma, (Church-)Turing hipotézis: Bármely függvény, amely egy jól de…niált eljárással kiszámítható, kiszámítható egy Turing géppel is. - Rabin (1959, 1960): Mit jelent az, hogy f -et nehezebb kiszámítani mint g-t? - Hartmanis, Stearns (1965): bonyolultság mértéke, hierarchia tételek. - Cobham (1965): függvények ”bels½o”számítási nehézsége, gépfüggetlen elmélet. - Karp (1972): P osztály (tractability vagy feasibility). - Aho, Ullman, Hopcroft (1974): RAM gép. A bonyolultságelmélet témakörét M. Rabin az 1976-os ACM Turing díj átvételekor tartott el½oadásában a következ½okben foglalta össze. Legyenek adottak a következ½ok: - P probléma osztály, - I 2 P egyedi probléma, - jIj a probléma mérete, - AL a P problémát (problémaosztályt) megoldó algoritmus. Az I 2 P problémát megoldva az AL algoritmus egy SI sorozatot hoz létre. Az SI sorozathoz hozzárendelünk bizonyos mértékeket (költséget). A legfontosabb mértékek: (1) Az SI hossza (számítási id½o) (2) Az SI mélysége (a párhuzamosítás mértéke, párhuzamosítás számítási ideje) (3) A memória igény (4) SI teljes "lépésszáma" helyett bizonyos kitüntetett aritmetikai m½uveletek, összehasonlítások, memóriam½uveletek, stb. száma) (5) Az algoritmus hardver implementálásához szükséges áramkör (Boole áramkör) bonyolultsága (kombinatorikus bonyolultság). Tegyük fel, hogy van egy mértékünk az SI számításokhoz. Fontosabb bonyolultsági mértékek: Legrosszabb eset bonyolultság: FAL (n) = max f (SI ) j I 2 P; jIj = ng : Átlagos bonyolultság: adott egy p valószín½uség eloszlás minden egyes Pn = fI j I 2 P; jIj = ng feladat halmazon. Ekkor a mérték: X MAL (n) = p (I) (SI ) : I2Pn
Algoritmusok analízise alatt azt értjük, hogy adott jIj méretfüggvény és (SI ) mérték esetén meghatározzuk a P -t megoldó AL algoritmus FAL (n) legrosszabb eset és MAL (n) átlagos bonyolultságát. Rabin szerint a bonyolultságelmélet legfontosabb kérdései (1976-ban) a következ½ok: 1. Hatékony algoritmusok keresése P megoldására. 2. A P feladatosztály bels½o bonyolultságára alsó becslések keresése. 3. P egzakt megoldásának keresése (már ha van). 4. Közelít½o algoritmusok fejlesztése. 5. A legrosszabb bels½o bonyolultság vizsgálata. BEVEZETÉS
7
6. A P átlagos bonyolultságának vizsgálata. 7. Szekvenciális algoritmusok fejlesztése P megoldására. 8. Párhuzamos algoritmusok fejlesztése P megoldására. 9. Szoftver algoritmusok fejlesztése. 10. Hardveren implementált algoritmusok. 11. Megoldás valószín½uségi (véletlen) algoritmusokkal. A bonyolultságelmélet mára a számítástudomány központi fontosságú területévé vált. A Rabin által felvázolt kérdések ma is intenzív vizsgálatok tárgyát képezik. Az el½oadás egy bevezetés az alapvet½o fogalmakba és eredményekbe.
8
BEVEZETÉS
2. fejezet Matematikai alapfogalmak 2.1. Jelölések A halmazok (naív) fogalmát és a velük végezhet½o m½uveleteket ismertnek tételezzük fel. A következ½o jelöléseket használjuk: N - természetes számok halmaza N0 - nemnegatív egész számok halmaza (N0 = N [ f0g) Z - egész számok halmaza n o Q
- racionális számok halmaza (Q =
p q
j p; q 2 Z, q 6= 0 )
- valós számok halmaza p - komplex számok halmaza (C = fa + bi j a; b 2 Rg, ”i = 1”) - üres halmaz - valódi részhalmaz - részhalmaz jAj - az A halmaz számossága (elemeinek száma) De…níció: Egy A 6= ; halmaz hatványhalmazán a 2A = fX j X Ag halmazrendszert értjük. Értelemszer½uen ;; A 2 2A . Szokás 2A helyett a P (A) (power set of A) jelölést is használni. Állítás: Ha jAj = n, akkor 2A = 2n . P Bizonyítás: Az n elem½u halmaz k elem½u különböz½o részhalmazainak száma nk és nk=0 nk = 2n . De…níció: A1 ; A2 ; : : : ; An tetsz½oleges halmazok direkt, vagy Descartes féle szorzatán az R C ;
A1
A2
:::
An = f(a1 ; : : : ; an ) j ai 2 Ai , i = 1; : : : ; ng
halmazt értjük. A direkt szorzat elemei rendezett elem n-esek. A direkt szorzat rövid jelölése: ni=1 Ai . Ha A1 = A2 = = An = A, akkor használjuk az An := ni=1 A jelölést is. Ílymódon például Rn és Cn jelöli a valós, illetve komplex elem½u n dimenziós vektorok halmazát. MATEMATIKAI ALAPFOGALMAK
9
2.2. Relációk és függvények De…níció: Legyenek A és B tetsz½oleges halmazok. Tetsz½oleges S A B részhalmazt (bináris) relációnak nevezünk. Az a 2 A és b 2 B elemek S relációban állnak egymással (jelölés aSb) akkor és csak akkor, ha (a; b) 2 S. A de…níciót rövidebben is megadhatjuk: aSb () (a; b) 2 S. De…níció: Az S A B reláció értelmezési tartománya: DS = fa 2 A j 9b 2 B : (a; b) 2 Sg : De…níció: Az S
A
B reláció értékkészlete: RS = fb 2 B j 9a 2 A : (a; b) 2 Sg :
De…níció: Az S
A
B reláció értéke (metszete) egy adott a 2 DS helyen: S (a) = fb 2 B j (a; b) 2 Sg :
De…níció: Az S
A
B relációt függvénynek nevezzük, ha jS (a)j = 1 (8a 2 DS ):
A függvényeket S : A ! B formában is megadhatjuk. De…níció: Egy S függvényrelációt (teljes) függvénynek nevezünk, ha DS = A és parciális függvénynek, ha DS A és DS 6= A. Két egyszer½u példa relációra: S1 = f(0; 0) ; (1; 1) ; (2; 4) ; (3; 9) ; (4; 16)g és S2 = f(small,short) ; (medium,middle) ; (medium,average) ; (large,tall)g: A de…níció alapján DS1 = f0; 1; 2; 3; 4g, RS1 = f0; 1; 4; 9; 16g és S1 (i) = fi2 g (i 2 DS1 ). Az S1 reláció függvény. Az S2 reláció esetén DS2 = fsmall,medium,largeg ;
RS2 = fshort,middle,average,tallg:
Minthogy S2 (medium) = fmiddle,averageg, az S2 reláció nem függvény. Függvényreláció esetén S (a) vagy üres, vagy egyelem½u halmaz. Például az S1 =
x; x2 j x 2 R
reláció (teljes) függvény, mert DS1 = R. De az p S2 = x; x j x 2 R; x
R
0
R
R
R
reláció csak parciális függvény, mert S2 (x) = ; minden x < 0 számra. Tetsz½oleges S A B relációt felfoghatunk egy S : A ! 2B halmazfüggvénynek is, ugyanis minden a 2 DS esetén S (a) B, azaz S (a) 2 2B . 10
MATEMATIKAI ALAPFOGALMAK
Az f : A ! B fügvényt véges függvénynek nevezzük, ha A és B véges halmaz. Az f : f0; 1gn ! f0; 1gm tipusú véges függvényeket bináris függvényeknek nevezzük. De…níció: Az f : f0; 1gn ! f0; 1g függvényt Boole függvénynek nevezzük. A de…níció másképpen fogalmazva azt jelenti, hogy f (x1 ; x2 ; : : : ; xn ) 2 f0; 1g
(xi 2 f0; 1g ; i = 1; : : : ; n):
Az alábbi igazság táblázatok megadnak négy alapvet½o Boole függvényt: x 0 0 1 1
y 0 1 0 1
x^y 0 0 0 1
x 0 0 1 1
x_y 0 1 1 1
y 0 1 0 1
x 0 0 1 1
y 0 1 0 1
x
y 0 1 1 0
x 0 1
x 1 0
Ha a 0 értékhez a hamis, az 1 értékhez pedig az igaz logikai értékeket rendeljük, akkor a fenti táblázatok rendre a logikai és (AND, x ^ y), vagy (OR, x _ y), kizáró vagy (XOR, x y) és negáció (NOT, x) függvényeket adják meg. A negáció függvényt szokás még a :x módon is jelölni. Legyen x; y 2 f0; 1g két logikai változó (vagy állítás)! Ekkor x=1
x_y =
x;
1, ha x = y = 1 0, egyébként
x^y =
0, ha x = y = 0 ; 1, egyébként
x
y=
1, ha x + y = 1 : 0, egyébként
Az XOR felírható még az x
y
x+y
(mod 2)
formában is. De…níció: A logikai változók :, ^, _ jelekkel felírt kifejezéseit Boole-polinomoknak nevezzük. Állítás: Minden Boole-függvény kifejezhet½o Boole-polinomokkal.
2.3. Függvények aszimptotikus jellemzése A következ½okben aszimptotikus nagyságrendi relációkat de…niálunk. De…níció: f (n) = O (g (n)) ( f (n) 2 O (g (n))), ha létezik c; n0 > 0 konstans, hogy jf (n)j c jg (n)j teljesül minden n n0 számra. FÜGGVÉNYEK ASZIMPTOTIKUS JELLEMZÉSE
11
8
6
y
4
2
0
-2 f (x) c*g(x) -4
0
50
100 x
150
200
f(x)=O(g(x)) aszimptotika Példa: Megmutatjuk, hogy log n = O (n). Teljes indukcióval igazoljuk: n 1 ) log n n. n = 1 esetén: log 1 = 0 1. Tegyük fel, hogy n 1-re igaz az állítás: log n n. Ekkor log (n + 1) log (2n) = log 2 + log n 1 + n. Példa: Megmutatjuk, hogy 2n+1 = O (3n =n). Teljes indukcióval igazoljuk: n 7 ) 2n+1 3n =n. n = 7 esetén: 28 = 256 37 =7 312:428. Tegyük fel, hogy n 7 és 2n+1 3n =n. Ekkor 2n+2 = 2 2n+1
2
3n 2 (n + 1) 3n+1 = n 3n n+1
3n+1 ; n+1
mert 2(n+1) < 1. 3n Az O (nagy ordó) relációval a következ½o m½uveleteket végezhetjük. Állítás: Ha f1 (n) 2 O (g1 (n)) és f2 2 O (g2 (n)), akkor f1 (n)+f2 (n) = O (jg1 (n)j + jg2 (n)j), illetve f1 (n) + f2 (n) = O (max fjg1 (n)j ; jg2 (n)jg). Bizonyítás: Tegyük fel, hogy n n0 esetén jf1 (n)j c1 jg1 (n)j és jf2 (n)j c2 jg2 (n)j. Ekkor jf1 (n) + f2 (n)j
jf1 (n)j + jf2 (n)j max fc1 ; c2 g max fjg1 (n)j ; jg2 (n)jg :
Állítás: Ha f1 (n) 2 O (g1 (n)) és f2 2 O (g2 (n)), akkor f1 (n) f2 (n) = O (g1 (n) g2 (n)). Állítás: Ha f (n) 2 O (g (n)), akkor cf (n) 2 O (g (n)). További példák: f (x) = x4
3x3 + 5x
1973 = O (x4 ).
(n + 1)2 = n2 + O (n). f (n) = 4 log n 12
3 (log n)2 + n2 = O (n2 ) : MATEMATIKAI ALAPFOGALMAK
Az f (n) = O (1) azt jelöli, hogy f (n) felülr½ol korlátos. De…níció: f (n) = (g (n)) ( f (n) 2 (g (n))), ha létezik c; n0 > 0 konstans, hogy jf (n)j c jg (n)j teljesül minden n n0 számra. 8 7 6 5
y
4 3 2 1 0 f (x) c*g(x)
-1 -2
0
50
100 x
150
200
f(x)= (g(x)) aszimptotika Példa: (1=2) n2
(n2 ), mert
5n =
1 2 n 2
5n =n2 =
1 2
5 n
1 ; 4
n
20.
De…níció: f (n) = (g (n)) ( f (n) 2 (g (n))), ha létezik c1 ; c2 ; n0 > 0 konstans, hogy c1 jg (n)j jf (n)j c2 jg (n)j teljesül minden n n0 számra. Alternatív de…níció: f (n) = (g (n)) , f (n) = O (g (n)) ^ g (n) = O (f (n)). 15
f (x) c1*g(x) c2*g(x)
y
10
5
0
0
50
100 x
150
200
f(x)= (g(x)) aszimptotika FÜGGVÉNYEK ASZIMPTOTIKUS JELLEMZÉSE
13
Példa: 2n2 + 3n log n 1
(n2 ), mert
log n + 3 =
2n2 + 3n log n n2
ha n elég nagy. P Állítás: p (n) = di=0 ai ni =
log n + 3
=2+
log n 3 + 2 2 n n
3 log n n
3;
nd , ha ad 6= 0. I(g)
g-nél gyorsabban növõ függvények
B(g)
.g O(g)
g-vel azonosan növõ függvények
g-nél lassabban növõ függvények
A O (g),
(g) és
(g) halmazok megjelenítése
De…níció: f (n) = o (g (n)) ( f (n) 2 o (g (n))), ha g (n) csak véges sok helyen nulla és f (n) = 0: n!1 g (n) lim
16 sqrt(x) log(x) log(x)/sqrt(x)
14 12 10
y
8 6 4 2 0 -2 -4 -1 10
10
0
10 x
1
10
2
10
3
f(x)=o(g(x)) aszimptotika Példák: 14
MATEMATIKAI ALAPFOGALMAK
log n = o (n), n log n = o (n2 ), de n log n = O (n2 ) és n log n = O (n3 ). Melyik becslés jobb? 2n2 = O (n2 ), de 2n2 6= o (n2 ) Megjegyzés: Ha f = o (g), akkor egyúttal f = O (g) is teljesül. De…níció: f (n) g (n), ha f (n) lim = 1: n!1 g (n) p p Példa: n + log n n.
2.4. Gráfok De…níció: A gráf pontokból és a pontokat összeköt½o vonalakból álló alakzat. A gráf pontjait szögpontoknak, vagy csúcsoknak nevezzük. A gráf két szögpontját összeköt½o olyan vonalat, amely nem megy át más szögponton, élnek nevezzük. A szögpontok halmazát V (vertex), az élek halmazát E (edge) jelöli. A G gráfot a G = (V; E) pár adja meg. Egy e 2 E élt a rendezetlen [u; v] pár ad meg, ahol u; v 2 V . Az u és v csúcsok az e él végpontjai. Az [u; u] 2 E élt huroknak nevezzük. Az e; e0 2 E éleket többszörös éleknek nevezzük, ha ugyanazt a két pontot kötik össze, azaz e = [u; v] és e0 = [u; v]. A hurkot és többszös éleket nem tartalmazó gráfokat egyszer½u gráfoknak nevezzük egyébként pedig multigráfnak. De…níció: Az u 2 V csúcs (u) fokán az u csúcsot tartalmazó élek számát érjük. Ha (u) = 0, akkor az u csúcsot izoláltnak nevezzük. De…níció: A G gráf üres, ha E = ;. Teljes a gráf, ha minden szögpontpár éllel van összekötve. De…níció: Az u; v 2 V csúcsokat összeköt½o n hosszúságú vonalnak nevezzük az egymáshoz csatlakozó f[vi 1 ; vi ]gni=1 élek sorozatát, ha v0 = u és vn = v. A vonal zárt, ha v0 = vn . A vonalat útnak nevezzük, ha a v0 ; v1 ; : : : ; vn csúcsok a v0 = vn lehet½oség kivételével egymástól különböznek. A zárt utat körnek nevezzük. De…níció: A gráf összefügg½o, ha bármely két szögpontját út köti össze. Következmény: Ha egy gráf nem összefügg½o, akkor van legalább egy olyan szögpontja, amelyb½ol nem vezet út az összes többi szögpontba. De…níció: Azok a szögpontok, amelyek egy adott szögpontból úttal elérhet½ok, a hozzájuk illeszked½o élekkel együtt a gráf egy összefügg½o komponensét alkotják. De…níció: Az olyan összefügg½o gráfot, amelyben nincsen kör, fának nevezzük. Ha a fának n csúcsa van, akkor pontosan n 1 éle van. De…níció: A G gráfot cimkézettnek nevezzük, ha az éleihez adatokat rendelünk. Ha minden e éléhez egy w (e) 0 számot rendelünk, akkor súlyozott gráfról beszélünk. De…níció: A G gráfot végesnek nevezzük, ha V és E véges halmazok. GRÁFOK
15
De…níció: A Gs = (Vs ; Es ) gráf a G = (V; E) gráf részgráfja, ha Vs
V és Es
E.
A E
A
D
B
C
A
D
B
B
C
C
A
3
E
3 B 2 4
D
E
C
F
2
6
3
D
Irányítatlan gráfok
De…níció: A G = (V; E) gráfot irányítottnak vagy digráfnak (directed graph) nevezzük, ha minden élét irányítjuk. Ekkor E rendezett párok halmaza. Az e = [u; v] 2 E élnek u a kezd½opontja és v a végpontja. Egy u 2 V csúcspont be (u) bemen½o foka, vagy be-foka az u szögpontban végz½od½o élek száma. Az u csúcspont ki (u) kimen½o foka, vagy ki-foka az u pontból induló élek száma. Az u 2 V csúcspontot forrásnak nevezzük, ha csúcspont nyel½o, ha ki (u) = 0, de be (u) > 0.
ki
(u) > 0, de
be
(u) = 0. Az u 2 V
Az irányított vonal, út és kör de…níciója hasonló az eredeti defínícióhoz azzal az eltéréssel, hogy az út (és a kör) esetén az élek irányítása meg kell, hogy egyezzen a vonal irányításával. Az v csúcs elérhet½o az u csúcsból, ha létezik u-ból induló és v-ben végz½od½o irányított út. De…níció: A G = (V; E) irányított gráf összefügg½o, ha az irányítások elhagyásával kapott gráf összefügg½o. De…níció: A G = (V; E) irányított gráf er½osen összefügg½o, ha bármely u; v 2 V csúcsot irányított él köt össze. De…níció: A G = (V; E) irányított gráf aciklikus, ha irányított kört nem tartalmaz. 16
MATEMATIKAI ALAPFOGALMAK
A
D
B
C
Irányított gráf A gráfok és relációk szoros kapcsolatban állnak egymással: 1. Legyen G = (V; E) irányított gráf. Ez megfeleltethet½o egy R
V
V relációnak:
R = f(u; v) j e = [u; v] 2 Eg : 2. Legyen R
A
B reláció. Ez megfeleltethet½o egy (V; E) gráfnak: V = A [ B;
E = fe = [u; v] j (u; v) 2 Rg :
A logikai áramkörök aciklikus irányított gráfoknak feleltethet½ok meg. Az alábbi két ábra ilyen logikai áramköröket mutat be.
2
1 2
v3
v1
v4 v2
o
o
v6
1
v5
v8
1
v4 v1
v7
v5 v2
v3
2.5. Halmazok számossága Egy A halmaz számosságán a halmaz elemeinek jAj-val jelölt "számát" értjük. Ha A elemeinek száma véges, akkor jAj egy meghatározott egész számot, az elemek tényleges számát jelenti. HALMAZOK SZÁMOSSÁGA
17
Ha azonban A elemeinek száma végtelen, akkor jAj jelentését egy osztályozás segítségével jellemezzük. De…níció: Két A és B halmazt azonos, vagy egyenl½o számosságúnak nevezünk ( jAj = jBj), ha elemeik között kölcsönösen egyértelm½u megfeleltetés létesíthet½o. Az jAj = jBj egyenl½o számosság összefüggés egy ekvivalencia reláció, amely a halmazok egy természetes osztályozását indukálja. Az azonos számosságú halmazokat azonos osztályba soroljuk. Ezek jellemz½oje hogy az azonos osztályhoz tartozó halmazok elemszáma azonos, míg a különböz½o osztályokhoz tartozó halmazok elemszáma különböz½o. A halmaz számossága ebben az értelemben annak az osztálynak a megjelölése, amelyhez tartozik. Jegyezzük meg, hogy a most bevezetett számosság fogalom nincs ellentmondásban azzal, hogy véges elemszámú halmazok számossága elemeik száma. Az egyenl½o számosság reláció ugyanis a véges halmazokat az n = 0; 1; 2; : : : elem½u halmazok osztályaiba sorolja és ezeket az osztályokat az elemek tényleges véges számával tudjuk azonosítani. De…níció: jAj jBj, ha van olyan C B részhalmaz, amelyre jAj = jCj. Könnyen belátható, hogy A B esetén jAj jBj. Fennállnak a következ½o relációk: a) jAj jBj ^ jBj jCj ) jAj jCj; b) jAj jBj ^ jBj jAj ) jAj = jBj. Cantor igazolta, hogy bármely két halmaz számossága nagyságrendi viszonyba állítható. A legkisebb végtelen számosság a természetes számok N halmazának @0 -al (@=alef) jelölt számossága. De…níció: Egy A halmazt megszámlálható számosságúnak nevezünk, ha számossága a természetes számok N halmazának számosságával egyenl½o. Véges sok véges vagy megszámlálható halmaz uniója is megszámlálható. Megszámlálható halmazok végtelen részhalmazai is megszámlálhatók. Ennek megfelel½oen a természetes számok összes végtelen részhalmazának számossága megegyezik N számosságával. Pl. az összes páros természetes számok halmaza felírható az fn = 2k j k = 1; 2; : : :g alakban, ahol a k ! 2k leképezés kölcsönösen egyértelm½u megfeleltetést hoz létre a két halmaz között. Könnyen igazolható, hogy az N N0 Z Q valódi tartalmazás ellenére ezen halmazok számossága azonos: jNj = jN0 j = jZj = jQj = @0 . A ( 1; 1) R részhalmaz számossága ugyancsak megegyezik R számosságával: az x ! 1 xjxj leképezés kölcsönösen egyértelm½u megfeleltetést létesít a két halmaz között. A fenti példák azt mutatják, hogy végtelen halmazok valódi végtelen részhalmazainak megegyezhet a számossága a tartalmazó halmaz számosságával. Ez a tulajdonság a végtelen halmazok egyik jellemz½o sajátossága, amely nem igaz véges halmazok esetére. De…níció: jAj < jBj, ha jAj jBj és jAj = 6 jBj. A valós számok R halmazát kontinuum számosságúnak nevezzük, amelyre fennáll, hogy jRj > @0 . A valós számok halmazának számossága nem megszámlálhatóan végtelen. Tétel (Cantor): jXj < 2X . Bizonyítás: Véges halmazokra az állítást korábban igazoltuk. Tegyük fel, hogy X 6= ;. A 2X hatványhalmaz tartalmazza X összes egy elem½u részhalmazát, ezért jXj 2X . Most már csak azt 18
MATEMATIKAI ALAPFOGALMAK
kell igazolnunk, hogy jXj = 6 2X , ha X 6= ;. Tegyük fel ennek az ellenkez½ojét. Ekkor léteznie kell egy kölcsönösen egyértelm½u f : X ! 2X megfeleltetésnek (pont-halmaz leképezésnek) a két halmaz között. Vizsgáljuk az A = fx 2 X j x 2 = f (x)g halmazt, amely azon X-beli x elemek halmaza, amelyek nincsenek benne az x-hez rendelt f (x) 2 2X halmazban. Minthogy A 2 2X , létezik egy a 2 X, hogy f (a) = A. Az a elemre nem teljesülhet a 2 A = f (a), mert A pontosan azon y elemek halmaza, amelyekre y 2 = f (y). Másrészt az a 2 = A = f (a) reláció sem lehetséges, mert akkor a 2 A lenne, ami megint ellentmond A de…níciójának. Tehát az azonos számosság feltevésével ellentmondásra jutottunk, vagyis jXj = 6 2X .
Az N összes véges részhalmazának 2N hatványhalmazára tehát fennáll, hogy 2N > jNj. A 2N halmaz számosságát @1 -el jelöljük.
A Cantortól származó kontinuum hipotézis azt mondja ki, hogy nincs olyan nem megszámlálhatóan végtelen A halmaz, amelynek számossága @0 és jRj között van. A hipotézist az jRj = 2N alakban is meg lehet adni. Gödel 1938-ban igazolta, hogy a kontinuum hipotézist a Zermelo-Fraenkel féle (ZF) axiómarendszerben nem lehet megcáfolni. Paul Cohen (1934-) 1963ban azt bizonyította, hogy a kontinuum hipotézist igazolni sem lehet a ZF axiómarendszerben. Ennek következtében a probléma eldönthetetlen a ZF axiómarendszerben.
A megszámlálható (felsorolható) halmaz fogalmának különösen fontos szerepe van az algoritmuselméleti vizsgálatokban. A következ½okben ennek egy fontos vonatkozását próbáljuk kiemelni. Egy halmazt felsorolhatónak (megszámlálhatónak) nevezzük, ha a tagjai felsorolhatók a következ½o értelemben: elhelyezhet½ok egy listában, amelynek van els½o, második, stb. tagja és a halmaz minden eleme el½obb vagy utóbb felt½unik a listán. A nulla elemmel rendelkez½o ; üres halmazt ebben az értelemben felsorolhatónak tekintjük. A halmaz elemeit felsoroló lista véges vagy végtelen. Egy végtelen halmazt, amelynek elemei felsorolhatók felsorolhatóan (vagy megszámlálhatóan) végtelennek nevezzük. A természetes számok N halmaza felsorolható. Egy lehetséges felsorolása: 1; 2; 3; : : : ; n; n + 1; : : :. Nem fogadható el felsorolásként például az 1; 3; 5; 7; : : : ; 2; 4; 6; : : : lista, amely els½obb felsorolja a páratlan, majd a páros számokat. A megkövetelt felsorolásban ugyanis a halmaz minden elemének fel kell t½unnie valamilyen n-edik elemként, ahol n véges. Példa: Az N2 = N N halmaz felsorolható. A halmaz (i; j) alakú számpárokból (i; n 2 N) áll. A halmaz elemeinek egy lehetséges felsorolása a következ½o: (1; 1) ; (1; 2) ; (2; 1) ; (1; 3) ; (2; 2) ; (3; 1) ; (1; 4) ; (2; 3) ; (3; 2) ; (4; 1) ; : : : Itt a felsorolás (rendezés) elve az, hogy (i; j) párokat egy mindkét irányban végtelen mátrixba rendezzük (i=sorindex, j=oszlopindex), majd a ferde átlók mentén felsoroljuk az ábrán jelzett módon: HALMAZOK SZÁMOSSÁGA
19
(1,3)
(1,4)
(1,5)
...
(2,1)
(2,2)
(2,3)
(2,4)
(2,5)
...
(3,1)
(3,2)
(3,3)
(3,4)
(3,5)
...
(4,1)
(4,2)
(4,3)
(4,4)
(4,5)
...
(5,1)
(5,2)
(5,3)
(5,4)
(5,5)
...
...
...
...
...
(1,2)
...
(1,1)
Az (i; j) párok felsorolása Vegyük észre, hogy a ferde átlókban szerepl½o elempárok összege konstans: 2 az els½o átlóban, 3 a második átlóban, 4 a harmadik átlóban, és így tovább. A felépítésb½ol világos, hogy bármely kiválasztott (m; n) pár a felsorolásban szerepelni fog j (m; n)-edik tagként. Az i-edik ferde átló elemeinek összege i + 1, elemeinek száma pedig i. Az (m; n) pár elemeinek összege m + n, ami az elemet az (m + n 1)-edik átlóba sorolja. Az els½o m + n 2 átló elemeinek száma: 2) (m + n 1) : 2 Az (m; n) pár a saját átlójában az m-edik elem lesz. Tehát az (m; n) pár sorszáma a fenti felsorolásban: (m + n 2) (m + n 1) m2 + 2mn + n2 m 3n + 2 j (m; n) = +m= : 2 2 Állítás: Ha az A és B halmazok felsorolhatók (megszámlálhatók), akkor A B is felsorolható (megszámlálható). Bizonyítás: A példa alapján eljárva az A és B halmaz elemeit el½oször külön-külön felsoroljuk: a1 ; a2 ; : : : ; am ; : : :, illetve b1 ; b2 ; : : : ; bn ; : : : Ezután az (ai ; bj ) elempárokat az (i; j) indexek alapján sorbarendezzük az el½obb látott módon. Az állítás alapján könnyen beláthatjuk, hogy Nk is felsorolható (megszámlálható). 1+2+
+ (m + n
2) =
(m + n
2.6. Nyelvek és szavak De…níció: Tetsz½oleges véges (szimbólumainak) nevezzük. 20
6= ; halmazt ábécének nevezünk. A
ábécé elemeit a
bet½uinek
MATEMATIKAI ALAPFOGALMAK
Példák: bool
lat
= f0; 1g, a Boole ábécé,
= fa; b; c; : : : ; zg, a latin ábécé,
keyboard
m
=
lat
[ fA; B; : : : ; Z; t; >; <; (; ); : : : ; !g, klaviatúra nyelve, t a szóköz jel,
= f0; 1; 2; : : : ; m
logic
1g, m
1 egész, az m alapú számrendszer ábécéje,
= f0; 1; x; (; ); ^; _; :g, Boole formulák ábécéje.
De…níció: A ábécé jeleinek tetsz½oleges véges sorozatát feletti szónak nevezzük. A w szó jwj hossza a w-ben lév½o jelek száma. A w = x1 x2 : : : xn szót felfoghatjuk a n halmaz egy (x1 ; x2 ; : : : ; xn ) elemének is, amelyb½ol a zárójeleket és az elválasztójeleket elhagyjuk. A w = x1 x2 : : : xn szó hossza: jwj = n. A "szavakkal" különböz½o objektumokat reprezentálhatunk: számokat, képleteket, gráfokat és programokat. Például az x = x1 x2 : : : xn ; xi 2 bool (i = 1; 2; : : : ; n) P szót az N (x) = ni=1 2n i xi nemnegatív szám bináris el½oállításának tekinthetjük. De…níció: Jelöljön G = (V; E) egy irányított gráfot, amelyben V a csúcsok és E
f(vi ; vj ) j vi ; vj 2 V; vi 6= vj g
az élek halmaza. Legyen jV j = n a csúcsok száma. A gráf MG = [aij ]ni;j=1 adjacencia (v. szomszédsági) mátrixát az 1; ha (vi ; vj ) 2 E aij = 0; ha (vi ; vj ) 2 =E el½oírással adjuk meg. Tekintsük az alábbi gráfot!
NYELVEK ÉS SZAVAK
v1
v2
v3
v4
21
A gráf adjacencia mátrixa
2
0 6 0 6 4 0 0
0 0 1 0
1 1 0 0
3 1 1 7 7: 1 5 0
A mátrix f0; 1; #g ábécé feletti lehetséges szó reprezentációja pedig 0011#0011#0101#0000#: De…níció: Az x = x1 x2 : : : xk 2 k és y = y1 yk : : : yl 2 után írásán) az xy = x1 x2 : : : xk y1 yk : : : yl 2
l
szavak konkatenációján (egymás
k+l
szót értjük. Példa: x = 0aa1bb, y = 111b, = f0; 1; a; bg. xy = 0aa1bb111b A konkatenáció asszociatív: x (yz) = (xy) z:
(2.1)
A Fibonacci számok sorozatát az F0 = 1; F1 = 1; Fn = Fn
1
+ Fn
2
(n
2)
el½oírással defniáljuk. Igazolható, hogy 1 Fn = p 5 A Fibonacci szavak sorozatát a
p !n+1 1+ 5 2
1 p 5
1
p !n+1 5 : 2
(2.2)
= fa; bg ábécé felett az f0 = b; f1 = a; fn = fn 1 fn
2
(n
2)
el½oírással de…niáljuk. Az els½o tíz Fibonacci szám és szó: n 0 1 2 3 4 5 6 7 8 9 22
Fn 1 1 2 3 5 8 13 21 34 55
fn b a ab aba abaab abaababa abaababaabaab abaababaabaababaababa abaababaabaababaababaabaababaabaab abaababaabaababaababaabaababaabaababaababaabaababaababa MATEMATIKAI ALAPFOGALMAK
Az üres szót "-al jelöljük. Ennek hossza j"j = 0 és tetsz½oleges x szóval konkatenálva visszaadja az x szót: x" = "x = x: De…níció: A felett értelmezett összes szavak halmazát, beleértve az " üres szót is, jelöli. De…níció: Legyen egy ábécé. Minden x 2 és i 1 egész számra legyen x0 = " és xi = xxi 1 . Példa: aabbaaaaaa = a2 b2 a6 = a2 b2 (aa)3 . De…níció: Legyen = fs1 ; s2 ; : : : ; sn g egy ábécé, n 1 és tegyük fel, hogy elemei (lineárisan) rendezettek, azaz s1 < s2 < < sn . A -on értelmezett lexikogra…kus (kanonikus) rendezést a következ½o el½oírással de…niáljuk: u < v , (juj < jvj) _ (juj = jvj ^ u = xsi u0 ^ v = xsj v 0 ^ i < j) ; ahol x; u0 ; v 0 2 . A lexikogra…kus rendezés segítségével megmutathatjuk, hogy ható). A felsorolás a következ½oképpen néz ki:
megszámlálható (felsorol-
s1 ; s2 ; : : : ; sn ; s1 s1 ; s1 s2 ; : : : ; s1 sn ; : : : ; sn s1 ; : : : ; sn sn ;
Elve pedig az, hogy el½oször vesszük az 1 jel hosszúságú szavakat (az ábécé bet½uit), majd a 2 jel hosszúságú szavakat a lexikogra…kus rendezés szerint, a 3 jel hosszúságú szavakat a lexikogra…kus rendezés szerint és így tovább. Az összes szó száma n elem½u ábécé esetén P P` k1hosszúságú k k n . Így egy x 2 szó, amelynek hossza ` a k=1 n + 1 és `k=1 nk sorszámok között kerül sorra a fenti felsorolásban. Tehát felsorolható (megszámlálható). De…níció: A tetsz½oleges L részhalmaza nyelv. Az LC = n L halmazt az L nyelv komplementumának nevezzük. L; = ; az üres nyelv. L" = f"g az egyetlen üres szóból álló nyelv. De…níció: Legyenek L1 és L2 nyelvek felett. Ekkor a két nyelv konkatenációja L1 L2 = fvw j v 2 L1 és w 2 L2 g : De…níció: Legyen L nyelv, L0 = L" , Li+1 = Li L ( i 1). Az L halmaz Kleene-féle i + i lezárása L = [i2N0 L , pozitív lezárása pedig L = [i2N L : Az L+ nem tartalmazza az üres szót. Vegyük még észre, hogy a ábécé Kleene-féle lezárása.
NYELVEK ÉS SZAVAK
23
24
MATEMATIKAI ALAPFOGALMAK
3. fejezet Algoritmusok, kiszámítható függvények és döntési problémák Az algoritmus, a kiszámíthatóság és eldönthet½oség alapvet½o, egymással összefügg½o fogalmak. Mi ezeket a fogalmakat részletesen a formális nyelvek, a leképezések (relációk) és a Turing gépek segítségével fogjuk tárgyalni.
Muhammad ibn Musa al-Khwarizmi, IX. század eleje Az algoritmus szó a híres középkori "arab" matematikus Muhammad ibn Musa al-Khwarizmi nevéb½ol ered, aki 800. el½ott született Horezm területén (az Amu-Darja mentén, kb. a mai Türkmenisztán és Üzbegisztán), és legalább 847-ig élt. A Bagdadi "Bölcsesség Háza" egyetemen tanított és 825 körül írta a f½o munkáját, amelynek címe "Al-jabr wa’l muqabala" (az algebra szó innen ered) és egy könyvet az 1,2,34,5,6,7,8,9 és 0 jeleken alapuló hindu-arab számokról, Az utóbbi könyv eredeti arab kézirata elveszett, de ennek latin fordítása "Algoritmi de numero Indorum" (Al-Khwarizmi a Hindu számítási m½uvészetr½ol) fennmaradt és bevezette az arab számokat Európába. A 0 szám els½o el½ofordulása is valószín½uleg neki köszönhet½o. A könyvben számítási szabályok vannak leírva, amelyeket utána neveztek el (Algoritmi dicit .../Al-Khwarizmi ezt mondja ...). Igen sokáig algoritmus alatt a ma már "egyszer½u" aritmetikai számolási szabályokat értették. Mi algoritmus alatt számítási modelleket értünk és a kiszámíthatóság és eldönthet½oség fogalmait ezekre alapozzuk. Más tárgyalásokban az algoritmus fogalmát tekintik adottnak, amely ALGORITMUSOK, KISZÁMíTHATÓ FÜGGVÉNYEK ÉS DÖNTÉSI PROBLÉMÁK
25
lehet½ové teszi néhány alapfogalom és összefüggéseik "egyszer½u" tárgyalását. Tegyük most fel egy rövid id½ore, hogy az algoritmus fogalmát valahogy de…niáltuk. De…níció: Egy f : N0 ! N0 (parciális) függvényt ekkor kiszámíthatónak nevezünk, ha van olyan A algoritmus, amely kiszámítja f -et úgy, hogy: 1. Ha f (n) értelmezve van (de…niált), akkor A megáll és kinyomtatja f (n) értékét. 2. Ha f (n) nincs értelmezve (nem de…niált), akkor A nem áll meg az n "inputon". Vegyük észre, hogy a de…níció szerint a sehol sem de…niált üres függvény is kiszámítható. De…níció: Az X N0 halmaz eldönthet½o, ha van olyan algoritmus, amely eldönti, hogy egy n 2 N0 szám az X halmazhoz tartozik-e? De…níció: A B halmaz karakterisztikus függvénye: B
(x) =
ha x 2 B ha x 2 =B
1; 0;
Egy X halmaz eldönthet½o, ha a X karakterisztikus függvény kiszámítható. Állítás: Ha X és Y eldönthet½o, akkor X [ Y , X \ Y , XnY és Y nX is az. De…níció: Egy X N0 halmazt felsorolhatónak (megszámlálhatónak) nevezzük, ha van olyan algoritmus, amely (tetsz½oleges sorrendben és késésekkel) kinyomtatja az X elemeit és csakis azokat. Ekvivalens megfogalmazások a következ½ok: 1. Egy X halmaz felsorolható, ha X = Df , ahol f kiszámítható. 2. Egy X halmaz felsorolható, ha X = Rf , ahol f kiszámítható. Állítás: Ha X és Y felsorolható, akkor X [ Y és X \ Y is az. Tétel (Emil Post): Ha X N0 eldönthet½o, akkor felsorolható is. Ha egy X halmaz és komplementere N0 nX is felsorolható, akkor X eldönthet½o. Tétel: Egy f : N0 ! N0 (parciális) függvény akkor és csak akkor kiszámítható, ha a gráfja F = f(x; y) j f (x) értelmezett és f (x) = yg felsorolható. Most a részletek pontos speci…kálása nélkül feltesszük, hogy az algoritmus egy leképezés a következ½o tulajdonságokal. De…níció: Az A algoritmus (program) egy A:
1
!
2
leképezés a 1 és 2 ábécék felett a következ½o tulajdonságokkal: (i) Az inputok 1 feletti szavak, (ii) Az outputok 2 feletti szavak, (iii) A minden inputhoz egyértelm½uen rendel hozzá egy outputot. Jelölje az A algoritmus inputját x 2 1 , az outputját pedig A (x) 2 2 . De…níció: Az A; B : 1 ! 2 algoritmusokat (programokat) ekvivalensnek nevezzük, ha A (x) = B (x) minden x 2 1 esetén. De…níció: Legyen 1 és 2 két ábécé. Az A algoritmus kiszámítja az f : 1 ! 2 függvényt, ha minden x 2 1 esetén A (x) = f (x). 26
ALGORITMUSOK, KISZÁMíTHATÓ FÜGGVÉNYEK ÉS DÖNTÉSI PROBLÉMÁK
De…níció: Egy adott ábécéhez és L nyelvhez tartozó ( ; L) döntési probléma alatt azt P értjük, hogy minden x 2 esetén el kell dönteni, hogy x 2 L vagy x 2 = L. Az A algoritmus a ( ; L) döntési problémát megoldja vagy felismeri, ha minden x 2 esetén: A (x) =
1, ha x 2 L; 0, ha x 2 = L.
A döntési probléma tehát egy speciális függvény kiszámítási probléma, ahol az algoritmus az L nyelv un. karakterisztikus függvényét számítja ki. Példa: Prímtesztelés: ( bool ; fx 2 ( bool ) j N (x) prímszámg) ; ahol N (x) az x szóhoz rendelt bináris szám. Példa: Hamilton kör probléma ( ; HC), ahol HC = fx 2 Példa: Kielégíthet½oségi probléma ( SAT = fx 2 (
= f0; 1; #g és
j x Hamilton kört tartalmazg : logic ; SAT )
logic )
:
j x egy kielégíthet½o Boole formulag :
De…níció: Ha egy L nyelvhez létezik egy algoritmus, amely L-et felismeri, akkor az L nyelvet rekurzívnak nevezzük. A fenti de…níciók alapján gondolhatjuk, hogy függvények kiszámítása a legáltalánosabb számítási probléma. Ez azonban nem így van. De…níció: Legyen és két ábécé és legyen R egy reláció. Az A algoritmus kiszámítja R-et, ha minden x 2 esetén (x; A (x)) 2 R. Példa: Input: x 2 ( bool ) , Output: y 2 ( bool ) , ahol y értékét a következ½oképpen határozzuk meg. Ha N (x) prímszám, akkor y = 1. Ha N (x) összetett szám, akkor y az N (x) egynél nagyobb akármelyik osztója lehet. A megfelel½o reláció: R = f(x; y) j y = 1, ha N (x) prím, y > 1 ^ (y j N (x))g : Az el½oz½o de…nícióban szerepl½o relációval nemdeterminisztikus számítási feladatokat írunk le. Az (x; A (x)) 2 R feltétel azt jelenti, hogy A (x) 2 R (x). Ha R valódi reláció, azaz jR (x)j > 1 legalább egy x 2 DR elemre, akkor az adott x esetén az algoritmus eredménye tetsz½oleges A (x) 2 R (x) elem lehet. Azaz ugyanarra az inputra más és más eredményeket kaphatuk. A determinisztikus esetben ez nem lehetséges, mert ugyanarra az inputra mindig ugyanazt a kimenetet kapjuk. Tekintve, hogy a nemdeterminisztikus számítási modellek fontos szerepet játszanak a bonyolultságelméletben, a függelékben röviden ismertetjük a programozás alapfogalmainak egy nemdeterminisztikus, relációelméleti leírását is.
ALGORITMUSOK, KISZÁMíTHATÓ FÜGGVÉNYEK ÉS DÖNTÉSI PROBLÉMÁK
27
28
ALGORITMUSOK, KISZÁMíTHATÓ FÜGGVÉNYEK ÉS DÖNTÉSI PROBLÉMÁK
4. fejezet Formális nyelvek és automaták 4.1. Formális nyelvek A formális nyelvek elmélete az 1950-es évek végén, az 1960-as évek elején alakult ki a programozási nyelvek megalapozására és vizsgálatára. Az automaták elméletét ugyanekkor fejlesztették ki. Fontos szerepük van a nyelvek (formális nyelvek, programnyelvek) felismerésében és elemzésében. Nyelv alatt egy véges ábécé feletti szavak halmazát értjük. Most bevezetjük a generatív nyelvtan fogalmát, amely a T terminális és az N nemterminális jelek diszjunkt ábécéjéb½ol, egy kitüntetett nemterminális kezd½oszimbólumból és szavak átírási szabályainak R halmazából áll. A fejezetben négy nyelvtípust de…niálunk a generatív nyelvtan fogalmának segítségével. A formális nyelvek elméletét programozási nyelvek interpretálására (elemzésére, felismerésére) használjuk . A programnyelvet (általában) több lépésben fordítjuk és értelmezzük. Ennek els½o lépése a lexikális analízis, amelyben a jeleket lexikális egységekbe (tokenekbe) gy½ujtjük. Ezt a lépést tipikusan automatákkal (véges állapotú gépekkel) végzik. A fordítás második lépése a szintaktikai elemzés (parsing), amelyben a lexikális egységekhez (tokenekhez) a nyelvtan szabályainak egy sorozatát (derivációkat) rendelünk. De…níció: A G = (N ; T ; s; R) rendszert generatív nyelvtannak nevezzük, ahol 1) N = 6 ; véges halmaz, a nemterminális szimbólumok (változók) halmaza, 2) T = 6 ; véges halmaz, a terminális szimbólumok halmaza, 3) N \ T = ;, 4) s 2 N a kezd½oszimbólum, 5) R olyan u ! v ( u; v 2 (N [ T ) ) alakú átírási (helyettesítési) szabályok véges halmaza, ahol u tartalmaz legalább egy elemet N -b½ol. Az átírási szabályok R halmazát felfoghatjuk a + véges részhalmazaként, ahol = N [ T a teljes ábécé. Tehát az u ! v átírási szabályt az (u; v) 2 R elempárral azonosítjuk. Példa: Legyen N = fsg, ahol s egyben a kezd½oszimbólum is, T = fa; bg a terminális jelek halmaza, R pedig a s ! asb, s ! ab alakú átírási szabályok halmaza. Az s kezd½ojelb½ol kiindulva a két átírási szabály ismételt alkalmazásával ak bk (k 1) alakú szavakat tudunk FORMÁLIS NYELVEK ÉS AUTOMATÁK
29
el½oállítani: ! ak sbk ! ak (ab) bk = ak+1 bk+1 :
s ! asb ! a (asb) b !
De…níció: Legyen G = (N ; T ; s; R) generatív nyelvtan. Ha w1 2 (N [ T )+ , w1 = p1 up2 és R tartalmazza az u ! v átírási szabályt, akkor w1 -et helyettesíthetjük a w2 = p1 vp2 szóval. Ebben az esetben azt mondjuk, hogy w2 közvetlenül levezethet½o w1 -b½ol G-ben (jelben w1 )G w2 ). A v 2 (N [ T ) levezethet½o az u 2 (N [ T )+ szóból (jelben u )G v), ha van olyan k egész szám és u0 ; u1 ; : : : ; uk 2 (N [ T ) szavak, hogy u = u0 )G u1 )G : : : )G uk = v: Ezt a levezetés láncot k-hosszúságú derivációnak is nevezzük. Például s ) A ) aAb ) aaAbb ) aaabbb egy 4-hosszúságú deriválás. De…níció: Legyen G = (N ; T ; s; R) generatív nyelvtan. A G nyelvtan által generált nyelven az L (G) = fw 2 T j s )G wg nyelvet értjük. Az L (G) nyelv az összes olyan T -beli szóból áll, amely megkapható a kezd½oállapotból G-beli derivációval. Példa: G = (fsg ; fa; bg ; s; fs ! asb; s ! abg) esetén L (G) = fan bn j n 1g : Példa: Legyen G1 = (N1 ; T1 ; s; R1 ), ahol N1 = fs,B,Cg, T1 = fa,b,cg és R1 a következ½o szabályokból áll: a)
s ! asBC
d)
aB ! ab
b)
s ! aBC
e)
bB ! bb
c)
CB ! BC
f)
bC ! bc
g)
cC ! cc
Tekintsük a következ½o levezetés láncokat: s ! a(s)BC ) aaB(CB)C ) a(aB)BCC ) aa(bB)CC ) aab(bC)C ) aabb(cC) ) aabbcc; illetve s ! a(s)BC ) aa(s)BCBC ) aaaB (CB) CBC ) aaaBBC(CB)C ) aaaBB(CB)CC ) ) aa(aB)BBCCC ) aaa(bB)BCCC ) aaab(bB)CCC ) aaabb(bC)CC ) ) aaabbb(cC)C ) aaabbbc(cC) ) aaabbbccc: Feladat: Igazoljuk, hogy L (G1 ) = fan bn cn j n 1g. A generatív nyelvtan fogalmának segítségével meg tudjuk fogalmazni függények kiszámítását a formális nyelvek keretén belül. 30
FORMÁLIS NYELVEK ÉS AUTOMATÁK
De…níció: Legyen adott egy G = (N ; T ; s; R) generatív nyelvtan és az f : ! függvény ( = N [ T ). A G nyelvtan "kiszámítja" f -et, ha minden w; v 2 esetén a következ½o állítás igaz: sws )G v akkor és csak akkor, ha v = f (w) : Egy ! függvényt nyelvtanilag kiszámíthatónak nevezünk, ha létezik egy G nyelvtan, amely kiszámítja. A most megfogalmazott függvénykiszámítás koncepció nem határozza meg a helyettesítési szabályok sorrendjét. Markov rendszerben ez egyértelm½uvé tehet½o, de a kiszámítható függvények köre ugyanaz marad.
4.1.1. Generatív nyelvtanok osztályozása A generatív nyelvtanok következ½o osztályozását N. Chomsky vezette be és ezek egymáshoz való viszonyát Chomsky-féle hierarchiának nevezzük. De…níció: A G = (N ; T ; s; R) generatív nyelvtan kifejezés struktúra, vagy 0-típusú, ha átírási szabályainak R halmazára nincs megszorítás. A 0-típusú nyelvtanok által generált nyelvek osztályát L0 -al jelöljük De…níció: A G = (N ; T ; s; R) generatív nyelvtan környezetfügg½o, vagy 1-típusú, ha minden (u; v) 2 R átírási szabályára teljesül, hogy v nem tartalmaz kevesebb karaktert mint u, azaz juj jvj. A környezetfügg½o (1-típusú) nyelvtanok által generált nyelvek osztályát L1 -el jelöljük és ezeket környezetfügg½o nyelveknek nevezzük. Feladat: Igazoljuk, hogy L (G1 ) környezetfügg½o. De…níció: A G = (N ; T ; s; R) generatív nyelvtan környezetfüggetlen, vagy 2-típusú, ha minden (u; v) 2 R átírási szabályára teljesül, hogy u 2 N . A környezetfüggetlen (2-típusú) nyelvtanok által generált nyelvek osztályát L2 -vel jelöljük és környezetfüggetlen nyelveknek nevezzük. Példa: A G = (fs,Ag ; fa,bg ; s; fs ! asb; s ! "g) nyelvtan környezetfüggetlen és az L (G) = fan bn j n 0g nyelvet generálja. Példa: Tekintsük a G3 nyelvtant, amelyet az alábbi terminális és nemterminális jelek és átírási szabályok de…niálnak: a)
s ! cM cN c
d)
N ! bN b
b)
M ! aM a
e)
N !c
c)
M !c
Könnyen igazolható, hogy G3 környezetfüggetlen és L (G3 ) = fcan can cbm cbm c j n; m 0g. A környezetfüggetlen nyelvek számos programozási nyelv fontos tulajdonságait emelik ki. De…níció: A G = (N ; T ; s; R) generatív nyelvtan reguláris, vagy 3-típusú, ha minden (u; v) 2 R átírási szabálya a ! w vagy a ! wb alakú, ahol a; b 2 N és w 2 T . FORMÁLIS NYELVEK
31
Ez azt jelenti, hogy az átírási szabályok jobb oldala vagy terminális elem, vagy egy terminális elem amelyet egy nem terminális elem követ. A reguláris (3-típusú) nyelvtanok által generált nyelveket reguláris nyelveknek nevezzük és ezek osztályát L3 -al jelöljük. Példa: Legyen G4 = (N4 ; T4 ; s; R4 ), ahol N4 = fs; A; Bg, T4 = f0; 1g és R4 -et az alábbi átírási szabályok de…niálják: a) s ! 0A d) B ! 0A b)
s!0
c)
A ! 1B
e)
B!0
Ez a nyelvtan reguláris. Az átírási szabályokat alkalmazva a következ½o derivációkat kaphatjuk: s ! 0, s ! 0A ! 01B ! 010, s ! 0A ! 01B ! 010A ! 0101B ! 01010, stb. Eszerint a generált nyelv (01)k 0 alakú szavakból áll, hol k n0. o k Feladat: Igazoljuk formálisan is, hogy L (G4 ) = (01) 0 j k 0 . Feladat: Legyen G = (fs; a; bg ; f1g ; s; R), ahol R = fs ) 1a; a ) 1b; b ) 1a; a ) 1; s ) "g. Igazoljuk, hogy G reguláris és L (G) = f12n j n 0g! Feladat: Legyen G = (fsg ; fa; bg ; s; R), ahol R elemei: s ) asb, s ) ss, s ) ". Mi az L (G)? Azonosítsuk a-t a balzárójellel, b-t pedig a jobb zárójellel! A programozási nyelvek nagy része környezetfüggetlen. A reguláris nyelveknek fontos szerepe van a lexikális analízisnél. A Chomsky-féle hierarchia azt jelenti, hogy a most de…niált négy generatív nyelvosztályra fennáll az L0 L1 L2 L3 tartalmazási reláció. Gra…kusan ábrázolva:
kifejezés struktúra (L0) nyelvek környezetfüggő (L1) nyelvek
környezetfüggetlen (L2) nyelvek
reguláris (L3) nyelvek
Generatív nyelvek Chomsky-féle osztályozása A négy nyelvosztályba tartozó nyelveket különböz½o tulajdonságú (erej½u) gépekkel (automatákkal, Turing gépekkel, stb.) lehet felismerni. Ezeket a következ½okben tárgyaljuk. 32
FORMÁLIS NYELVEK ÉS AUTOMATÁK
4.2. Automaták Az automaták (véges állapotú gép) fogalmát mint egyfajta számítógép modelleket az 1950es évek elején Hu¤man (1955), Mealy (1955) és Moore (1956) vezették be. Az automaták véges sok bels½o állapottal rendelkez½o speciális gépek, amelyek adott input jel és bels½o állapot esetén meghatározott bels½o állapotba mennek át és egy adott jelsorozatot (szót) szekvenciálisan (lineárisan) dolgoznak fel. Az automatáknak számos típusát de…niálták: - Mealy és Moore gépek, - Véges determinisztikus automata, - Véges nemdeterminisztikus automata, - Véletlen automata, - Verem automata, - Lineárisan korlátos automata (szalag korlátos Turing gép). Ezek közül három automata típust ismertetünk.
4.2.1. Véges determinisztikus automaták De…níció: Egy véges determinisztikus automatán az M = (Q; ; ; q0 ; F ) rendezett elem ötöst értjük, ahol (i) Q 6= ? az állapotok véges halmaza, (ii) véges input ábécé, (iii) : Q ! Q az állapotátmeneti (következ½o állapot) függvény, (iv) q0 a kiinduló állapot ( q0 2 Q), (v) F Q az elfogadó állapotok halmaza. A (q; a) = p egyenl½oség azt jelenti, hogy M a q 2 Q állapotból az a 2 input hatására átvált a p 2 Q állapotba. Tegyük fel, hogy x = x1 x2 : : : xn 2 (n = jxj). Az M automata az x ”szót” (inputot) a következ½oképpen dolgozza fel: M a q0 kezdeti állapotban ”beolvassa”x1 -et, majd a q1 = (q0 ; x1 ) állapotba kerül. M a q1 állapotban beolvassa x2 -½ot, majd a q2 = (q1 ; x2 ) 2 Q állapotba kerül. M a qi állapotban beolvassa xi+1 -et, majd a qi+1 = (qi ; xi+1 ) 2 Q állapotba kerül. M a qn 1 állapotban beolvassa xn -et, majd a qn = (qn 1 ; xn ) 2 Q állapotba kerül. A jelsorozat feldolgozása az n-ik lépésben befejez½odik. Ekkor az automata a qn = (qn 1 ; xn ) végs½o állapotba kerül. Az automata m½uködésének szemléltetéséhez tegyük fel, hogy az x 2 szót egy input szalagon helyezzük el, amelyhez egy, az automatával összekötött olvasófej csatlakozik. Az AUTOMATÁK
33
olvasófej beolvas egy karaktert, az automata felveszi a jelt½ol függ½o új állapotát és az olvasó fej eggyel jobbra lép.
xi+1
xi+1
qi
xi+2
qi+1
De…níció: Az M automata elfogadja az x (input)szót, ha a végs½o állapotra qn 2 F teljesül. M elutasítja x-et, ha qn 2 = F (azaz qn 2 Q n F ). De…níció: Az M automatát teljesnek nevezzük, ha minden (q; a) 2 Q p 2 Q állapot, amelybe átválthat.
párhoz van olyan
Egy automata m½uködését un. állapot táblázattal, illetve állapot diagrammal is szemléltethetjük. Példa: M = (Q; ; ; q0 ; F ), ahol Q = fq0 ; q1 ; q2 ; q3 g, (q0 ; 0) = q2 ; (q2 ; 0) = q0 ;
(q0 ; 1) = q1 ; (q2 ; 1) = q3 ;
= f0; 1g, F = fq0 ; q3 g és
(q1 ; 0) = q3 ; (q3 ; 0) = q1 ;
(q1 ; 1) = q0 ; (q3 ; 1) = q2 :
A megfelel½o állapot táblázat: Jel Állapot q0 q1 q2 q3
0 q2 q3 q0 q1
1 q1 q0 q3 q2
A megfelel½o állapotdiagram: 34
FORMÁLIS NYELVEK ÉS AUTOMATÁK
1
q0
q1
1 0
0
0
0 1
q2
q3
1
Az elfogadó állapotokat dupla kör jelöli. Példa: paritásellen½orz½o gép: 0-kat és 1-eket olvas be egy szalagról. Bels½o állapota q0 , ha az addig beolvasott 1-ek száma páros és q1 , ha ezek száma páratlan. Jel Állapot 0 q0 q0 q1 q1
1 q1 q0
1
0 q0
q1
0
1
De…níció: Az M automata által elfogadott (felismert) nyelv az L (M ) = fw 2
j M elfogadja w-tg
halmaz. Az automata által felismert nyelv pontosan azokból a szavakból áll, amelyekre M a kezd½oállapotból valamely elfogadó végállapotba megy át. De…níció: Egy L nyelvet felismerhet½onek nevezünk, ha van olyan M véges determinisztikus automata, amelyre L (M ) = L. AUTOMATÁK
35
Tétel: Ha L1 és L2 nyelvek felismerhet½ok egy véges nem determinisztikus automatával, akkor L1 L2 is felismerhet½o. Tétel (Kleene): A véges (determinisztikus) automatákkal felismerhet½o nyelvek osztálya megegyezik az L3 (reguláris) nyelvosztállyal.
4.2.2. Véges nem determinisztikus automaták De…níció: Egy véges nem determinisztikus automatán az M = (Q; ; ; q0 ; F ) rendezett elem ötöst értjük, ahol (i) Q 6= ? az állapotok véges halmaza, (ii) véges input ábécé, (iii) : Q ! 2Q az állapotátmeneti "függvény", (iv) q0 a kiinduló állapot ( q0 2 Q), (v) F Q az elfogadó állapotok halmaza. Ha M a p 2 Q állapotban van és az y 2 jelet olvassa be, akkor M állapotátmeneti "függvénye" egy véges (p; y) Q részhalmazt de…niál. Az M következ½o állapota ennek tetsz½oleges q 2 (p; Y ) eleme lehet (amelynek nincs rögzített kiválasztási szabálya). Egy egyszer½u példát mutat erre a következ½o állapot diagrammal megadott nem determinisztikus automata: b q0
q1 a
a
b a
q2
a,b
b
q3
a
Az automata azért nem determinisztikus, mert a q0 állapotban az a input jel hatására az automata felveheti a q1 , illetve q3 állapotot is. Vizsgáljuk most a fenti automata számítási fáját a 3 karakter hosszúságú sorozatokon! 36
FORMÁLIS NYELVEK ÉS AUTOMATÁK
q0
b a
a
q3
q1
q3 a q3
q0 b
a
q2
q1
b
a
b
a
q3 b
a q3
q2
q2 a,b q2
a
b
q3
q2
q2
a,b q2
a,b q2
Az abb szó esetén az automata végs½o állapota q2 , amelyhez két úton juthat el: q0 ! q1 ! q0 ! q2 ; q0 ! q3 ! q 2 ! q2 : Az aba szó esetén több végs½o állapotot is elérhet: q0 ! q1 ! q 0 ! q1 ; q0 ! q1 ! q 0 ! q3 ; q0 ! q3 ! q 2 ! q2 : De…níció: Az M = (Q; ; ; q0 ; F ) véges nem determinisztikus automata az x = x1 : : : xn 2 inputot elfogadja, ha van az állapotoknak egy olyan véges qk1 ; qk2 ; : : : ; qkn+1 sorozata, amelyre teljesül, hogy: a) minden i n esetén qki+1 2 (qki ; xi ) (qk1 = q0 ), b) qkn+1 2 F . Tétel: A véges nem determinisztikus automaták által elfogadott (felismert) nyelvek megegyeznek a reguláris ( L3 ) nyelvekkel.
4.2.3. Verem automaták De…níció: Egy véges determinisztikus verem automatán az M = (Q; ; ; ; q0 ; F ) rendezett elem hatost értjük, ahol (i) Q 6= ? az állapotok véges halmaza, (ii) véges input ábécé, amely tartalmazza a üres jelet, AUTOMATÁK
37
(iii) véges verem ábécé, amely tartalmazza a # üres jelet, (iv) : Q ( [ f"g) ( [ f"g) ! ( [ f"g) (Q [ f"g) az állapotátmeneti függvény, (v) q0 a kiinduló állapot ( q0 2 Q), Adott állapotban lév½o veremautomata beolvas egy jelet az input szalagról és a verem tetejér½ol. Meghatározza az új állapotát és a verem memórián végzend½o m½uveletet (pl. verem tetejének törlése, vagy új elem beírása a verem tetejére). Sematikusan: a beolvasandó input
olvasófej
író/olvasó fej
a verem
M
automata
#
Formálisan: Tegyük fel, hogy a p 2 Q állapotban beolvasott szalag szimbólum x, a verem tetejér½ol beolvasott szimbólum pedig y. Az állapotátmeneti függvény értéke pedig legyen (p; x; y) = (q; z). Ekkor M az y-t leemeli (törli) a verem tetejér½ol, a q állapotba vált és z-t beírja a verem tetejére. Ha azonban x = ", y = " vagy z = ", akkor ennek megfelel½oen M nem olvassa a szalagot, nem törli a verem tetejét, illetve nem ír a verem tetejére. A szalag olvasófeje mozdulatlan marad, ha x = " és egy hellyel jobbra mozdul, ha x 6= ". A veremautomata m½uködése üres szalag, vagy verem esetén: Ha (p; x; ") = (q; z) (üres verem), akkor a q állapotba kerül és z-t beírja a verem tetejére. Ha (p; x; y) = (q; "), akkor M a q állapotba kerül és y-t leveszi a verem tetejér½ol (nem ír a verembe). Ha (p; "; y) = (q; z) (üres szalag), akkor nem olvas a szalagról, y-t a verem tetejér½ol leemeli, z-t a verem tetejére beírja. Ha (p; "; ") = (q; ") (üres szalag, üres verem), akkor M a q állapotba kerül, nem olvas be a szalagról és nem végez író, vagy olvasó m½uveletet a veremen. De…níció: Az M verem automata az x jelsorozatot elfogadja, ha a q0 kiinduló állapotból és üres veremb½ol kiindulva az x input szó feldolgozásának a végén elfogadó állapotba kerül. Az M veremautomata által elfogadott L (M ) nyelv az M által elfogadott szavak halmaza. Vegyük észre, hogy a (p; x; ") = (q; ") esetben a veremautomata a vermet …gyelmen kív½ul hagyja és a véges nemdeterminisztikus automatát szimulálja. Ebb½ol azonnal következik az alábbi eredmény. 38
FORMÁLIS NYELVEK ÉS AUTOMATÁK
Állítás: A verem automaták elfogadják (felismerik) a reguláris ( L3 ) nyelveket. A verem automaták ennél azonban jóval többet tudnak, azaz er½osebbek mint az "egyszer½u" automaták. Igaz ugyanis a következ½o Tétel: A veremautomaták által elfogadott (felismert) nyelvek a környezetfüggetlen ( L2 ) nyelvek. A generatív nyelvek Chomsky hierarchiájára vonatkozó ábránkat a következ½oképpen egészíthetjük ki:
kifejezés struktúra (L0) nyelvek környezetfüggő (L1) nyelvek
környezetfüggetlen (L2) nyelvek veremautomata
reguláris (L3) nyelvek véges determinisztikus automata véges nemdeterminisztikus automata veremautomata
Automaták által felismert generatív nyelvek
Példa: Legyen M = (Q; ; ; ; s; F ), ahol Q = fs; p; r; f g, = fa; b; c; g, = fa; b; #g, F = ff g. A állapotátmeneti függvényt az alábbi állapotábra adja meg, ahol a p és q állapotok közti él a; b; c cimkéje a (p; a; b) = (q; c) "m½uveletnek" felel meg. AUTOMATÁK
39
a,a;ε
b,b;ε p
a,b;a a,a;a a,ε;a
ß,b;ε a,b;ε a,#;ε b,a;ε b,#;ε ß,a;ε c,ε;ε
c,ε;ε
ß,#;ε Start
s
r
ß,ε,ε
b,ε;b b,a;b
ε,ε;ε
b,b;b
f
ε,ε;ε
Az f az elfogadó állapotot, r pedig az elutasító állapotot jelöli. A (p; x; y) = (q; z) összefüggés helyett alkalmazott (p; x; y; q; z) jelöléssel az állapotábrának megfelel½o állapotátmeneti táblázat a következ½o: állapotátmenet (a)
(b)
(c) (d) (e) (f)
(s; a; "; s; a) (s; a; a; s; a) (s; a; b; s; a) (s; b; "; s; b) (s; b; a; s; b) (s; b; b; s; b) (s; c; "; p; ") (s; ; "; r; ") (p; a; a; p; ") (p; b; b; p; ")
megjegyzés verembe írja a-t
" " verembe írja b-t
" " elfogad? elutasít elfogad? elfogad?
állapotátmenet (g) (h) (i) (j) (k) (l) (m) (n) (o) (p)
(p; ; #; f; ") (p; a; b; r; ") (p; b; a; r; ") (p; ; a; r; ") (p; ; b; r; ") (p; a; #; r; ") (p; b; #; r; ") (p; c; "; r; ") (r; "; "; r; ") (f; "; "; f; ")
megjegyzés elfogad elutasít elutasít elutasít elutasít elutasít elutasít elutasít elutasító állapoban marad elfogadó állapotban marad
Megmutatjuk, hogy a veremautomata wcwR alakú palindrom kifejezéseket fogad el, ahol w a w 2 fa; bg szó fordítottja! A veremautomata mindaddig az s kezd½oállapotban marad, amíg a és b jeleket olvas be. Ezeket a verembe írja az input szalaghoz képest "fordított sorrendben" ((a) és (b) szabály). Ha az s állapotban a c bet½u megjelenik, akkor a veremautomata átmegy a p lehetséges elfogadó állapotba ((c) szabály). Ha a szalagon a üres jel jelenik meg, akkor átmegy az r elutasító állapotba ((d) szabály). Az automata a p állapotban marad mindaddig, amíg a szalagról és a veremb½ol kiolvasott jel megegyezik ((e),(f) szabály). Ha a p állapotban a szalagról és veremb½ol beolvasott jelek különböz½ok, vagy a c (újra) el½okerül, akkor az elutasító r állapotba kerül ((h)(n) szabályok). Az automata sem ez elfogadó, sem pedig az elutasító állapotból nem lép ki ((o)-(p) szabályok). R
40
FORMÁLIS NYELVEK ÉS AUTOMATÁK
Példa: Legyen M = (Q; ; ; ; s; F ), ahol Q = fs; p; r; f g, = fa; b; g, F = ff g. A állapotátmeneti függvényt a következ½o állapotábra,
= fa; b; #g,
b,a;ε p b,#;ε b,a;ε
a,a;a
ß,a;ε
a,ε;ε
a,ε;a ß,#;ε Start
s
r
b,#,ε
ß,ε;ε
ε,ε;ε
f
ε,ε;ε
illetve állapotátmeneti táblázat adja meg: állapotátmenet (a) (b) (c) (d) (e) (f)
(s; ; "; f; ") (s; a; "; s; a) (s; a; a; s; a) (s; b; #; r; ") (s; b; a; p; ") (p; b; a; p; ") (p; b; #; r; ")
megjegyzés elfogad verembe írja a-t
" elutasít törli a-t a veremb½ol törli a-t a veremb½ol elutasít
állapotátmenet (g) (h) (i) (j) (k)
(p; ; a; f; ") (p; ; #; f; ") (p; a; "; r; ") (f; "; "; f; ") (r; "; "; r; ")
megjegyzés elfogad elfogad elutasít elfogadó állapoban marad elutasító állapoban marad
Megmutatjuk, hogy a veremautomata az L = fan bm j n m 0g nyelvet fogadja el! M a kiinduló s állapotban az üres szalag és verem állapotot elfogadja és átmegy az f elfogadó állapotba ((a) szabály). Az a jel hatására az s állapotban marad és a verem tetejére beírja a-t ((b) szabály). A b jel hatására üres verem esetén az s állapotból átmegy az r elutasító állapotba ((c) szabály). Ha a verem nem üres, akkor a-t törli a verem tetejér½ol és átmegy a p állapotba ((d) szabály). Ha a p állapotban b-t olvas be az input szalagról és a van a verem tetején, akkor a p állapotban marad, mert lehetséges, hogy az input kevesebb b-t tartalmaz, mint a-t ((e) szabály). Ha azonban a b beolvasásakor a verem üres, akkor M az elutasító állapotba kerül ((f) szabály). Ha a p állapotban M észreveszi, hogy több a van mint b, akkor elfogadó állapotba megy át ((g),(h) szabály). Ha a p állapotban (tehát egy b jel után) beolvasásra kerül egy a jel, akkor M az inputot elutasítja és az r állapotba megy át. Az automata az elfogadó, vagy elutasító állapot elérése után ezekben az állapotokban marad ((j),(k) szabályok). AUTOMATÁK
41
42
FORMÁLIS NYELVEK ÉS AUTOMATÁK
5. fejezet Számítási modellek Az algoritmus fogalmának pontos meghatározására igen sokféle matematikai modellt dolgoztak ki. Ezek közül a fontosabbak a következ½ok: - rekurzív függvények (Gödel, 1934) - Turing gépek (Turing, 1936 és részben Post, 1936) - rekurzív függvények (Church, 1936) - parciális rekurzív függvények (Kleene, 1936) - -kalkulus (Church, 1936) - általánosított Turing gépek (Turing, 1939, Leeuw, Moore, Shannon, Shapiro, 1956, Chandra, Stockmeyer, 1976, Kozen, 1976, Burgin, 1992) - neurális hálók (McCulloch, Pitts, 1943) - von Neumann automata (sejtautomata) (John von Neumann, 1949) - Kolmogorov algoritmusok (1953) - véges automata (McCulloch, Pitts, 1943, Mealy, 1953, Kleene, 1956, Moore, 1956, Rabin, Scott, 1959, stb.) - Minsky gépek (Minsky, 1967) - memória-módosító gépek (Schönhage gépek, Schönhage, 1980) - RAM (Sheperdson, Sturgis, 1963), RASP (Elgot-Robinson, 1964), PRAM - Petri hálók (Petri, 1962) - vektor gépek (Pratt, Rabin, Stockmeyer, 1974) - Post szorzatok (Post, 1943) - normális Markov algoritmusok (Markov, 1954) - formális nyelvek (Chomsky, 1956, Backus, 1959, Naur, 1960) - stb. A sokféle számítási modell közül a következ½oket vizsgáljuk: - Turing gépek, - RAM gép, - logikai hálózatok (Boole áramkörök). Ezeket tekintjük ma alapvet½o modelleknek. SZÁMíTÁSI MODELLEK
43
5.1. Turing gépek A Turing gép (T ) olyan véges sok bels½o állapotú gép, amelynek két f½o komponense van: - egy végtelen, egy elem½u cellákra osztott input/output szalag mindkét irányban (L=bal, R=jobb, N=nem mozdul) mozgó író/olvasó fejjel, - véges állapotú vezérl½o egység. A végtelen szalag egy ”végtelen memória”modellnek felel meg. A Turing gép egy elemi m½uvelete a gép bels½o állapotától és az iró/olvasó fej aktuális helyzetéhez tartozó cella jelét½ol függ. Az elemi m½uvelet összetev½oi: - T állapotot vált, - jelet ír az aktuális cellába, - elmozdítja a fejet egy cellával jobbra (R), vagy balra (L), vagy helyben hagyja (N). A Turing gép m½uködését az alábbi ábrával szemléltethetjük: 0
1
2
s
x1
x2
i ...
xi-1
xi
n xi+1
...
xn
#
#
...
író/olvasó fej
végtelen szalag
vezérlő egység (program)
Az s jel a szalag baloldali végjele (tkp. kezd½ojel), a fej nem léphet az s jelt½ol balra. A # szimbólum az üres helyet jelöli. A szalag jobbra végtelen (mindkét irányban végtelen szalagú T gépet is szokás de…niálni). A Turing gép formális de…níciója a következ½o. De…níció: Egy determinisztikus Turing gépen ( T ) az T = (Q; ; #; s; ; q0 ; qA ) rendezett elem hetest értjük, ahol (i) Q 6= ; az állapotok halmaza, (ii) az input (szalag) ábécé, (iii) # 2 = az üres jel, (iv) s 2 = az input szalag baloldali végjele, (v) : Q ( [ f#; sg) ! Q ( [ f#; sg) fL; R; Ng állapotátmeneti függvény, amelyre teljesül, hogy (p; s) 2 Q fsg fR; Ng (8p 2 Q n fqA g) ; (5.1) (vi) q0 2 Q a kiinduló állapot, (vii) qA 2 Q elfogadó állapot. 44
SZÁMíTÁSI MODELLEK
Ha T a p 2 Q állapotban van és az Y 2 (p; Y ) = (q; X; Z)
jelet olvassa be, akkor T elemi m½uvelete:
(q 2 Q; X 2 ; Z 2 fL; R; Ng) ;
(5.2)
ahol a T gép - a q állapotba vált, - az Y jelet felülírja az X jellel, - az iró/olvasó fej Z irányba mozdul. A (5.1) tulajdonság fejezi ki, hogy a T gép az s balvégjelet nem írhatja felül és attól balra nem léphet. Ekkor ugyanis csak (p; s) = (q; s; R) vagy (p; s) = (q; s; N) lehetséges, ahol q 2 Q. Megjegyzés: A Turing gépet szokás úgy is de…niálni, hogy az iró/olvasó fej mindig jobbra, vagy balra lép. A mindkét irányban végtelen szalaggal de…niált Turing gépeknél a szalagon van egy kitüntetett 0-val jelölt kezd½ocella. Egyik megkötés sem jelent azonban érdemi megszorítást. Megjegyzés: A Turing gép egy érdekes változata E.L. Post gépe (1947), amely abban különbözik Turing gépét½ol, hogy nem lehet egyszerre írni és lépni ugyanabban az elemi m½uveletben. Adott x 2 input feldolgozását T a q0 induló állapotban az els½o cellánál kezdi. Ha az input feldolgozása során T a qA elfogadó állapotba kerül, akkor megáll és az inputot az iró/olvasó fej helyzetét½ol függetlenül elfogadja. Ha T -nek van olyan q 6= qA állapota, hogy T megáll (azaz a q állapotból nem tud kijutni), akkor T elutasítja az inputot. El½ofordulhat az is, hogy adott input szóra T nem áll meg. De…níció: A T Turing gép az x inputot (szót) elfogadja, ha véges sok lépésben a qA elfogadó állapotban megáll. T az x inputot elutasítja, ha nem áll meg, vagy nem a qA állapotban áll meg. De…níció: A T Turing gép által elfogadott nyelv azon szavak halmaza, amelyeket T elfogad (felismer), azaz L (T ) = fw 2 j T elfogadja w-tg : A T Turing gép által kiszámított függvényt (a T "programfüggvénye") úgy de…niáljuk, hogy adott x input szó esetén a függvény értéke az a w szó, amely megállás után a szalagon van az s és az els½o üres jel között. A Turing gép által kiszámított függvény parciális, ha T nem áll meg legalább egy input szón (a függvény itt nincs értelmezve), egyébként pedig teljes. De…níció: A T Turing gép az F : ! függvényt kiszámítja, ha minden x 2 esetén T (véges sok lépés után) a qA állapotban áll meg úgy, hogy a szalagon az s balvégjel után F (x) áll. Az F : ! függvényt kiszámíthatónak (rekurzívnak) nevezzük, ha létezik egy T Turing gép amely az F függvényt a most de…niált értelemben kiszámítja. Vegyük észre, hogy a Turing gép "programfüggvénye" nem feltétlenül kiszámítható a de…nícióbeli értelemben. Példa (paritásellen½orz½o gép): Konstruáljunk olyan két állapotú Turing gépet, amely 1-esek véges sorozatait olvassa be, a q0 állapotban áll meg, ha az egyesek száma páros és a q1 állapotban áll meg, ha az egyesek száma páratlan. Ekkor = f1g, Q = fq0 ; q1 g. Kiinduláskor az egyesek száma 0 és a gép induló állapota q0 . Ha a gép beolvas egy 1 jelet, akkor az egyesek száma páratlanra változik és a gép átmegy a TURING GÉPEK
45
q1 állapotba. Ha a q1 állapotban beolvasásra kerül egy 1 jel, akkor az egyesek száma párosra változik és a gép átmegy a q0 állapotba. A keresett Turing gép állapot(átmeneti) táblázata: jel állapot 1 # q0 (q1 ; 1; R) (q0 ; #; N) q1 (q0 ; 1; R) (q1 ; #; N) A Turing gépeket állapotdiagrammal a következ½oképpen szemléltethetjük ( (p; Y ) = (q; X; Z)):
(Y,X,Z) p
q
A példa Turing gépének állapot diagramja:
(1,1,R) (#,#,N)
(#,#,N) q0
q1
(1,1,R)
Példa (paritásellen½orz½o gép): Konstruáljunk olyan Turing gépet, amely 0; 1 sorozatokat olvas be, kimenete E, ha az 1-esek száma páros és D ha páratlan. A 0; 1 sorozatok el½ott s, utána pedig # áll. Esetünkben = f0; 1g, Q = fq0 ; q1 ; q2 g. A konstrukció azon alapul, hogy egy input jel beolvasásakor T a q1 állapotba vált, ha az 1-esek számának párossága nem változik (kiinduláskor ezek száma 0 és a 0 páros szám). T a q2 állapotba vált, ha az 1-esek számának párossága változik. A keresett Turing gép állapot(átmeneti) táblázata: jel állapot s 0 q0 (q0 ; s; R) (q1 ; 0; R) (q1 ; 0; R) q1 q2 (q2 ; 0; R)
1 (q2 ; 1; R) (q2 ; 1; R) (q1 ; 1; R)
# (q1 ; E; N) (q2 ; D; N)
A most de…niált T gép állapot diagramja: 46
SZÁMíTÁSI MODELLEK
(#,E,N)
q1
(0,0,R)
(0,0,R)
q0
(s,s,R)
(1,1,R) (1,1,R)
(1,1,R) q2 (0,0,R) (#,D,N)
”Állítás”: A Turing gép többet tud mint az automata. Minden M = hQ; ; ; q0 ; F i automatához tudunk olyan T gépet konstruálni, amely az automatát szimulálja. A T állapotátmeneti függvénye legyen e (p; Y ) = ( (p; Y ) ; Y; R), : : : x1
...
M
xn
x1
...
xn
#
T
Végül de…niáljuk a Turing gép id½o- és tárigényét. De…níció: Egy T Turing gép id½oigénye az a timeT (n) függvény, amely a gép lépésszámának maximumát adja meg n hosszúságú bemenetek esetén. De…níció: Egy T Turing gép tárigénye az a spaceT (n) függvény, amely n hosszúságú bemenetekre a gép szalagjaira kiírt különböz½o mez½ok maximális száma. Fel szokás tenni, hogy timeT (n) n és spaceT (n) 1.
5.1.1. Turing gépek programozása A Turing gép programozása a szalagábécé és a véges sok állapotból álló vezérl½o egység (állapot táblázat és/vagy diagram) megtervezését jelenti. A következ½o egyszer½u példák némi betekintést adnak a Turing gépek "programozásába" TURING GÉPEK
47
Az els½o példa f0; 1g ábécé feletti Turing gépe addig mozgatja a fejet jobbra, amíg egy # üres jelet nem talál és megáll. A gép állapottáblázata: állapot s q0 (q0 ; s; R)
jel 0 (q0 ; 0; R)
1 (q0 ; 1; R)
# (q0 ; #; N )
A gép állapot diagramja: (1,1,R)
(0,0,R) q0
(#,#,N)
A második példánkban ezt a gépet úgy módosítjuk, hogy a # jel megtalálásakor a fej egyet visszalépjen, ezt a (# el½otti utolsó) jelet helyettesítse egy # üres jellel és álljon meg. A feladatnak legalább 1 hosszúságú szó esetén van értelme. Azt a tényt, hogy legalább egy hosszúságú a beolvasott szó, külön állapottal jelöljük. A szó utolsó karakterének # jellel történ½o felülírásához és az utána történ½o megálláshoz egy harmadik állapotot használunk. A Turing gép állapot táblája és állapot diagramja a következ½o: jel s 0 állapot q0 (q0 ; s; R) (q1 ; 0; R) q1 (q1 ; 0; R) q2 (q2 ; #; N )
1 # (q1 ; 1; R) (q0 ; #; N ) (q1 ; 1; R) (q2 ; #; L) (q2 ; #; N ) (1,1,R)
q1
(0,0,R)
(0,0,R)
(#,#,N)
(1,1,R) q0
(#,#,L)
(0,#,N)
q2
(1,#,N)
Mindkét Turing gép F : f0; 1g ! f0; 1g típusú karakter függvényeket számít ki. Az els½o esetben F (x) = x. A második esetben F (x) = y, ha x = y alakú, ahol 2 f0; 1g. Az y rész hosszára jyj 0 teljesül. 48
SZÁMíTÁSI MODELLEK
Feladat: Hogyan módosul a fenti két Turing gép, ha a szalag input ábécéje csak egy jelb½ol (pl. 1) áll? És hogyan módosulnak akkor, ha a Turing gép csak jobbra, vagy balra léphet, kivéve egy megállító állapotot. Hasonlítsuk össze a megfelel½o állapot diagramokat is! Harmadik példánk szalagábécéje legyen fa; bg és tegyük fel, hogy legalább egy hosszúságú szavakat dolgozunk fel. A tervezend½o Turing gép minden x 2 fa; bg (jxj 1) input szóhoz számítsa ki a #x outputot, azaz valósítsa meg az F (x) = #x (jxj 1) parciális függvényt. Tételezzünk fel négy állapotot: q0 ; q1 ; q2 ; q3 . A q0 állapotban a gép beolvassa x els½o karakterét. Ha ez a, akkor írjon ki egy # jelet, lépjen jobbra és váltson a q1 állapotba. Ha az els½o karakter b, akkor is írja ki a # jelet, lépjen jobbra és váltson a q2 állapotba. A továbbiakban a q1 állapot jelentse azt hogy a fej aktuális pozíciója el½otti karakter a volt. A q2 állapot pedig azt, hogy a fej aktuális pozíciója el½otti karakter b volt. Mármost, ha a gép a q1 állapotban a jelet olvas be, akkor írjon ki a-t (az egy cellával korábbi jelet), lépjen jobbra és maradjon a q1 állapotban (mert az aktuális pozícióban a van). Ha a q1 állapotban b jelet olvas be, akkor írjon ki a-t (az egy cellával korábbi jelet), lépjen jobbra és váltson a q2 állapotba (mert az aktuális pozícióban b van). Hasonló okoskodással kapjuk, hogy ha a q2 állapotban beolvasott jel a, akkor a gép írjon ki egy b jelet (az egy cellával korábbi jelet), lépjen jobbra és váltson a q1 állapotba. Ha a q2 állapotban beolvasott jel b, akkor a gép írjon ki egy b jelet (az egy cellával korábbi jelet), lépjen jobbra és maradjon a q2 állapotban. Ha a q1 és q2 állapotok bármelyikében beolvasott jel a # üres jel, akkor az állapotnak megfelel½o a vagy b jellel írja felül a # jelet, lépjen jobbra és váltson a q3 állapotba. A most leírt Turing gép állapot diagramja a következ½o: (a,a,R)
q1
(a,#,R)
(#,a,R)
(a,b,R)
q0
(b,#,R)
(b,a,R)
q3
(#,b,R) q2
(b,b,R)
A bemutatott példák azt is illusztrálják, hogy nem könny½u a Turing gépek programozása (ill. adott feladathoz Turing gép tervezése). Több olyan sémát is kidolgoztak, amely a Turing gép programozását segíti el½o, akár "szubrutinok" felhasználásával is. Ilyen sémák találhatók például Trahtenbrot, vagy Aho, Motwani és Ullman könyveiben. Schönhage és munkatársai az un. TPAL nyelvet fejlesztették ki Turing gépek számítógépes implementálására és programozására. Kisebb Turing gépeket a neten elérhet½o demo programokkal lehet létrehozni és vizsgálni. TURING GÉPEK
49
Feladat: Legyen Q = fq0 ; q1 ; q2 g, gramja a következ½o:
= f0; 1; 2; 3; 4; 5; 6; 7; 8; 9g, qA = q0 . A gép állapot dia(1,1,R) (4,4,R) (7,7,R) (2,2,R) (5,5,R) (8,8,R)
(0,0,R) (3,3,R) (6,6,R) (9,9,R)
q1
(2,2,R) (5,5,R) (8,8,R)
q0 (1,1,R) (4,4,R) (7,7,R) (2,2,R) (5,5,R) (8,8,R)
q2
(0,0,R) (3,3,R) (6,6,R) (9,9,R)
(1,1,R) (4,4,R) (7,7,R)
(0,0,R) (3,3,R) (6,6,R) (9,9,R)
Mit csinál ez a Turing gép? Mit tesz a 2718 és 271828 szavakkal? Feladat: Tervezzünk olyan Turing gépet, amelyik összead két unáris kóddal megadott pozitív egész számot és az eredményt unárisan írja ki!
5.2. A Turing gép kiterjesztései A Turing gépnek számos általánosítása van: k-szalagos (k
1) T gép (Hartmanis, Stearns),
Turing gépek mindkét irányban végtelen szalagokkal, Turing gépek 2D szalagokkal, Turing gépek több iró/olvasó fejjel minden egyes szalagon (párhuzamos T gép), nem determinisztikus Turing gépek, véletlen elérés½u Turing gépek, orákulum Turing gépek, alternáló többszalagos Turing gépek, stb. A k-szalagos Turing gép sémája: 50
SZÁMíTÁSI MODELLEK
program
s
t
t
...
1. szalag
s
t
t
...
2. szalag
s
t
t
...
3. szalag
t
t
...
k-ik szalag
. . .
s
Az összes író/olvasó fej az alapmodellnél látott módon m½uködik. A programvezérl½o egység a szalagokat szimultán kezeli. Az orákulum Turing gép (Turing, 1939) egy többszalagos Turing gép, amelynek van egy speciális orákulum szalagja és egy hozzárendelt h : B ! B orákulum függvénye, amely az orákulum válaszait adja meg.
input szalag ...
munka szalag ... . . . Vezérlő egység
orákulum szalag ... . . . output szalag ...
Ha az orákulum szalagra egy z szót írunk, akkor a Turing gép jelez az orákulumnak, hogy helyettesítse a z szót a h (z) szóval. Egy input feldolgozása alatt akárhányszor az orákulumhoz lehet fordulni. Az orákulum T gép id½ofüggvényében egy orákulummal való konzultáció egy lépésnek számít. A tárigény számításánál az orákulum szalagot nem vesszük …gyelembe. De…níció: Az A és B Turing gépeket ekvivalensnek nevezzük, ha minden x 2 input esetén fennállnak a következ½ok: (i) A akkor és csak akkor fogadja x-et, ha B is elfogadja, (ii) A akkor és csak akkor utasítja el x-et, ha B is elutasítja, A TURING GÉP KITERJESZTÉSEI
51
(iii) A számítása akkor és csak akkor végtelen x-en, ha B számítása is végtelen x-en. Tétel: A többszalagos és az egy szalagos Turing gépek ekvivalensek. Ezt az ekvivalenciát a kés½obbiekben kissé pontosítjuk. Megjegyezzük azonban, hogy az egyszalagos Turing gép ekvivalenciája más Turing gép modellekkel is fennáll. Ezeket azonban itt nem tárgyaljuk.
5.3. Regiszter gépek és a RAM modell A regiszter gépek olyan számítási modellek, amelyek véges, vagy végtelen sok memória regiszterb½ol és véges sok utasításból állnak. A regiszter gépeket különféle formákban els½oként Shepherdson és Sturgis, Elgot és Robinson, valamint Minsky javasolta. Minsky regiszter vagy program gépe véges sok memória regiszterb½ol áll, amelyen egy vezérl½o egység m½uveleteket (utasításokat) végez. A memória regiszterek tartalma tetsz½oleges nagy egész szám lehet. A gép sematikus ábrája a következ½o: R0 Vezérlő egység
regiszterek
R1 R2 R3
író/olvasó fej
. . .
(véges sok, tetszőlegesen hosszú egész számokat tárolnak)
RN
A regisztereket és tartalmukat is ugyanazzal a jellel (pl. Ri az i-edik regiszter) azonosítjuk. A gép programja utasítások sorszámozott sorozata. Egy utasítás összetev½oi: (1) a m½uvelet neve; (2) a regiszter neve; (3) egy vagy két utasítás sorszáma. A Minsky gép vezérl½o egységének utasításai: Jelölés Név 0 "zero" 0 "successor" H
Példa a0 a0
Jelentés az a regisztert kinullázza 1-t ad az a regiszter tartalmához Ha a 6= 0, akkor a := a 1. "decrement or jump" a (n) Ha a = 0, akkor GOTO n "Halt" H Megállás
Általában egy utasítás végrehajtása után a program kontroll a következ½o utasításra megy át. Az a (n) utasításnál az n-edik sorra ugrik a vezérlés, ha a tartalma zérus. 52
SZÁMíTÁSI MODELLEK
Feladat: Tegyük fel, hogy gépünknek három regisztere (a; b; w) van és vizsgáljuk a következ½o programot: Utasítás sorszáma Utasítás 1 b0 2 a (7) 3 b0 4 b0 5 w0 6 w (2) 7 H Mi lesz a regiszterek tartalma megálláskor, ha induláskor a = 2, b = 3 és w = 5? A Minsky-féle regiszter gépet ma már egy modernebb jelölésrendszerrel programnyelvi formában szokás megadni. A Minsky, majd Davis és Weyuker által de…niált L nyelvnek 3 utasítása van: x =: x + 1, x := x 1, és if x 6= 0 goto A. Az L nyelvet szokás a regisztergépek redukált programnyelvének is nevezni. Ennek ekvivalens változata a SMALL nyelv, amelyben: - a változók latin kisbet½uk, - az utasítások cimkézettek, - a megengedett utasítások: - x := x + 1, - x := x 1, - if x = 0 then goto cimke, - halt (x). Itt x tetsz½oleges változót jelöl, a halt (x) utasítás megállítja programot x értékével mint outputtal. Az alábbi SMALL program összead két számot. program add(x,y); 1: z := 0; 2: if y = 0 then goto 6; 3: x := x + 1; 4: y := y 1; 5: if z = 0 then goto 2; 6: halt (x) Megjegyezzük, hogy Shepherdson és Sturgis regiszter gépekhez kifejlesztett hasonló "egyszer½u nyelvében" (simple language) az utasítások (X := 0, X := succ (Y ), X := pred (Y )) nem cimzettek, azokat a ";" jel választja el és a goto utasítás helyett while ciklus van. A RAM (Random Access Machine) gépek a regisztergépek osztályába tartoznak és számos változatuk van (lásd például Aho-Hopcroft-Ullman könyvét). Itt és most Cook és Reckhow (1973) RAM gépét ismertetjük. A RAM gép olyan véges program, amely végtelen sok memória regiszteren végez m½uveleteket. A regiszterek tartalma tetsz½oleges egész szám (pozitív, negatív, zérus) lehet. A regiszterek tartalmát az R0 ; R1 ; R2 ; : : : sorozat jelöli. Adott még az ` (n) =
dlog jnje + 1; ha jnj 1; ha jnj < 2:
REGISZTER GÉPEK ÉS A RAM MODELL
2;
53
függvény, amely az n szám tárolásának idejét mutatja közelít½oleg. ` (n) tulajdonképpen az n szám kettes számrendszerbeli hossza. Itt feltételezzük, hogy az utasítás végrehajtásának id½o költsége az utasítás operandusának kettes számrendszerbeli hosszával arányos. A RAM gép lehetséges utasításait és végrehajtási idejüket az alábbi táblázat tartalmazza: Utasítás Végrehajtási id½o Ri C, C tetsz½oleges egész 1 Ri Rj + Rk ` (Rj ) + ` (Rk ) Ri Rj Rk ` (Rj ) + ` (Rk ) Ri R Rj ` RRj + ` (Rj ) R Ri Rj ` (Ri ) + ` (Rj ) GOTO m if Rj > 0 ` (Rj ) Read Xi ` (input) Print Ri ` (Ri ) Normálisan a program kontroll egy utasítás sorról a következ½ore megy át. A GOTO utasítás a kontrollt az m-edik sorra adja át, ha Rj > 0. A Read Rj utasítás a soron következ½o input számot beírja az Rj regiszterbe. Print Rj az Rj tartalmát kiírja egy kimeneti szalagra. Az Ri RRj indirekt utasítás az Rj -ik regiszter tartalmát beírja Ri -be, ha Rj 0. Az RRi Rj utasítás értelmezése hasonló. Az indirekt utasításokra azért van szükség, hogy egy rögzített program korlátlan számú regisztert elérhessen. A RAM program az els½o utasítástól indul, amikor is az összes regiszter tartalma zérus. Akkor áll meg, ha a vezérlés átkerül egy olyan sorra, melyben nincs utasítás, illetve, ha egy negatív indirekt címet érzékel. Input szalag x1
x2
x3
...
x
n
olvasófej
R0
regiszterek
R1 R2
Vezérlő egység
R3
író/olvasó fej
output szalag y1
y2
. . . memória
(végtelen sok, tetszőlegesen hosszú egész számokat tárolnak)
írófej
y3
Legyen = fx1 ; x2 ; : : : ; xp g egy véges ábécé és A adott halmaz (nyelv). Azt vizsgáljuk, hogy mennyi id½o kell a RAM programnak az A halmaz felismerésére. Egy x = xi1 xi2 : : : xin (xij 2 ) szót a gépnek az i1 ; i2 ; : : : ; in ; 0 egészek sorozataként adjuk meg, ahol a 0 a jelsorozat végét jelzi. A gépnek n + 1 Read utasítást kell végrehajtania a jelsorozat beolvasásához. A 54
SZÁMíTÁSI MODELLEK
gép elfogadja x-et, ha az 1-et kinyomtatja és megáll. Elutasítja x-et, ha a 2-t nyomtatja ki és megáll. A számítási id½o a számítás összes lépésének a fenti táblázat szerint számolt együttes ideje. De…níció: Az M RAM gép az A halmazt T (n) id½o alatt felismeri, akkor és csak akkor, ha minden x 2 szó esetén M megáll az x inputon T (jxj) ( jxj = n) id½o alatt és elfogadja x-et, ha x 2 A, vagy elveti x-et, ha x 2 = A.
5.4. Boole-függvények és logikai hálózatok A logikai kapu egy olyan …zikai eszköz, amely egy Boole függvényt valósít meg. Azokat az áramköröket, amelyekben a m½uveletek logikaiak, logikai áramkörnek nevezzük. A logikai áramkör (hálózat) egy olyan irányított aciklikus gráfnak felel meg, amelyben a szögpontok az input szögpontok kivételével logikai kapuk. Logikai kaput sokféle technológiával lehet el½oállítani. A következ½o ábrán AN D és OR kapuk megvalósítása látható egyszer½u eszközök (elem, izzólámpa, kapcsolók) segítségével. x
x
y
y 1
2 + -
+ x
y
x
y
A változók értéke 1, ha a jelölt kapcsoló zárva van és 0, ha nyitva. A valamivel bonyolultabb (x _ y) ^ z függvényt megvalósító áramkör a következ½o:
1
x z
z
y 2
+ x
y
Az ábrákon jelezzük az áramköröknek megfelel½o logikai szimbólumukat is. A logikai áramkörök un. straight-line (lineáris) programokat hajtanak végre, azaz olyan programokat, amelyek csak értékadó utasításokat (input, output, számítás) tartalmaznak, de nem tartalmaznak ciklust és elágazást. Az áramkör csúcsaihoz rendeljük a program lépéseket, az élek pedig a programlépések közti kapcsolatokat. BOOLE-FÜGGVÉNYEK ÉS LOGIKAI HÁLÓZATOK
55
A logikai áramköröket a méretükkel (csúcsok száma) és mélységükkel (az élekben kifejezett leghosszabb út hossza) jelemezzük. A Boole-függvények, ill. logikai áramkörök (hálózatok) ötlete Claude Shannon-tól származik:
Claude Shannon (1916-2001) De…níció: A Boole-hálózat (logikai áramkör) egy aciklikus (irányított kört nem tartalmazó) irányított gráf, amelyre igazak a következ½ok: - minden pontjának be-foka legfeljebb 2, ki-foka tetsz½oleges, - a 0 be-fokú pontokhoz vagy egy változó, vagy a 0 konstans, vagy az 1 konstans van hozzárendelve, a változónévvel ellátott pontot bemeneti pontnak nevezzük, - minden 0-nál nagyobb be-fokú pontot kapunak nevezzük - az 1 be-fokú pontokhoz (kapukhoz) a NOT címkét rendeljük, - a 2 be-fokú pontokhoz (kapukhoz) az AND vagy OR címkéket rendeljük, - a 0 ki-fokú pontokat kimen½o pontoknak nevezzük. Egy n bemenettel és m kimenettel rendelkez½o Boole áramkör sematikusan ábrázolva: x2
x1
x3
x4
xn
...
1
2
1
z1
56
z2
...
zm
SZÁMíTÁSI MODELLEK
Egy Boole áramkör, amelynek n input és m output pontja van, valamilyen f : f0; 1gn ! f0; 1gm függvényt valósít meg. De…níció: Az áramkör mérete: az ^ és _ kapuk száma. De…níció: Az áramkör mélysége: egy bemenet csúcstól egy kimenet csúcsig vezet½o utak maximális hossza. De…níció: Az f : f0; 1gn ! f0; 1g leképezést megvalósító áramkör elfogadja az x1 : : : xn 2 f0; 1gn szót, ha a kimeneten teljesül, hogy f (x1 ; : : : ; xn ) = 1. Példa: f (x1 ; x2 ; x3 ; x4 ) = x1
x2
x3
x4 (egy lehetséges) megvalósítása:
x1
x2
1
x4
x3
1
2
o XOR áramkörök
o
A Boole-hálózatok alapvet½oek a gyakorlatban, ugyanakkor hátrányuk, hogy az input és a Boole hálózat mérete kötött (az alkalmazásokra nézve lásd pl. Savage könyvét). A Boole-hálózatok nagyon bonyolultak lehetnek. Tegyük fel, hogy egy Boole-áramkör az f : f0; 1gn ! f0; 1g fügvényt számolja ki s mérettel és d mélységgel. Ekkor elég nagy n-re fennáll, hogy 2n s , d n + dlog2 ne + 1: (5.3) n
5.5. Számítási modellek ekvivalenciája A fejezetben bemutatott számítási modellek erejüket, a kiszámítható függvények (eldönthet½o feladatok) osztályát tekintve ekvivalensek a klasszikus egyszalagos Turing géppel és így egymással is. Az egy- és többszalagos Turing gépek ekvivalenciáját korábban már kimondtuk. Ezt az ekvivalenciát pontosítjuk néhány eredmény idézésével. SZÁMíTÁSI MODELLEK EKVIVALENCIÁJA
57
Tétel: Legyen T egy k-szalagos Turing gép. Van olyan egyszalagos T 0 Turing gép, amelyre L (T ) = L (T 0 ), továbbá timeT 0 (n) 2time2T (n), spaceT 0 (n) spaceT (n) + n. Ha egy helyett két szalagot engedünk meg, akkor a szimuláció gyorsabb lesz. Tétel: A T k-szalagos Turing géphez megadható olyan 2-szalagos T 0 Turing gép, amelyre L (T ) = L (T 0 ), továbbá timeT 0 (n) = O (timeT (n) log timeT (n)) és spaceT 0 (n) spaceT (n) + n. Megmutatható, hogy a Turing gép ekvivalens a Minsky-féle regiszter géppel is (lásd pl. Minsky könyvét). A többszalagos Turing gép és a RAM gép ekvivalensek a következ½o értelemben. Tétel: a) Ha egy A halmazt a P RAM gép T (n) > n id½o alatt felismeri, akkor van olyan többszalagos Turing gép, amely A-t felismeri (T (n))2 id½on belül. b) Fordítva, ha egy Turing gép az A halmazt felismeri T (n) n id½o alatt, akkor van olyan RAM gép, amely A-t felismeri O (T (n) ` (T (n))) id½o alatt. A Boole-hálózatok és Turing gépek viszonyát a következ½o eredménnyel jellemezzük. Tétel: Minden (mindkét irányban végtelen) többszalagos T Turing géphez és minden n; N 1 számpárhoz van olyan n bemenet½u, O (N 2 ) méret½u, O (N ) mélység½u, legfeljebb 2 be-fokú Boolehálózat, mely egy (x1 ; x2 ; : : : ; xn ) 2 f0; 1gn bemenetre akkor és csak akkor számol ki 1-et, ha az x1 x2 : : : xn bemenetre a T Turing gép N lépése után az els½o szalag nulladik cellájában 1 áll. A most kimondott tételeknél élesebb eredmények is ismertek. A bemutatott eredmények azonban jelzik a klasszikus Turing modell fogalmi erejét és központi szerepét a nagyszámú számítási modell között.
5.6. Univerzális Turing gépek Eddig azt láttuk, hogy különböz½o algoritmusokhoz (programokhoz) különböz½o Turing gépeket kellett terveznünk. Turingtól származik az univerzális Turing gép ötlete, amely szimulálja az összes többi Turing gépet. Az univerzális "T ; x" Turing gép két részb½ol áll: - az interpretálandó program (a T gép leírása), - az interpretálandó gép tetsz½oleges x 2 bemenete. Az univerzális gép az T leírását (kódját) értelmezve lépésr½ol lépésre utánozza T m½uködését az x bemeneten. Turing igazolta, hogy van ilyen univerzális Turing gép. Ebb½ol az is következik, hogy minden Turing gépek által megoldható feladatot egy univerzális Turing géppel is megoldhatunk. Az univerzális gép konstruálásához az els½o teend½onk a T gépb½ol véges adatot csinálni. Az alábbiakban megadjuk a Turing gépek egy lehetséges kódolását. Legyen T = (Q; ; #; s; ; q0 ; qA ) egy tetsz½oleges Turing gép, ahol Q = fq0 ; q1 ; : : : ; qm ; qA g ; 58
[ f#; sg = fA1 ; A2 ; : : : ; Ar g : SZÁMíTÁSI MODELLEK
Az egyes jelek f0; 1g -beli kódjai legyenek a következ½ok: kod (qi ) = 10i+1 1 (i = 0; 1; : : : ; m) ; kod (qA ) = 10m+2 1; kod (Aj ) = 110j 11 (j = 1; : : : ; r) ; kod (N ) = 1110111; kod (R) = 11102 111; kod (L) = 11103 111: Vegyük észre, hogy itt 0j a j hosszúságú 00 : : : 0 sorozatot jelenti! A (p; Al ) = (q; Aj ; ) állapotátmenetek kódját a kod ( (p; Al )) = #kod (p) kod (Al ) kod (q) kod (Aj ) kod ( ) # el½oírással képezzük az összes szóbajöv½o p 2 Q, l; j 2 f1; : : : ; rg és 2 fL; R; N g értékre. Ezután T gép kódját a következ½o módon de…niáljuk: az állapotok jQj száma, a munka ábécé szimbólumainak j j száma, az összes állapotátmenet felsorolása. Tehát kod (T ) = #0m+2 #0r ##kod (állapotátmenet1 ) #kod (állapotátmenet2 ) # : : : : Így minden T gépet egy w 2 szóval írunk le. Tetsz½oleges w 2 szóhoz legfeljebb egy T gép tartozhat: Tw , amelynek kódja w. A w kód ismeretében az Tw gép jellemz½oi algoritmussal megkaphatók. A következ½o gyengébb tételt igazoljuk. Tétel: Van olyan 3-szalagos U univerzális Turing gép, amelyre teljesül a következ½o: ha w; x 2 , és Tw létezik, akkor az U gép a w#x bemenetet pontosan akkor fogadja el (utasítja el, kerül vele végtelen ciklusba), ha Tw az x bemenetet elfogadja (elutasítja, végtelen ciklusba kerül vele). Bizonyítás (vázlat): Az egyszer½uség kedvéért egy (p; a) ! (q; b; Z) állapotátmenetet a fenti kód helyett jelöljünk a (p; a; q; b; Z) elemötössel. A Tw gép kódja tulajdonképpen a (p; a; q; b; Z) elemötösök sorozata. A háromszalagos U univerzális gépet (interpretert) a következ½oképpen de…niáljuk: - U els½o szalagja (S1 ) Tw bemenetét, az x szót tartalmazza. - U második szalagja (S2 ) Tw leírását tartalmazza, azaz az összes (p; a; q; b; Z) elemötös sorozatát. - U harmadik szalagja (S3 ) a Tw aktuális állapotát és az els½o szalagról az aktuális állapotban beolvasott jelet tartalmazza (p; a) pár formájában. UNIVERZÁLIS TURING GÉPEK
59
S1
S1
...
x
...
x
Tw
U
S2 ...
w
S3 ...
(p,a)
Kiinduláskor a harmadik szalag csak a (q0 ; s) párt tartalmazza. A (p; a) párban a elvileg felesleges, mert az els½o szalag tartalmazza. Azonban a (p; a; q; b; Z) elemötös azonosítását megkönnyíti. Az U univerzális Turing gép (interpreter) "programjának" f½o ciklusa a következ½o: while p 6= qA do begin 1) Keressük meg az aktuális (p; a) párnak megfelel½o (p; a; q; b; Z) elemötöst a második (S2 ) szalagon! 2. Irjunk b-t az els½o (S1 ) szalagra, hajtsuk végre a Z m½uveletet az S1 iró/olvasó fején, olvassuk be a következ½o a0 jelet S1 -r½ol! 3. Irjuk a (q; a0 ) párt a harmadik (S3 ) szalagra! end A megállási feltétel Tw de…níciójától függ. Az U univerzális Turing gép csupán másolási és mintaillesztési m½uveleteket végez. Turing eredetileg egyszalagos univerzális Turing gép létezését igazolta. Tétel (Shannon, 1956): Létezik 2 (bels½o) állapotot és 2 jelet ( f0; 1g) használó egyszalagos univerzális Turing gép. Shannon bizonyítása konstruktív. Shannon igazolta azt is, hogy nem létezik 1 bels½o állapotú univerzális Turing gép. Minsky 1962-ben egy 7 állapotú 4 jelet használó univerzális Turing gépet konstruált. Azóta számos "kis" univerzális Turing gépet konstruáltak és verseny is volt (van) a legkisebb univerzális Turing gép megkeresésére (Lásd pl. Wikipédia, WolframMathWorld). A Turing gép speciális eseteként említettük a Post gépet. Aanderaa és Fischer megmutatták, hogy nincs 2 állapotú univerzális Post-gép. Ez az eredmény azt jelzi, hogy a számítási modell és az univerzalitási tulajdonság között összefüggés van.
60
SZÁMíTÁSI MODELLEK
6. fejezet Algoritmikus eldönthet½oség és kiszámíthatóság A Turing gépet a legáltalánosabb számítási modellnek tartjuk (Church-Turing hipotézis). Ezt támasztja alá az a tény, hogy nem ismert olyan (mai számítógépeken is realizálható) gép- vagy algoritmus modell, amely olyan számításokat is el tudna végezni, amelyet a Turing gép nem1 . Ez azonban nem jelenti azt, hogy más modellek (pl. a RAM gép) nem lehetnek (számítási id½oben vagy tárigényben) hatékonyabbak mint a Turing gép. A Turing géppel való megoldhatóság egy feladat megoldhatóságát általában jellemzi. Ha egy feladat Turing géppel megoldható, akkor azt megoldhatónak tekintjük. Ha nem, akkor megoldhatatlannak. Látni fogjuk, hogy számos jól de…niált feladat nem oldható meg Turing géppel.
6.1. Nyelvek felismerése és eldöntése Turing gépekkel Adott nyelv és egy adott Turing gép vonatkozásában két kérdés vethet½o fel. Felismeri-e az adott Turing gép az adott nyelvet (azaz a nyelv rekurzívan felsorolható-e), illetve el tudja-e dönteni az adott nyelvet (azaz a nyelv rekurzív-e). Az utóbbi tulajdonságú Turing gépet az algoritmus modelljének tekintjük. Fontos ismételten megjegyezni, hogy nyelvekkel a szokásos számítási feladatokat le tudjuk írni és ezért a Turing-féle algoritmus modell általános jelleg½u. A fejezetet néhány fogalom ismétlésével kezdjük. De…níció: Egy determinisztikus Turing gépen ( T ) az T = (Q; ; #; s; ; q0 ; qA ) rendezett elem hetest értjük, ahol (i) Q 6= ; az állapotok halmaza, (ii) az input (szalag) ábécé, (iii) # 2 = az üres jel, (iv) s 2 = az input szalag baloldali végjele, 1
Léteznek olyan hipotetikus szuper rekurzív algoritmus koncepciók, amelyek olyan számításokat is el tudnak végezni, amelyeket a rekurzív algoritmusok nem.
½ ALGORITMIKUS ELDÖNTHETOSÉG ÉS KISZÁMíTHATÓSÁG
61
(v) : Q ( [ f#; sg) ! Q ( [ f#; sg) fL; R; Ng állapotátmeneti függvény, amelyre teljesül, hogy (p; s) 2 Q fsg fR; Ng (8p 2 Q n fqA g) ; (vi) q0 2 Q a kiinduló állapot, (vii) qA 2 Q elfogadó állapot. De…níció: A T Turing gép az x inputot (szót) elfogadja, ha véges sok lépésben a qA elfogadó állapotban megáll. T az x inputot elutasítja, ha nem áll meg, vagy nem a qA állapotban áll meg. De…níció: A T Turing gép által elfogadott nyelv azon szavak halmaza, amelyeket T elfogad (felismer), azaz L (T ) = fw 2 j T elfogadja w-tg : De…níció: Az L nyelvet rekurzívan felsorolhatónak (Turing felismerhet½onek) nevezzük, ha van olyan T Turing gép, amelyre L = L (T ). Az LRE = fL (T ) j T Turing gépg halmazt a rekurzívan felsorolható nyelvek osztályának nevezzük. Egy adott L nyelvre vonatkozó döntési problémán azt értjük, hogy tetsz½oleges x 2 szó esetén el tudjuk dönteni, hogy x 2 L vagy x 2 = L. Az L 2 LRE nyelvet felismer½o T Turing gép csak egy fél algoritmust jelent az L eldöntésére, mert megeshet, hogy egy w 2 LC szóra T nem áll meg.
"Igen" ha xeL T felismeri L-et x
De…níció: Az L nyelvet (a ( ; L) döntési problémát) rekurzívnak (Turing eldönthet½onek) nevezzük, ha van olyan T Turing gép, amelyre L = L (T ) és T minden x 2 szóra véges sok lépésben megáll, úgy, hogy: (i) ha x 2 L, akkor T a qA állapotban áll meg (ii) ha x 2 = L, akkor T elutasító állapotban áll meg. Az (i)-(ii) feltételek fennállása esetén azt mondjuk, hogy T minden inputon megáll (T mindig megáll). Az ilyen T gép az ”algoritmus”formális modellje.
"Igen" ha xeL T eldönti L-et x "Nem" ha xeLC
62
½ ALGORITMIKUS ELDÖNTHETOSÉG ÉS KISZÁMíTHATÓSÁG
Egy nyelv eldöntése tehát er½osebb követelmény mint a felismerése (elfogadása). De…níció: Az LR = fL (T ) j T mindig megálló Turing gépg halmazt a rekurzív (algoritmikusan eldönthet½o) nyelvek osztályának nevezzük. A de…níció alapján nyílvánvaló a következ½o két eredmény. Állítás: Ha egy L nyelv rekurzív (eldönthet½o), akkor rekurzíve felsorolható is: LR
LRE :
Állítás: Ha egy L nyelv rekurzív (eldönthet½o), akkor LC is az. De…níció: A T Turing gép az F : ! függvényt kiszámítja, ha minden x 2 esetén T (véges sok lépés után) a qA állapotban áll meg úgy, hogy a szalagon az s balvégjel után F (x) áll. Az F : ! függvényt kiszámíthatónak (rekurzívnak) nevezzük, ha létezik egy T Turing gép amely az F függvényt a most de…niált értelemben kiszámítja. Döntési probléma esetén az algoritmus az L nyelv karakterisztikus függvényét számítja ki. A Turing felismerhet½oség és a Turing eldönthet½oség közötti lényeges különbséget az alábbi egyszer½u példával mutatjuk meg. Példa: Legyen L = fa2n j n 0g a páros hosszúságú aa : : : a szavak (sorozatok) nyelve. Készítsünk olyan 2 állapotú Turing gépet, amely felismeri az L nyelvet! A gép az s kezd½ojelt½ol elindulva addig mozog jobbra, amíg # üres jelet talál. Közben a q0 (páros) és q1 (páratlan) állapotok között kapcsolgat. Az egyetlen elfogadó állapot q0 . A megfelel½o állapot tábla és állapotdiagram jel állapot s a # q0 (q0 ; s; R) (q1 ; a; R) (q0 ; #; N ) (q0 ; a; R) (q1 ; #; N ) q1 illetve (a,a,R)
q0
q1
(#,#,N)
(s,s,R) (#,#,N)
(a,a,R)
Ez a gép mindig megáll. Módosítsuk most ezt a Turing gépet a következ½ok szerint: - a # jelre álljon meg, ha az addig beolvasott a jelek száma páros, - ha nem, akkor folytassa a mozgást jobbra. NYELVEK FELISMERÉSE ÉS ELDÖNTÉSE TURING GÉPEKKEL
63
Az új követelményeknek megfelel½o Turing gép állapot táblája és állapotdiagramja jel állapot s a # q0 (q0 ; s; R) (q1 ; a; R) (q0 ; #; N ) (q0 ; a; R) (q1 ; #; R) q1 illetve (a,a,R)
q0
q1
(#,#,R)
(s,s,R) (#,#,N)
(a,a,R)
Feladat: Módosítsunk az el½obbi Turing gép állapot tábláján a következ½ok szerint: jel s a # állapot q0 (q0 ; s; R) (q1 ; a; R) (q0 ; #; N ) (q0 ; a; R) (q1 ; #; L) q1 Mit csinál ez a gép? Felismeri-e az L = fa2n j n 0g nyelvet? És eldönti-e? Feladat: Módosítsunk az el½obbi Turing gép állapot tábláján a következ½ok szerint: jel állapot s a # q0 (q0 ; s; R) (q1 ; a; R) (q0 ; #; N ) q1 (q0 ; a; R) (q0 ; #; L) Mit csinál ez a gép? Felismeri-e az L = fa2n j n 0g nyelvet? És eldönti-e? A rekurzívan felsorolható és rekurzív nyelvek osztályai a formális nyelvek egy, a Chomskyfélét½ol eltér½o osztályozását adják és a Turing-féle algoritmus koncepciót is jellemzik. A rekurzívan felsorolható nyelvek azok, amelyekhez létezik a nyelvet felismer½o eljárás (gép), amely véges sok lépésben felismeri a nyelv szavait. A rekurzív nyelvek pedig azok, amelyekhez létezik olyan algoritmus (gép), amely véges lépésben nemcsak a nyelv szavai ismeri fel, hanem minden szóról el tudja dönteni, hogy benne van-e az adott nyelvben. Látni fogjuk, hogy léteznek rekurzívan fel nem sorolható nyelvek, és azt is, hogy a rekurzív nyelvek a rekurzívan felsorolható nyelvek valódi részhalmazát alkotják. Lineáris korlátos automatának nevezik azt az egyszalagos Turing gépet, amelynél az író/olvasó fej sohasem hagyja el az input szó által elfoglalt cellákat. Már ez a korlátozott Turing gép is b½ovebb nyelvosztályt ismer fel mint az automaták. Igazak a következ½o eredmények. 64
½ ALGORITMIKUS ELDÖNTHETOSÉG ÉS KISZÁMíTHATÓSÁG
Tétel: Ha L egy környezetfügg½o nyelv, akkor létezik egy olyan lineáris korlátos automata, amely L-et elfogadja. Tétel: Ha az L nyelvet egy lineáris korlátos automata elfogadja, akkor L környezetfügg½o. A két eredmény együttesen azt jelenti, hogy egy L nyelv akkor és csak akkor környezetfügg½o, ha egy lineáris korlátos automata elfogadja. Az is következik, hogy a környezetfügg½o nyelvek rekurzívan felsorolhatók. Ennél azonban több is igaz, amit az alábbi két eredmény mutat. Tétel: Minden rekurzívan felsorolható nyelv kifejezés struktúra típusú nyelv. Tétel: Minden kifejezés struktúra nyelv rekurzívan felsorolható. A kifejezés struktúra vagy rekurzívan felsorolható nyelveket szokás egyszer½uen nyelvtanok által generált nyelvekként is említeni. Tétel: Egy f : ! függvény akkor és csak akkor kiszámítható (rekurzív), ha nyelvtanilag kiszámítható. Az eredményekb½ol az következik, hogy a kifejezés struktúra (vagy 0) típusú nyelvek azonosak a rekurzívan felsorolható nyelvekkel. Következésképpen a Chomsky-féle nyelvosztályok mind rekurzívan felsorolhatók és ezeket a nyelveket a Turing gépek felismerik. Turing gép kifejezés struktúra (L0) nyelvek környezetfüggő (L1) nyelvek lineáris korlátos automata
környezetfüggetlen (L2) nyelvek veremautomata
reguláris (L3) nyelvek véges determinisztikus automata véges nemdeterminisztikus automata veremautomata
Automaták és Turing gépek által felismert generatív nyelvek A következ½o eredmény azt igazolja, hogy a rekurzívan felsorolható nyelvek az összes nyelvek valódi részhalmazát alkotják. Tétel: Van olyan L1 nyelv, amely nem rekurzívan felsorolható. Bizonyítás: Egy T gép véges jelsorozattal leírható. Ezért az összes T gép számossága megszámlálható, azaz felsorolható természetes számokkal sorszámozva: M1 ; M2 ; : : :. A gépek által felismert nyelvek (amelyek a rekurzívan felsorolható nyelvek) legyenek: L (M1 ) ; L (M2 ) ; : : :. Ezek szintén megszámlálhatók. szintén megszámlálható, de az összes nyelvek halmaza 2 = fX j X g NYELVEK FELISMERÉSE ÉS ELDÖNTÉSE TURING GÉPEKKEL
65
az ismert jNj < 2N számossági egyenl½otlenség miatt már nem az. Tehát van nem rekurzívan felsorolható nyelv. Az átlós módszert használjuk az L1 nyelv konstrukciójához. megszámlálható (felsorolható) a következ½ok szerint: szavait soroljuk fel hosszúságuk szerint növekv½oen, az azonos hosszúságú szavakat pedig a lexikogra…kus rendezés szerint: w1 ; w2 ; : : :. De…niáljuk az alábbi táblázatot (mátrixot) a következ½oképpen: wi jelöli a táblázat i-edik sorát, L (Mj ) pedig a táblázat j-edik oszlopát. Az i-edik sor és j-edik oszlop keresztez½odésében (a táblázat (i; j) index½u eleme) azt jelöljük, hogy egy wi szó eleme, vagy nem eleme az L (Mj ) nyelvnek (2; 2). = Az L1 nyelvet a következ½oképpen de…niáljuk: wi 2 L1 , wi 2 = L (Mi )
(i = 1; 2; : : : ):
Az alábbi táblázat szimbolikusan mutatja L1 konstrukcióját.
w1 w2 .. . wi wi+1 .. .
L (M1 ) L (M2 ) 2 = 2 2 = 2 .. .. . . 2 = 2 = 2 = 2 = .. .. . .
L (Mi ) L (Mi+1 ) 2 = 2 2 2 = .. .. . . 2 2 = 2 = 2 = .. .. . .
L1 2 2 = .. . 2 = 2 .. .
Az L1 nyelv nem lehet rekurzívan felsorolható, azaz nem egyezhet meg egyetlen rekurzív nyelvvel sem, mert egy wi szó vagy az L (Mi ), vagy L1 eleme. Tehát L1 rekurzívan fel nem sorolható. Az utolsó három tétel alapján egy ábécé feletti generatív nyelveket a következ½oképpen osztályozhatjuk: összes nyelv Σ felett rekurzívan fel nem sorolható nyelvek
rekurzívan felsorolható/kifejezés struktúra (L0) nyelvek
66
½ ALGORITMIKUS ELDÖNTHETOSÉG ÉS KISZÁMíTHATÓSÁG
A következ½okben a rekurzív (eldönthet½o) nyelveket vizsgáljuk. Tétel: Egy L nyelv akkor és csak akkor rekurzív (eldönthet½o), ha L és LC rekurzívan felsorolható. Bizonyítás (vázlat): Ha L rekurzív, akkor LC is az. Tegyük fel, hogy L és LC rekurzíve felsorolható. Ekkor van T1 és T2 , hogy L = L (T1 ) és LC = L (T2 ). Legyen T3 olyan gép, amelyik azt …gyeli, hogy melyik gép adja ki az x szót.
T1
i
i
n
n
i
n
n
i
x
T2 T3
Ekkor tudjuk, hogy x melyik nyelvben van. A három gépb½ol egyet csinálunk. Vegyük észre, hogy a most bizonyított tétel nem más mint a 3. fejezetben látott Post tétel. Az eggyel korábbi tételben de…niáltuk az L1 nyelvet, amely nem rekurzívan felsorolható. De…niáljuk ennek komplementer nyelvét, azaz az
L2 = fwi j wi 2 L (Mi )g
(6.1)
nyelvet. Tétel: Az L2 nyelv rekurzívan felsorolható, de nem rekurzív (eldönthet½o). Bizonyítás: Van olyan Turing gép, amelyik elfogadja az L2 nyelvet. Tehát L2 rekurzívan felsorolható. Mivel azonban komplementere L1 nem rekurzívan felsorolható, ezért L2 nem lehet rekurzív. Tétel: Minden környezetfüggetlen nyelv rekurzív (Turing eldönthet½o). Igazolható, hogy vannak olyan rekurzív nyelvek, amelyek nem környezetfüggetlenek. Ennek alapján a nyelvek alábbi osztályozására jutunk. NYELVEK FELISMERÉSE ÉS ELDÖNTÉSE TURING GÉPEKKEL
67
rekurzív (eldönthető) nyelvek
Összes nyelv Σ felett
rekurzivan fel nem sorolható nyelvek
rekurzívan felsorolható nyelvek
reguláris nyelvek
környezetfüggetlen nyelvek
6.2. Eldönthetetlen problémák A szakaszban néhány olyan döntési problémát vizsgálunk, amelyek Turing géppel nem eldönthet½ok, azaz a problémát leíró nyelv nem rekurzív. Ha egy döntési probléma nem eldönthet½o, akkor a problémát leíró nyelv karakterisztikus függvénye sem kiszámítható (rekurzív). Els½oként vizsgáljuk az elfogadási problémát: Adott egy T Turing gép és az x 2
szó. Döntsük el, hogy T elfogadja-e x-et!
A kézenfekv½o alapötlet az, hogy futtassuk T -t az x szón. Ez mindaddig rendben is van, ha T elfogadja x-et "reális" id½on belül, azaz x 2 L (T ). Ha nem ez történik, akkor nem tudjuk, hogy az algoritmus futása csak sokáig tart, vagy végtelen ideig. Vegyük észre a probléma és a Turing eldönthet½oség rokon jellegét! A feladat megoldásához kellene egy "szuperalgoritmus". De látni fogjuk, hogy ilyen nincs. De…niáljuk az univerzális nyelvet: Lu = fw#x 2 j az Tw gép létezik és x 2 L (Tw )g : (6.2) Az Lu nyelv az univerzális Turing gépek nyelve, ezeket a szavakat fogadja el egy U gép. Bármely U univerzális gépre teljesül, hogy Lu = L (U ). Ebb½ol következik, hogy Lu rekurzívan felsorolható, azaz Lu 2 LRE . Igaz a következ½o alapvet½o eredmény. Tétel (Turing, 1936): Lu rekurzívan felsorolható, de nem rekurzív (eldönthet½o). Második problémánk az el½oz½ohöz nagyon hasonló, úgynevezett megállási probléma. A probléma a számítások végességével kapcsolatos. Tegyük fel, hogy valamilyen program nyelven van egy csoda programunk, amely a következ½oket tudja: 68
½ ALGORITMIKUS ELDÖNTHETOSÉG ÉS KISZÁMíTHATÓSÁG
(i) inputja bármely az adott nyelven megírt P program és annak X inputja; (ii) a csoda program korrekt módon eldönti, hogy a P program az X inputon megáll-e (Igen), vagy fut örökké (Nem). Legyen a csoda program neve halts (P; X) és de…niáljuk a következ½o programot: diagonal (X) a: if halts (X; X) then goto a else halt A diagonal (X) program a következ½oképpen m½uködik: Ha a halts program eldönti, hogy az X program saját magával mint inputtal megáll, akkor a diagonal program örök ciklusba kerül, egyébként pedig megáll. Ezután a következ½o kérdésünk az, hogy megáll-e diagonal (diagonal)? Nos, akkor és csak akkor áll meg, ha a halts (diagonal; diagonal) hívás "Nem" választ ad. Ez más szóval azt jelenti, hogy akkor és csak akkor áll meg, ha nem áll meg. Ez ellentmondás éspedig a kiinduló feltevés miatt. Tehát nincs ilyen csoda program, amely megmondaná, hogy egy tetsz½oleges program megáll, vagy ciklizál. A megállási probléma Turing gépekre pontosan megfogalmazva a következ½oképpen néz ki: Egy kódjával adott T gép adott bemenettel megáll-e? Az elfogadási problémához képest az a különbség, hogy ott az x 2 = L (Tw ) esetben nem feltétlenül áll meg a Turing gép. A megállási problémához tartozó nyelv: Lh = fw#x 2
j 9Tw és az x bemenetre véges sok lépésben megáll.g
(6.3)
Tétel: Az Lh nyelv rekurzívan felsorolható, de nem rekurzív (eldönthet½o), azaz Lh 2 LRE n LR . A tétel tulajdonképpen azt mondja ki, hogy nincs olyan algoritmus (garantáltan megálló Turing gép), amely tetsz½oleges Turing gép és tetsz½oleges input esetén meghatározná, hogy az adott inputon az adott Turing gép megáll-e. Az edddigiek alapján a nyelveket eldönthetlen és eldönthet½o nyelvekre oszthatjuk a következ½oképpen: rekurzív (algoritmikusan eldönthető) nyelvek
Összes nyelv Σ felett
eldönthetetlen nyelvek
Lh L2 Lu
rekurzívan felsorolható nyelvek
ELDÖNTHETETLEN PROBLÉMÁK
69
Megjegyzés: Aanderaa és Fischer igazolták (1967), hogy a két állapotú Post gépekre a megállási probléma megoldható. A megállási probléma és az univerzalitás összefüggenek. A számos Turing eldönthetetlen probléma közül a következ½oket idézzük. Tétel: Algoritmikusan eldönthetetlen, hogy egy (leírásával adott) 1-szalagos T Turing gépre az L (T ) nyelv üres-e. Nyelvek egy tulajdonságát triviálisnak nevezzük, ha minden nyelvnek megvan ez a tulajdonsága, vagy egyiknek sem. A nemtriviális tulajdonság azt jelenti tehát, hogy egyes nyelveknek megvan ez a tulajdonsága, míg másoknak nincs meg ez a tulajdonsága. Rice tétele: Bármely nem triviális nyelv tulajdonságra algoritmikusan eldönthetetlen, hogy egy leírásával adott T Turing gépre az L (T ) nyelvnek megvan-e ez a tulajdonsága.
6.2.1. Néhány további eldönthetetlen probléma A szakaszban néhány olyan érdekes eldönthetetlen feladatot ismertetünk, amelyek azt jelzik, hogy az eldönthetetlen feladatok köre milyen széles és szerteágazó. Post megfeleltetési problémája (A PCP( n) probléma): Adott egy véges ábécé és az (u1 ; v1 ), (u2 ; v2 ), . . . ,(un ; vn ) -beli szópárok sorozata. A kérdés: Van-e olyan fij g (1 ij n) véges sorozat, hogy ui1 : : : uik = vi1 : : : vik ? A probléma n = 1; 2-re eldönthet½o. Nagy n-re azonban eldönthetetlen. Post k-tag rendszerek (1921): Legyen adott a véges ábécé, a k 1 egész szám, a P : ! leképezés és az !0 2 kezd½oszó. A T = ( ; k; P; !0 ) négyest Post k-tag rendszernek (gépnek) nevezzük. A rendszer az !0 kezd½oszóból kiindulva az f!i g szósorozatot képezi a következ½oképpen: !i+1 = uP ( ) ;
ha !i = vu, ahol
2 ; v2
k 1
:
A k 1 halmaz a k 1 hosszúságú feletti szavak halmazát jelenti. A sorozat képzése addig tart, amíg a kapott szó hossza kisebb nem lesz mint k, vagy a kapott szó els½o bet½uje azonos nem lesz egy un. megállító (halting) bet½uvel. Ha ez nem történik meg, akkor a rendszer vagy periodikus lesz, vagy korlátlan (szóhossz) növekedést mutat. Példa: Legyen T0 = (f0; 1g ; 3; f0 ! 00; 1 ! 1101g ; !0 ) és !0 = 001101. Ekkor kapjuk, hogy 0 0 1 1 0 1 1 0 1 0 0 0 0 1 1 0 1 Tehát visszakapjuk a kezd½oszót, a sorozat ciklizál. Példa: Legyen T0 = (f0; 1g ; 3; f0 ! 00; 1 ! 1101g ; !0 ) és !0 = 000000. Ekkor a sorozat: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 70
½ ALGORITMIKUS ELDÖNTHETOSÉG ÉS KISZÁMíTHATÓSÁG
Tehát ez a sorozat megáll. Cocke és Minsky igazolta, hogy 2-tag rendszerekkel minden Turing gép szimulálható. A Post-féle k-tag rendszerek megállási problémája annak az eldöntése, hogy adott T k-tag rendszer egy adott !0 kezd½oszó esetén T megáll-e? Wang igazolta, hogy a megállási probléma k = 1 esetén eldönthet½o, k = 2 esetén pedig vannak olyan rendszerek, amelyekre a megállási probléma nem eldönthet½o. Collatz 3x + 1 problémája (1930 körül): Legyen x 2 N és f (x) =
x=2; ha x páros 3x + 1; ha x páratlan.
A függvény képe: Collatz function 60
50
f(x)
40
30
20
10
0
0
5
10 x
15
20
Kérdés: Igaz-e, hogy tetsz½oleges x0 2 N számból indulva az xn+1 = f (xn ) ( n 0) iteráció mindig az 1 ! 4 ! 2 ! 1 ciklusban végz½odik? A kérdés "enyhébb" változata: Igaz-e, hogy tetsz½oleges x0 2 N számból indulva az xn+1 = f (xn ) ( n 0) iteráció mindig eléri-e az 1-et, azaz valamely t értékre xt = 1? Ez utóbbi kérdés ekvivalens megfogalmazásban: A következ½o program megáll minden m 2 N egész számra: n := m while n > 1 do if (n páros) then n := n=2 else n := 3n + 1 endif endwhile A sejtés az, hogy igen, de nincs igazolva. A probléma általánosítása (Conway, Kurtz, Simon): Legyenek adottak m 2 N, az ar , br racionális számok (r 2 f0; 1; : : : ; m 1g) úgy, hogy valahányszor x r (mod m), akkor f (x) = ar x + br egész szám. A kérdés az, hogy bármely pozitív egész számból indulva az xn+1 = f (xn ) (n 0) iteráció eléri-e az 1-et, azaz valamely t értékre xt = 1? ELDÖNTHETETLEN PROBLÉMÁK
71
Conway (1972) egy speciális esetben, Kurtz és Simon (2007) pedig az általános formában igazolta, hogy ez a probléma eldönthetetlen. Hilbert 10. problémája (Diophantoszi egyenletek): Adott egy egész együtthatós n változós p (x1 ; x2 ; : : : ; xn ) polinom (n 2). Hilbert 1900-ban azt a kérdést vetette fel, hogy van-e "általános módszer" a p (x1 ; x2 ; : : : ; xn ) = 0 egyenlet egész megoldásainak meghatározására. Másképpen fogalmazva: döntsük el, véges számú lépésben (m½uvelettel), hogy van-e a p (x1 ; x2 ; : : : ; xn ) = 0 egyenletnek egész számokból álló megoldása. Például az x21 + x22 + 1 = 0 egyenletnek nincs egész megoldása, de az x1 x2 + x1 x2 1 = 0 egyenletnek végtelen sok van (pl. x1 = 1, x2 2 Z tetsz½oleges). Matijaszevics 1970-ben igazolta, hogy a probléma algoritmikusan eldönthetetlen. Az egyváltozós, egész együtthatós p(z) = a0 + a1 z + a2 z 2 + ::: + an 1 z n 1 + an z n = 0 polinomok esetén a fenti kérdés eldönthet½o, ugyanis Cauchy tétele alapján a polinom összes gyöke a jzj 1 + max0 i n 1 jajani jj komplex körben (körlemezben) van. Végigpróbálva az 1 + max 0 i n
jai j 1 jan j
;1 + max 0 i n
jai j 1 jan j
intervallumba es½o összes egész számot, a kérdést véges sok m½uvelettel eldönthetjük.
6.3. Turing kiszámítható függvények A Turing gép mint algoritmus koncepció egyik alternatívája a rekurzív függvény fogalma. A rekurzív függvényeket nemnegatív egész számokon vizsgáljuk, azaz f : N0 ! N0 tipusúak. Megjegyezzük azonban, hogy az egészek és egy formális nyelv szavai között könnyen konvertálhatunk oda és vissza. Így a szavak formájában kódolt információk és algoritmusok egész számok formájában is kódolhatók. Gödel éppen ezt használta ki nevezetes vizsgálataiban. Megjegyezzük még, hogy egy halmaz (nyelv) akkor (primitív, parciális) rekurzív, ha karakterisztikus függvénye (primitív, parciális) rekurzív.
6.3.1. Primitív rekurzív függvények A primitív rekurzív függvényeket néhány nyilvánvalóan kiszámítható alapfüggvényb½ol rögzített m½uveleti szabályok (ismételt) alkalmazásával állítjuk el½o. Els½oként a következ½o alapfüggvényeket de…niáljuk: (i) azonosan 0 függvény: zero (x) = 0 (x 2 N0 ), (ii) a "rákövetkezés" függvény succ(x) = x + 1 (x 2 N0 ), 72
½ ALGORITMIKUS ELDÖNTHETOSÉG ÉS KISZÁMíTHATÓSÁG
(iii) projekciós függvények: i k
(n1 ; : : : ; nk ) = ni
(1
i
k) :
(6.4)
A következ½o két m½uvelettel állíthatunk el½o újabb függvényeket a már meglév½okb½ol. A kompozíció (helyettesítés) m½uvelete: A g és a h1 ; : : : ; hk függvények kompozíciója a következ½o n-változós függvény: f (x) = g (h1 (x) ; : : : ; hk (x)) :
(6.5)
Az x változó bármely számú változóval helyettesíthet½o. Például vehetjük az f (x; y) = g (h1 (x; y) ; : : : ; hk (x; y)) : kompozíciót is, stb. A (primitív) rekurzió m½uvelete (Dedekind, 1888): Az f függvény a g és h függvényekb½ol rekurzióval el½oállítható, ha f (x; 0) = g (x) ; f (x; succ (y)) = h (x; y; f (x; y)) :
(6.6) (6.7)
Ha az f függvénynek több mint két független változója van, akkor x-et helyettesíthetjük extra változókkal. Ha az f -nek csak egy független változója van, akkor az x változót elhagyjuk és a rekurzió alakja a következ½o lesz: f (0) = g (g 2 N0 rögzített konstans), f (succ (y)) = h (y; f (y)) :
(6.8) (6.9)
De…níció: Egy függvény primitív rekurzív, ha az alapfüggvényekb½ol helyettesítéssel és rekurzióval megkapható. Példa (összeadás): Az (x; y) !sum(x; y) = x + y függvényt az alábbi rekurzióval kapjuk: sum (x; 0) = 11 (x) = x; sum (x; succ (y)) = succ (sum (x; y)) : Ez m½uködik, amint azt a 2 + 2 = 4 esetben is láthatjuk: sum (2; 2) = succ (sum (2; 1)) = succ (succ (sum (2; 0))) = succ (succ (2)) = succ (3) = 4: Példa (szorzás): az (x; y) !prod(x; y) = xy függvényt az alábbi rekurzióval kapjuk: prod (x; 0) = 0; prod (x; succ (y)) = sum(x; prod (x; y)): TURING KISZÁMíTHATÓ FÜGGVÉNYEK
73
Példa: Az (x; y) ! exp (x; y) = xy függvény rekurzív el½oállítása: exp (x; 0) = succ (zero (m)) ; exp (x; succ (y)) = prod (x; exp (x; y)) : Példa (a megel½oz½o függvény): A "megel½oz½o" függvény egy adott egész számot megel½oz½o szám, amelynek rekurzív de…níciója a következ½o: (6.10) (6.11)
pred (0) = 0; pred (succ (y)) = y: Példa (el½ojel függvény): Értéke 0, ha a változó értéke 0, egyébként pedig 1. De…níciója:
(6.12) (6.13)
sign (0) = 0; sign (succ (x)) = 1:
Példa (iszero függvény): Értéke 1, ha a változó értéke 0, egyébként pedig 0. De…níciója: (6.14) (6.15)
iszero (0) = 1; iszero (succ (x)) = 0: Példa (kivonás) A kivonási (un. monus) m½uveletet az x
y=
x y; ha x 0 egyébként
y
el½oírással adjuk meg. A megfelel½o monus függvényt primitív rekurzióval a következ½oképpen de…niálhatjuk: monus (x; 0) = x; monus (x; succ (y)) = pred (monus (x; y)) :
(6.16) (6.17)
Tekintsük most monus (2; 1) és monus (1; 2) kiszámítását rekurzívan: monus (2; 1) = pred (monus (2; 0)) = pred (2) = 1 és monus (1; 2) = pred (monus (1; 1)) = pred (pred (monus (1; 0))) = pred (pred (1)) = pred (0) = 0: 74
½ ALGORITMIKUS ELDÖNTHETOSÉG ÉS KISZÁMíTHATÓSÁG
Példa (minimum): A min (x1 ; x2 ) = x1
x1
x2 összefüggés miatt (6.18)
min (x1 ; x2 ) = monus (x1 ; monus (x1 ; x2 )) : p Példa ( x függvény egészrésze): Fennáll a következ½o összef½uggés: p p 2 hp i [ n] ; ha n + 1 6= ([ n] + 1) ; p n+1 = p 2 ha n + 1 = ([ n] + 1) : [ n] + 1; Ezért a megfelel½o primitív rekurzió az alábbi: hp i 0 = 0; hp i p n+1 = n + iszero
p
n+1
n +1
2
:
(6.19)
A kompozíció és a primitív rekurzió mellett más m½uveletekkel is el½o lehet állítani primitív függvényekb½ol primitív függvényeket. Ilyen m½uvelet az iteráció is. Informálisan a h függvény iterációján az f (x; n) = h(n) (x) = h (h (: : : h (x) : : :)) {z } | n
függvényt értjük. Formálisan a de…níció a következ½o: h(0) (x) = x;
h(n+1) (x) = h h(n) (x) : Az f függvény a h iterációja, ha f (x; 0) = x és f (x; n + 1) = h(n+1) (x) = h ( 33 (x; n; f (x; n))). Robinson igazolta, hogy a primitív rekurzív függvények osztálya felépíthet½o a primitív rekurzió helyett az iteráció segítségével is. Az alapfüggvények (zero, succ, projekció) Turing kiszámíthatók. A kompozíció és a primitív rekurzió meg½orzik a Turing kiszámíthatóságot. Ezért a primitív rekurzív függvények Turing kiszámíthatók. Igazolható az is, hogy a primitív rekurzív függvények osztálya felsorolható (megszámlálható). Tétel: Nem minden Turing kiszámítható függvény primitív rekurzív. Bizonyítás: Az átlós módszert használjuk. Minden egyes primitív rekurzív függvényt egy véges "szó" ad meg. Ezeket megszámozhatjuk (felsorolhatjuk) az f1 ; f2 ; : : : formában. De…niáljuk a g (x) = fx (x) + 1 függvényt, amely egy "tökéletes" Turing kiszámítható függvény. De nem lehet primitív rekurzív, mert mindegyikt½ol különbözik. A primitív rekurzív függvények olyan függvényeknek felelnek meg, amelyek rögzített hosszúságú ciklusokkal kiszámíthatók. TURING KISZÁMíTHATÓ FÜGGVÉNYEK
75
6.3.2. Parciális rekurzív függvények A primitív rekurzív függvények teljes függvények, amelyek az egész N0 halmazon vannak értelmezve. Ha olyan függvényeket akarunk konstruálni, amelyek csak parciálisak (tehát nem az egész N0 on vannak értelmezve), akkor egy új képzési szabályt kell bevezetni. Ez lesz a minimalizálás m½uvelete. A minimalizálás m½uvelete: Az f függvényt minimalizálással a következ½o módon de…niáljuk: f (x) = min fg (x; y) = 0g : y
(6.20)
Azt mondjuk, hogy f (x) az a minimális y 2 N0 , amelyre g (x; y) = 0. Ha nincs ilyen érték, akkor f (x) de…niálatlan. A minimalizálási m½uvelet szokásos jelölése: f (x) = y (g (x; y) = 0) :
(6.21)
ahol a minimalizálást, y a minimalizálás változóját, a () zárójelben lev½o kifejezés pedig a minimalizálás feltételét jelenti. Példa: Legyen f (x) = miny fx + y = 2g. Ekkor f (0) = 2, f (1) = 1 és f (2) = 0. Az x 3 értékekre f (x) de…niálatlan. Példa: Legyen h (x; y) = minz fx = y + zg. Ekkor pl. h (5; 2) = 3, de h (2; 5) de…niálatlan. Könny½u látni, hogy h (x; y) = x y, ha x y, egyébként pedig h de…niálatlan. Példa: A négyzetgyök függvény egész részét a minimalizálással a következ½oképpen adhatjuk meg: p x = t (monus (x; (t + 1) (t + 1)) = 0) : (6.22) p Példa: A c x függvény egész részét hasonlóképpen adhatjuk meg: p c x = t (monus (x; (t + 1)c ) = 0) : (6.23) Példa: A logaritmus függvény egész része [logc x] = t monus x; ct+1 = 0 :
(6.24)
De…níció: Egy függvényt parciális rekurzívnak nevezünk, ha az alapfüggvényekb½ol helyettesítéssel, rekurzióval és minimalizálással megkapható. Igaz a következ½o eredmény. Tétel (Kleene): A Turing kiszámítható függvények osztálya azonos a parciális rekurzív függvények osztályával. A parciális rekurzív függvények osztályának vannak olyan tagjai, amelyek teljesek, de nem primitív rekurzívak. Híres példa erre az alábbi rekurzióval megadott Ackermann (AckermannPéter Rózsa) függvény: A (0; n) = n + 1 A (m; 0) = A (m A (m; n) = A (m 76
(n 0) ; 1; 1) (m > 0) ; 1; A (m; n 1)) (m > 0; n > 0) :
(6.25) (6.26) (6.27)
½ ALGORITMIKUS ELDÖNTHETOSÉG ÉS KISZÁMíTHATÓSÁG
Az Ackermann függvény gyorsabban n½o mint bármelyik primitív rekurzív függvény. Írjuk át a függvényt a Tm (n) = A (m; n) alakba. Ekkor a fenti rekurzió alakja:
T0 (n) = n + 1 (n 0) ; Tm+1 (0) = Tm (1) (m > 0) ; Tm+1 (n + 1) = Tm (Tm+1 (n)) (m > 0; n > 0) : Vizsgáljuk meg a függvény néhány értékét!
T1 (n) = T0 (T1 (n 1)) = T1 (n 1) + 1 = T1 (n = T1 (0) + n = T0 (1) + n = n + 2;
i) + i
T2 (n) = T1 (T2 (n 1)) = T2 (n 1) + 2 = T2 (n = T2 (0) + 2n = T1 (1) + 2n = 2n + 3;
i) + 2i
T3 (n) = T2 (T3 (n 1)) = 2T3 (n 1) + 3 = 2i T3 (n i) + 3 2i 1 = 2n T3 (0) + 3 2n 3 = 2n T2 (1) + 3 2n 3 = 2n+3 3;
1)) = 2T4 (n
T4 (n) = T3 (T4 (n 2
: T4 (0)+3 :: 2
= 2| 2 {z
n emelet
}
2
1)+3
3 = 22
T4 (n 2)+3
3
: :: 2
3 = 2| 2{z }
3:
n+3 emelet
Az Ackermann függvény nagyon er½osen n½o. Például 22
T4 (1) = 2
22
3 = 65533;
T4 (2) = 265536
3
2
1019728 ;
T4 (3) = 22
65536
3:
A T4 (2) = A (2; 4) értékének leírásához már több mint 19000 jegy kell a tizes számrendszerben. Összehasonlításképpen megjegyezzük, hogy az univerzum atomjainak a számát kevesebb mint 10100 -ra becsülik. A szakaszban tárgyalt függvénytípusok egymáshoz való viszonyát az alábbi ábrával jellemezhetjük: TURING KISZÁMíTHATÓ FÜGGVÉNYEK
77
egész számokon értelmezett függvények
parciális rekurzív (Turing kiszámítható) függvények
teljes parciális rekurzív függvények
primitív rekurzív függvények
Feladat: Konstruáljunk Turing gépet, amely a zero függvényt számítja ki! Feladat: Konstruáljunk Turing gépet, amely a succ függvényt számítja ki! Feladat: Konstruáljunk Turing gépet, amely a projekciós függvényeket számítja ki!
78
½ ALGORITMIKUS ELDÖNTHETOSÉG ÉS KISZÁMíTHATÓSÁG
7. fejezet Algoritmusok analízise Turing értelemben algoritmikusan megoldható feladatokkal és megoldó algoritmusaik elemzésével foglalkozunk. A felvet½od½o kérdések: - Adott feladat nehézségének (bonyolultságának) jellemzése. - Több módszer (algoritmus) esetén a jobbik (legjobb) kiválasztása. A feladatok nehézségét a megoldási költséggel és a szükséges er½oforrások mennyiségének vizsgálatával jellemezzük. Az alapvet½o jellemz½ok: - számítási id½o (általában aritmetikai vagy logikai m½uveletek számában), - tárigény. Egy feladat nehézségét sok esetben a megoldás "költségére" adott fels½o, illetve alsó korláttal tudjuk jellemezni. A fels½o korlátok jobb, gyorsabb algoritmusok keresését inspirálják, míg az alsó korlátok (amiknél nincs gyorsabb algoritmus) a feladat nehézségét jellemzik. A feladatok bonyolultsága és az ½oket megoldó algoritmusok hatékonysága általában összefüggést mutat. Adott feladatot megoldó algoritmusok között a hatékonyabbat csak az algoritmusok elemzésével tudjuk kiválasztani. Konkrét algoritmusok elemzésénél a cél az adott algoritmusok hatékonyságának (költségének és er½oforrásigényének) vizsgálata. Megjegyezzük, hogy egy algoritmus hatékonyságára vonatkozó információ egyúttal a megoldandó feladat nehézségét is jellemzi, vagy jellemezheti.
7.1. Bevezetés 7.1.1. Elméleti eredmények és fogalmak A bonyolultságelméletben számos meglep½o eredmény van. Els½oként említjük meg, hogy vannak olyan feladatok, amelyekre nincs optimális algoritmus. Ha például az L nyelv id½oben hatékony felismerése a feladat, akkor olyan T algoritmust keresünk, amelyre a timeT (n) elég lassan n½o, s½ot esetleg a legjobb. Ilyen azonban nincs mindig, amit a következ½o eredmény is mutat. ALGORITMUSOK ANALíZISE
79
Gyorsítási tétel: Van olyan L nyelv, amelyre igazak az alábbiak: (i) Az L felismerhet½o egy olyan T Turing géppel, amelyre timeT (n) véges minden n-re. (ii) Tetsz½oleges, az L nyelvet felismer½o T Turing géphez van olyan T 0 Turing gép, amelyre L = L (T 0 ) és timeT 0 (n) = O (log timeT (n)) : Ez az eremény (elvileg) tovább is fokozható: Ha L = L (T ) és timeT (n) cn ( c konstans), akkor 8" > 0-ra 9T 0 Turing gép, hogy L = L (T 0 ) és timeT 0 (n) n (1 + ") ( n n0 (")). Tehát erre a feladatra nincs legjobb algoritmus. A következ½okben bemutatjuk, hogy a Turing megoldható feladatok körében tetsz½oleges bonyolultságú feladatok léteznek. Tekintsük a következ½o egész számokon értelmezett Ackermannszer½u függvényt: (1) = 2; (n + 1) = 2 22
: :: 2
(n)
;
n
1:
1 ”emelet” van. Ez 2n -nél (exponenciális függvénynél),
Világos, hogy (n) = 2 , ahol n n n!-nál és n -nél is gyorsabban n½o: 5
10
fi(n) n
2 n!
4
10
n
n
3
y
10
2
10
1
10
0
10
1
1.5
2
2.5
3 n
3.5
4
4.5
5
Matlabban kapott számítási eredmények: n (n) 2n n! nn
1 2 2 1 1
2 3 4 5 4 16 65536 inf 4 8 16 32 2 6 24 120 4 27 256 3125
Ha a függvényértéket és a helyettesítési értéket az ”1"-es számrendszerben felírjuk, akkor bármelyik, a (n)-et kiszámító Turing gépre timeT (n) legalább (n) lesz (már csak a szám vonásokkal 80
ALGORITMUSOK ANALíZISE
történ½o ábrázolásához/beolvasásához is kell ennyi lépés). Ez a helyzet akkor is ha valamilyen nagyobb számrendszerben ábrázoljuk a -t. A konkrét példán túlmen½oen igazak az alábbi általános eredmények. Cejtin tétele: Tetsz½oleges f : ! ( = f0; 1g) kiszámítható függvényhez van beli szavaknak olyan tulajdonsága, amerre a következ½ok teljesülnek: a) a tulajdonság e¤ektíve felismerhet½o, azaz van olyan T Turing gép, amelyik tetsz½oleges p 2 szóról eldönti, hogy tulajdonságú, vagy sem; b) tetsz½oleges, a tulajdonságot felismer½o T Turing gép id½o bonyolultságára fennáll, hogy timeT (jpj) > f (p)
(7.1)
végtelen sok p szóra. Rabin tétele: Tetsz½oleges f : ! ( = f0; 1g) kiszámítható függvényhez van beli szavaknak olyan tulajdonsága, amerre a következ½ok teljesülnek: a) a tulajdonság e¤ektíve felismerhet½o, azaz van olyan T Turing gép, amelyik tetsz½oleges p 2 szóról eldönti, hogy tulajdonságú, vagy sem; b) tetsz½oleges, a tulajdonságot felismer½o T Turing gépre véges sok kivétellel az összes p 2 szóra fennáll, hogy timeT (jpj) > f (p) : (7.2) A két tétel alapján indokolt az algoritmusokat id½o- és tárigényük nagyságrendje (bonyolultsága) alapján osztályozni. A következ½okben néhány bonyolultsági osztályt de…niálunk. De…níció: Egy L nyelv id½obonyolultsága legfeljebb f (n), ha van egy Turing gép, amely az L nyelvet eldönti és minden w 2 ( jwj = n) szóra legfeljebb f (n) lépésben megáll. A legfeljebb f (n) id½obonyolultságú nyelvek osztályát DT IM E (f (n))-el jelöljük. De…níció: Egy L nyelv tárbonyolultsága legfeljebb f (n), ha van egy Turing gép, amely az L nyelvet eldönti és minden w 2 (jwj = n) szóra a Turing gép tárigénye legfeljebb f (n) . A legfeljebb f (n) tárbonyolultságú nyelvek osztályát DSP ACE (f (n))-el jelöljük. A nyelv (feladat) bonyolultsága helyett a nyelvet eldönt½o Turing gépre (algoritmusra) is mondjuk, hogy legfeljebb f (n) id½o-, ill tárigény½u. Els½o közelítésben két fontos algoritmus osztályt különböztetünk meg. De…níció: A T gép (algoritmus) polinomiális futási idej½u (id½obonyolultságú), ha id½oigénye legfeljebb p (n), ahol p polinom. A de…níció alternatív változata: a p (n) polinom helyett az O nk függényt használják. c De…níció: A T gép (algoritmus) exponenciális, ha id½oigénye O 2n , valamilyen c > 0 konstansra. De…níció: Mindazon nyelvek osztályát, amelyek polinomiális idej½u Turing géppel eldönthet½ok P T IM E-mal, vagy egyszer½uen P -vel jelöljük. Másképpen P = [k 0 DT IM E nk :
(7.3)
De…níció: Mindazon nyelvek osztályát, amelyek polinomiális tárigény½u Turing géppel eldönthet½ok P SP ACE-el jelöljük. Másképpen P SP ACE = [k 0 DSP ACE nk : BEVEZETÉS
(7.4) 81
De…níció: Mindazon nyelvek osztályát, amelyek exponenciális idej½u Turing géppel eldönthet½ok EXP T IM E-mal jelöljük. Másképpen k
EXP T IM E = [k 0 DT IM E 2n
(7.5)
:
Elvileg a polinomiális algoritmusok a ”jó” algoritmusok, a "kezelhet½ o" (tractable) algoritmusok, vagy "könny½ u" problémák. Az exponenciális algoritmusok ezzel szemben a ”rossz” algoritmusok, a "nehéz" (intractable) problémák. Nagyon sok gyakorlatban használt algoritmus polinomiális. Példák polinomiális algoritmusokra: - Kombinatorika: gráfok összefügg½oség tesztje, legrövidebb út, magyar módszer. - Aritmetikai algoritmusok: alapvet½o aritmetikai m½uveletek, legnagyobb közös osztó meghatározása az euklideszi algoritmussal. - Lineáris algebrai algoritmusok: determináns, inverz és lineáris egyenletrendszer megoldása Gauss-módszerrel. Exponenciális algoritmusokra, illetve problémákra példa az Ackermann típusú függvények kiszámítása (ez tkp. szuperexponenciális), az összes permutáció el½oállítása, a determináns eredeti de…níció alapján történ½o kiszámítása, számos gráfelméleti probléma (pl. az utazó ügynök probléma egyes variánsai), vagy a lineáris programozás szimplex algoritmusa. A fenti osztályozás nem minden esetben függ össze a gyakorlati megvalósíthatósággal. Például a szimplex algoritmus a gyakorlatban jól bevált gyors algoritmus. Ugyanakkor vannak polinomiális idej½u algoritmusok, amelyekkel nagyméret½u feladatok esetén szinte lehetetlen eredményt kapni. Problémák szokásos osztályozása (els½o közelítésben): rekurzív (algoritmikusan eldönthető) nyelvek
Összes nyelv S felett
eldönthetetlen nyelvek
nehéz problémák
könnyű problémák
Feladat: A következ½o program az nk binomiális együtthatót (jelölése C (n; k)) számítja ki iteratívan. for i := 0 to m do {C[i; 0] := 1; C[i; i] := 1}; 82
ALGORITMUSOK ANALíZISE
for n := 2 to m do for k := 1 to n 1 do C[n; k] := C[n 1; k] + C[n 1; k 1]; Elemezze az eljárást! Mi az eljárás költsége általában? Adjon alsó becslést a C (n; n=2) költségére, ha n páros szám!
7.1.2. Az oszd meg és uralkodj elv A oszd meg és uralkodj elv egy egyszer½u és hatékony módszer problémák megoldására. Az elv alapötlete: - Szétosztjuk a problémát kisebb rész problémákra. - Megoldjuk a kisebb részproblémákat. - A kisebb részproblémák megoldásaiból összerakjuk az eredeti probléma megoldását. Tekintsük az elvet leíró alábbi általános algoritmust! DivideAndConquer(data,N ,solution) data a set of input values N the number of values in the set solution the solution to this problem if (N SizeLimit) then DirectSolution( data, N , solution ) else DivideInput( data, N , smallerSets, smallerSizes, numberSmaller ) for i = 1 to numberSmaller do DivideAndConquer(smallerSets[i], smallerSizes[i], smallSolution[i]) end for CombineSolutions(smallSolution, numberSmaller, solution) end if Az algoritmus el½oször azt nézi meg, hogy a probléma méret elég kicsi-e ahhoz, hogy egy direkt algoritmussal (DirectSolution) oldjuk meg. Ha probléma túl nagy, akkor el½oször az inputot felosztó rutint (DivideInput) hívja meg, hogy az input adatokat (feladatot) kisebb részekre bontsa. Ezek méretei lehetnek egyenl½ok, vagy eltér½oek is. Az algoritmus ezután rekurzívan meghívásra kerül a kisebb input adathalmazokon és ezen hívások eredményeit f½uzi össze a CombineSolutions rutin. A fenti oszd meg és uralkodj algoritmus hatékonyságát (bonyolultságát) a következ½oképpen írhatjuk le: DAC(N )= ahol
DIR(N ), P DIV(N )+ numberSmaller DAC(smallerSizes[i])+COM(N ), i=1
ha N SizeLimit ha N > SizeLimit
DAC a DivideAnd Conquer algoritmus bonyolultsága, BEVEZETÉS
83
DIR a DirectSolution bonyolultsága, DIV a DivideInput bonyolultsága, COM a CombineSolutions bonyolultsága. A rekurzíó megoldásához szükségünk van a következ½o szakaszban található mester tételre.
7.1.3. A mester tétel A mester tétel segítségével meghatározhatjuk az oszd meg és uralkodj algoritmus bonyolultságát abban az esetben, amikor az input adatokat egyenl½o részre osztjuk. Tétel: Ha n a b szám hatványa, a; b; c; d konstansok, a 1, b > 1, akkor a d; ha n = 1 aT (n=b) + cn;
T (n) = rekurzió megoldása
(7.6)
ha n > 1
8 < O (n) ; ha a < b O (n log n) ; ha a = b T (n) = : O nlogb a , ha a > b.
(7.7)
Bizonyítás: Könnyen látható, hogy
n + cn b n n = a aT 2 + c + cn b b acn n + cn = a2 T 2 + b b n n acn = a2 aT 3 + c 2 + + cn b b b n a2 cn acn = a3 T 3 + 2 + + cn b b b .. .
T (n) = aT
= ai T
i 1 X a n + cn bi b j=0
logb n 1
=a
logb n
T (1) + cn
X j=0
j
a b
j
:
Minthogy alogb n = blogb a
logb n
= blogb n
azért
logb n 1
T (n) = dn
logb a
+ cn
X j=0
84
logb a
a b
= nlogb a ; j
:
ALGORITMUSOK ANALíZISE
Ha a < b, akkor a=b < 1, logb n 1
X j=0
Ezért T (n) < dnlogb a + cbn= (b
a b
j
1 X a < b j=0
b
j
=
b
a
:
a) = O (n). (a < b ) logb a < 1!). Ha a = b, akkor logb n
T (n) = dn + cn
X
1j = dn + cn (1 + logb n) = O (n log n) :
a b
=
(a=b)logb n 1 (a=b) 1
=
nlogb a 1 1 = O nlogb a (a=b) 1
1
= O nlogb a .
j=0
Ha a > b, akkor logb n 1
X j=0
j
Tehát ekkor T (n) = dn + cnO nlogb a Példák:
1
:
Ha T (n) = 2T (n=3) + cn, akkor a = 2 < b = 3 miatt T (n) = O (n). Ha T (n) = 2T (n=2) + cn, akkor a = b = 2 miatt T (n) = O (n log n). Ha T (n) = 4T (n=2) + cn, akkor a = 4 > b = 2 miatt T (n) = O nlog2 4 = O (n2 ). A most igazolt mester tételnél általánosabb eredmények is vannak. Ilyen található például Cormen, Leiserson, Rivest és Stein könyvében. Az alábbi táblázat a T (n) = aT
n + f (n) b
rekurzió megoldásának nagyságrendjét tartalmazza az f (n) = esetben: d T (n) log a (f (n)) < c tetsz½oleges log b log a =c > 1 (f (n) log n) log b log a log b
=c
log a log b
>c
<
1
tetsz½oleges
(7.8) nc logd n vagy f (n) = 0
(7.9)
log a
n log b
log a
n log b
Példák: Ha T (n) = 9T Ha T (n) = 9T (n2 log n). BEVEZETÉS
n 3
+ n4 , akkor log a= log b = 2 < c = 4 és d = 0 miatt T (n) = n 3
+ n2 , akkor log a= log b = c = 2 és d = 0 >
(n4 ).
1 miatt T (n) =
85
Ha T (n) = 9T (n2 ). Ha T (n) = 9T
n 3
n 3
+
n2 , log2 n
akkor log a= log b = c = 2 és d =
2<
1 miatt T (n) =
, akkor log a= log b = 2 > c = 0 és d = 0 miatt T (n) =
(n2 ).
Feladat: Adjuk meg a következ½o rekurziók megoldását a mester tétellel, vagy a fenti táblázattal, illetve jelezzük, ha ezek nem alkalmazhatók: a) T (n) = 2T (n=2) + n2 ;
b) T (n) = 4T (n=2) + n2 ;
c) T (n) = T (n=2) + 2n ;
d) T (n) = 2n T (n=2) + nn ;
e) T (n) = 16T (n=4) + n;
f) T (n) = 2T (n=2) + n log n;
g) T (n) = 2T (n=2) + n= log n;
h) T (n) = 2T (n=4) + n0:51 ;
i) T (n) = 0:5T (n=2) + 1=n.
7.2. Keresési, rendezési és kiválasztási feladatok A mindennapi gyakorlatban is fontos keresési, kiválasztási és rendezési feladatokkal foglalkozunk néhány alapvet½o esetben.
7.2.1. Keresési feladatok A keresési feladaton azt értjük, hogy egy listában (vagy tömbben) egy adott érték½u elemet (target) keresünk. A lista (tömb) lehet rendezetlen, vagy rendezett. A szekvenciális és a bináris keresés algoritmusát elemezzük. Ha a lista elemei rendezetlenek, akkor a lista elemeit szekvenciálisan összehasonlítjuk az adott érték½u elemmel. A szekvenciális keresés algoritmusa: SequentialSearch(list,target,N ) list the elements to be searched target the value being searched for N the number of elements in the list for i = 1 to N do if (target = list[i]) 86
ALGORITMUSOK ANALíZISE
return i end if end for return 0 A legjobb eset, ha a keresett elem (target) az els½o elem, a legrosszabb pedig az, ha az utolsó N -edik elem. Tehát az összehasonlítások száma (esetünkben a számítási költség) 1 és N közé esik. Ha feltesszük, hogy az adott tulajdonságú elem azonos 1=N valószín½uséggel lehet a lista bármelyik helyén, akkor a keresés átlagos költsége a következ½oképpen határozható meg. Ha a keresett elem az i-edik helyen van, akkor i összehasonlítások költsége. Az átlagos költség a költségek várható értéke: N N X 1 X 1 i = i= A (N ) = N N i=1 N i=1
N (N + 1) N +1 = : 2 2
Ha feltesszük, hogy a keresett elem nincs a listán, akkor N + 1 lehet½oségünk van. Feltéve, hogy minden eset egyenl½oen valószín½u, akkor ezek valószín½usége 1= (N + 1) és az átlagos költség a következ½o lesz: ! N X i N 1 N (N + 1) A (N ) = + = +N N +1 N +1 N +1 2 i=1 =
N N N +1 N 1 + = + : 2 N +1 2 2 (N + 1)
Látható, hogy az újabb feltevésünk módosította (növelte) az átlagos költséget. Ha N ! 1, N 1 akkor 2(N ! 12 és ezért +1) N +1 1 + : A (N ) 2 2 Nagy N -re ez nem jelent½os növekedés. A következ½okben tegyük fel, hogy a listánk rendezett és vizsgáljuk a bináris keresés algoritmusát, amelynek alapötlete, hogy felezzük a listát, a középs½o elemmel összehasonlítjuk a keresett elemet, majd aszerint, hogy milyen viszonyban állnak (<, =, >) választjuk a lista els½o felét, a kilépést, vagy a lista második felét. Ezt ismételjük a kapott részlistán, amíg az el nem fogy. Egy lehetséges program a következ½o BinarySearch(list,target,N ) list the elements to be searched target the value being searched for N the number of elements in the list start = 1 end = N while start end do middle = d(start + end)=2e KERESÉSI, RENDEZÉSI ÉS KIVÁLASZTÁSI FELADATOK
87
select (Compare(list[middle], target)) from case 1: start = middle+1 case 0: return middle case 1: end = middle 1 end select end while return 0 ahol a Compare(x,y) függvény de…níciója:
Compare (x; y) =
8 <
1; 0; : 1;
ha x < y ha x = y ha x > y
Az eljárás döntési fája 7 elem½u lista esetén:
list[4]
list[2]
list[1]
list[6]
list[3]
list[5]
list[7]
A döntési fa csomópontjaiban lév½o elemeket hasonlítja össze az algoritmus a target értékével az egyes iterációkban. Ha a target értéke kisebb mint a csomóponti elem, akkor a számítás a baloldali részfán folyik tovább, ha pedig nagyobb, akkor a jobboldali részfán. A legrosszabb eset bonyolultságot vizsgáljuk. Az algoritmus felezési jellege miatt tegyük fel, hogy N = 2k 1 valamilyen k 1 értékre. Az els½o felezésben a középs½o elem indexe k k 1 1+2 1 =2 = 2 . Ezért az els½o iterációban keletkez½o részlista hossza 2k 1 1. Hasonló okfejtéssel a második iterációban keletkez½o részlista hossza 2k 2 1, és igy tovább. A j-edik iteráció részlistájának hossza 2k j 1. Az iterációs ciklus legkés½obb a k-adik iterációban fejez½odik be. Ez k öszehasonlítást jelent, ahol k = log2 (N + 1) s log2 N . Az átlagos bonyolultságot vizsgáljuk az N = 2k 1 elemszámra azon feltevés mellett, hogy a target a listában van és ott egyenl½o 1=N valószín½uséggel fordulhat el½o bárhol. A döntési fa i-edik szintjén lev½o elemek száma 2i 1 és a szintek száma k. Ha a keresett elem az i-edik szinten van, akkor i összehasonlítást végzünk a megtalálásához. Ezért az átlagos számítási költség:
A (N ) =
k X i=1
88
1 0 k 2i 1 X 1 X i 1 1A @ = i2 : i N N i=1 j=1 ALGORITMUSOK ANALíZISE
Vegyük észre, hogy x 6= 1 esetén + kxk
1 + 2x +
1
+ xk
= 1 + x + x2 + = = =
0
0
xk+1 1 x 1 (k + 1) xk (x
xk+1
1)
1
2
kxk+1
(x 1) (k + 1) xk + 1 : (x 1)2
Az x = 2 értéket ebbe behelyettesítve kapjuk, hogy k X
i2i
1
= k2k+1
(k + 1) 2k + 1 = (k
1) 2k + 1:
i=1
Tehát az átlagos számítási költség átírható az A (N ) =
1 (k N
1) 2k + 1 =
= log2 (N + 1)
(log2 (N + 1)
1) (N + 1) + 1 N
log2 (N + 1) 1+ N
alakba. Minthogy log2 (N + 1) =N ! 0, az átlagos számítási költségre fennáll, hogy A (N )
log2 (N + 1)
1;
ami 1-el kevesebb mint a legrosszabb eset log2 (N + 1) költsége. Feladat: Mi a bináris keresés átlagos bonyolultsága, ha megengedjük, hogy a keresett elem ne legyen a listában és minden eset (elhelyezkedés) valószín½usége azonosan 1= (N + 1)? Feladat: Mi a bináris keresés legrosszabb eset bonyolultsága, ha N 6= 2k 1? Feladat: Mi a bináris keresés átlagos bonyolultsága, ha a keresett elem a listában van, minden eset (elhelyezkedés) valószín½usége azonosan 1=N és N 6= 2k 1? Feladat: Mi a bináris keresés átlagos bonyolultsága, ha a keresett elem esetleg nincs a listában, minden eset (elhelyezkedés) valószín½usége azonosan 1= (N + 1) és N 6= 2k 1?
7.2.2. Rendezési feladatok Két fontos rendezési algoritmust elemzünk, amelyek az oszd meg és uralkodj elv tipikus alkalmazásai. KERESÉSI, RENDEZÉSI ÉS KIVÁLASZTÁSI FELADATOK
89
Összefésül½o rendezés Az algoritmus alapja az összefésülés (merge). Tegyük fel, hogy adottak az A [1 : k] és B [1 : l] növekv½oen rendezett tömbök és tartalmukat a C [1 : k + l] tömbben kívánjuk tárolni, rendezetten. A két rendezett tömb összefésülési algoritmusa a következ½o: 1. C [1]-be az A [1] és B [1] közül a kisebbiket rakjuk, 2. Ha az A [1 : i] és B [1 : j] résztömböket már feldolgoztuk, akkor a következ½o elem: C [i + j + 1] = min fA [i + 1] ; B [j + 1]g : Az összefésülés maximális költsége k + l 1 összehasonlítás és k + l mozgatás. A legkisebb költség: min fk; lg összehasonlítás (Miért?). Legyen az A [1 : n] tömb rendezetlen. Az összefésül½o rendezés (msort) alapelve: rendezzük a tömb els½o és második felét külön külön, majd ezek tartalmát fésüljük össze és használjunk rekurziót! function msort (x; y) comment sorts A [x::y] if y x 1 then return(A) else return(merge(msort x;
x+y 2
; msort
x+y 2
+ 1; y )
Legyen T (n) az összefésül½o rendezés költsége (összehasonlítások száma) n hosszúságú tömb esetén és tegyük fel, hogy n = 2k alakú. Az n=2 hosszúságú rendezett tömbök összefésülése n 1 összehasonlítás. Ezért az algoritmus költségére fennáll, hogy T (n) =
1; ha n 1 2T (n=2) + n
1;
egyébként
A ”mester” tétel alapján T (n) = O (n log n) összehasonlítás az összefésül½o rendezés költsége. A pontosabb eredmény: n n + n 1 = 22 T 2 2 2 n n 3 2 =2 T 3 +2 1 +2 2 22 i X n n = 2i T i + 2j 1 j 1 2 2 j=1
T (n) = 2T
k
= 2 T (1) +
k X
n
j 1
2
+n
n +2 1 +n 2 n 1 +n 1 2 1 +n
= 2n + kn
1
1
1 = 2n + kn
j=1
1
1
k X
2j
1
j=1
2k
1 = n log2 n + n:
Tehát az összefésül½o rendezés legrosszabb eset bonyolultsága n hosszúságú tömb esetén O (n log n) összehasonlítás. 90
ALGORITMUSOK ANALíZISE
Gyorsrendezés A gyorsrendezés vagy quicksort algoritmust C.A.R. Hoare publikálta 1962-ben és egyike a 20. század tíz legfontosabbnak tartott algoritmusának (lásd B. A. Cipra: The Best of the 20th Century: Editors Name Top 10 Algorithms, SIAM News, Volume 33, Number 4).
Sir Tony Hoare Az algoritmusnak három eleme van: - felosztás, - uralkodás, - összevonás. A felosztásban az algoritmus kiválaszt egy A (q) elemet (pivot elemet vagy ½orszemet) és felosztja az fA (p) ; : : : ; A (r)g (p r) tömböt két ”összefügg½o”(esetleg üres) fA (p) ; : : : ; A (q
1)g ;
fA (q + 1) ; : : : ; A (r)g
résztömbre úgy, hogy a baloldali résztömb elemei kisebbek, vagy kisebb-egyenl½ok A (q)-nál, a jobboldali résztömb elemei pedig nagyobbak A (q)-nál. A két résztömb elemei nem rendezettek. Az q index (½orszem, pivot elem) számítása a felosztó eljárás része. Az uralkodás fázisában az fA (p) ; : : : ; A (q 1)g és fA (q + 1) ; : : : ; A (r)g résztömböket a felosztás (gyorsrendezés) rekurzív hívásával rendezzük. Az összevonás fázisa: Mivel rekurzív hivások az egyelem½u résztömböknél állnak le és résztömböket helyben rendeztük, az eredményül kapott egész fA (p) ; : : : ; A (r)g tömb rendezett lesz. Az algoritmus leírása: gyorsrendezés (A; p; r) if p < r then q =feloszt(A; p; r) gyorsrendezés(A; p; q
1)
KERESÉSI, RENDEZÉSI ÉS KIVÁLASZTÁSI FELADATOK
91
gyorsrendezés(A; q + 1; r) A teljes tömb rendezése: gyorsrendezés(A; 1; hossz (A)). A feloszt eljárás kiválasztja az ½orszemet (esetünkben x = A (r)), majd helyben átrendezi az fA (p) ; : : : ; A (r)g résztömböt. feloszt (A; p; r) x = A (r) i=p 1 for j = p : r 1 if A (j) x then i=i+1 csere(A(i); A (j)) csere(A (i + 1) ; A (r)) return i + 1 A feloszt eljárás a tömböt folyamatosan négy (esetleg üres) részhalmazra bontja az alábbi ábra szerint:
őrszem p
i <=x
r x
j >x
ismeretlen
A(i+1) és A(j) cseréje, ha A(j)<=x A feloszt eljárás 4 tartománya A j és r 1 közötti indexekre a fenti feltételek nem állnak, ugyanis az itteni elemek nincsenek kapcsolatban az ½orszemmel. A gyorsrendezés hatékonyságát vizsgáljuk három esetben. 1. Az átlagos futásid½o elemzése Legyen T (n) az összehasonlítások átlagos száma (várható értéke) n különböz½o tömb elem esetén. Világos, hogy T (0) = T (1) = 0. Tegyük fel, hogy x az i-edik legkisebb elem. Ekkor az A (1 : n) tömböt a feloszt eljárás egy i 1, egy 1 és egy n i elem½u résztömbre bontja. A rekurzív hívások ideje T (i 1) és T (n i). Az i tetsz½oleges értéket vehet fel 1 és n között, egyenl½o valószín½uséggel. A feloszt eljárás n 1 összehasonlítást igényel. Ezért adott i-re a 92
ALGORITMUSOK ANALíZISE
költség T (i
1) + T (n
1 és ezek átlaga
i) + n
1X T (n) = [T (i n i=1 n
1) + T (n
i)] + n
1:
Minthogy n X
[T (i
1) + T (n
i)] = 2
i=1
n 1 X
T (i) ;
i=2
azért 2X T (i) + n T (n) = n i=2 n 1
1:
Végezzük el a következ½o átalakításokat: nT (n) = 2
n 1 X
T (i) + n2
n;
i=2
(n
1) T (n
1) = 2
n 2 X
T (i) + n2
3n + 2;
i=2
nT (n)
(n
1) T (n
1) = 2T (n
1) + 2 (n
1) ;
ahonnan nT (n) = (n + 1) T (n
1) + 2 (n
1) :
Osszuk el mindkét oldalt n (n + 1)-el: T (n) T (n 1) 2 (n 1) = + : n+1 n n (n + 1) Legyen most S (n) = T (n) = (n + 1). Ekkor de…níció szerint S (0) = S (1) = 0, S (2) = T (2) =3 = 1=3 és 2 (n 1) S (n) = S (n 1) + : n (n + 1) n
3 esetén 2 (n 1) n (n + 1)
2 : n
Tehát fennáll, hogy S (n)
0; ha n 1 S (n 1) + 2=n;
KERESÉSI, RENDEZÉSI ÉS KIVÁLASZTÁSI FELADATOK
ha n
2 93
Ennek megoldása: S (n)
S (n
1) +
S (n
2) +
2 n 2 n
1
+
2 n
.. . S (n
n X
i) + 2
j=n
.. . S (1) + 2
n X 1 j=2
1 j i+1
=2
j
n X 1 j=2
2
j
Z
n
1
1 dx = 2 ln n: x
Innen kapjuk, hogy T (n) = (n + 1) S (n) < 2 (n + 1) ln n = 2 (n + 1) log n= log e 1:386 (n + 1) log n = 1:386n log n + O (n) : Állítás: A gyorsrendezés átlagos költsége
1:4n log n + O (n).
2. A "legrosszabb" futásid½o/felosztás Legyen x a legkisebb elem, azaz i = 1 és tegyük fel, hogy ez ismétl½odik a rekurzív hívásoknál. Ekkor T (n) = T (n 1) + n 1: Ezt minden n-re összegezve kapjuk, hogy n X
T (i) =
i=1
illetve
T (n) =
n X
T (i
1) +
i=1
n X i=1
(i
1) =
n X
(i
1) ;
=
n2 :
i=1
(n
1) n 2
3. A "legjobb" futásid½o/felosztás Legyen x az n=2-ik elem. Ez két n=2 elem½u tömböt hoz létre és ez rekurzívan ismétl½odik. Ekkor a futási id½o rekurzív képlete: T (n) = 2T (n=2) + n
1;
amelynek megoldása a mester tétel alapján T (n) = O (n log n). Az összefésül½o rendezésnél látott levezetés alapján T (n) = n log2 n + n. A Hoare-féle gyorsrendez½o algoritmusnak számos más változata is van. Az ½orszem megválasztása véletlenül is történhet. 94
ALGORITMUSOK ANALíZISE
7.2.3. Alsó becslés a rendezések bonyolultságára A következ½o eredmény azt mutatja, hogy összefésül½o és a gyorsrendezés algoritmusok közel optimálisak. Tétel (alsó becslés a rendezések költségére): Tetsz½oleges rendez½o algoritmus, amely elem páronkénti összehasonlításokat és cseréket használ, legalább (n log n) összehasonlítást igényel a legrosszabb esetben. Bizonyítás: Tegyük fel, hogy a rendez½o algoritmus helyesen rendezi az a1 < a 2 <
< an
elemek összes lehetséges n! input permutációját, legfeljebb k döntéssel (páronkénti összehasonlítással). Minden v1 ; v2 ; : : : ; vn inputsorozathoz tartozik a sorban kapott döntések eredményeit (i; n) tartalmazó legfeljebb k hosszúságú kódszó. Minden kódszóhoz egyértelm½uen hozzátartozik az átrendezések (cserék) egy P1 ; P2 ; : : : ; Ps sorozata (rendezési koreográ…a). Ez azért van, mert itt a programfüggvény tényleg függvény. Mármost összesen legfeljebb 2k kódszó (döntés és átrendezés sorozat) lehetséges. Ha 2k < n!, akkor legalább két inputra ugyanazt a cseresorozatot hajtja végre. Következésképpen legalább egy output ami ellentmondás. Kaptuk tehát, hogy 2k n!, p hibás lesz, n azaz k dlog2 n!e. Stirling n! s 2 n (n=e) aszimptotikus formulája alapján dlog n!e > n log n
n : 2
Következmény: Összefésül½o rendezés közel optimális (optimális konstans szorzótól eltekintve). Az összefésül½o rendezésre az összehasonlítások pontos száma T (n) = n log2 n + n. Ez az algoritmus tehát közel optimálisnak tekinthet½o.
7.2.4. Kiválasztási feladatok A kiválasztási feladatoknál nem egy adott érték½u listaelemet keresünk, hanem valamilyen tulajdonsággal rendelkez½o elemet. Két kiválasztási feladatot vizsgálunk. A maximális és minimális elem kiválasztása Keressük az n elem½u S tömb maximális és minimális elemét! A feladatra adott els½o megoldásunk egyszer½u lineáris keresés, amelyet kétszer alkalmazunk: Smax = S [1] for i = 2; : : : ; n if S [i] > Smax then Smax = S [i] end Smin = S [1] for i = 2; : : : ; n KERESÉSI, RENDEZÉSI ÉS KIVÁLASZTÁSI FELADATOK
95
if S [i] < Smin then Smin = S [i] end Az els½o megoldás költsége 2n
2 (= O (n)) összehasonlítás.
A második megoldás alapötlete az oszd meg és uralkodj elven alapul: A tömböt félbevágjuk és mindkét fél tömbben megkeressük a maximumot és a minimumot rekurzívan. function maxmin (x; y) comment return max and min in S [x::y] if y x 1 then return(max (S [x] ; S [y]) ; min (S [x] ; S [y])) else (max1; min1) := maxmin (x; b(x + y) =2c) (max2; min2) := maxmin (b(x + y) =2c + 1; y) return(max (max1,max2) ; min (min1,min2)) Legyen T (n) a maxmin(x; y) rutin által tett összehasonlítások száma, ha n = y x + 1. Tegyük fel, hogy n = 2k valamilyen a 2 egész hatványa. T (n) = 1, ha n = 2. Legyen most n > 2! A részproblémák méretei: 1. b(x + y) =2c x + 1 = b(n + 2x 1) =2c x + 1 = (n=2 + x 1) x + 1 = n=2, 2. y b(x + y) =2c = y (n=2 + x 1) = n n=2 = n=2. A részproblémák költségei: 2 T (n=2) + 2 összehasonlítás. Tehát fennáll a következ½o összefüggés: 1; ha n = 2 T (n) = 2T (n=2) + 2; ha n > 2: A rekurzió pontos megoldása a következ½oképpen kapható meg: n 2 = 2 2T n = 4T 4 .. .
T (n) = 2T
+2 n +2 +2 4 +4+2
X n 2j =2T i + 2 j=1 i
i
log n 1
= 2log n 1 T (2) +
X
2j
j=1
n = + 2log n 2 = 1:5n 2:
2
Tehát ez a megoldás csak 75%-át használja el az el½oz½o algoritmus idejének. 96
ALGORITMUSOK ANALíZISE
A k-adik legnagyobb elem kiválasztása A k-adik legnagyobb elemet keressük n elem½u rendezetlen A [1 : n] tömbben. Kézenfekv½o megoldás, ha a tömböt O (n log n) költséggel növeked½oen átrendezzük a B [1 : n] tömbbe, ahol B (n k + 1) lesz az A tömb k-adik legnagyobb eleme. Látni fogjuk, hogy a k-adik legnagyobb elem lényegesen kisebb költséggel megkapható. Blum, Floyd, Tarjan, Pratt és Rivest megmutatták, hogy O (n) összehasonlítás kell a feladat megoldásához. A következ½o egyszer½usít½o feltevéseket tesszük: minden elem különböz½o és n = 2k . Vizsgáljuk el½oször a k = 2 esetet, azaz keressük a tömb második legnagyobb elemét! Ennek egy lehetséges megoldása a következ½o: (1) párosítsuk az elemeket és az elempárokból válasszuk ki a nagyobbik elemeket (a gy½ozteseket). Ez n=2 összehasonlítás költség½u. (2) Az n=2 gy½oztest ismét párosítsuk, majd ismét válasszuk ki a gy½ozteseket. Ez n=4 összehasonlítás. (3) Folytassuk így tovább, amíg a gy½oztest (a legnagyobb elemet) megkapjuk. Az eljárás k = dlog ne lépése összesen n2 + n4 + + 2nk = n 1 összehasonlítást igényel. A második legnagyobb elem csak olyan lehet, amelyik a legnagyobb elem ellen vesztett. Ilyen legfeljebb dlog ne darab van. Ezek közül dlog ne 1 mérk½ozéssel választhatjuk ki a legnagyobbat. Tehát a második legnagyobb elemet n + dlog ne 2 összehasonlítással kaphatjuk meg, ami sokkal jobb mint O (n log n), ha n elég nagy. Vizsgáljuk most az általános k esetet, azaz keressük a tömb k-adik (legnagyobb) elemét! Legyen T (n) az n elem½u A tömbben a k-adik elem meghatározásának maximális költsége (összehasonlítások száma). Legyen továbbá x az A tömb egy tetsz½oleges eleme. Hasonlítsuk össze x-et a többi elemmel (n 1 összehasonlítás) és az elemeket soroljuk a következ½o két halmazba: S1 = fA [i] j A [i] < xg ;
S2 = fA [i] j A [i] > xg :
(7.10)
Ha x a t-edik elem volt, akkor jS1 j = t 1, jS2 j = n t. A következ½o esetek lehetségesek: 1. Ha t = k, akkor készen vagyunk. 2. Ha k > t, akkor S2 -ben folytatjuk az összehasonlításokat (költség: T (n t)). 3. Ha k < t, akkor S1 -ben folytatjuk az összehasonlításokat (költség: T (t 1)). Az összes költségre fennáll, hogy T (n) Ha t
1, vagy t
n
1 + max fT (t
t)g :
n, akkor ez nem túl jó korlát mert T (n) = n
Elvileg a t
1) ; T (n
1 + T (n
1) =
n2 :
n=2 lenne a jó választás, mert ekkor T (n) = n
Az x "½orszem" ügyes megválasztásával az
1 + T (n=2) = O (n) : (n2 ) korlát jelent½osen javítható a következ½oképpen:
KERESÉSI, RENDEZÉSI ÉS KIVÁLASZTÁSI FELADATOK
97
(i) Osszuk be az elemeket 5 elem½u csoportokba: n=5 csoport. (ii) Kiválasztjuk a csoportok mediánsait. (iii) Kiválasztjuk (az eljárás rekurzív hívásával) a mediánsok mediánsát (T (n=5) összehasonlítás). Ez lesz az x ”½orszem”! Vizsgáljuk most az ½orszem választással módosított eljárás költségét! Összesen n=5 (tkp.dn=5e) csoportot képezünk. Csoportonként legfeljebb c (c 6) összehasonlítás kell a mediáns (középs½o legnagyobb elem) kiválasztásához. A c = 6 érték igazolása megtalálható például a Knuth könyv III. kötetében (5.3.3.fejezet 9. Feladat). Az ½orszem kiválasztásának költsége tehát: c (n=5) összehasonlítás. Most becslést adunk az x ½orszemnél kisebb, illetve nagyobb elemek számára. Az x-nél kisebb minden olyan 5-ös csoport alsó 3 eleme, amelyiknek a csoport mediánsa x-nél kisebb (n=10 csoport) plusz 2 elem a saját csoportjában. Ezek száma: 3 (n=10) + 2 > 3n=10. Ebb½ol következik, hogy az x-nél nagyobb elemek száma kisebb mint n (3n=10) = 7n=10. Az x-nél nagyobb elemek száma (el½oz½ohöz hasonló okfejtéssel) legalább 3n=10 + 2 > 3n=10, amib½ol azonnal következik, hogy az x-nél kisebb elemek száma kisebb mint 7n=10. A fenti x választással fennáll, hogy T (t 1) ; T (n t) T (7n=10). Ehhez még hozzájön a mediánsok és az x ½orszem keresés költsége. Kapjuk tehát a T (n)
c
n n +T +n+T 5 5
7n 10
egyenl½otlenséget. Megmutatjuk, hogy T (n)
(7.11)
n = O (n) ;
ahol egy a c-t½ol függ½o konstans ( 10 + 2c). Az n 5 esetben ez nyilvánvalóan teljesül. Tegyük fel, hogy n < N -re az állítás igaz. Az indukciós feltevés alapján: T (n)
n n 7n + +n+ 5 5 10 2c + 2 + 10 + 7 (10 + 2c) + 9 = n= n 10 10 n: c
Igazoltuk tehát, hogy az ½orszemválasztással módosított keres½o elem költsége O (n) összehasonlítás. A c = 6 költség½u mediáns keresés esetén = 22. Ha sorbarendezzük az 5 elemet, például a minimum kiválasztásos rendezéssel, akkor c = 10 és = 30. Az eredményben az is meglep½o, hogy nem függ k-tól. Pontosabb elemzéssel Blum, Floyd, Pratt, Tarjan és Rivest megmutatták, hogy T (n) < 5:73n. Igazolták továbbá, hogy a k-adik elem meghatározásához legalább n + min fk; n
k + 1g + dlog2 (n)e
4
(7.12)
összehasonlítás kell (2 k n 1). A mediáns (az dn=2e-edik legnagyobb elem) esetében ezt a becslést Bent és John 2n-re javították. 98
ALGORITMUSOK ANALíZISE
Az algoritmus hasonlít a gyorsrendezéshez. Az eredeti algoritmust, amelyben a mediáns meghatározása még nem szerepel, Hoare publikálta 1970-ben. Ennek átlagos m½uveletigénye legfeljebb 3:4n összehasonlítás n hosszúságú véletlen inputot feltételezve. Feladat: Mi a számítási költsége a következ½o algoritmusnak, amely szintén a k-adik legnagyobb elemet határozza meg? FindKthLargest(list,N ,K) list the values to look through N the size of the list K the element to select for i = 1 to K do largest = list[1] largestLocation = 1 for j = 2 to N (i 1) do if list[j] > largest then largest = list[j] largestLocation = j end if end for Swap( list[N (i 1)], list[largestLocation] ) end for return largest Hasonlítsuk ösze az eredményt a Blum, Floyd, Pratt, Tarjan és Rivest eredményével!
7.3. Aritmetikai algoritmusok Alapvet½o aritmetikai m½uveletek bonyolultságával foglalkozunk. Ide tartoznak a következ½o m½uveletek: - összeadás, - szorzás, - osztás, - gyökvonás, - aritmetikai kifejezések kiértékelése, - számelméleti algoritmusok (legnagyobb közös osztó, faktorizáció, prímtesztek, stb.), - különböz½o számrendszerekben adott számok konverziói. Az aritmetikai m½uveleteket számítógép aritmetikákban hajtjuk végre. Ezek közül a legfontosabbak: - egész aritmetika - lebeg½opontos aritmetika - moduláris aritmetika. ARITMETIKAI ALGORITMUSOK
99
Legyen a számrendszer alapja
> 1. Az
A = an
1
n 1
+
+ a1 + a0 > 0
egész számot az n hosszúság és a 0 ai 1 számjegyek jellemzik. Id½onként feltesszük, hogy an 1 6= 0. Ha a ”szó”alap rögzített, akkor csak az n hosszúság és az fai gni=01 számjegyek tárolása szükséges. Feltesszük, hogy A = 0 (zérus) esetén n = 0. További jelölések: r := a mod b egész osztási maradék (0 r < b) q := a div b egész osztási hányados (0 a qb < b) Az egész számok és polinomok m½uveletei között szoros kapcsolat van. Legyen A = a0 + a1 +
+ am
1
+ bn
1
m 1
;
és B = b0 + b1 +
n 1
két egész szám. Az A és B számokhoz rendelt polinomok pedig legyenek p (x) = a0 + a1 x +
+ am 1 xm
q (x) = b0 + b1 x +
+ bn 1 x n 1 :
1
és Ekkor fennáll, hogy A
B = p( )
q( );
AB = p ( ) q ( ) ; és A=B = p ( ) =q ( ) :
7.3.1. Szorzás Két szorzási eljárást vizsgálunk. Az irodalomban azonban lényegesen több van. A naív szorzási eljárás Az eljárás m és n hosszúságú egész számok esetén Algoritmus AlapSzorzás P 1 Pn 1 i Input: A = m a , B = i i=0 i=0 bj P 1 k Output: C = AB := m+n c k k=0 C A b0 for j from 1 to n 1 do C C + j (A bj ) Return C A f½o m½uvelet a 6. sorban van: A bj . A a C változóban. 100
(mn) ”szó”m½uveletet igényel.
i
j
szorzás ezt tolja el j ”szóval”, majd akkumulálódik
ALGORITMUSOK ANALíZISE
A Karacuba-Ofman algoritmus Az eljárást 1962-ben közölték. Legyen n0 2 az küszöb, amely alatt az n < n0 szó hosszúságú számokra a naív algoritmust használjuk. A Karacuba-O¤man algoritmus az un. kivonásos változata a következ½o: Algoritmus KaracubaSzorzás. P P Input: A = ni=01 ai iP , B = ni=01 bj i 1 k Output: C = AB := 2n k=0 ck if n < n0 then return AlapSzorzás(A; B) k dn=2e (A0 ; B0 ) := (A; B) mod k , (A1 ; B1 ) := (A; B) div sA sign(A0 A1 ), sB sign(B0 B1 ) C0 KaracubaSzorzás(A0 ; B0 ) C1 KaracubaSzorzás(A1 ; B1 ) C2 KaracubaSzorzás(jA0 A1 j ; jB0 B1 j) return C := C0 + (C0 + C1 sA sB C2 ) k + C1 2k :
k
Az eljárás additív változata az A0 + A1 és B0 + B1 értékeket használja jA0 A1 j és jB0 B1 j értékek helyett. Tétel: A KaracubaSzorzás algoritmus az AB szorzatot T (n) = O (n ) ”szó”szorzással számítja ki, ahol = log 3 1:585. Bizonyítás: A = A1 k + A0 , B = B1 k + B0 és AB = A1 B1 Az sA jA0
A1 , sB jB0
A1 j = A0
sA sB jA0
2k
+ (A0 B1 + A1 B0 )
B1 j = B0 A1 j jB0
k
+ A0 B0 :
B1 és
B1 j = (A0
A1 ) (B0
B1 )
összefüggések miatt C = A0 B0 + (A0 B1 + A1 B0 )
k
+ A1 B1
2k
Az A0 és B0 legfeljebb dn=2e ”szó” hosszúságúak, jA0 A1 j, jB0 hosszúságúak. A ”szó” szorzások T (n) számára fennáll, hogy n2 ; ha n < n0 2T (dn=2e) + T (bn=2c) ;
T (n) = Tegyük fel, hogy 2l 1 n0
n
T (n)
2l n0 , valamilyen l 3T 2l 1 n0 2log 3
log n
ha n
1 értékre (l
32 T 2l 2 n0
= AB: B1 j, A1 és B1 bn=2c ”szó”
n0 :
log n). Ekkor n=2
2l 1 n0 és
3l T (n0 )
T (n0 ) = nlog 3 T (n0 ) :
A fenti séma kb. 4n additív ( ) m½uveletet használ. Ez levihet½o kb. (7=2) n additív m½uveletre. Az elért O (n1:585 ) javítás jelent½os, de nem éri el az elvileg lehetséges javítás mérékét. ARITMETIKAI ALGORITMUSOK
101
A Toom-Cook szorzás (Toom 1963, Cook 1966) a Karacuba-Ofman algoritmus olyan általánosítása amelyben az n ”szó” hosszúságú A és B számokat r (r 2) részre bontjuk fel az A=p k A = A0 + A1 k + A2 2k + + Ar 1 (r 1)k és B = B0 + B1
k
+ B2
2k
+
+ Br
1
(r 1)k
b=q
k
alakban, ahol k = dn=re. A szorzat alakja ekkor C = AB = C0 + C1 Vegyük észre, hogy C a
k
mennyiség 2r
k
+
+ C2r
2
(2r 2)k
:
2-ed fokú polinomja, azaz C = c
c (x) = p (x) q (x) = C0 + C1 x +
k
, ahol
+ C2r 2 x2r 2 :
Egy ilyen polinomot (az együtthatóit) 2r 1 különböz½o helyen felvett értékéb½ol (interpolációval) rekonstruálhatunk. Tehát a Toom-Cook szorzás az n ”szó”hosszúságú számok szorzását 2r 1 darab dn=re ”szó”hosszúságú szorzatra vezeti vissza. 1) 1) Az eljárás aszimptotikus bonyolultsága O n , ahol = log(2r . Minthogy log(2r !1 log r log r (r ! 1), ez azt jelenti, hogy elvileg akár az O (n) költség is elérhet½o. Az eljárás hatékonysága néhány a gyakorlatban is vizsgált r értékre: r 3 4 5 6 7
1.465 1.404 1.365 1.338 1.318
A Toom-Cook eljárás részletes elemzése megtalálható Knuth könyvében. Megjegyzések Más elven m½uköd½o szorzási eljárások is vannak: moduláris és FFT alapú szorzások. Az utóbbiak legjobb változatának (Schönhage-Strassen algoritmus) aszimptotikus bonyolultsága O (n log n log log n). Gyors szorzó eljárásokat sok helyen használnak (pl. a kódolásban). Ezek egy részét áramkörben is megvalósították. A szorzáshoz szükséges m½uveletszámra Winograd adott alsó becslést er½os megkötések esetén. Kiegyensúlyozatlan szorzásról beszélünk, ha A m, B n jegy½u és mondjuk m > n. A szorzás elvégzésére többféle technika létezik. Például "párnázás" (a rövidebb szám kiegészítése zérusokkal), vagy az m hosszúságú számot dm=ne darab n hosszúságú részre bontjuk. Ha az n ”szó” hosszúságú számok szorzása T (n) m½uvelet, akkor a két szám szorzását ílymódon dm=ne T (n) + O (m + n) m½uvelettel végezhetjük el. 102
ALGORITMUSOK ANALíZISE
7.3.2. Osztás Legyen = 2, A és B két legfeljebb n hosszúságú nemnegatív egész szám, B = b0 + b1 2 + + bl 1 l 1 > 2 és bl 1 > 0 (B normalizált). A feladat: q és r meghatározása úgy, hogy A = qB + r, ahol 0 r < B. Tkp. q = bA=Bc, r = A mod B = A qB. A maradékos egész osztás feladatának megoldására több algoritmus is létezik: - naív, - Svoboda, - oszd meg és uralkodj, - Newton, - kombinált módszerek, stb. A Newton-eljáráson alapuló algoritmus Anderson, Earle, Goldschmidt, Powers és Cook ötletén alapul. Alapja a következ½o észrevétel: A=B = A (1=B) : Ha A és B legfeljebb n bit hosszúságú egész szám, akkor elég az 1=B számot n bit értékes jegyre (közelít½oleg) meghatározni (legyen ez ) és az A alkalmas korrekciójával a q := A div B hányadost meghatározni. A B szám n bit értékes jegy hosszúságú reciprokát a Newtonmódszerrel határozzuk meg. A Newton (tkp. Newton-Raphson) módszer az f (x) = 0 (f : R ! R) alakú egyenleteket oldja meg numerikusan. Adott x0 2 R pontból kiindulva alakja a következ½o: f (xj ) =f 0 (xj ) ;
xj+1 = xj
j = 0; 1; 2; : : : .
(7.13)
Ha gyök (azaz f ( ) = 0), jx0 j eléggé kicsi, f (x) eléggé síma és f 0 ( ) 6= 0, akkor egy alkalmas K > 0 konstanssal teljesül, hogy jxj+1
j
K jxj
j2 :
Ez másodrend½u konvergenciát jelent, ami a konvergencia fázisban az értékes jegyek iterációnkénti megkett½oz½odését jelenti. Pl. duplapontosságú lebeg½opontos aritmetikában, ha a közelítés els½o 2 tizedesjegyre beállt, akkor legfeljebb 3 iterációban eléri az elvileg elérhet½o legnagyobb pontosságot. Adott B 6= 0 szám reciproka az f (x) = B 1=x = 0 egyenlet megoldása. Ekkor f 0 (x) = 1=x2 és a Newton iteráció alakja: 1 xj
B xj+1 = xj Algoritmus NewtonDiv. 1 set x0 = 2 m ( 2B <2 m for i = 1 : dlog ne ARITMETIKAI ALGORITMUSOK
1 x2j
= 2xj
Bx2j :
(7.14)
1 ) B
103
xi+1 = 2xi
Bx2i
end set q = Axdlog ne or q = Axdlog ne set r = A qB Igazoljuk a következ½o tulajdonságokat: 1 2B Az x0 -ra teljesül, hogy
Másrészt tetsz½oleges i
x0
x1
1 ; B
xi
(7.15)
1 1 x0 : 2B B 0 indexre tegyük fel, hogy teljesül az állítás. Ekkor Bx2i = xi (2
xi+1 = 2xi
B
1 B
2xi + Bx2i
+
Bxi )
xi 2
= xi ;
illetve
=
1 B
Bx2i =
xi+1 = 2xi
2
1 B
B xi
Az állításból következik, hogy Bxi 1, azaz 1 Igazoljuk a következ½o tulajdonságot is: 1 1 Az i = 0 esetben 2B < x0 , amib½ol 1 indexre fennáll az állitás. Ekkor
1 A k = dlog ne
Bxi+1 = 1
1 B
1 : B
Bxi
0.
+
2Bxi +
1 : 22i
Bxi <
1 2
Bx0 < 1
B 2 x2i
1 B
=
= (1
(7.16) 1 2
következik. Tegyük fel, hogy az i 1 22i
2
Bxi ) <
2
=
1 22i+1
0
:
log n választással teljesül, hogy 0
1
1 : 2n
1 22k
Bxk <
Felhasználjuk azt az észrevételt, hogy A; B < 2n . A fenti egyenl½otlenségb½ol adódik, hogy: 0
1 B
1 xk < B2n
és 0 104
A B
0
Axk <
1 B
xk B
<
1 2n
1 A < : n B2 B ALGORITMUSOK ANALíZISE
Minthogy A=B = q + r=B, írhatjuk, hogy 0
q+
r B
Axk <
1 ; B
ahonnan átrendezéssel q
1 B
q+
r
1 B
< Axk
q+
r B
q+
B
1 B
adódik: Axk q-1
q q-1/B
q+1
q+(B-1)/B
Tehát q = dAxk e vagy q = bAxk c. Az algoritmus iterációnként legfeljebb 2 szorzást és 1 összeadást igényel. Az iterációk száma log n. Így összköltsége 2T (n) log n, ahol T (n) az n bites egész számok szorzásának idejét jelöli. Megmutatható azonban, hogy az i-edik iterációban elég csak 2i értékes jegyre dolgozni. Igaz továbbá, hogy T (l) + T (j) T (l + j) (Igazolás: párnázással). Ezért a szorzási összköltség: T (1) + T (2) +
+ T 2k
T 1 + 2 + 22 + = T 2k+1
1
+ 2k T (4n) :
Ez lényegében azt jelenti, hogy a maradékos osztás (hányados és maradék meghatározása) aszimptotikus bonyolultsága azonos az alkalmazott szorzás aszimptotikus bonyolultságával. Ha például a szorzásokat a Karacuba-Ofman algoritmussal végeznénk, akkor O nlog 3 lenne a számítási költség. Ha a szorzásokat az FFT szorzással végeznénk, akkor O (n log n log log n) az eredmény. Példa: Osszuk el 12345-öt 7-tel!. Ekkor n = 5, log n 2:332 és 1=14 < 1=8 1=7. Tehát k = 3 és x0 = 1=8. Az els½o három Newton iterált (10 tizedesjegy pontossággal): i xi 0 0:125 1 0:140625 2 0:1428222656 3 0:1428571428 Az 1=7 10 jegy pontosságú inverze: 0:1428571428. Láthatjuk az értékes jegyek kett½oz½odését az iterációk során. Mármost b12345 0:1428571428c = 1763 és 12345 1763 7 = 4. Tehát q = 1763 és r = 4. ARITMETIKAI ALGORITMUSOK
105
A Newton eljárásnak több változata is ismert. Ha a számrendszer alapja > 2, akkor a fenti eljárás értelemszer½u módosításokkal ugyanúgy m½uködik. Számos kombinált (és esetenként hardverben is realizált) osztási algoritmus is van. Pl. Burnikel és Ziegler (1998) olyan rekurzív eljárást adott meg, amelynek futás ideje 2K (n) + O (n log n), ha 2n jegy½u egész számot n jegy½u egész számmal osztunk. A K (n) függvény a Karacuba-Ofman algoritmus futásideje n jegy½u számok esetén. Ha nem kell a maradék, akkor a futásid½o 23 K (n) + O (n log n).
7.4. Mátrixalgoritmusok A mátrixalgoritmusok alapvet½o szerepet játszanak egy sor területen. Az alapvet½o jellegzetesség½uk a nagyméret½u mátrixok tárhely igénye, illetve az aritmetikai m½uveletigényük. Az alapvet½o mátrix m½uveletek közül legnagyobb költsége a mátrixok szorzásának van. A bonyolultságelmélet egyik meglep½o eredménye, hogy mátrixok invertálása és egyenletrendszerek megoldásának m½uveletigénye azonos a mátrixok szorzásának m½uveletigényével.
7.4.1. Mátrixok és vektorok szorzása Legyen F = R vagy F = C. Az m
n típusú valós vagy komplex elem½u mátrixokat az
2
a11 a12 : : : a1j : : : a1n .. .. .. 6 .. . . . 6 . 6 A = 6 ai1 ai2 : : : aij : : : ain 6 . .. .. .. 4 .. . . . am1 am2 : : : amj : : : amn
3
7 7 7 m;n 7 = [aij ]i;j=1 7 5
(aij 2 F)
alakban adjuk meg (jelölés: A 2 Fm n ). aij az A mátrix i-edik sorában és j-edik oszlopában álló mátrixelemet jelöli. Az n-dimenziós oszlopvektorokat 2
6 6 x=6 4
x1 x2 .. . xn
3
7 7 7 2 Fn (xi 2 F) ; 5
az n-dimenziós sorvektorokat pedig x = [x1 ; x2 ; : : : ; xn ] 106
(xi 2 F) ALGORITMUSOK ANALíZISE
n alakban adjuk meg. A 2 Fm n transzponáltja AT 2 Fn m , ahol AT = [aji ]m;n i;j=1 . Két x; y 2 F vektor valós skalárszorzatán (dot szorzat) az 2 3 y1 n 6 y2 7 X 6 7 T x y = [x1 ; x2 ; : : : ; xn ] 6 .. 7 = x1 y1 + x2 y2 + + xn yn = xi yi 4 . 5 i=1 yn
mennyiséget értjük. A hagyományos kiszámítási algoritmus a következ½o: function: z = dot (x; y) z = x(1) y(1) for i = 2 : n z = z + x (i) y (i) end
A valós skalárszorzat kiszámításának költsége a fenti, hagyományos algoritmussal: n szorzás és n 1 összeadás: Két m k és k n méret½u A 2 Fm k , B 2 Fk n mátrix szorzatát a C = AB 2 F
m n
, cij =
k X
ait btj
(i = 1; : : : ; m; j = 1; : : : ; n)
t=1
el½oírás de…niálja. A C szorzatmátrix m n típusú, amelynek (i; j) index½u elemét úgy kapjuk, hogy az i-edik sort szorozzuk a j-edik oszloppal, azaz 2 3 b1j 6 7 cij = [ai1 ; : : : ; aik ] 4 ... 5 : bkj
Ez két vektor dot (valós skalár) szorzata: az A i-edik sor- és a B j-edik oszlopvektoráé. A de…níció alapján az A 2 Fm k , B 2 Fk n mátrixok szorzásának algoritmusa: for i = 1 to m do for j = 1 to n do cij = ai1 b1j for k = 2 to k cij = cij + aik end for k end for j end for i
bkj
Az algoritmus költsége: mnk szorzás és mn (k
1) összeadás.
Ha m = n = k, akkor ez n3 szorzást és n3 n2 összeadást jelent. Tehát az algoritmus polinomiális idej½u, de nagy n-ekre ez jelent½os számítási id½ot jelent és a csökkentése szükséges. A továbbiakban f½oként négyzetes mátrixok szorzásával foglalkozunk. MÁTRIXALGORITMUSOK
107
7.4.2. Winograd mátrix szorzó algoritmusa A mátrix szorzások m½uveletszámának csökkentésében az els½o jelent½os lépést Winograd tette (1967, 1968), aki észrevette, hogy vektorok skaláris szorzásánál a szorzások felét ki lehet cserélni additív m½uveletekre. Legyen x; y 2 Fk és k páros szám. Ekkor igaz, hogy T
x y=
k=2 X
(x2`
1
+ y2` ) (x2` + y2` 1 )
`=1
k=2 X
x2` 1 x2`
`=1
k=2 X
y2` 1 y2` :
(7.17)
`=1
A formula alapján két k-dimenziós vektor valós skalár szorzata (3=2) k szorzási és 2k 2 additív m½uveletet igényel. Vegyük azonban észre, hogy a második összeg csak x-t½ol, a harmadik összeg pedig csak y-tól függ. Ha a (7.17) azonosságot az A 2 Fm k , B 2 Fk n (k páros szám) mátrixok C = AB szorzatára alkalmazzuk, akkor cij =
k=2 X `=1
(ai;2`
1
+ b2`;j ) (ai;2` + b2`
1;j )
k=2 X
ai;2` 1 ai;2`
`=1
k=2 X
b2`
1;j y2`;j :
(7.18)
`=1
Itt a második összeg csak az i indext½ol függ (j-t½ol nem), ezért az összes oszlop kiszámításában újra felhasználható ugyanabban a sorban. Hasonlóképpen, a harmadik összeg nem függ i-t½ol (csak j-t½ol) és az összes sor kiszámításában ismételten újra felhasználható. Az A 2 Fm k , B 2 Fk n mátrix Winograd féle szorzási algoritmusa a következ½o: d = k=2 // calculate rowFactors for A for i = 1 to m do rowFactor[i] = ai1 ai2 for j = 2 to d do rowFactor[i] = rowFactor[i] +ai;2j 1 ai;2j end for j end for i // calculate columnFactors for B for i = 1 to n do columnFactor[i] = b1i b2i for j = 2 to d do columnFactor[i] = columnFactor[i] +b2j 1;i b2j;i end for j end for i // calculate C for i = 1 to m do for j = 1 to n do cij = -rowFactor[i] - columnFactor[j] for ` = 1 to d do cij = cij + (ai;2` 1 + b2`;j ) (ai;2` + b2` 1;j ) 108
ALGORITMUSOK ANALíZISE
end for ` end for j end for i Vizsgáljuk meg az eljárás m½uveletigényét feltételezve, hogy k páros szám: A el½okészítése B el½okészítése C számítása Összesen
Szorzások száma md nd mnd (mn + m + n) k2
Összeadások száma m (d 1) n (d 1) mn (3d + 1) (3mn + m + n) k2 + mn m
n
Két n-ed rend½u négyzetes mátrix szorzásának m½uveletigénye Winograd módszerével (1=2) n3 +n2 szorzás és (3=2) n3 + O (n2 ) additív m½uvelet. Ez 50%-os csökkenés a multiplikatív m½uveletekben és 50%-os növekedés az additív m½uveletekben. Ha olyan környezetben implementáljuk az algoritmust, ahol az additív és multiplikatív m½uveletek ideje azonos, akkor az algoritmus nem jelent igazi javulást a hagyományos algoritmushoz képest. Winograd formulája az a1 b1 + a2 b2 = (a1 + b2 ) (a2 + b1 )
a1 a2
b1 b2
azonosságon alapul. Harter (1972) megmutatta, hogy ilyen fajta felbontáson alapuló további javítási lehet½oség nincs. Feladat: Hogyan módosul a fenti algoritmus, ha k páratlan? Mi lesz ekkor a m½uveletigény?
7.4.3. Strassen mátrix szorzó algoritmusa Strassen algoritmusa 1969-b½ol származik és nagyságrendileg is jelent½osen csökkentette a mátrix szorzások O (n3 ) m½uveletigényét. Eljárása 2 2-es méret½u mátrixok ügyes szorzásán és az oszd meg és uralkodj elven alapul. Szükség van a 2 2 blokk (particionált) mátrixok fogalmára, amely a mátrix 4 részmátrixra bontását (partícióját) jelenti az A=
A11 A12 A21 A22
2 Fm
n
formában, ahol Aij 2 Fmi nj (i = 1; 2, j = 1; 2). Az azonos sorban álló blokkok sorainak száma azonos. Hasonlóképpen, az azonos oszlopban álló blokkok oszlopainak száma azonos. Azonosan particionált mátrixok összegzését és skalárral való szorzását blokkonként úgy végezhetjük, mintha a blokkok számok lennének. Particionált mátrixok blokkonkénti szorzásánál az els½o mátrix oszlopok szerinti particionálása meg kell, hogy egyezzen a második tényez½o sorok szerinti particionálásával. Ezért az A= MÁTRIXALGORITMUSOK
A11 A12 A21 A22
2 Fm
n
;
B=
B11 B12 B21 B22
2 Fn
p
109
particionált mátrixok blokkonkénti szorzása akkor lehetséges, ha A11 2 Fr Ekkor C=
A11 A12 A21 A22
B11 B12 B21 B22
a11 a12 a21 a22
és B11 2 Fs
A11 B11 + A12 B21 A11 B12 + A12 B22 A21 B11 + A22 B21 A21 B12 + A22 B22
=
Ha az eredeti de…níció alapján számoljuk a 2 A=
s
;
.
:
2-es B=
b11 b12 b21 b22
mátrixok C=
c11 c12 c21 c22
= AB
szorzatát, akkor ez 8 szorzást és 4 összeadást igényel. Strassen észrevette, hogy a két 2 2-es mátrix szorzása elvégezhet½o a következ½oképpen: m1 m2 m3 m4 m5 m6 m7
= (a12 a22 ) (b21 + b22 ) ; = (a11 + a22 ) (b11 + b22 ) ; = (a11 a21 ) (b11 + b12 ) ; = (a11 + a12 ) b22 ; = a11 (b12 b22 ) ; = a22 (b21 b11 ) ; = (a21 + a22 ) b11 ;
c11 c12 c21 c22
= m1 + m2 m4 + m6 ; = m4 + m5 ; = m6 + m7 ; = m2 m3 + m5 m7 :
(7.19)
Ez mindösszesen 7 szorzást és 18 összeadást igényel. Vegyük észre, hogy a szorzások számának csökkenésével egyidej½uleg jelent½osen megn½o az additív m½uveletek száma. Nagyméret½u mátrixok Strassen-féle szorzása a következ½o észrevételen alapul: Legyen n = 2k és A; B 2 Fn n és particionáljuk az A és B mátrixokat úgy, hogy A=
A11 A12 A21 A22
;
B=
B11 B12 B21 B22
n
Aij ; Bij 2 F 2
n 2
:
Strassen (7.19) képletét alkalmazva a 2 2-es blokkmátrixok szorzatát felírhatjuk a következ½o alakban: M1 = (A12 A22 ) (B21 + B22 ) ; C11 = M1 + M2 M4 + M6 ; M2 = (A11 + A22 ) (B11 + B22 ) ; C12 = M4 + M5 ; M3 = (A11 A21 ) (B11 + B12 ) ; C21 = M6 + M7 ; M4 = (A11 + A12 ) B22 ; C22 = M2 M3 + M5 M7 : (7.20) M5 = A11 (B12 B22 ) ; M6 = A22 (B21 B11 ) ; M7 = (A21 + A22 ) B11 ; n n típusú mátrix összeszorzása és 18 darab n2 típusú mátrix A szorzáshoz 7 darab n2 2 2 n n összeadása kell. A kisebb 2 2 típusú mátrixok szorzását 2 2-es particionálással visszavezethetjük n4 n4 típusú mátrixok szorzására és az eljárást folytatva végül 2 2 típusú mátrixok szorzatára, amelyet ugyancsak Strassen módszerével végzünk el.
110
ALGORITMUSOK ANALíZISE
Ha TA (n) és TM (n) jelöli az additív és a multiplikatív m½uveletek teljes számát a most vázolt rekurzív algoritmusban, akkor fennáll, hogy TM (n) = 7TM
n ; 2
ahol TM (2) = 7. Innen kapjuk, hogy TM (n) = 7k = nlog2 7
n2:808 :
(7.21)
n típusú mátrix Az additív m½uveletek meghatározásához vegyük észre, hogy a 18 darab n2 2 összeadásán túlmen½oen az n2 n2 típusú mátrixok szorzásai is tartalmaznak additív m½uveleteket. Tehát n n 2 TA (n) = 7TA + 18 ; (7.22) 2 2 ahol TA (2) = 18. Ennek megoldása a (7.9) táblázat alapján TA (n) = nlog2 7 . A rekurzió pontos megoldása zárt alakban TA (n) = 6 7k 4k ;
ahonnan kapjuk, hogy TA (n)
6
7k = 6nlog2 7 < 6n2:808 :
Ha feltesszük, hogy a multiplikatív m½uveletek ideje legfeljebb c-szerese az additívakénak (c 1), akkor Strassen-féle szorzás összes költsége akkor sem több mint (6 + c2:808 ) n2:808 = 2:808 O (n ) m½uvelet. Az additív m½uveletek száma kismértékben csökkenthet½o Winograd 2 2 mátrixszorzási eljárásával: S1 = a21 + a22 ; S5 = b12 b11 ; P1 = S 2 S 6 ; P5 = S 1 S 5 ; S 9 = P2 + P3 ; S13 = S12 + P6 ;
S2 = S1 a11 ; S6 = b22 S5 ; P2 = a11 b11 ; P6 = S4 b22 ; S10 = P1 + P2 ; S14 = S11 P7 ; C=
S3 = a11 a21 ; S7 = b22 b12 ; P3 = a12 b21 ; P7 = a22 S8 ; S11 = S10 + P4 ; S15 = S11 + P5 :
S9 S13 S14 S15
S4 = a12 S2 ; S8 = S6 b21 ; P4 = S3 S7 ; S12 = S10 + P5 ;
:
Ez az eljárás 7 szorzást és 15 összeadást igényel. Feladat: Igazoljuk, hogy a (7.22) rekurzió pontos megoldása tényleg TA (n) = 6 7k n = 2k !
4k , ha
7.4.4. Megjegyzések a gyors mátrix szorzásokról 1. A gyors mátrix szorzó eljárások numerikus stabilitása és rekurzív jellege miatt az alkalmazhatósága vitatott. Számos munka jelzi azonban, hogy a Strassen algoritmus numerikusan MÁTRIXALGORITMUSOK
111
stabil és jól használható párhuzamos környezetben is. A Strassen eljárásnak van nem rekurzív változata is. 2. A Strassen és Winograd eljárások 2 2-es mátrixok 7 szorzást igényl½o un. nem kommutatív szorzási algoritmusain alapulnak. Nem kommutatívnak nevezünk egy szorzási algoritmust, ha az mátrixokra is alkalmazható a mátrixok felcserélhet½oségének feltevése nélkül. Az O nlog 7 korlát javítható lenne, ha 7-nél kevesebb szorzás is elég lenne 2 2-es mátrixok szorzására. Winograd 1971-ben igazolta azonban, hogy legalább 7 szorzás kell. Igy Strassen és Winograd eljárása a fenti sémában gondolkodva már nem javítható. 3. A szorzás Toom-Cook algoritmusához hasonlóan itt is felmerülhet, hogy 2 2-es mátrixok helyett r r mátrixokat (r 3) veszünk. Ha ezekre létezne egy olyan nem kommutatív szorzási algoritmus, amelynek szorzásokban kifejezett költsége cr < r3 , akkor n = rt rend½u mátrixokat r r blokkra felbontva és rekurzív hívást használva, javítást érhetnénk el a Strassen, ill. Winograd fenti algoritmusaihoz képest. Ekkor T (n)
cr T (n=r)
ctr T (1) ;
azaz T (n) = O n(log cr )= log r . Ez akkor lehet jobb mint Strassen, vagy Winograd fenti algoritmusa, ha (log cr ) = log r < log 7. Ha r = 3, akkor 2(log 3)(log 7) 21:85 miatt 21, vagy annál kevesebb szorzás kellene. Az ismert legjobb nem kommutatív algoritmus 3 3-as mátrixok szorzásása 23 szorzást igényel (Laderman, 1976). Tehát ezen a módon nem sikerült javítani a fenti két algoritmust. 4. Óriási verseny alakult ki az O nlog 7 (log 7 2:808) korlát javítására bonyolult technikákat (bilineáris, trilineáris alakok, csoportelméleti módszerek) használva. Az ismert legjobb elméleti eredmény Coppersmith és Winograd 1987-es eredménye: O (n2:376 ). Az eljárás a gyakorlatban nem használható. 5. Kérdés, hogy mi lehet a legjobb eredmény? A szorzások minimálisan szükséges számára több (n2 ) nagyságrend½u alsó korlát ismert a számítási modellt½ol függ½o konstansokkal. Egy n2 -es alsó korlát egyszer½uen megmutatható. Legyen 2
6 6 A=6 4
p1 0 : : : p2 0 : : : .. .
0 0 .. .
pn 0 : : : 0
3
7 7 7; 5
2
6 6 B=6 4
3 q1 q2 : : : qn 0 0 ::: 0 7 7 .. .. 7 . . 5 0 0 ::: 0
két n n-es mátrix, ahol p1 ; : : : ; pn ; q1 ; : : : ; qn egymástól páronként különböz½o prímszámok (2n darab). Az AB szorzat alakja AB = [pi qj ]ni;j=1 : A prímszámok különböz½osége miatt a pi qj számok egymástól páronként különböz½o számok (a prímszámfelbontás egyértelm½usége miatt). Ez n2 különböz½o számot és n2 szorzatot jelent. 112
ALGORITMUSOK ANALíZISE
7.5. A gyors Fourier-transzformáció A gyors Fourier-transzformáció (FFT) alapvet½o fontosságú algoritmus, amely szintén egyike a 20. század tíz legfontosabbnak tartott algoritmusának. A gyors Fourier-transzformált a diszkrét Fourier-transzformált kiszámításának hatékony módszere. Adott f (t) függvény Fouriertranszformáltján az Z F (!) =
1
f (t) e
i2 !t
(7.23)
dt
1
függvényt értjük. Az inverz Fourier-transzformációt az Z 1 1 f (t) = F (!) ei2 2 1
!t
(7.24)
d!
összefügggés de…niálja. Legyen t adott mintavételezési id½oköz, yk = f (k t) (k = 0; 1; : : : ; n 1) pedig adott minta. Tegyük fel, hogy f (t) periódikus függvény T = n t periódussal, azaz y0 = yn . Az F (!)-t a [0; T ] intervallumban (egy periódusra) egy numerikus integrállal közelítjük:
Legyen
Fe (!) =
Z
n t
f (t) e
i2 !t
dt
0
t
n 1 X
yj e
i2 !j t
:
j=0
! = 1= (n t) és !k = k !. Ekkor Fe (!k )
t
n 1 X
yj e
i2 kj=n
:
j=0
A diszkrét Fourier-transzformáció (DFT) az n elem½u y0 ; y1 ; : : : ; yn ak =
n 1 X
yj e
i2 kj=n
(k = 0; 1; : : : ; n
1
sorozathoz az
1)
j=0
komplex n elem½u számsorozatot rendeli. A hozzárendelés inverze (diszkrét inverz Fouriertranszformáció): n 1 1X ak ei2 kj=n (j = 0; 1; : : : ; n 1) : yj = n k=0 A továbbiakban csak a diszkrét Fourier-transzformáltakkal foglalkozunk egy kissé átírt formában. Jelölje 2 (n 1) 2 2 2 (n 1) ! = !n = cos + i sin = cos i sin n n n n n az 1 szám komplex n-dik (n 1) egységgyökét (a z 1 = 0 n-edik megoldását). A GYORS FOURIER-TRANSZFORMÁCIÓ
113
ωk=cos(2(k-1)π/n)+isin(2(k-1)π/n) ábrázolása n=8 esetén Im(z)
ω3=i ω4
ω2
ω1=1 ω5=-1
Re(z)
ω8=cos(7π/4)+isin(7π/4) =cos(π/4)-isin(π/4)
ω6 ω7=-i
Legyen továbbá y = [y1 ; : : : ; yn ]T ; Y = [Y1 ; : : : ; Yn ]T 2 Cn . Az y komplex vektor véges (diszkrét) Fourier transzformáltján az Yk =
n 1 X
! jk yj ;
k = 0; 1; : : : ; n
(7.25)
1
j=0
összefüggéssel megadott Y komplex vektort értjük. Az Y Fourier-transzformáltat mátrix-vektor szorzat formájában is felírhatjuk: (7.26)
Y = Fn y; ahol
2
6 6 6 Fn = 6 6 4
1 1 1 .. .
1 ! !2 .. .
1 !n
1 !2 !4 .. . 1
! 2(n
::: :::
1)
1 !n ! 2(n .. .
: : : ! (n
1 1)
1)2
n 1
3
7 7 7 7 2 Cn 7 5
n
az un. Fourier mátrix. Tömörebb formában: Fn = ! jk j;k=0 (indexezés 0-tól (n Vegyük észre, hogy ! `n+k = ! k (0 k < n)
(7.27)
1)-ig!).
és ! = 1=!. Az Fn mátrix inverze felírható az Fn 1 = 114
1 H F n n ALGORITMUSOK ANALíZISE
T
alakban, ahol AH = A az A mátrix hermitikus transzponáltját jelenti. Minthogy FnT = Fn , n 1 azért Fn 1 = n1 F n = n1 ! jk j;k=0 , illetve 2 3 1 1 1 ::: 1 6 1 ! !2 : : : !n 1 7 6 7 1 2 4 6 ! ! 2(n 1) 7 Fn 1 = 6 1 ! 7: 7 .. .. .. n 6 .. 4 . 5 . . . 1 !n
1
! 2(n
1)
: : : ! (n
1)2
Az állítás igazolására szorozzuk össze Fn j-edik sorát Fn 1 k-adik oszlopával: 1 X jl lk 1 X jl ! ! = ! ! n l=0 n l=0 n 1
n 1
1 X l(j = ! n l=0 n 1
lk
k)
:
Ha j = k, akkor ! 0 = 1 miatt a fenti szorzat értéke 1. Ha j 6= k, akkor n 1 X
! l(j
k)
l=0
=
k)n
! (j !j
k
1 1
=
1
1
!j k
1
= 0.
Tehát a fenti mátrix valóban Fn inverze. Ennek alapján invertálhatjuk a diszkrét Fourier transzformáltat: 1 y = Fn 1 Y = F n Y; (7.28) n vagy n 1 1 X jk ! Yk ; j = 0; 1; : : : ; n 1: (7.29) yj = n k=0 Vegyük észre az inverz Fourier-transzformáció képletének hasonlóságát az eredeti transzformáció képletével! Példa: n = 2, !2 = cos i sin = 1, F2 =
1 1
i sin 24 = i, 2 1 1 1 6 1 i 1 F4 = 6 4 1 1 1 1 i 1
n = 4, !4 = cos 24
1 1
;
3 1 i 7 7; 1 5 i
F2
F4
1
1
1 2
1 1
1 1
:
1 16 1 = 6 44 1 1
1 i 1 i
1 1 1 1
=
2
3 1 i 7 7: 1 5 i
Az n rend½u diszkrét Fourier transzformáció költsége (feltéve, hogy Fn elemei adottak) az Fn y mátrix-vektor szorzás költsége. Hagyományos mátrix-vektor szorzással ez n2 szorzás és n2 n összeadás. 2 A gyors Fourier-transzformáció alapja az a tulajdonság, hogy !2n = !n . Cooley and Tukey (1965) A GYORS FOURIER-TRANSZFORMÁCIÓ
115
James W. Cooley (1926- )
vették észre, hogy 0 k 2n felbontható a következ½oképpen: [F2n y]k =
2n X1 j=0
=
n 1 X
John W. Tukey (1915-2000)
1 esetén a 2n-ed rend½u diszkrét Fourier transzfomáció
jk yj !2n
=
n 1 X
=
j=0
+
n 1 X
(2j+1)k
!2n
y2j+1
j=0
j=0
2jk k !2n y2j + !2n
j=0
n 1 X
2jk y2j !2n n 1 X
2jk !2n y2j+1
j=0
k !njk y2j + !2n
n 1 X
!njk y2j+1 :
j=0
Így a 2n rend½u Fourier transzformáltak számítása visszavezethet½o két n rend½u Fourier transzformált kiszámítására (oszd meg és uralkodj elv). Tegyük fel, hogy n = 2k . Algoritmus FFT. Input: y Output: Y = Fn y if n = 1 then return Y = y ! cos 2n i sin 2n b [y0 ; y2 ; : : : ; yn 2 ]T c [y1 ; y3 ; : : : ; yn 1 ]T B FFT(b) C FFT(c) for j from 0 to n=2 1 do Yj Bj + ! j Cj Yj+n=2 Bj + ! j+n=2 Cj Ha T (n) az n rend½u gyors Fourier transzformáció multiplikatív költsége, akkor fennáll, hogy T (n) = 2T (n=2) + O (n) : 116
ALGORITMUSOK ANALíZISE
Ennek megoldása a mester tétel alapján: T (n) = O (n log n) : Tulajdonképpen T (n) 3n log n. Tehát az FFT algoritmus O (n log n) multiplikatív m½uveletet igényel szemben O (n2 ) költség½u algoritmussal. Pna hagyományos 1 jk 1 Az yj = n k=0 ! Yk (k = 0; 1; : : : ; n 1) inverz Fourier transzformációt az FFT algoritmussal ! helyett !-val és y helyett Y -al számolva ugyanolyan költséggel kaphatjuk meg.
Ha n nem 2k alakú, akkor többféle lehet½oség van. Elvileg a legegyszer½ubb: az n adat kipárnázása a legközelebbi 2 hatványig. Az FFT algoritmus rendkívüli gyakorlati fontosságú. Számos változata létezik. Kép és jelfeldogozásra speciális chipek léteznek. A gyakorlatban a rekurzív algoritmust helyett ekvivalens nem rekurzív alakokat használnak. Cooley és Tukey eredeti algoritmusa sem rekurzív. Megjegyzések: 1. Danielson és Lánczos Kornél már 1942-ben javasolta a felbontást, esetleg néhány ismétlését. Nem vizsgálták a rekurzivitást, vagy a teljes végrehajtás és a bonyolultságot sem. 2.A legjobbnak tartott FFT implementációt Frigo és Johnson fejlesztették ki (M. Frigo, S.G. Johnson: The design and implementation of FFTW3, Proc. IEEE, vol. 93, No. 2, pp. 217-231, 2005). Az FFTW3 szoftver kifejlesztéséért 1999-ben a 3. John H. Wilkinson prize for Numerical Software díjat kapták (4 évenként adják 1991-t½ol). Az FFTW3 eljárás van beépítve a Matlab szoftverbe is. 3. Az FFT ismertebb, gyakran használt változatai numerikusan stabilak! A következ½o ábra az Y = Fn y képlettel számolt diszkrét Fourier-transzformáció CPU idejét és a beépített FFTW3 gyors Fourier-Transzformáció idejét hasonlítja össze Matlabban: DFT versus FFT W3 0.14 FFT W3 DFT
Matlab CPU time (seconds)
0.12
0.1
0.08
0.06
0.04
0.02
0 500
1000
1500
2000 2500 3000 3500 m átri x/adatsor m érete (n)
4000
4500
5000
Látható, hogy az ábrán az FFTW3 CPU ideje szinte azonos az x tengellyel, míg a DFT CPU ideje nagyjából összhangban van az O (n2 ) m½uveletszámmal. A GYORS FOURIER-TRANSZFORMÁCIÓ
117
7.6. Párhuzamos algoritmusok A párhuzamos algoritmusok értelemszer½uen párhuzamos számítógépekhez kapcsolódnak. Igen sokféle párhuzamos gép ismert. A számítógépek klasszikus Flynn-féle osztályozása 1966-ból: - Neumann gép (SISD) - SIMD - MIMD - (MISD). Ennek egy modernizált változata a Flynn-Johnson-féle osztályozás, amelyet a következ½o ábra mutat be:
Single
Single
Multiple
SISD "Uniprocessors"
SIMD "Array processors"
MISD
GMMP
MIMD DMSV "Distributed shared memory"
DMMP "Distributed memory multicomputers"
Shared variables
Message Passing
Distributed
GMSV "Shared memory multiprocesors"
Global
SIMD versus MIMD
Multiple
Instruction Stream(s)
Data Stream(s)
Global versus distributed memory
Communication/Synchronization
A párhuzamos gépek szokásos mai osztályozása ezzel szemben a következ½o két architektúrát különbözteti meg: - Multiprocesszor (megosztott memóriájú) architektúra Shared memory
Bus
Processor 1
118
Processor 2
.......
Processor n
ALGORITMUSOK ANALíZISE
- Multicomputer (üzenetátadó) architektúra P M P
P
M
M
MESSAGE-PASSING COMUNICATION NETWORK
P
P
M
M P
P - processor M - memory
M
Ezekkel itt részletesen nem foglalkozunk, hanem csak párhuzamos gép (algoritmus) modellekkel.
7.6.1. Párhuzamos számítások modelljei A párhuzamos számításoknak (számítógépeknek) is igen sok modellje ismert. A bonyolultság elméletben alapvet½oen két fajta modellt vizsgálnak: a regisztergép típusú parallel RAM és a Boole-hálózat modelleket. A PRAM (parallel RAM) modell A PRAM modell sémája: global memory
M
P1
P2
Pp
RAM processors
A processzorok a memóriát 1 egységnyi id½o alatt érik el. A PRAM utasítások 3 fázisú ciklusokban kerülnek végrehajtásra, amelyeknek elemei: PÁRHUZAMOS ALGORITMUSOK
119
- olvasás ha kell, - számítás, ha kell, - írás, ha kell. Kétfajta végrehajtási mód lehetséges: szinkron (SIMD), aszinkron (MIMD). A tipikus eset a szinkronizált mód: az aktív processzorok a PRAM program pontosan egy és ugyanazon utasítását hajtják végre ciklusonként. A számítás akkor ér véget, ha az utolsó processzor is megáll. De…níció: A PRAM gépek párhuzamos id½obonyolultsága alatt az algoritmus szinkronizált lépéseinek (utasításainak) számát értjük. A tárbonyolultság a felhasznált memória cellák száma, a párhuzamosság mértéke pedig a felhasznált processzorok száma. A PRAM számítás költsége az id½obonyolultság és a processzorok számának szorzata. A memória elérés lehetséges formái: - EREW (Exclusive Read, Exclusive Write): adott memória rekeszb½ol/be egyszerre csak egy processzor ír/olvas - CREW (Concurrent Read, Exclusive Write): adott memória rekeszb½ol egyszerre több processzor is olvashat, de csak egy írhat egy ciklusban. - CRCW (Concurrent Read, Concurrent Write): a memória rekeszekb½ol/be egyszerre több processzor olvashat/írhat ciklusonként: - COMMON CRCW- adott helyre beírt értékek csak azonosak lehetnek, egyébként hibajelzés - ARBITRARY CRCW - a beírásban gy½oztes processzor tetsz½olegesen választott - PRIORITY CRCW - egy kitüntetett processzor gy½oz. A szinkronizált PRAM modell túlságosan egyszer½u, de mégis ez az elterjedtebb. Aszinkron PRAM (APRAM) modellek: - Phase PRAM (minden processzor kooperál) - Phase LPRAM (látencia (késés) a memória elérésében) - Subset PRAM - Subset LPRAM Mindegyik verzióban van EREW, CREW, CRCW változat is. További változatok: APRAM, BPRAM, WPRAM, YPRAM, HPRAM. A nagyszámú PRAM modell számítási erejét a következ½o de…níció alapján lehet összehasonlítani. De…níció: Az A PRAM modell er½osebb mint a B modell (jelölés A B, ha B minden algoritmusa változtatás nélkül fut az A gépen ugyanolyan párhuzamos id½o alatt. Igazolható a következ½o er½olista: PRIORITY CRCW
ARBITRARY CRCW
COMMON CRCW
CREW
EREW.
A különböz½o PRAM modellek képesek egymást szimulálni. A következ½o ábrán az élek a szimulált modellb½ol a szimuláló modellre mutatnak. Az éleken a szimulált p processzoros modell egy lépésének szimulációjához szükséges számitási id½ok szerepelnek. 120
ALGORITMUSOK ANALíZISE
O(log p) EREW PRAM
O(log p) CREW PRAM O(log p) O(log p)
O(log p)
O(log p) O(1), p2 processzor COMMON CRCW ARBITRARY CRCW
O(1), p2 processzor
O(log p)
O(1), p2 processzor
PRIORITY CRCW
Az EREW és a CREW modelleket összehasonlítjuk egy egyszer½u m½uveleten: egy adatot közlünk minden processzorral (broadcasting). Pi jelöli az i-edik processzort, p a processzorok számát, Mj pedig a j-edik memória helyet. A CREW modellben ugyanarról a helyr½ol minden processzor egyszerre tud olvasni. Ezért az adatot a következ½o algoritmussal közölhetjük a processzorokkal: P1 WRITE the data in M1 ; FOR k = 2 TO p DO IN PARALLEL Pk READ M1 END Ez a broadcasting m½uvelet 2 ciklust vesz igénybe. Az els½o ciklusban P1 beírja az adatot az M1 cellába, a második ciklusban pedig az összes processzor olvassa az adatot. Az EREW modellben egyszerre csak egy processzor olvashat ugyanarról a helyr½ol. Ha a processzorok ugyanonnan olvasnak, akkor a broadcasting szekvenciális lenne. Kihasználhatjuk azonban a második processzor olvasás/számítás/írás ciklusát, hogy az adatot kiírjuk egy második cellába is, ahonnan a következ½o ciklusban már kett½o processzor olvashat. Ha ezek is kiírják két új helyre az adatot, akkor a következ½o ciklusban már négy processzor olvashat és így tovább. Tegyük fel, hogy p = 2k . P1 WRITE the data in M1 ; inc = 1; FOR j = 1 TO log p DO FOR k = inc + 1 TO 2 inc DO IN PARALLEL Pk READ Mk inc ; Pk WRITE the data in Mk ; END inc = 2 inc; END PÁRHUZAMOS ALGORITMUSOK
121
Az algoritmus beírja az adatot az M1 helyre. A küls½o ciklus els½o végrehajtásakor P2 olvassa az adatot és kiírja az M2 helyre, és az inc változó a 2 értéket veszi fel. A második küls½o iterációban P3 és P4 olvassa az adatot M1 -b½ol és M2 -b½ol, kiírják az adatot az M3 és M4 helyekre és inc értéke 4 lesz. Az utolsó el½otti küls½o ciklusban már a processzorok fele ismeri az adatot amely be van írva az M1 ; : : : ; Mp=2 memóriacellákba. Ez lehet½ové teszi, hogy a processzorok második fele egyszerre olvassa el az adatot ezekb½ol a cellákból. Miután a olvasás és írás egy utasítás ciklusban megtehet½o, a küls½o ciklust log p-szer kell megismételni. Ezért az EREW modellen a broadcasting m½uvelet O (log p) párhuzamos m½uveletet igényel szemben a CREW modell 2 m½uveletével. A BSP (Bulk-Synchronous parallel) modell A BSP gépet (1989) 3 tulajdonság jellemzi: - a komponensek mindegyike rendelkezik processzorral és memóriával - router, amely pont-pont üzeneteket közvetít és h-relációkat is létesít (olyan periódus, amelyben minden komponens legfeljebb h üzenetet küldhet és kaphat) - barrier szinkronizálás: a szinkronizálás kikapcsolható, de az üzenetek továbbra is mennek az azonnali elérés garanciája nélkül. Barrier synchroniser Router
P1
P2
Pp Processor-memory pairs
M
M
M
A LogP gép A LogP gép (1993) aszinkron, elosztott memóriájú multiszámítógép modell, a BSP leszármazottja. Általános sémája: Network
P1
P2
Pp Processor-memory pairs
M
122
M
M
ALGORITMUSOK ANALíZISE
A Papadimitriu-Yanakis modell A modell 1990-b½ol származik. Lényegében egy logP gép korlátlan számú processzor-memória párral: Network
P1
P2 Unlimited processor-memory pairs
M
M
A CLUMPS model Az 1994-ben de…niált modell f½obb jellemz½oi: processzor-memória párok, partícionálható kapcsoló hálózat amelyben SIMD és MIMD és a kett½o bármely kombinációja el½oállítható. Kombinatorikai (Boole-hálózat) modell A Boole-hálózatok aciklikus irányított gráfok, amelyeknek a szögpontjai vagy input vagy számítási csomópontok. Minden egyes számítási csomópontot (kaput) egy "processzornak" tekintünk. A logikai hálózatok tehát egyfajta struktúrálatlan párhuzamos számítógépek, ahol m½uveletek rendjére és szerkezetére nincs feltevés (de lehetséges). Tekintsük a következ½o példát Boole-hálózatra: Inputok
x1
x2
x3
1:2
x4
x5
3:4
1. szint
x6
x7
x8
7:8
5:6
1:4 2. szint
1:3
5:7
5:8
3. szint
1
1:2
1:3
1:4
1:5
1:6
1:7
1:8
A m½uveleti csomópontok a két input OR függvényét számolják ki. Az i : j címke (i jelentése: az xi ; xi+1 ; : : : ; xj változók OR függvénye. PÁRHUZAMOS ALGORITMUSOK
j)
123
A Boole-áramkörökre megismert néhány fogalmat most újabbakkal egészítjük ki. A v-edik m½uveleti csomópont d mélysége alatt az input csomópontoktól a -edik csomóponthoz vezet½o leghosszabb utat értjük. Az áramkör d mélysége alatt a kimeneti csomópontok mélységeinek a maximumát értjük. Az összes m½uveleti csomópont s száma az áramkör mérete. Az i mélység½u m½uveleti csomópontok wi száma az áramkör szélessége az i-edik mélységben (az inputok a 0-ik mélységben vannak). A szélességek maximuma az összes mélységben de…niálja az áramkör w szélességét. Világos, hogy s dw. Legyen f = ffN g egy függvénycsalád, fN : f0; 1gg(N ) ! f0; 1gh(N ) ; ahol g (N ) az N monoton növ½o függvénye. Legyen C = fCN g Boole-áramkörök egy családja, ahol CN az fN függvényt számítja. A CN áramkörnek g (N ) inputja és h (N ) outputja van. De…níció: A C = fCN g áramkör családot uniformnak nevezzük, ha minden adott N -re van olyan algoritmus, amely CN -et generálja. A Boole-hálózatok és a CREW PRAM modellek közti kapcsolatot jellemzik a következ½o eredmények. Tétel: Legyen C = fCN g Boole áramkörök uniform családja és jelölje sN , illetve dN a CN áramkör méretét, illetve mélységét. Ekkor létezik egy CREW algoritmus, amely fN -et kiszámítja O (dN ) lépésben p = dsN =dN e processzorral. Bizonyítás: Az áramkört szimuláljuk p processzorral. Tegyük fel, hogy az N inputot a közös memória els½o N cellájában tároljuk. Legyen a CN áramkör i-edik mélységben lév½o kapuinak száma Ni , ahol dN X Ni = s N : i=1
Egy két inputos kapu szimulációja a megfelel½o adatpár memóriából való beolvasásából (legfeljebb 2 lépésben), a kapu m½uvelet végrehajtásából (1 lépésben), és az eredmény másik cellában írásából áll (1 lépésben). Legyenek most u1 ; u2 ; : : : ; uk azok az (i + 1)-edik mélységben lév½o kapuk, amelyeknek az egyik input adata az i-edik mélységben lév½o -edik kapu outputja. Ekkor az (i + 1)-edik mélységben lév½o u1 ; u2 ; : : : ; uk kapukat szimuláló processzorok szimultán olvashatják ki a memóriából a -edik kapu eredményét. Így a p processzor az i-edik szinten lév½o kapukat legfeljebb k dNi =pe lépésben (k 4) szimulálhatja. Ha T a szimuláció teljes ideje és p = dsN =dN e, akkor az sN =dN + 1 p sN =dN egyenl½otlenség miatt dN =sN 1= (p 1) és T
dN X i=1
Ni k p
d
N kX k < (Ni + 1) = (sN + dN ) p i=1 p
k (sN + dN ) = kdN (sN =dN )
1+
dN sN
kdN
1+
1 p
1
= O (dN ) :
Tétel: Tegyük fel, hogy egy CREW algoritmus az f függvényt az n hosszúságú input szavakon t (n) id½oben kiszámítja polinomiális p (n) számú processzorral, O (p (n) t (n)) memóriacellát használva. Ekkor van olyan O (p2 (n) t (n) + p (n) t2 (n)) méret½u és O (log (p (n) t (n))) mélység½u Boole áramkör, amely ugyanezt az f függvényt kiszámítja. 124
ALGORITMUSOK ANALíZISE
7.6.2. Hatékonysági mutatók A párhuzamos algoritmusok fejlesztése és elemzése a hagyományos szekvenciális algoritmusoktól eltér½o gondolkodást igényel. Egyes problémák hatékony szekvenciális algoritmusait sikerül jól párhuzamosítani, másokét pedig nem. Bárhogy is van, a párhuzamos eszközök használatától valamilyen javulást várunk a szekvenciális gépekhez képest. A következ½okben egyszer½u hatékonysági mutatókat de…niálunk, amelyek ezt a követelményt számszer½usítik. De…níció (Felgyorsítási (speed-up) hányados, Sp ): Legyen T (N ) - legjobb ismert szekvenciális algoritmus ideje, Tp (N ) - a párhuzamos algoritmus ideje p processzoron. Ekkor a felgyorsítási hányados Sp =
T (N ) Tp (N )
(Sp
De…níció Az Ep =
1) :
Sp p
(7.30)
(7.31)
hányadost processzor hatékonyságnak nevezzük. Ugyanazon algoritmus esetén kétféle implementáció lehet: soros és párhuzamos. Ezért de…niáljuk a módosított T1 (N ) (7.32) Sp 1 Sp = Tp (N ) felgyorsítási mutatót is, ahol T1 (N ) a soros implementáció ideje. T1 (N ) nem szükségképpen a feladatot megoldó legjobb algoritmus. Hasonlóképpen de…niáljuk a Ep =
Sp p
(7.33)
a módosított processzor hatékonyságot is. Jegyezzük meg, hogy T (N ) Tp (N ) és T1 (N ) Tp (N ), mert a szekvenciális algoritmust 1 processzoron is végrehajthatjuk, míg a többi p 1 processzor nem csinál semmit. Állítás: A fenti mutatókra a következ½o egyenl½otlenségek teljesülnek: T1 (N ) 1
Sp
p; Sp
(7.34)
pTp (N ) ; 0 Sp :
Ep
1;
(7.35) (7.36)
"Bizonyítás": Egy p processzort használó algoritmus 1 párhuzamos lépését legfeljebb p szekvenciális lépéssel szimulálhatjuk. Az algoritmus Tp (N ) lépését pTp (N ) szekvenciális lépéssel szimulálhatjuk. A soros gép pedig képes lehet a feladatot gyorsabban is megoldani. Tehát T1 (N ) pTp (N ). A Tp (N ) T1 (N ) pTp (N ) egyenl½otlenséget Tp (N )-el osztva kapjuk, hogy 1 Sp p. Ezt PÁRHUZAMOS ALGORITMUSOK
125
p-val osztva azonnal kapjuk, hogy 1=p Ep 1. Az Sp Sp egyenl½otlenség a T (N ) T1 (N ) egyenl½otlenség következménye. Amdahl "törvénye" azt mondja ki, hogy nem mindig lehetséges elérni a p maximális felgyorsítást. Állítás (Amdahl): Legyen f egy soros RAM gépen végrehajtható program végrehajtási idejének azon törtrésze, amely párhuzamosítható. Ekkor a p processzoron elérhet½o felgyorsításra fennáll az 1 (7.37) Sp (1 f ) + f =p egyenl½otlenség. "Bizonyítás": Tegyük fel, hogy a soros számítás T1 lépést hajt végre. Ebb½ol f T1 a párhuzamosítható lépésszám, amelyet p processzorra terhelhetünk rá. A megmaradó (1 f ) T1 szekvenciális lépés legalább ugyanannyi lépést igényel a párhuzamos gépen. Ezért a Tp párhuzamos id½ore fennáll, hogy Tp T1 [(1 f ) + f =p], ahonnan az állítás következik. Az eredmény azt mutatja, hogy ha egy soros programnak csak rögzített f %-a párhuzamosítható, akkor az elérhet½o felgyorsítást korlátja 1= (1 f ), ha p ! 1. Például, ha egy program idejének 90%-a párhuzamosítható, akkor a maximális felgyorsítás 10, akárhány processzorunk is van. De…níció: Ha egy párhuzamos algoritmus felgyorsítására teljesül Sp (N ) = (p), azaz aszimptotikusan lináris, akkor azt mondjuk, hogy az algoritmusnak optimális a felgyorsítása. Brent ütemezési elve azt mutatja meg, hogy mennyire lehet egy probléma meglév½o bels½o párhuzamosságát hatékony párhuzamos algoritmusba konvertálni. Tétel (Brent): Tekintsünk egy C számítási feladatot, amelyet t párhuzamos lépésben lehet végrehajtani és a m½uveletek közti kommunikációs id½o elhanyagolható. Legyen mi az i-edik lépésben Pt végzett elemi (primitív) m½uveletek száma és legyen m = i=1 mi . Tekintsünk egy p processzoros M gépet, amely ugyanazokat az elemi (primitív) m½uveleteket hajtja végre és ahol p maxi mi . Ha a C feladatbeli m½uveletek közti kommunikációs id½o az M gépen is elhanyagolható, akkor a C számítás az M párhuzamos gépen Tp id½o (lépés) alatt végezhet½o el, amelyre fennáll, hogy Tp
(m=p) + t:
(7.38)
Bizonyítás: Egy párhuzamos lépés, amelyben mi m½uveletet hajtanak végre, az M gépen Pt dmi =pe < (mi =p) + 1 lépésben szimulálható. Ezt a t lépésre összegezve kapjuk, hogy Tp = i dmi =pe < P t i=1 [(mi =p) + 1] = (m=p) + t. A Brent elv akkor áll, ha a kommunikációs költségek elhanyagolhatók. A kommunikációs költségek gyakran jelent½osek és akadályát képezik a párhuzamosság kihasználásának. Vizsgáljuk meg a Brent elvet az x1 ; x2 ; : : : ; xn (n = 2k ) egész számok összeadásán. Ha feltételezzük, hogy legfeljebb két számot adhatunk össze egy elemi (primitív) m½uveletben, akkor az összeget csak páronkénti öszeadásokkal képezhetjük: - el½oször összeadunk n=2 elempárt, - másodszor összeadjuk ezek eredményét, azaz összeadunk n=4 elempárt, - és így tovább, amíg az utolsó n=2k = 1 összeadás sorra nem kerül. Ezért mi = n=2i az i dlog2 ne értékekre. Ha p processzor van, akkor dn=pe egész számot hozzárendelünk a p 1 processzor mindegyikéhez és a megmaradó n (p 1) dn=pe egész számot az utolsó p-edik processzorhoz. dn=pe (párhuzamos) lépésben a p processzor mindegyike 126
ALGORITMUSOK ANALíZISE
kiszámolja a saját részösszegét. Minden további iterációban csak az el½oz½o iterációban résztvev½o processzorok fele aktív. Az aktív processzorok kiszámítják az el½oz½o iteráció részösszegeinek összegét. O (log p) (párhuzamos) lépés után az n szám összege kiszámolásra kerül. Ez az algoritmus a feladatot O (n=p + log p) id½olépésben számítja ki. Kés½obb látni fogjuk, hogy az algoritmusnak optimális a felgyorsítása, ha (n=p) > log p. Feladat: Egy algoritmus N m½uveletb½ol áll. Legyen Tp , ill Tq az algoritmus párhuzamos végrehajtásához szükséges id½o p, ill. q processzor esetén. Ha q < p, akkor igazoljuk, hogy N q
Tq
Tp +
N
Tp q
:
7.6.3. Esettanulmányok A szakaszban több ismert feladat párhuzamos megoldását elemezzük. Heller összegzési algoritmusa Adottak az x1 ; : : : ; xN számok, N = 2n (n processzoron!
1) és számítsuk ki az
PN
i=1
xi összeget N=2
A feladat megoldására Heller (1978) "associative fan-in" algoritmusát ismertetjük, amely az oszd meg és uralkodj elven alapul: N X
xi =
i=1
N=2 X i=1
xi +
N=2 X
xN=2+i :
i=1
A két részösszeget tovább bontjuk N=4 elem½u részösszegekre és így tovább. Az N = 8 esetben a számítási fa: x1
x2
P1 +
P2 +
P1 +
P1 +
x3
x4
x5
x6
P3 +
P3 +
x7
P4 +
x8
Step 1
Step 2
Step 3
PÁRHUZAMOS ALGORITMUSOK
127
Tegyük fel, hogy xi 2 Mi , ahol Mi az i-edik memória rekesz, i = 1; 2; : : : ; N . Az eljárást megvalósító CREW algoritmus: inc = 1 FOR j = 1 TO log N DO FOR i 2 1 + 2 k inc j k = 0; 1; : : : ; /* Processor Pi does the following */ READ Mi and Mi+inc ; ADD contents of Mi and Mi+inc ; WRITE the sum in Mi ; inc = 2 inc; END END
N 2j
1
DO IN PARALLEL
Az eljárás összesen N 1 összeadási m½uveletet igényel. Ez azonos a szekvenciális algoritmus m½uveletszámával. Az aktív processzorok száma minden iterációban felez½odik (rossz kihasználtság): a szintek száma log N és ezért Tp (N ) = log N . A felgyorsítás mértéke N ; log N
SN=2 =
N 1 log N
N log N N 2
2 !0 log N
ahonnan a hatékonyság: EN=2
=
(N ! 1) :
Az algoritmus processzor hatékonysága nagy N -re elfogadhatatlanul alacsony. Következtetések: A hatékonysághoz a probléma méretének sokkal nagyobbnak kell lennie mint a processzorok számának. Bármely fa struktúrájú párhuzamos algoritmus könnyen programozható az el½obbi példa alapján. Összegzés rögzített számú processzoron n Ezt a feladatot már elemeztük PNa Brent-elv tárgyalásánál. Adottak az x1 ; : : : ; xN számok, N = 2 (n 1) és számítsuk ki az i=1 xi összeget p (1 < p < N ) processzoron.
Osszuk az N számot p csoportra, amelyek egyenként legfeljebb dN=pe számot tartalmaznak. Minden csoportot hozzárendelünk egy és csak egy processzorhoz. Minden processzoron szekvenciálisan kiszámítjuk a csoport összeget legfeljebb dN=pe 1 m½uvelettel. A p részösszeget valamilyen stratégiával (pl. bináris fa stratégiával) összeadjuk. 128
ALGORITMUSOK ANALíZISE
group 1
group 2
group 3
S1+S2
group 4
S3+S4
S1+S2+S3+S4
Így a teljes számítási id½o: N p
Tp (N ) = Tehát
Sp = l m
1 + dlog pe : N
N p
1
:
1 + dlog pe
Ha N = Lp log p, akkor N=p = L log p és Sp
Lp log p L = p: (L + 1) log p L+1
Vegyük észre, hogy Sp lineáris p-ben, s½ot Sp = (p) , ami optimális felgyorsítást jelent. Az L számot terhelési tényez½onek nevezik. L ! 1 esetén Sp p. Az eljárás processzor hatékonysága: L Ep (Ep ! 1, ha L ! 1) : L+1 Vektorok skalárszorzása rögzített számú processzoron Adott PN két vektor X = [x1 ; x2 ; : : : ; xN ] és Y = [y1 ; y2 ; : : : ; yN ]. Számítsuk ki a két vektor i=1 xi yi skalárszorzatát p processzoron. Tegyük fel, hogy N = np és a k-adik processzor (k = 1; : : : ; p) az (N=p)k
X
xi yi
i=(N=p)(k 1)+1
összeget számolja ki. Minden processzor N=p szorzást és N=p 1 összeadást igényel. A részösszegeket bináris fával adjuk össze dlog pe id½oegység alatt. Az összköltség: Tp (N ) =
2
N p
1 + dlog pe
párhuzamos lépés. PÁRHUZAMOS ALGORITMUSOK
129
Ha p = N , akkor TN (N ) = dlog N e + 1. Ha p = N=2, akkor TN=2 (N ) = log N2 + 3. Általános esetben 2N 1 Sp = : 2 Np 1 + dlog pe Tegyük fel, hogy p = 2k és N = Lp log p. Ekkor Sp
2L 2Lp log p = p= 2L log p + log p 2L + 1
(p) :
Ez aszimptotikusan optimális felgyorsítást jelent. De…níció: Egy feladatot aszimptotikusan teljesen párhuzamosíthatónak nevezünk, ha van egy olyan algoritmus rá, amelynek a felgyorsítása optimális.
Keresési feladat Adott egy N adat egy PRAM gép memóriájában, amelynek p < N processzora van. A feladat annak az eldöntése, hogy van-e egy x érték az N adat között. A kezdetben P1 ismeri az x értéket és P1 -nek kell a válasz (igen/nem) is. 1. EREW PRAM algoritmus: (a) P1 közli x-et a P1 ; P2 ; : : : ; Pp processzorokkal O (log p) párhuzamos lépésben. (b) Minden processzor lokális keresést csinál legfeljebb dN=pe adaton, dN=pe párhuzamos lépésben. (c) Minden processzor de…niál egy T alalt mutatót igaz vagy hamis értékkel. A végs½o választ egy párhuzamos redukcióval (bináris fával) kapjuk O (log p) párhuzamos lépésben. Az algoritmus költsége összesen Tp (N ) = O (log p) + dN=pe párhuzamos lépés. 2. CREW PRAM algoritmus: Hasonló, de P1 ; P2 ; : : : ; Pp kiolvassa x-et O (1) id½oben. A (c) lépés azonban még mindig O (log p) és így a végs½o számítási id½o Tp (N ). Feladat: Mi az algoritmus és költsége egy CRCW COMMON gép esetén?
Mátrixok szorzása Strassen mátrix szorzási algoritmusa párhuzamosan (els½o közelítésben) a következ½oképpen implementálható. Legyen n = 2k és A; B 2 Fn n és particionáljuk az A és B mátrixokat úgy, hogy A= 130
A11 A12 A21 A22
;
B=
B11 B12 B21 B22
n
Aij ; Bij 2 F 2
n 2
:
ALGORITMUSOK ANALíZISE
Vizsgáljuk meg a Strassen eljárás egy lépésének képleteit: M1 M2 M3 M4 M5 M6 M7
= (A12 A22 ) (B21 + B22 ) ; = (A11 + A22 ) (B11 + B22 ) ; = (A11 A21 ) (B11 + B12 ) ; = (A11 + A12 ) B22 ; = A11 (B12 B22 ) ; = A22 (B21 B11 ) ; = (A21 + A22 ) B11 ;
és C11 C12 C21 C22
= M1 + M2 M4 + M6 ; = M4 + M5 ; = M6 + M7 ; = M2 M3 + M5 M7 :
Az M1 M7 képletek legfeljebb két párhuzamos lépésben számíthatók (összeadások, szorzatok). Ezután a C11 ; C12 ; C21 ; C22 mennyiségek legfeljebb két párhuzamos összeadási m½uvelettel kiszámíthatók. Az összes párhuzamos összeadási m½uveletek száma 3. Ha T (N ) jelöli a szorzás párhuzamos idejét N N mátrixokon, akkor fennáll, hogy T (N ) = T
N 2
+3
(T (1) = 1) :
Ennek megoldása T (N ) = 1 + 3 log N = O (log N ) párhuzamos id½o. Kérdés: Mekkora a szükséges processzor szám? A feladatra vonatkozó csúcs eredmény (V. Pan): 2 dlog N e+1 párhuzamos id½o, N 2 dN= log N e processzoron (N 2 bels½o szorzattal).
7.6.4. Párhuzamos bonyolultsági osztályok A párhuzamos algoritmusok alapvet½o bonyolultsági osztálya az NC-osztály, amelyet Cook (1985) vezetett be. De…níció: Legyen N C (r) azon feladatok osztálya, amelyeket egy uniform fCN g Boole-áramkör családdal megoldhatunk úgy, hogy az áramkörök sN méretére és dN mélységére fennállnak az sN = O N t ;
dN = O ((log N )r )
(7.39)
összefüggések, ahol t 1. Ez azt jelenti, hogy a CN áramkör mérete az N polinomja, mélysége pedig log N polinomja. De…níció ( N C-osztály): N C = [r 1 N C (r) : (7.40) PÁRHUZAMOS ALGORITMUSOK
131
Korábban idéztük azt a tételt, amely szerint egy sN méret½u és dN mélység½u, C = fCN g uniform Boole áramköri családot egy CREW algoritmussal O (dN ) lépésben p = dsN =dN e processzorral szimulálhatunk. Ennek alapján az N C-osztály azokból a feladatokból áll, amelyek számítási ideje az N probléma méret logaritmusának polinomja (poli-log/polinom(log N ) id½o), polinom számú processzoron. Az N C osztályt ekvivalens módon (AC osztály) lehet de…niálni PRAM algoritmusokkal is. Az N C osztály azokat a feladatokat tartalmazza, amelyek hatékonyan párhuzamosíthatók. Ha egy feladat nincs az N C-osztályban, akkor ez azt jelenti, hogy alapjában véve szekvenciális és nehezen párhuzamosítható. További fontosabb párhuzamos bonyolultsági osztályok: P C és random N C un. valószín½uségi áramkörökkel, ahol az input egy része véletlen (érmedobás jelleggel). Lemma: (i) N C P ; (ii) N C (i) N C (i+1) . Bizonyítás: (i) N C P , mert az NC-problémák megoldása szekvenciális algoritmussal legfeljebb polinomiális idej½u (polinom polinom=polinom). (ii) Ha egy feladat fut O (log N )i id½oben, akkor biztosan fut O (log N )i+1 id½oben is. A fordított P N C reláció nem igazolt. Az N C osztályba tartoznak például a következ½o feladatok: Lineáris algebrai problémák (mátrix-vektor szorzás, mátrix-mátrix szorzás, determináns számítás, lineáris egyenletrendszerek megoldása). Gyors Fourier transzformált. Számos gráfelméleti probléma. Környezetfüggetlen nyelvek. Felmerül a kérdés, hogy melyek azok a P osztálybeli feladatok, amelyekre nem lehetséges az N C osztálybeli feladatok "extrém" felgyorsítása? A probléma megválaszolásához (1) Bevezetjük a számítási feladatok egyfajta nehézségi "rendezését". (2) Megmutatjuk, hogy ha vannak olyan nehéz (P -teljes) problémák, amelyek hatékonyan párhuzamosíthatók polinomiális számú processzorral, akkor az összes P -beli feladat is hatékonyan párhuzamosítható lenne. Ezért valószín½uleg a nagyszámú P -teljes probléma nem igazán jól párhuzamosítható. De…níció: Az L1 nyelv redukálható (visszavezethet½o) az L2 nyelvre ( L1 par L2 ), ha létezik olyan poli-log id½oben polinomiális számú proceszorral kiszámítható f függvény, hogy minden x2 szóra x 2 L1 , f (x) 2 L2 . (7.41) A redukálhatóság egy tranzitív reláció, amely a feladatok egyfajta osztályozását hozza létre. 132
ALGORITMUSOK ANALíZISE
Állítás: Ha L1 par L2 és L2 par L3 , akkor L1 par L3 . Bizonyítás: x 2 L1 , w = f1 (x) 2 L2 és w 2 L2 , f2 (w) 2 L3 teljesülnek az f1 és f2 függvényekkel. Ezért x 2 L1 , f2 (f1 (x)) 2 L3 és f2 (f1 (x)) poli-log id½oben polinomiális számú processzorral kiszámítható. Tehát L1 par L3 . De…níció: A K nyelvet P -nehéznek nevezzük, ha L par K teljesül minden L 2 P nyelvre. Azt a feladatot (nyelvet) nevezzük nehéznek, amelyre minden probléma redukálható. Állítás: Ha a K nyelv P -nehéz és K par L, akkor L szintén P -nehéz. Bizonyítás: Legyen M 2 P tetsz½oleges. Ekkor M par K, mert a K nyelvre minden P nyelv visszavezethet½o. A K par L feltevés és a tranzitivitási tulajdonság miatt ekkor M par L is teljesül. Tehát az L nyelv P -nehéz. Az eredmény azt jelenti, hogy egy nehéz problémát nem lehet "könny½u" problémára visszavezetni. Állítás: Tegyük fel, hogy L1 par L2 és L2 2 N C. Ekkor L1 2 N C: Bizonyítás: Legyen x 2 L1 és számítsuk ki f (x)-t poli-log id½oben polinomiális számú processzorral! Az L2 2 N C feltevés miatt annak eldöntése, hogy f (x) az L2 nyelvhez tartozik, vagy sem, poli-log számítási id½ot és polinomiális számú processzort igényel. Tehát az összes számítás poli-log idej½u polinomiális számú processzorral elvégezhet½o és ezért L1 2 N C. Vizsgáljuk most meg azt, hogy mi történne akkor, ha egy P -nehéz (P -teljes) nyelv N C-hez tartozna "extrém" felgyorsítással? Legyen L 2 P tetsz½oleges és K 2 N C egy P -nehéz nyelv. Ekkor a de…níció miatt L par K és a fenti állítás miatt L 2 N C. Tehát ha egy P -nehéz nyelv N C-hez tartozna, akkor P = N C lenne és minden P -beli problémának "extrém" felgyorsítása lehetne. De…níció: A K nyelvet P -teljesnek nevezzük, ha a K nyelv P -nehéz és K 2 P . Számos P -teljes probléma ismert. Legyen például C egy olyan Boole-áramkör, amelynek egy kimeneti kapuja van. Annak az eldöntése, hogy C elfogad-e egy x input szót, P -teljes feladat1 . Hasonlóképpen P -teljes feladatok a maximális folyam probléma, a lineáris programozás, környezet független nyelvtan által generált nyelv üressége és végtelensége, környezet független nyelvek tartalmazási problémái, stb.
1
Szekvenciális gépen ez könny½u feladat.
PÁRHUZAMOS ALGORITMUSOK
133
134
ALGORITMUSOK ANALíZISE
8. fejezet Számítási bonyolultság A fejezetben az N P bonyolultsági osztállyal foglalkozunk. Ezek olyan feladatok, amelyekre nem ismert polinomiális idej½u algoritmus, csak exponenciális idej½u, de a feladat megoldásának ellen½orzése polinomiális id½oben történhet. Az osztály az ilyen típusú feladatok nagy száma miatt fontos. Tipikus N P feladat például az úgynevezett ládapakolási (bin packing) probléma: Adottak 1 (egységnyi) kapacitású ládák, valamint N különböz½o méret½u tárgy az s1 ; s2 ; : : : ; sN méretekkel, amelyekre fennáll, hogy 0 si 1 (i = 1; 2; : : : ; N ). A feladathoz kapcsolódó optimalizálási feladat a következ½o: Mi az a legkisebb ládaszám, amelyben elhelyezhetjük az N tárgyat? A megfelel½o döntési feladat: Lehetséges-e vagy sem elhelyezni a tárgyakat B vagy annál kevesebb ládában? A hátizsák probléma esetén van N tárgyunk, amelyek méretei: s1 ; s2 ; : : : ; sN és ezek értéke rendre w1 ; w2 ; : : : ; wN . Továbbá van egy hátizsákunk amelynek a mérete K. Az optimalitási feladat az, hogy határozzuk meg azokat a tárgyakat, amelyek beférnek a hátizsákba és összértékük a legnagyobb. A megfelel½o döntési feladat: Van-e olyan részhalmaza a tárgyaknak, amelyik befér a hátizsákba és összértéke legalább W ? Ez a feladat pénzügyi beruházási stratégiákhoz is kapcsolódik, ahol a tárgyak méretei a különböz½o beruházások költségei, a tárgyak értékei a beruházások haszna, a hátizsák mérete pedig a beruházáshoz rendelkezésre álló teljes összeg.
8.1. Az NP osztály és NP-teljesség Az N P osztály vizsgálatának eszköze a nemdeterminisztikus Turing-gép. A nemdeterminisztikus Turing gép segítségével de…niáljuk az N P osztályt. A második szakaszban az N P osztályt jellemezzük. SZÁMíTÁSI BONYOLULTSÁG
135
8.1.1. Nem-determinisztikus Turing-gépek és az NP osztály A nem-determinisztikus automata mintájára bevezetjük a nemdeterminisztikus Turing gépet, amit a nemdeterminisztikus algoritmusok formális de…níciójának is tekinthetünk. A nemdeterminisztikus Turing gépek abban különböznek a determinisztikus Turing gépekt½ol, hogy az állapotátmenetek függvény helyett relációval írhatók le. Tehát adott állapotból nem egy egyértelm½uen meghatározott következ½o állapotba kerülnek, hanem több, el½ore meg nem határozott lehetséges állapotba. A nemdeterminisztikus Turing gép állapotátmeneti függvénye halmazérték½u. A formális de…níció el½ott tekintsük egy determinisztikus és egy nem determinisztikus számítás folyamatgráfját. determinisztikus számítás
nem-determinisztikus számítás
start
. . .
. . .
. . . elutasít
elutasít elfogad elfogad, vagy elutasít
Szekvenciális program minden csomópontjában egyértelm½uen meghatározott a folytatás. Nem-determinisztikus programban el½ofordul egynél több választható folytatás. Jelölje s a Turing gép szalagjának baloldali kezd½ojelét. A szalag jobbra végtelen. De…níció: Egy nem-determinisztikus Turing gépen ( N T ) az N T = (Q; ; ; ; q0 ; qA ; qR ) rendezett elem hetest értjük, ahol (i) Q 6= ? az állapotok halmaza, (ii) az input ábécé, (iii) = [ fs; #g, fL;R;N g (iv) : (Q n fqA ; qR g) ! 2Q állapotátmeneti reláció (függvény), amelyre teljesül, hogy (q; s) Q fsg fR; N g (8q 2 Q n fqA ; qR g) ; (8.1) 136
SZÁMíTÁSI BONYOLULTSÁG
(v) q0 2 Q a kiinduló állapot, (vi) qA 2 Q elfogadó állapot, (vii) qR 2 Q n fqA g elutasító állapot. Ha N T a p 2 Q állapotban van és az Y 2 "függvénye" egy véges (p; Y ) Q
jelet olvassa be, akkor N T állapotátmeneti fL; R; N g
részhalmazt de…niál. Az N T lépése ennek tetsz½oleges (q; X; Z) 2 (p; Y ) eleme lehet, ahol - q az új állapot, - X az Y -t felülíró új jel, - Z pedig az iró/olvasó fej mozgási iránya. A (8.1) tulajdonság azt fejezi ki, hogy az N T gép az s balvégjelet nem írhatja felül és attól balra nem léphet. Adott x 2 input feldolgozását N T a q0 induló állapotban az els½o cellánál kezdi. Vagy végtelen sok lépést tesz, vagy megáll egy q 2 fqA ; qR g állapotban. Adott inputra az N T gép sokféle számítást (számítási sorozatot) végezhet. De…níció: Az N T nemdeterminisztikus Turing gép az x inputot t id½oben [ s tárigénnyel] elfogadja, ha van a gépnek olyan számítási sorozata, amely legfeljebb t lépésb½ol [ s tárhelyet használ] áll és a gép qA állapotban áll meg. Lehet az x inputon olyan számítás is, amely tovább tart, esetleg nem áll meg, vagy elutasító. De…níció: Az N T nemdeterminisztikus Turing gép az x inputot elutasítja, ha az összes lehetséges számítás olyan, hogy nem áll meg, vagy a qR állapotban áll meg. Példa: Vizsgáljuk az M = (Q; ; ; ; q0 ; qA ; qR ) nem-determinisztikus Turing gépet, ahol Q = fq0 ; q1 ; q2 g, = fa; bg, = fa; b; s; tg, qA = q2 , qR = q1 és az állapotátmeneteket a következ½o állapot diagram írja le: (b,b,R)
q0
(b,b,R)
q1
(b,b,R)
q2
(a,a,R)
A w = ababb input jelsorozat esetén az M megállhat a q0 , q1 , q2 állapotok bármelyikében. Egy számítás sorozat elvisz q2 -be. Ezért a w szót M elfogadja. A gép által felismert nyelv azon feletti szavakból áll, amelyek a ’bb’jelsorozatra végz½odnek. De…níció: Az N T nem-determinisztikus Turing gép az L nyelvet felismeri, ha L pontosan azokból a sorozatokból áll, amelyeket N T (akármekkora véges id½oben) elfogad. Ha ezen felül még minden x 2 L szót f (jxj) ( jxj = n) id½oben [tárhellyel] elfogad, akkor azt mondjuk, hogy N T az L nyelvet f (n) id½oben [tárigénnyel] ismeri fel. Az f (n) id½oben [tárral] nem-determinisztikus Turing géppel felismerhet½o nyelvek osztályát N T IM E (f (n)) [N SP ACE (f (n))] jelöli. AZ NP OSZTÁLY ÉS NP-TELJESSÉG
137
De…níció: Mindazon nyelvek osztályát, amelyek polinomiális idej½u nem-determinisztikus Turing géppel eldönthet½ok N P -vel jelöljük. Másképpen N P = [k 0 N T IM E nk :
(8.2)
De…níció: Mindazon nyelvek osztályát, amelyek polinomiális tárigény½u nem-determinisztikus Turing géppel eldönthet½ok N SP ACE-el jelöljük. Másképpen N SP ACE = [k 0 N SP ACE nk :
(8.3)
Megjegyzések: 1. A determinisztikus Turing gépek speciális nem-determinisztikus Turing gépeknek tekinthet½ok. Ezért P N P . 2. Az N T gép nem egy gyakorlati számítási modell, hanem egy fontos elméleti eszköz döntési feladatok bonyolultságának vizsgálatában. Tétel: Minden nem determinisztikus Turing gép ekvivalens egy determinisztikus Turing géppel. Ötlet: Vizsgáljuk a nem-determinisztikus gép összes lehetséges számítási ágát és szimuláljuk ½oket egy determinisztikus géppel. Az ekvivalencia következménye az alábbi Tétel: Az N T gépek által felismerhet½o nyelvek pontosan a rekurzivan felsorolható nyelvek. Tétel: Ha L 2 N P , akkor létezik egy p polinom, hogy L megoldható (felismerhet½o) egy legfeljebb O 2p(n) id½obonyolultságú determinisztikus algoritmussal. Ez azt jelenti, hogy a nemdeterminisztikus polinomiális idej½u algoritmusokat szimuláló determinisztikus algoritmusokról csak annyit tudunk igazolni, hogy exponenciálisak. Érdekes módon a tárbonyolultság nem n½o exponenciálisan, amit a következ½o eredmény mutat. Tétel (Savitch): P SP ACE = N SP ACE. Az N P feladatok egyik fontos jellemz½oje, hogy ha van információnk a megoldásról (ez lesz a tanú), akkor ennek ismeretében a megoldás ellen½orzése polinomiális id½oben történhet. Ennek a formális leírását a következ½oképpen tehetjük meg. De…níció: Az L nyelvnek az L0 2 DT IM E (g (n)) nyelv f (n) hosszúságú, g (n) idej½u tanúja, ha x 2 L akkor és csak akkor teljesül, ha van olyan y 2 szó, amelyre jyj f (jxj) és x&y 2 L0 . Az x&y az x és y szavak konkatenációját jelöli. Tétel: (i) Minden L 2 N T IM E (f (n)) nyelvnek van O (f (n)) hosszúságú, lineáris idej½u tanúja. (ii) Ha egy L nyelvnek van f (n) hosszúságú, g (n) idej½u tanúja, akkor L 2 N T IM E (g (n + f (n))) . Következmény: Tetsz½oleges L 2 nyelvre az alábbi tulajdonságok ekvivalensek: (i) L felismerhet½o N T gépen polinomiális id½oben. (ii) L-nek van polinomiális hosszúságú és idej½u tanúja. Bemutatunk néhány N P osztályba tartozó feladatot és a tanúját. Az els½o három feladatban tételezzünk fel egy n szögpontú egyszer½u irányítatlan gráfot. Gráf összefügg½osége. Tanú 138
n 2
út, minden pontpárra egy-egy. SZÁMíTÁSI BONYOLULTSÁG
Gráf nem-öszefügg½osége. Tanú: a ponthalmaz egy valódi részhalmaza, amelyet nem köt össze él a többi ponttal. Hamilton kör létezése a gráfban. Tanú: a Hamilton-kör. Egész szám összetettsége. Tanú: egy valódi osztó. A példákból is látható, hogy az NP feladatokra jellemz½o, hogy tanú ismeretében egyszer½uek, míg a tanú megkeresése nagyon nehéz. Az N P id½obonyolultsági osztály nagy kérdése, hogy P valódi része-e N P -nek. A sejtés az, hogy P 6= N P: (8.4) Ezt azonban eddig még nem sikerült eldönteni. További kérdés az osztály …nomabb jellemzése. Ennek alapfogalmait a következ½o szakaszban vizsgáljuk.
8.1.2. NP-teljesség Bevezetjük a (Karp) redukció fogalmát amelynek segítségével az N P -beli feladatok nehézségét mérhetjük. De…níció: Az L1 nyelv polinomiálisan visszavezethet½o az L2 nyelvre ( L1 p L2 ), ha létezik olyan polinomiális id½oben kiszámítható f függvény, hogy minden x 2 szóra x 2 L1 , f (x) 2 L2 .
(8.5)
Állítás: Ha L1 p L2 és L2 p L3 , akkor L1 p L3 . Állítás: Ha L1 p L2 és L2 2 P , akkor L1 2 P: A két állítás igazolását a párhuzamos algoritmusoknál lényegében már láttuk. Sematikusan ábrázolva pedig a következ½o: igen x
polinomiális idejű visszavezető algoritmus
f(x)
polinomiális idejű algoritmus L2 eldöntésére nem
polinomiális idejű algoritmus L1 eldöntésére
Állítás: Ha egy nyelv N P -ben van, akkor minden rá polinomiálisan visszavezethet½o nyelv is N P -ben van. De…níció: Egy L 2 N P nyelvet N P -teljesnek nevezünk, ha minden N P -beli nyelv polinomiálisan visszavezethet½o L-re. AZ NP OSZTÁLY ÉS NP-TELJESSÉG
139
Állítás: Ha az L1 és L2 nyelvek N P -ben vannak, az L1 nyelv N P -teljes és polinomiálisan visszavezethet½o az L2 nyelvre, akkor L2 is N P -teljes. Vizsgáljuk most a megállási problémát, amelyhez tartozó Lh = fkod (T ) #x 2
j T az x bemenetre véges sok lépésben megáll.g
(8.6)
nyelv rekurzívan felsorolható, de nem rekurzív. Megmutatjuk, hogy minden rekurzívan felsorolható nyelv redukálható Lh -ra. Legyen A egy rekurzívan felsorolható nyelv. Legyen TA egy Turing gép, amely elfogadja A-t. Legyen f (x) = kod (TA ) #x. Az f rekurzív függvény. Minden x-re igaz, hogy x 2 A , TA megáll x-en , f (x) 2 Lh . Ez azt jelzi, hogy Lh teljes az összes rekurzívan felsorolható nyelvre nézve, vagyis Lh a legnehezebb probléma a rekurzívan felsorolható nyelvek közt. Vizsgáljuk most a megállási probléma egy korlátos változatát. Legyen M nemdeterminisztikus Turing gép, x egy bináris szó, és 0n unáris jelölésben az n szám. A kérdés M elfogadja-e x-et n lépésben? A problémához tartozó nyelv: BH = fkod (M ) #x#0n j M elfogadja x-et n lépésbeng :
(8.7)
Tétel: A BH nyelv N P -teljes. Bizonyítás: BH 2 N P mert jkod (M ) #x#0n j = (jkod (M )j + jxj + n). Most polinomiálisan redukálunk minden N P problémát BH-ra. Legyen A 2 N P . Ekkor van egy nemdeterminisztikus TA Turing gép, mely TA , amely A-t p id½oben elfogadja, ahol p egy rögzített polinom. Legyen f (x) = kod (TA ) #x#0p(jxj) :
(8.8)
Ekkor minden x-re igaz, hogy x 2 A , TA elfogadja x-et p (jxj) id½oben , kod (TA ) #x#0p(jxj) 2 BH , f (x) 2 BH. Minthogy TA egy rögzített Turing gép és p polinom, az f (x) kiszámításának ideje az jxj polinomja. Tehát f polinomiális id½oben kiszámolható. Ezért A p BH. Ezrekre teszik az ismert N P -teljes feladatok számát. A szokásos eljárás az N P -teljesség kimutatására a következ½o: - Egy N P -teljes probléma megadása. - Erre való polinomiális visszavezetés. A következ½okben megadunk hét fontos N P -teljes problémát. De…níció: Egy Boole-polinom kielégíthet½o, ha az általa de…niált Boole-függvény nem azonosan 0. Kielégíthet½oségi probléma (SAT): adott f Boole-polinomról eldönteni, hogy kielégíthet½o-e? Példa: Az (u1 _ :u3 _ :u4 ) ^ (:u1 _ u2 _ :u4 ) formula kielégíthet½o (pl. u1 = i, u2 = i, u3 = i, u4 = i). A (:u1 _ :u1 _ :u1 ) ^ (u1 _ :u2 _ :u2 ) ^ (u1 _ u2 _ :u3 ) ^ (u1 _ u2 _ u3 ) formula nem kielégíthet½o. 140
SZÁMíTÁSI BONYOLULTSÁG
Kielégíthet½oségi probléma (3SAT): Az (a1;1 _ a1;2 _ a1;3 ) ^
^ (an;1 _ an;2 _ an;3 )
(8.9)
alakban megadott Boole függvényr½ol eldönteni, hogy kielégíthet½o-e? Független halmaz probléma (Vertex cover/VC): Adott a G = (V; E) gráf és a k egész szám. Döntsük el, hogy van-e a csúcsoknak egy olyan legfeljebb k elem½u részhalmaza, amelyeket nem köt össze él E-ben. Hamilton kör probléma (HAM): Adott a G = (V; E) gráf. Döntsük el, hogy van-e Hamilton kör a G gráfban? Utazó ügynök probléma (TSP): Adott egy súlyozott G = (V; E) gráf. és a K szám. Döntsük el, hogy van-e legfeljebb K hosszúságú körút a G gráfban. Részletösszeg probléma (SUBSET-SUM): Adottak az s1 ; : : : ; sn és t természetes számok. Van-e az fs1 ; : : : ; sn g halmaznak olyan részhalmaza, amelynek összege pontosan t? Feladat ütemezés (JS): Adott n feladat, amelyek végrehajtási idejei a t1 ; t2 ; : : : ; tn pozitív egész számok, végrehajtási határidejei pedig a d1 ; d2 ; : : : ; dn határid½ok. Az i-edik feladat határid½o túllépéséért járó büntetés pi (i = 1; 2; : : : ; n). Adott továbbá a P 1 egész szám. Van-e olyan sorrendje a feladatoknak, amelyik büntetése kisebb mint P ? Az N P -teljesség igazolása elvileg a következ½o lépésekben történhet. El½oször kell a következ½o alapvet½o eredmény. Tétel (Cook, 1971): A SAT nyelv N P -teljes. Ezután redukció alkalmazásával kell a többi feladat N P -teljességét igazolni a következ½o sorrendben:
SAT
3SAT
VC
SUBSET-SUM
HAM
JS
TSP
Az eddig megismert bonyolultsági osztályuk és (feltételezett) viszonyuk a következ½o: AZ NP OSZTÁLY ÉS NP-TELJESSÉG
141
P
NP
NP-teljes
P-teljes NC
EXPTIME
eldönthető feladatok minden probléma
További bonyolultsági osztályok is vannak. Ezek száma jelenleg (2009.08.01) 488, amelyek a http://qwiki.stanford.edu/wiki/Complexity_Zoo honlapon megtekinthet½ok. Az a tény, hogy egy feladatra csak exponenciális idej½u algoritmust ismerünk, nem feltétlenül jelenti azt, hogy nincs is jobb algoritmus. Híres példa erre a lineáris programozás feladata: cT x ! max Ax b; x
0;
ahol A 2 Rm n , b 2 Rm , c; x 2 Rn . A feladatra ismert és a gyakorlatban legjobban bevált direkt módszer, a szimplex módszer, exponenciális idej½u. Kés½obb igazolták, hogy átlagos bonyolultsága polinomiális idej½u. Majd végül számos polinomiális idej½u algoritmust is adtak rá (Hacsijan, Dikin, Evtushenko, Karmarkar, stb.).
142
SZÁMíTÁSI BONYOLULTSÁG
9. fejezet Függelék 9.1. A programozás alapfogalmainak egy nemdeterminisztikus, relációelméleti leírása A következ½okben ismertetjük a programozás alapfogalmainak egy olyan nemdeterminisztikus, relációelméleti leírását, amelynek részletes kifejtése Fóthi Ákos (ill. Fóthi-Horváth) jegyzetében található meg. Legyen 6= ; tetsz½oleges véges halmaz. A elemeib½ol álló x = x1 x2 : : : xn : : : végtelen hosszúságú sorozatok halmazát jelölje 1 . Ha x 2 1 , akkor értelemszer½uen jxj = 1. Egy x = x 1 x2 : : : xn 2 véges sorozat utolsó elemén (elemfüggvényén) a (x) = xn = xjxj elemet értjük. Legyen = [ 1 a elemeib½ol képezett véges és végtelen sorozatok (szavak) halmaza. Egy x 2 sorozat redukáltja az a sorozat, amelyet úgy kapunk, hogy az x sorozat minden azonos elemb½ol álló véges részsorozatát a részsorozat egyetlen elemével helyettesítjük. Jelölése: red(x). Öt alapvet½o fogalmat de…niálunk: 1. Állapottér (a számítógép memória modellje) 2. Feladat (a programozási feladat modellje) 3. Program (a programfutás modellje) 4. Programfüggvény (a programfutás eredménye) 5. Feladat megoldása (a feladat és a program viszonyának modellezése). De…níció: Legyenek A1 ; A2 ; : : : ; An tetsz½oleges véges, vagy megszámlálhatóan végtelen halmazok. Az A = A1 A2 : : : An halmazt állapottérnek nevezzük, az Ai halmazokat pedig tipusértékhalmazoknak. Megjegyzések: - Az állapottér a számítógép memória modellje. Az állapottér egy eleme a memória egy adott állapotának felel meg. - Az állapottér Ai komponensei az egyes jellemz½ok lehetséges értékeinek halmazai. Az állapottér komponensei között ugyanaz a (tipusérték) halmaz többször is szerepelhet. FÜGGELÉK
143
- A típusértékhalmaz elnevezés azt jelzi, hogy ezek a halmazok bizonyos közös tulajdonságú (azonos tipusú) elemekb½ol állnak. De…níció: Legyen A állapottér. Az F A A relációt (programozási) feladatnak nevezzük. A feladat egy ”leképezés”(reláció) az állapottéren: az állapottér minden DF -beli pontjára megmondjuk, hogy hova kell bel½ole eljutni. Az állapottér megadása nem egyszer½u (mert esetleg éppen a megoldást nem ismerjük). Egy program futásakor a számítógép memóriájának tartalma dinamikusan változik. A program futását az állapotok, vagyis állapottérbeli sorozatok megadásával modellezzük. De…níció: Az S A A relációt programnak nevezzük, ha 1. DS = A, 2. 8a 2 A : 8 2 S (a) : 1 = a, 3. 8 2 RS : = red ( ) : A de…níció jelentése a következ½o: 1. tulajdonság: triviális; 2. tulajdonság: A program futását jellemz½o 2 A sorozat mindig abból az a 2 A pontból indul el, amelyhez hozzárendeltük; 3. tulajdonság: RS = f 2 A j 9a 2 A : (a; ) 2 Sg, bármelyik 2 RS olyan sorozat, amelyben az állapotok nem ismétl½odnek. A program tehát egy reláció, amelynek értékkészlete az állapottéren értelmezett sorozatokból áll. Ezek a sorozatok egy-egy konkrét program végrehajtást jellemeznek. Kérdés: Az F A A feladat és az S A A program viszonya? Az F feladat reláció az a 2 A ”kezdeti memóriaállapothoz” egy (vagy több) olyan b 2 A ”végs½o memóriaállapotot”(tkp. megoldást) rendel, amelyre igaz, hogy (a; b) 2 F . Az S program reláció ugyanehhez az a kezdeti állapothoz egy (vagy több) 2 A sorozatot rendel. Ha ez a sorozat véges ( 2 A ), akkor a végs½o állapot, amely a sorozat utolsó eleme, a programfutás eredménye. Ennek a végs½o állapotnak a feladat b ”megoldásához”való viszonyát kell jellemezni. A közbüls½o memóriaállapotok ebb½ol a szempontból nem érdekesek, ill. ezeket nem vizsgáljuk. A viszony jellemzését két lépésben végezzük el. De…níció: A p (S) A A relációt az S A A program programfüggvényének nevezzük, ha 1. Dp(S) = fa 2 A j S (a) A g, 2. p (S) (a) = fb 2 A j 9 2 S (a) : ( ) = bg. A de…níció jelentése a következ½o: 1.tulajdonság: Csak olyan pontokban vizsgáljuk azt, hogy hova jut el a program, amelyekben a futás véges (a program nem száll el); 2. tulajdonság: Tetsz½oleges b 2 A ponthoz, amelyre (a; b) 2 p (S), létezik véges, a program által el½oállított 2 A sorozat ((a; ) 2 S), amelynek utolsó eleme (utolsó programállapota) éppen b. A programfüggvény (reláció) a program futásának eredményét jellemzi. De…níció: Az S A A program megoldja az F A A feladatot, ha 1. DF Dp(S) , 2. 8a 2 DF : p (S) (a) F (a). 144
FÜGGELÉK
A de…níció jelentése a következ½o: 1. tulajdonság: A DF = fa 2 A j 9b 2 A : (a; b) 2 F g
Dp(S) = fa 2 A j S (a)
Ag
feltétel miatt az állapottér azon pontjaihoz, ahol a feladat értelmezve van, a program csak véges sorozatokat rendelhet; 2. tulajdonság: A p (S) (a) = fb 2 A j 9 2 S (a) : ( ) = bg
F (a) = fc 2 A j (a; c) 2 F g
feltétel azt fejezi ki, hogy a sorozatok végpontjait a feladat hozzárendeli a kezd½oponthoz. Tehát a program által generált ”véges”sorozatok végpontjai a feladat megoldásai. Ezzel a program és a feladat viszonyát jellemeztük. Hagyományos értelemben vett, determinisztikus programunk akkor van, ha p (S) valójában függvény reláció. Ha nem függvény reláció, akkor azonos inputok esetén különböz½o outputok lehetségesek.
9.2. Irodalom Aho, A.V., Hopcroft, J.E., J.D. Ullman: Számítógép algoritmusok tervezése és analízise, M½uszaki Könyvkiadó, 1982 Ausiello, G.: Algoritmusok és rekurzív függvények bonyolultságelmélete, M½uszaki Könyvkiadó, 1984 Bagyinszki J., György A.: Diszkrét matematika f½oiskolásoknak, Typotex, 2001 Birkho¤, G., Bartee, T.C.: A modern algebra a számítógép-tudományban, M½uszaki Könyvkiadó, 1974 Boolos, G.S., Burgess, J.P., Je¤rey, R.C.: Computability and Logic, 4. kiadás, Cambridge University Press, 2002 Burgin, M.: Super-Recursive Algorithms, Springer, 2005 Cormen, T.H., Leiserson, C.E., Rivest, R.L., Stein, C.: Új algoritmusok, Scolar, 2003 Davis, M., Weyuker, E.: Computability, Complexity, and Languages, Academic Press, 1983 Demetrovics J., Denev, J., Pavlov, R.: A számítástudomány matematikai alapjai, Tankönyvkiadó, 1985 Edmonds, J.: How to Think about Algorithms, Cambridge University Press, 2008 IRODALOM
145
Epstein, R.L., Carnielli, W.A.: Computability: Computable Functions, Logic, and the Foundations of Mathematics, 3. kiadás, ARF, 2008 Fóthi Ákos: Bevezetés a programozáshoz, Tankönyvkiadó, Budapest, 1984 Fóthi Á., Horváth Z.: Bevezetés a programozásba, http://www.inf.elte.hu/ekonyvtar/bevprog.pdf Garey, M.R., Johnson, D.S.: Computers and Intractability: A Guide to the Theory of NP-Completeness, Freeman, 1979 Gavrilov, G.P., Szapozsenko, A.A.: Diszkrét matematikai feladatgy½ujtemény, M½uszaki Könyvkiadó, 1981 Gécseg Ferenc: Automaták és formális nyelvek, Polygon, Szeged, 2005 Gopalakrishnan, G.: Computation Engineering: Applied Automata Theory and Logic, Springer, 2006 Hein, J.L.: Theory of Compution: An Introduction, Jones and Bartlett Publishers, 1996 Hopcroft, J.E., Motwani, R., Ullman, J.D.: Introduction to automata theory, languages, and computation, 2. kiadás., Addison-Wesley, 2001 Hopcroft, J.E., Ullman, J.D.: Formal Languages and Their Relation to Automata, AddisonWesley, 1969 Iványi A.(szerk.): Informatikai algoritmusok 1-2, ELTE Eötvös Kiadó, 2004, 2005 Iványi A.: Párhuzamos algoritmusok, ELTE Eötvös Kiadó, 2005 Jablonszkij, S.V., Lupanov, O.B.: Diszkrét matematika a számítástudományban, M½uszaki Könyvkiadó, 1980 Juhász István: Rekurzióelmélet, MTA Matematikai Kutató Intézete, 1978 Katona G. Y., Recski A., Szabó C.: A számítástudomány alapjai, Typotex, 2002 Knuth, D.: A számítógép programozás m½uvészete, 1-2-3, M½uszaki Könyvkiadó, 1987, 1988 Lewis, H.R., Papadimitriu, C.H.: Elements of the Theory of Computation, 2. kiadás, Prentica_Hall, Inc., 1998 Lovász L., Gács P.: Algoritmusok, M½uszaki Könyvkiadó, 1978 Lovász L.: Algoritmusok bonyolultsága. Budapest, Tankönyvkiadó, 1990 146
FÜGGELÉK
Manna, Z.: Programozáselmélet, M½uszaki Könyvkiadó, 1981 Manyin, J.I.: Bevezetés a kiszámíthatóság elméletébe, M½uszaki Könyvkiadó, 1986 McConnell, J.J.: Analysis of Algorithms: An Active Learning Approach, Jones and Bartlett Publishers, 2001 Minsky, M.L.: Computation: Finite and In…nite Machines, Prentice-Hall, Englewood Cli¤s, NJ, 1967 Papadimitriu, C.H.: Számítási bonyolultság, Novadat, 1999 Péter Rózsa: Recursive Functions, 3. kiadás, Akadémiai Kiadó, 1967 Rónyai L., Ivanyos G., Szabó R.: Algoritmusok, Typotex, 1998 Savage, J.E.: Models of Computation: Exploring the Power of Computing, Addison Wesley, 1998 Schönhage, A., Grotefeld, A.F.W., Vetter, E.: Fast Algorithms: A Multitape Turing Machine Implementation, BI Wissenschaftsverlag, 1994 Sedgewick, R.: Algorithms, Addison-Wesley, 1983 Sedgewick, R.: Algorithms in Java, Addison-Wesley„2002 Shen, A., Vereshchagin, N.K.: Computable Functions, American Mathematical Society, 2003 Trahtenbrot, B.A.: Algoritmusok és absztrakt automaták, M½uszaki Könyvkiadó, 1978 Van Loan, C.: Computational Frameworks for the Fast Fourier Transform, SIAM, 1992 Varga László: Rendszerprogramok elmélete és gyakorlata, Akadémiai Kiadó, 1980 Wegener, I.: The Complexity of Boolean Functions, Wiley, 1987 Wirth, N.: Algoritmusok+adatstrukturák=programok, M½uszaki Könyvkiadó, 1982
IRODALOM
147