Budapesti Műszaki és Gazdaságtudományi Egyetem Villamosmérnöki és Informatikai Kar
Iwatt Róbert
Tar Domokos Géza
SZÁMÍTÁSELMÉLET SZIGORLAT KIDOLGOZOTT TÉTELEK
A jegyzet a 2004 áprilisától érvényes tételsor tételeinek egy kidolgozása. A kidolgozás alapjául kizárólag saját élményeink és a szövegben megjelölt források általunk helyesnek hitt interpretációi szolgáltak. A jegyzetben írtak helyességéért semmilyen felelősséget nem vállalunk! Köszönet mindenkinek, aki már eddig is hozzájárult a jegyzet minőségének javításához. Esetleges további észrevételeiteket a
[email protected] címre várjuk.
Tartalomjegyzék A01 ................................................................................................................................................................7 Végtelen halmazok számossága: egyenlő, kisebb-egyenlő, illetve kisebb számosságú halmaz definíciója, Cantor, számossága és ezek Bernstein-tétel (NB). Megszámlálhatóan végtelen és kontinuum számosságú halmaz. , összehasonlítása a természetes számok számosságával. Véges ábécé feletti szavak és nyelvek halmaza, e halmazok hatványhalmazának számossága (*). Kontinuum-hipotézis (NB). számossága. Hatványhalmaz, Cantor-tétel (*).
A02 ................................................................................................................................................................9 Determináns definíciója, alaptulajdonságai (*), kiszámítása, kifejtési tétel (*). Mátrixok, műveletek mátrixokkal, ezek tulajdonságai (*). Determinánsok szorzástétele (NB). Mátrix inverze, létezésének szükséges és elégséges feltétele, az inverz kiszámítása. Mátrix rangja, a rangfogalmak egyenlősége (*). Gráf szomszédossági mátrixa, hatványainak jelentése; gráf illeszkedési mátrixa, annak rangja (*).
A03 ..............................................................................................................................................................13 Lineáris egyenletrendszer megoldása Gauss-eliminációval, megoldhatóság, a megoldás egyértelműségének feltétele. n × n -es lineáris egyenletrendszer egyértelmű megoldhatóságának jellemzése a determináns segítségével (*), általános egyenletrendszer megoldhatóságának jellemzése a rang segítségével (*). Térbeli koordinátageometria: sík egyenlete, egyenes egyenletrendszere, metszéspontok és metszésvonalak számítása.
A04 ..............................................................................................................................................................16 Vektortér definíciója, példák. Altér, lineáris kombináció, generált altér, generátorrendszer. Lineáris függetlenség, a kétféle definíció ekvivalenciája. Kicserélési tétel (*). Bázis, vektorok bázis szerinti felírásának egyértelműsége. Dimenzió, a dimenzió egyértelműsége.
A05 ..............................................................................................................................................................19 Lineáris leképezés fogalma, példák. Lineáris leképezés mátrixa, vektor képének meghatározása a mátrix segítségével. Lineáris leképezések szorzata, szorzat mátrixa (*). Lineáris leképezések magtere, képtere, ezek altér volta. Dimenziótétel (*).
A06 ..............................................................................................................................................................22 Lineáris transzformációk, illetve négyzetes mátrixok sajátértékei, sajátvektorai. A sajátértékek és sajátvektorok meghatározása. Sajátaltér, ennek altér volta.
A07 ..............................................................................................................................................................24 Kombinatorikus leszámlálási alapfeladatok, példák. Binomiális tétel. Gráfelméleti alapfogalmak: gráf, egyszerű gráf, izomorfia, részgráf, feszített részgráf, élsorozat, út, kör, összefüggőség, összefüggő komponens, fa, feszítőfa. Fák egyszerű tulajdonságai. Cayley-tétel (*).
A08 ..............................................................................................................................................................27 Minimális költségű feszítőfa keresése. Piros-kék algoritmus (*). Prim módszere, a módszer lépésszáma naív és kupacos (*) implementáció esetén. Kruskal algoritmusa, megvalósítása UNIO-HOLVAN adatszerkezettel, lépésszáma (*). Boruvka módszere (*).
A09 ..............................................................................................................................................................30 Legrövidebb utak keresése. Szélességi bejárás, lépésszáma. Dijkstra algoritmusa (*), lépésszáma mátrixos (*) és éllistás (*) megadással. Bellman-Ford algoritmusa, lépésszáma mátrixos megadás esetén. Floyd algoritmusa, lépésszáma mátrixos megadás esetén (*).
A10 ..............................................................................................................................................................33 Mélységi bejárás, lépésszáma, mélységi és befejezési számozás, az élek osztályozása irányított és irányítatlan gráfok esetén. Alkalmazások: DAG tulajdonság ellenőrzése (*), topologikus sorrend keresése (*), legrövidebb és leghosszabb út keresése DAG-ban, PERT módszer.
A11 ..............................................................................................................................................................36 Síkbarajzolhatóság, kapcsolat a gömbre rajzolhatósággal, Euler-tétel (*), felső becslés az élek számára. Kuratowskigráfok, ezek síkba nem rajzolhatósága, Kuratowski-tétel (NB), Fáry-Wagner-tétel (NB). Dualitás, gyenge izomorfia fogalma, absztrakt dualitás, Whitney tételei (NB).
A12 ..............................................................................................................................................................38 Hamilton-körök és -utak. Szükséges feltétel Hamilton-kör/út létezésére. Elégséges feltételek: Ore (*) és Dirac tétele. Hamilton-kör keresés bonyolultsága (*). Euler-körök és -utak, ezek létezésének szükséges és elégséges feltétele.
A13 ..............................................................................................................................................................39 Gráfok színezése. χ (G ) fogalma és viszonya ω (G ) -hez, illetve ∆(G ) -hez. Brooks tétele (NB). Mycielski konstrukciója (*). Intervallumgráfok színezése. Perfekt gráf fogalma. Síkbarajzolható gráfok kromatikus száma (*). 3SZÍN nyelv bonyolultsága (*). Élkromatikus szám, χ e (G ) viszonya ∆(G ) -hez, Vizing-tétel (*).
A14 ..............................................................................................................................................................41 Páros gráfok. Párosítások páros gráfban, magyar módszer (*), lépésszáma. König tétele (*), Hall tétele (*), Frobenius tétele (*). Párosítások tetszőleges gráfban, υ és τ kapcsolata, Tutte tétele (csak a szükségesség bizonyításával). Gallai tételei (közülük szabadon választhatóan az egyik bizonyításával).
A15 ..............................................................................................................................................................43 Hálózat, hálózati folyamok. A javító utas algoritmus. Ford-Fulkerson tétel (*), Edmonds-Karp tétel (NB). Egészértékűségi lemma. A folyamprobléma általánosításai. Menger tételei (*). Többszörös összefüggõség, élösszefüggõség. Dirac tétele (NB).
A16 ..............................................................................................................................................................45 Oszthatóság, felbonthatatlan és prímtulajdonságú számok. A számelmélet alaptétele (*). Osztók száma. A prímek számának végtelensége. Kongruencia fogalma, alapműveletek kongruenciákkal. Lineáris kongruenciák, a megoldhatóság szükséges és elégséges (*) feltétele. Wilson tétele (*).
A17 ..............................................................................................................................................................48 Teljes és redukált maradékrendszer, algoritmus.
ϕ -függvény definíciója. Euler-Fermat-tétel (*), kis Fermat-tétel. Euklideszi
A18 ..............................................................................................................................................................49 Számelmélet és algoritmusok: alapműveletek, hatványozás az egészek körében és modulo m. Prímtesztelés (feladata, Fermat-féle teszt, Carmichael számok). Nyilvános kulcsú titkosírás.
A19 ..............................................................................................................................................................52 Művelet fogalma, félcsoport, csoport, Abel-csoport, részcsoport, elem rendje. Példák: csoportok számokon, mátrixokon, rajzok szimmetriacsoportja, ciklikus csoport, diédercsoport, szimmetrikus csoport. Csoportok izomorfiája. Mellékosztály, Lagrange tétele (*), elemrend és csoport rendjének kapcsolata.
A20 ..............................................................................................................................................................54 Gyűrű és test fogalma. Példák:
, , , n × n -es mátrixok, polinomok,
p.
Komplex számok, algebrai és
trigonometrikus alak, alapműveletek komplex számokkal. Komplex szám n-edik gyöke, egységgyökök.
B01...............................................................................................................................................................56 Rendezési feladat. Buborékrendezés, lépésszáma (*). Beszúrásos rendezés, lépésszáma. Rendezett sorozatok összefésülése, az összefésülés lépésszáma, összefésüléses rendezés, lépésszáma (*). Alsó korlát az összehasonlítás alapú rendezésekre (*). Gyorsrendezés, lépésszáma (*). Ládarendezés, radixrendezés (*), lépésszámuk (*).
B02...............................................................................................................................................................59 Kupac adatszerkezet, műveletek, lépésszámuk, kupacépítés (*). Kupacos rendezés, lépésszáma. Lineáris és bináris keresés rendezett halmazban, a keresés lépésszáma, alsó korlát. Bináris keresőfák, műveletek, lépésszámuk.
B03...............................................................................................................................................................62 AVL-fák, szintszám (*), műveletek (*), lépésszámuk (*). 2-3 fák, szintszám, műveletek, lépésszámuk. B-fák, műveletek (*), lépésszámuk (*).
B04...............................................................................................................................................................65 Vödrös hash-elés, a műveletek lépésszáma (*). Nyitott címzésű hash-elés: lineáris és kvadratikus maradék próba (*), kettős hash-elés. Jó hash-függvények (*). A hash-elés alkalmazhatósága, összehasonlítva a keresőfákkal.
B05...............................................................................................................................................................67 A Turing-gép fogalma, működése. A többszalagos Turing-gép szimulálása egyszalagossal, az idő és tárkorlát változása (*). A Chomsky nyelvosztályok kapcsolata a Turing-gép változataival (*). Univerzális Turing-gépek létezése (*). Church-Turing-tézis.
B06...............................................................................................................................................................69 Rekurzív és rekurzívan felsorolható nyelvek és rekurzív, illetve parciálisan rekurzív függvények. Az R, RE, coR és coRE nyelvosztályok kapcsolata. Nevezetes nyelvek, bonyolultságuk: diagonális nyelv, univerzális nyelv (*), megállási nyelv, dominó probléma (*), Post megfeleltetési feladata (NB), környezetfüggetlen nyelvtanokkal kapcsolatos eldönthetetlen feladatok (*).
B07...............................................................................................................................................................71 Kolmogorov-bonyolultság: adott Turing-gépre vett bonyolultság, invariancia-tétel, a Kolmogorov-bonyolultság definíciója, a definíció értelmessége. Összenyomhatatlanság, összenyomhatatlan szavak létezése (*), a C függvény bonyolultsága (*).
B08...............................................................................................................................................................73 Idő- és tárkorlátos Turing-gépek. Tár-idő-tétel (*). Nevezetes nyelvosztályok: P, PSPACE, EXPTIME, ezek kapcsolata.
B09...............................................................................................................................................................75 Nemdeterminisztikus Turing-gépek, idő és tárbonyolultságuk. NP és coNP nyelvosztály, ezek kapcsolata P-vel és R-rel. Tanú-tétel (*). Példák NP és coNP-beli nyelvekre.
B10...............................................................................................................................................................77 Karp-redukció, a Karp-redukció tranzitivitása. NP-teljesség. Cook-Levin-tétel (*). További nyelvek NP-teljessége: 3SAT (*), 3-SZÍN (*), MAXFTLEN, X3C (NB), H (NB), RH (NB), Ládapakolás (NB).
B11...............................................................................................................................................................80 Dinamikus programozás: elve, példák a korábbi algoritmusok közül, hátizsák probléma megoldása kis súlyok esetén, az algoritmus lépésszáma. Közelítő algoritmusok: elv, algoritmus a ládapakolási feladatra (*).
B12...............................................................................................................................................................82 Véges automata. Véges automaták determinizálása és teljesen specifikálása. Minimálautomata, konstrukciója, unicitása (*). Kétirányban mozgó véges automata, kapcsolata az egyirányban mozgó véges automatával (*).
B13...............................................................................................................................................................84 Generatív nyelvtanok, Chomsky-nyelvosztályok. A generatív nyelvek számossága. Bal- és jobb-reguláris nyelvtanok, kapcsolatuk (*), reguláris nyelvek. Véges automaták és reguláris nyelvek kapcsolata.
B14...............................................................................................................................................................88 Reguláris nyelvek zártsági tulajdonságai: metszet, unió (*), komplementer, konkatenált, tranzitív lezárt (*). Pumpálási lemma reguláris nyelvekre (*). Reguláris halmazok, kapcsolatuk a reguláris nyelvekkel (*).
B15...............................................................................................................................................................90 Környezetfüggetlen nyelvek. Környezetfüggetlen nyelvtanok jólfésült alakra hozása. Chomsky-normálformára hozás. Greibach-normálforma (*). Rekurzió és balrekurzió kiküszöbölhetősége.
B16...............................................................................................................................................................94 Veremautomaták. Állapottal és üres veremmel elfogadó veremautomaták, ezek kapcsolata. Mélységbe látó veremautomata, kapcsolata a nem mélységbe látó veremautomatával (*). Környezetfüggetlen nyelvtanok és veremautomaták kapcsolata (*), környezetfüggetlen nyelvtanból veremautomata konstruálása.
B17...............................................................................................................................................................97 Pumpálási lemma környezetfüggetlen nyelvekre (*). A környezetfüggetlen nyelvek zártsági tulajdonságai: metszet, unió, komplementer, konkatenált (*), tranzitív lezárt (*). Determinisztikus környezetfüggetlen nyelvek. A determinisztikus környezetfüggetlen nyelvek zártsági tulajdonságai: metszet, unió, komplementer (*).
B18...............................................................................................................................................................99 A fordítás fogalma. Véges fordító. Reguláris (*) és környezetfüggetlen nyelvek zártsági tulajdonságai a véges fordítás esetén. Veremfordító, szintaxis vezérelt fordítási séma, kapcsolatuk (*).
B19.............................................................................................................................................................101 Levezetési fa környezetfüggetlen nyelvtanok esetén. Környezetfüggetlen nyelvtanok és nyelvek egyértelműsége. A környezetfüggetlen nyelvtanok elemzésének célja. Cocke-Younger-Kasami algoritmusa. Az Earley-algoritmus.
B20.............................................................................................................................................................105 Balelemzés. Az LL(k)-elemzés algoritmusa (erős és gyenge). LL(k) nyelvtanok (*) és nyelvek (*).
B21.............................................................................................................................................................107 Jobbelemzés. Az LR(k)-elemzés algoritmusa. LR(k) nyelvtanok (*) és nyelvek (*). Prefix tulajdonságú nyelvek, kapcsolatuk az LR(k)-elemzéssel (*).
B22.............................................................................................................................................................111 A precedenciaelemzés algoritmusa. Erős és gyenge precedencia-nyelvtanok, erősen és gyengén precedencia-elemezhető nyelvek kapcsolata (*). Az operátor precedencia elemzés.
X-Y ............................................................................................................................................................113 2004-es tételpárok
Végtelen halmazok számossága: egyenlő, kisebb-egyenlő, illetve kisebb számosságú halmaz definíciója, Cantor-Bernstein-tétel (NB). Megszámlálhatóan végtelen és kontinuum számosságú halmaz. , , számossága és ezek összehasonlítása a természetes számok számosságával. Véges ábécé feletti szavak és nyelvek halmaza, e halmazok számossága. Hatványhalmaz, Cantor-tétel (*). hatványhalmazának számossága (*). Kontinuumhipotézis (NB).
A01
Végtelen halmazok számossága: egyenlő, kisebb-egyenlő, illetve kisebb számosságú halmaz definíciója Végtelen halmaz elemeit nem lehet megszámolni, két végtelen halmazt legfeljebb összehasonlítani tudunk. Ha két halmaz elemei között létezik kölcsönösen egyértelmű megfeleltetés (bijekció), akkor azt mondjuk, hogy a két halmaz egyenlő számosságú. Jele: A = B ; A ~ B . A ≤ B , ha megadható olyan f : A → B leképzés, ami A minden eleméhez B más-más elemét rendeli.
Ha A ekvivalens B egy részhalmazával, de B -vel magával nem, akkor B számossága nagyobb mint A számossága. Jele: A < B .
H halmaz számossága: H = {| X | | X ∈ A és
X ≅ H } . ( ≅ - párba állítható)
Cantor-Bernstein-tétel (NB) Ha az A és B halmazok között létezik f : A → B és g : B → A egyértelmű (injektív) leképezés, akkor létezik egy kölcsönösen egyértelmű (bijektív) h : A → B leképezés. [http://en.wikipedia.org/wiki/Cantor-Bernstein-Schroeder_theorem] Megszámlálhatóan végtelen és kontinuum számosságú halmaz Minden olyan halmaz megszámlálhatóan végtelen, melynek elemei sorozatba rendezhetőek. Megszámlálhatóan végtelen halmaz bármely részhalmaza véges, vagy megszámlálhatóan végtelen. A természetes számok ( ) halmazának számosságát megszámlálhatóan végtelennek nevezzük. Jele: = ℵ0 . A valós számok (
) halmazának számossága kontinuum (megszámlálhatatlanul végtelen). Jele: c .
Z, Q, R számossága és ezek összehasonlítása a természetes számok számosságával Az egész számok ( ) és között egy bijektív leképezés lehet pl. f : → alapján számossága megszámlálhatóan végtelen. Tehát = = ℵ0 .
= 2k → k ; 2k + 1 → −k ami
A racionális számokat ( ) fel tudjuk sorolni számlálójuk és nevezőjük összegének növekvő sorrendjében ⎛1 1 2 1 3 1 ⎞ = = ℵ0 . ⎜ , , , , , ,… ⎟ tehát ⎝1 2 1 3 1 4 ⎠ A valós számok ( ) halmazának számossága nagyobb mint a természetes számoké ℵ0 = ≤ =c [http://en.wikipedia.org/wiki/Cantor's_diagonal_argument] A valós számok és a számegyenes pontjai között kölcsönösen egyértelmű leképezés létesíthető. ( 0,1) = . A valós számok tetszőlegesen kis intervallumra leképezhetőek kölcsönösen egyértelmű módon. Véges ábécé feletti szavak és nyelvek halmaza, e halmazok számossága Véges ábécé feletti szavak halmaza megszámlálhatóan végtelen, hiszen a szavak sorba rendezhetőek, például lexikografikusan. A véges ábécé feletti nyelvek száma kontinuum. _____________________________________________________________________________________ 7
Utóbbi állítás szintén a Cantor-féle módszerrel bizonyítható. [Algoritmusok 204. oldal] Véges ábécé feletti generatív (rekurzív felsorolható) nyelvek halmaza ℵ0 számosságú. Mivel minden nyelvhez tartozik nyelvtan, azokat át tudjuk úgy alakítani, hogy felsorolhatóak, megszámlálhatóak legyenek, tehát az általuk generált nyelvek is megszámlálhatóan végtelenek. [http://www.cs.bme.hu/~csima/fony00/szamossag/index.html] Hatványhalmaz H H hatványhalmazán H összes részhalmazának halmazát értjük. 2 H = 2 = 2n , ha n a H halmaz
elemeinek száma. Cantor-tétel
H halmaz számossága mindig kisebb mint hatványhalmazának számossága, vagyis H < 2 H . Mindig van adott számosságnál nagyobb. Hatványhalmazának számossága (*) Az
hatványhalmazának számossága kontinuum, tehát 2 = c .
Kontinuum-hipotézis [http://en.wikipedia.org/wiki/Continuum_hypothesis] [Cantor] Nincs olyan halmaz, amelynek a számossága a természetes és a valós számok halmazának számossága között van. Azaz ∃ A, ℵ0 < A < 2ℵ0 . Ha lenne olyan A halmaz, amely igazolja a kontinuum-hipotézist, akkor A és a természetes számok halmaza között nem lenne kölcsönösen egyértelmű megfeleltetés, mert mindig lennének olyan A-beli elemek, amelyek szabadon (párosítatlanul) maradtak, és az A és a valós számok halmaza között nem lenne kölcsönösen egyértelmű megfeleltetés, mert mindig lennének olyan -beli elemek, amelyek szabadon (párosítatlanul) maradtak. Kurt Gödel bizonyította be, hogy a kontinuum hipotézis feltételezése nem okoz ellentmondást a ZFC axiómarendszerben. (Azaz ZFC ellentmondás-mentessége esetén a kontinuum hipotézis feltételezése nem vezet ellentmondásra.) A 60-as években Paul Cohen igazolta, hogy a kontinuum hipotézis tagadása nem okoz ellentmondást a ZFC axiómarendszerben. (Azaz ZFC ellentmondás-mentessége esetén a kontinuum hipotézis tagadása nem vezet ellentmondásra.) ZFC ~ Zermelo-Fraenkel-Cantor [Általánosított kontinuum-hipotézis] Ha A egy végtelen halmaz, akkor nincs más számosság A és 2 A között.
_____________________________________________________________________________________ 8
Determináns definíciója, alaptulajdonságai (*), kiszámítása, kifejtési tétel (*). Mátrixok, műveletek mátrixokkal, ezek tulajdonságai (*). Determinánsok szorzástétele (NB). Mátrix inverze, létezésének szükséges és elégséges feltétele, az inverz kiszámítása. Mátrix rangja, a rangfogalmak egyenlősége (*). Gráf szomszédossági mátrixa, hatványainak jelentése; gráf illeszkedési mátrixa, annak rangja (*).
A02
Determináns definíciója [Lineáris Algebra – 17-21. oldal] Az ⎛ α11 α12 … α1n ⎞ ⎜ α 21 α 22 … α 2 n ⎟⎟ ⎜ A= ⎜ ⎟ ⎜ ⎟ ⎝ α n1 α n 2 … α nn ⎠ mátrix determinánsa (vagy más szóval az α ij , i, j = 1, 2, ..., n elemekből képzett determináns)
det A =
α11 α12 … α1n α 21 α 22 … α 2 n
=
(− 1) ∑ σ
I (σ )
α1σ (1)α 2σ ( 2) …α nσ ( n )
α n1 α n 2 … α nn A jobb oldali összegzést az 1, 2, ..., n számok minden lehetséges σ permutációjára kell elvégezni. Ez annak a formalizmusa, hogy n-tényezős szorzatokat képzünk a mátrixból úgy, hogy minden sorból és oszlopból pontosan egy elemet veszünk. A szorzat tényezőit olyan sorrendben felírva, hogy az n-edik helyen az n-edik sorból vett elem álljon, megnézzük, hogy melyik elemnek mi az oszlopindexe – ezek az oszlopindexek az 1…n számok egy permutációját adják. Ezután aszerint látjuk el pozitív ill. negatív előjellel az adott szorzatot, hogy páros vagy páratlan-e a permutáció I(σ) inverziószáma. Ezt minden szorzatra elvégezve és az egyes szorzatokat összeadva, a determinánst kapjuk eredményül. Determináns alaptulajdonságai (*) [Lineáris Algebra – 23-29. oldal] 1. (a) Ha a főátló alatt vagy fölött minden elem 0, akkor a determináns a főátlóbeli elemek szorzata. (b) Ha valamelyik sor minden eleme 0, akkor a determináns is 0. (c) Ha valamelyik sor minden elemét λ-val megszorozzuk, akkor a determináns is λ-val szorzódik. 2. Ha valamelyik sor minden eleme egy kéttagú összeg, akkor a determináns két determináns összegére bomlik, ahol az egyikben az adott sorban rendre az összegek egyik tagja szerepel, a másikban pedig a másik tag, a többi elem pedig mind a két determinánsban ugyanaz, mint az eredetiben volt. 3. Ha két sor egyenlő, akkor a determináns 0. 4. Ha valamelyik sor egy másik sor λ-szorosa, akkor a determináns 0. 5. Ha egy sorhoz hozzáadjuk egy másik sor λ-szorosát, akkor a determináns nem változik. 6. Ha két sort felcserélünk, akkor a determináns a negatívjára változik. 7. Ha az elemeket a főátlóra tükrözzük, akkor a determináns nem változik. Minden sorokra kimondott tétel automatikusan igaz oszlopokra is. Determináns kiszámítása [Lineáris Algebra – 28. oldal] Gauss-eliminációval lépcsős alakra (amíg minden főátló alatti elem 0 nem lesz) kell hozni a mátrixot. Ekkor a determináns a főátlóbeli elemek szorzata. _____________________________________________________________________________________ 9
Kifejtési tétel (*) [Lineáris Algebra – 31-32. oldal] Egy n-edrendű determinánsból elhagyva az i-edik sort és a j-edik oszlopot egy (n-1)*(n-1)-es determináns keletkezik. Az α ij elemhez tartozó Aij előjeles aldeterminánson ennek a determinánsnak a (−1) i + j szeresét értjük. Ha egy sor minden elemét megszorozzuk a hozzá tartozó előjeles aldeterminánssal, az így kapott szorzatoknak az összege a determinánssal egyenlő: det A = α i1 Ai1 + α i 2 Ai 2 +
n
+ α in Ain = ∑ α ij Aij . j =1
Mátrixok, műveletek mátrixokkal, ezek tulajdonságai (*) [Lineáris Algebra – 41-46. oldal] Legyen T egy kommutatív test és k,n adott pozitív egészek. Ekkor a T test feletti k*n-es mátrixon egy olyan téglalap alakú táblázatot értünk, amelynek k sora és n oszlopa van és amelynek elemei T-ből valók. A T feletti k*n-es mátrixok halmazát T k ×n -nel jelöljük. Legyen A, B ∈ T k ×n , λ ∈ T . Ekkor A+B-t, illetve λA-t úgy kapjuk meg, hogy a megfelelő helyeken álló elemeket összeadjuk, illetve minden elemet λ-val megszorzunk. T elemeit szokás skalároknak is nevezni, ezért egy mátrix egy T-beli elemmel vett szorzatát a mátrix skalárszorosának hívjuk. A k*n-es mátrixok körében az összeadás asszociatív, kommutatív, létezik nullelem és minden elemnek létezik ellentettje. A k*n-es mátrixok az összeadásra nézve egy kommutatív csoportot alkotnak. Az összeadásra és szorzásra együttesen T k ×n vektortér T felett. Legyen A ∈ T k ×n , B ∈ T n×r . Ekkor C = AB ∈ T k ×r és az i-edik sor j-edik eleme A i-edik sorának és B jedik oszlopának mint két n komponensű vektornak a skaláris szorzata. A és B csak akkor szorozható össze (ebben a sorrendben), ha A-nak ugyannyi oszlopa van, mint ahány sora B-nek. Ha λ ∈ T és A,B,C tetszőleges olyan mátrixok, amelyekre az alábbi egyenlőségek valamelyik oldala értelmezve van, akkor a másik oldal is értelmes, és az egyenlőség teljesül. A(BC) = (AB)C [asszociativitás] A(B+C) = AB+AC, (A+B)C = AC+BC [disztributivitások] λ(AB) = (λA)B = A(λB) Azért van két disztributivitás, mert a szorzás nem kommutatív. Determinánsok szorzástétele (NB) [Lineáris Algebra – 51. oldal]
det( AB) = det A ⋅ det B Mátrix inverze, létezésének szükséges és elégséges feltétele, az inverz kiszámítása [Lineáris Algebra – 50. oldal] Most mátrixon négyzetes mátrixot kell érteni. E az egységmátrix. A mátrix kétoldali inverzén (inverzén) egy olyan K mátrixot értünk, amelyre AK=KA=E. Ha egy B mátrixra BA=E teljesül, akkor B az A mátrix bal oldali inverze (balinverze). Ha AJ=E akkor J az A jobb oldali inverzve (jobbinverze).
_____________________________________________________________________________________ 10
Bármely gyűrűben teljesül, hogy ha egy elemének létezik bal- és jobbinverze is, akkor ezek mindenképpen egyenlők és ekkor az elemnek nem lehet több bal-, illetve jobbinverze. Egy elem (kétoldali) inverze tehát egyértelműen meghatározott. Az A mátrix inverzét A −1 -gyel jelöljük. I. Ha det A ≠ 0 , akkor A-nak létezik (kétoldali) inverze. II. Ha A-nak létezik balinverze (vagy jobbinverze), akkor det A ≠ 0 . [Segédtétel] Legyen  az a mátrix, amelyben az i-edik sor j-edik eleme A ji ahol Akl az A mátrix α kl eleméhez tartozó előjeles aldeterminánst jelöli. Ekkor 0 … 0 ⎞ ⎛ det A ⎜ ⎟ det A … 0 ⎟ ⎜ 0 AÂ=ÂA=(det A)*E= ⎜ ⎟. ⎜ ⎟ ⎜ 0 0 … det A ⎟⎠ ⎝ Rögzített n esetén T n×n gyűrű a mátrixösszeadásra- és szorzásra. Mátrix rangja, a rangfogalmak egyenlősége (*) [Lineáris Algebra – 82-86. oldal] Az u 1 ,…, u m ∈ T k vektorok lineárisan összefüggők, ha léteznek olyan λ1 ,… λ m ∈ T skalárok, amelyek nem mind 0-k, és λ1 u 1 + … + λ m u m = 0 . Az u 1 ,…, u m ∈ T k vektorok lineárisan függetlenek, ha λ1 u 1 + … + λ m u m = 0 CSAK úgy valósulhat meg, ha mindegyik λi = 0 . Egy A mátrix oszloprangja r, ha A oszlopvektorai között található r lineárisan független, de r-nél több nem. Egy A mátrix sorrangja r, ha A sorvektorai között található r lineárisan független, de r-nél több nem. Egy A mátrix determinánsrangja r, ha van olyan r*r-es aldeterminánsa, ami nem nulla, de bármely r-nél nagyobb rendű aldeterminánsa (ha egyáltalán van ilyen) már nulla. Az itteni aldetermináns-fogalom nem ugyanaz, mint ami a kifejtési tételben szerepelt (mivel itt tetszőleges r sor és oszlop metszéspontjáról van szó) Bármely mátrix oszloprangja, sorrangja és determinánsrangja megegyezik. Gráf szomszédossági mátrixa, hatványainak jelentése; gráf illeszkedési mátrixa, annak rangja (*) [Gráfelmélet – 29. oldal] Egy n pontú G gráf A(G)=( aij ) n*n-es szomszédossági mátrixa:
aij = 0, ha az i-edik és j-edik pont nem szomszédos k, ha az i-edik és j-edik pont között k darab párhuzamos él halad l, ha i=j és az i-edik ponthoz l darab hurokél illeszkedik. Irányított gráfok esetében aij az i-edik pontból a j-edik pontba vezető élek száma. A szomszédossági mátrix t-edik hatványa olyan A t = (mij ) mátrix, melynek mij eleme az i-ből j-be vezető t hosszúságú élsorozatok száma. Ezen élsorozatok között nem csak az utakat, hanem az azonos ponton többször átmenő sorozatokat is számoljuk. Pl. hurokéleket nem tartalmazó A 3 diagonális elemeinek összege a gráfban található három hosszúságú körök számának hatszorosa.
_____________________________________________________________________________________ 11
Egy n pontú, e élű G gráf B(G)=( bij ) n*e-es illeszkedési mátrixa:
bij = 0, ha a j-edik él nem illeszkedik az i-edik ponthoz 1, ha a j-edik élnek az i-edik pont a kezdőpontja -1, ha a j-edik élnek az i-edik pont a végpontja Legyen megállapodás szerint bij =1 akkor is, ha a j-edik él az i-edik ponthoz illeszkedő hurokél. Irányítatlan esetben is ez a definíció, csak ott a j-edik él mindkét végpontjának megfelelő mátrixelem 1. Az n pontú c darab összefüggő komponensből álló, hurokélmentes irányított G gráf illeszkedési mátrixának rangja n-c.
_____________________________________________________________________________________ 12
Lineáris egyenletrendszer megoldása Gauss-eliminációval, megoldhatóság, a megoldás egyértelműségének feltétele. lineáris egyenletrendszer egyértelmű n × n -es megoldhatóságának jellemzése a determináns segítségével (*), általános egyenletrendszer megoldhatóságának jellemzése a rang segítségével (*). Térbeli koordinátageometria: sík egyenlete, egyenes egyenletrendszere, metszéspontok és metszésvonalak számítása.
A03
Lineáris egyenletrendszer megoldása Gauss-eliminációval [Lineáris Algebra – 55. oldal] Egy k egyenletből álló n ismeretlenes egyenletrendszer általános alakja: α11 x1 + α12 x2 + ... + α1n xn = β1
α 21 x2 + α 22 x2 + ... + α 2 n xn = β 2 α k1 x1 + α k 2 x2 + ... + α kn xn = β k Ahol az α ij együtthatók és a β i konstansok egy T kommutatív test elemei. A Gauss-elimináció során az alábbi lépéseket fogjuk elvégezni, amelyek az eredetivel ekvivalens egyenletrendszerekhez vezetnek.: 1. Valamelyik egyenletet egy 0-tól különböző T-beli elemmel végigszorozzuk. 2. Valamelyik egyenlethez egy másik egyenlet skalárszorosát hozzáadjuk. 3. Két egyenletet felcserélünk. 4. Az olyan egyenleteket, ahol valamennyi együttható és minden jobb oldali konstans is 0, elhagyjuk. Az algoritmus menete a következő: 1. Tegyük fel, hogy α11 ≠ 0 . Az első egyenletet osszuk végig α11 -gyel . 2. Minden i>1-re az i-edik egyenletből vonjuk ki az első egyenlet α i1 -szeresét. (Így x1 együtthatói az első egyenlet kivételével mind 0-vá váltak, azaz kiküszöböltük x1 -et). 3. Tegyük fel, hogy az így kapott egyenletrendszerben az új α 22 ≠ 0 . Ekkor az előző eljárást (1. – 2.) megismételjük: a második egyenletet végigosztjuk α 22 -vel, majd i>2-re az i-edik egyenletből kivonjuk a második egyenlet α i 2 -szeresét. 4. A fenti lépést (3.) minden i-re elvégezzük. Ha valamikor megakadunk, pl. α 22 = 0 , de α 52 ≠ 0 , akkor a 2. és az 5. egyenletet felcseréljük. Ha ez sem megy, azaz minden i ≥ 2 esetén α i 2 = 0 , akkor a harmadik ismeretlenre térünk át, vagyis α 23 -mat vizsgáljuk, stb... Az eredmény a lépcsős alak lesz, a főátlóban található elemek a vezéregyesek, a vezéregyesek alatt minden elem 0. A lépcsős alakból kiindulva, a Gauss-eliminációt visszafelé haladva elvégezve, a sorokból kinullázódnak a nem vezéregyes együtthatói. Ezt az alakot hívjuk redukált lépcsős alaknak. Az α ij együtthatókból képzett k × n -es mátrixot az egyenletrendszer együtthatómátrixának nevezzük, a jobb oldali konstansokkal kibővített k × (n + 1) -es mátrixot pedig az egyenletrendszer kibővített mátrixának nevezzük és A | b -vel jelöljük Megoldhatóság [Lineáris Algebra – 60. oldal] Az egyenletrendszer akkor és csak akkor megoldható, ha az RLA-ban nem fordul elő olyan sor, amelyben az együtthatóknak megfelelő rész csupa 0, a jobb oldali rész pedig nem 0 (tilos sor).
_____________________________________________________________________________________ 13
Megoldás egyértelműségének feltétele [Lineáris Algebra – 60. oldal] Az egyenletrendszer akkor és csak akkor egyértelműen megoldható, ha (nincs tilos sor és) a vezéregyesek száma megegyezik az ismeretlenek számával. Az n × n -es lineáris egyenletrendszer egyértelmű megoldhatóságának jellemzése a determináns segítségével (*) [Lineáris Algebra – 70. oldal] Legyen A ∈ T n×n . Ha D=det A=0, akkor az Ax = b egyenletrendszer vagy nem oldható meg, vagy pedig egynél több megoldása van. Az Ax = 0 homogén lineáris egyenletrendszernek akkor és csak akkor van nemtriviális megoldása, ha det A = 0 . Általános egyenletrendszer megoldhatóságának jellemzése a rang segítségével (*) [Lineáris Algebra – 86. oldal] Az Ax = b egyenletrendszert akkor és csak akkor oldható meg, ha r ( A) = r ( A | b) , azaz az együtthatómátrix rangja megegyezik a kibővített mátrix rangjával. Megoldhatóság esetén a megoldás akkor és csak akkor egyértelmű, ha a (közös) rang megegyezik az ismeretlenek számával. Sík egyenlete [Felsőbb Matematika – 347. oldal] A P0 ( x0 , y0 , z0 ) pontra illeszkedő, az n = ( A, B, C ) normál vektorra merőleges sík egyenlete: n( r − r 0 ) = 0 , ahol r 0 a P0 pont helyvektora, r pedig a sík tetszőleges P( x, y, z ) pontjába mutató helyvektor. A skaláris szorzást elvégezve, a sík Ax+By+Cz-D=0 alakú általános egyenletéhez jutunk. Egyenes egyenletrendszere [Felsőbb Matematika – 346. oldal] Legyen a P0 ( x0 , y0 , z0 ) pont helyvektora r 0 ( x0 , y0 , z0 ) . A P0 pontra illeszkedő v = (a, b, c) irányvektorral párhuzamos egyenes egyenlete: r = r 0 + tv , ahol a t valós paraméter az összes valós számon végigfut, r pedig az egyenes tetszőleges P( x, y, z ) pontjának helyvektora. Ezt az egyenletet szokás az egyenes paraméteres vektoregyenletének is nevezni. A bal oldalon és a jobb oldalon álló vektorok megfelelő koordinátái egymással egyenlők, azaz x = x0 + at , y = y0 + bt , z = z0 + ct . Ez az egyenes skaláris paraméteres egyenletrendszere. Ha az a, b, c koordináták egyike sem nulla, akkor x − x0 y − y0 z − z0 = = . a b c Metszéspontok és metszésvonalak számítása [Felsőbb Matematika – 348. oldal] Egyenes és sík döféspontja Az x = x0 + at , y = y0 + bt , z = z0 + ct egyenes és az Ax+By+Cz-D=0 sík döféspontjának meghatározásához azt a t értéket kell kiszámítani, amelyekhez tartozó x = x0 + at , y = y0 + bt , z = z0 + ct _____________________________________________________________________________________ 14
értékek kielégítik a sík egyenletét. Ezért ezeket az x, y, z kifejezéseket helyettesítsük be a sík egyenletébe, majd az így kapott egyenletet oldjuk meg (t-re). Ha egyetlen megoldás van, akkor van döféspont. Ha nincs megoldás, akkor nincs döféspont. Ha végtelen sok megoldás van, akkor az egyenes benne van a síkban.
_____________________________________________________________________________________ 15
Vektortér definíciója, példák. Altér, lineáris kombináció, generált altér, generátorrendszer. Lineáris függetlenség, a kétféle definíció ekvivalenciája. Kicserélési tétel (*). Bázis, vektorok bázis szerinti felírásának egyértelműsége. Dimenzió, a dimenzió egyértelműsége.
A04
Vektortér definíciója, példák. [Lineáris Algebra – 96. oldal] Az egy oszlopból álló mátrixokat oszlopvektoroknak nevezzük. Egy ilyen mátrix (egyetlen oszlopának) elemeit a vektor komponenseinek vagy koordinátáinak hívjuk. A T test elemeiből képzett q komponensű vektorok összességét ( T q×1 helyett röviden) T q -val jelöljük. [Lineáris Algebra – 63.oldal] Egy V nemüres halmazt vektortérnek nevezünk a T test felett, ha az alábbi kikötések (az ún. vektortéraxiómák) teljesülnek. (Ö) A V halmazon értelmezve van egy összeadás nevű művelet: bármely u , v ∈ V elempárhoz egyértelműen hozzárendelünk egy V-beli elemet, amelyet u+v-vel jelölünk. (Ö1) Az összeadás asszociatív. (Ö2) Az összeadás kommutatív. (Ö3) Létezik nullelem. (Ö4) Mindegyik elemnek létezik ellentettje. (S) A T test és a V halmaz között értelmezve van egy skalárral való szorzásnak nevezett művelet az alábbi módon: bármely λ ∈ T és u ∈ V elempárhoz egyértelműen hozzárendelünk egy V-beli elemet, amelyet λ u -val jelölünk. (S1) Bármely λ , µ ∈ T és v ∈ V esetén ( λ + µ ) v = λ v + µ v . (S2) Bármely λ ∈ T és u , v ∈ V esetén λ ( u + v ) = λ u + λ v . (S3) Bármely λ , µ ∈ T és v ∈ V esetén (λµ )v = λ ( µ v) . (S4) Bármely v ∈ V -re 1v=v, ahol 1 a T test egységeleme. A vektortér megadásához tehát meg kell adni a vektorok V halmazát, a T testet és értelmezni kell a két műveletet, az összeadást és a skalárral való szorzást. Ezután ellenőrizni kell, hogy a fenti axiómák teljesülnek-e. Vektortereknél a vektorok közötti szorzást általában nem értelmezzük, viszont speciális vektorterekben bevezetünk szorzást. Ilyenek pl. az algebrák vagy a skalárszorzattal ellátott euklideszi terek. Példák: P1. Origóból kiinduló sík-, illetve térvektorok a valós test felett a szokásos vektorösszeadásra és a valós számmal való szorzásra nézve. P2. T k a T test felett, ha a műveleteket a szokásos módon komponensenként végezzük. P3. k × n -es mátrixok a T test felett a mátrixok szokásos összeadására és skalárral való szorzására nézve. P4. T[x], azaz a T feletti polinomok a T felett a szokásos műveletekre nézve. P5. Az összes valós számon értelmezett valós értékű függvények a valós test felett a szokásos műveletekre. P6. A valós számsorozatok a valós test felett a szokásos műveletekre. P7. A komplex számok a valós test felett a komplex számok körében értelmezett műveletekre. Altér, lineáris kombináció, generált altér, generátorrendszer. [Lineáris Algebra – 103. oldal] A T test feletti V vektortér egy nemüres W ⊆ V részhalmazát altérnek nevezzük V-ben, ha W maga is vektortér ugyanazon T felett ugyanazokra a V-beli vektortérműveletekre (pontosabban ezeknek a műveleteknek a W-re történő megszorításaira) nézve. Egy T test feletti V vektortérben egy W nemüres részhalmaz akkor és csak akkor altér, ha _____________________________________________________________________________________ 16
(i) u , v ∈ W ⇒ u + v ∈ W (ii) v ∈ W , λ ∈ T ⇒ λ v ∈ W A tétel alapján így annak eldöntéséhez, hogy egy vektortér adott részhalmaza altér-e, nem kell valamennyi axiómát végignézni, hanem elég csupán a műveleti zártságot ellenőrizni. Példák altérre: P1. Bármely vektortérben az egész tér, illetve a csak a 0 vektorból álló részhalmaz mindig altér. Ezek a triviális alterek. P2. Bármely vektortérben egy tetszőleges, de rögzített vektor összes skalárszorosai mindig alteret alkotnak. Legyen V vektortér a T test felett, a1 ,… a n ∈ V , λ1 ,… , λn ∈ T . A λ1 a1 + … + λn a n vektort az a i vektorok ( λi skalárokkal képzett) lineáris kombinációjának nevezzük. Az a1 ,… a n ∈ V vektorokat a V vektortér generátorrendszerének nevezzük, ha V minden eleme előáll az a i vektorok lineáris kombinációjaként. A rendszer azt jelenti, hogy (a halmazzal ellentétben) ugyanaz a vektor többször is előfordulhat az a i -k között. A vektortér elemei többféleképpen is felírhatók egy adott generátorrendszer elemeinek lineáris kombinációjaként. Az a1 ,… a n ∈ V vektorok által generált altéren az a i vektorok összes lineáris kombinációinak a halmazát értjük és ezt a1 ,… a n -nel jelöljük. Azaz: a1 ,… a n = {λ1 a1 + … + λn a n | λ1 ,… , λn ∈ T }
Lineáris függetlenség, a kétféle definíció ekvivalenciája. [Lineáris Algebra – 115. oldal] A fogalom analóg a mátrixokra vonatkozó sor- és oszlopfüggetlenséggel. Az u1 ,… , u m ∈ V vektorok lineárisan összefüggők, ha léteznek olyan λ1 ,… , λm ∈ T skalárok, amelyek nem mind 0-k, és λ1u1 + … + λmum = 0 . Az u1 ,… , u m ∈ V vektorok lineárisan függetlenek, ha λ1u1 + … + λmum = 0 CSAK úgy valósulhat meg, ha mindegyik λ1 = 0 . Ezekkel ekvivalens megfogalmazás, hogy egy vektorrendszer lineárisan független, ha egyik eleme sem írható fel a többi lineáris kombinációjaként. Mivel vektorrendszerről van szó ugyanaz a vektor többször is előfordulhat, ami lényeges a függetlenség szempontjából: ha az u i -k között szerepelnek azonos vektorok, akkor a vektorrendszer biztosan összefüggő. Tetszőleges vektortérben: 1. Ha egy (legalább kételemű) lineárisan független rendszerből egy tetszőleges elemet elhagyunk, akkor a maradék vektorok is lineárisan független rendszert alkotnak. 2. Ha egy lineárisan összefüggő rendszerhez egy tetszőleges vektort hozzávesszük, akkor az így kapott vektorok is lineárisan összefüggők. 3. Egy legalább kételemű vektorrendszer akkor és csak akkor lineárisan összefüggő, ha van benne (legalább egy) olyan vektor, amely előáll a többi vektor lineáris kombinációjaként. 4. Ha u1 ,… , u m lineárisan független, de az u m +1 vektor hozzávételével kapott rendszer lineárisan összefüggő, akkor u m +1 előáll az u1 ,… , u m vektorok lineáris kombinációjaként. 5. Tegyük fel, hogy valamely v vektor előáll az u1 ,… , u m vektorok lineáris kombinációjaként. Ez az előállítás akkor és csak akkor egyértelmű, ha u1 ,… , u m lineárisan független. _____________________________________________________________________________________ 17
Egy v vektor lineárisan függ az u1 ,… , u m vektoroktól, ha v előáll az u1 ,… , u m vektorok lineáris kombinációjaként. Kicserélési tétel (*). [Lineáris Algebra – 122. oldal] Legyen f 1 ,… , f n lineárisan független rendszer és g 1 ,… , g k generátorrendszer egy V vektortérben. Ekkor bármely f i -hez található olyan g j , hogy f 1 ,… , f i −1 , g j , f i +1 ,… , f n is lineárisan független rendszer. Bázis, vektorok bázis szerinti felírásának egyértelműsége. [Lineáris Algebra – 120. oldal] Bázison lineárisan független generátorrendszert értünk. 1. Egy u1 ,… , u m vektorrendszer akkor és csak akkor bázis, ha a vektortér minden eleme egyértelműen előáll az u1 ,… , u m vektorok lineáris kombinációjaként. 2. Egy vektortérben bármely két bázis azonos elemszámú. 3. Legyen f 1 ,… , f n lineárisan független rendszer és g 1 ,… , g k generátorrendszer egy V vektortérben. Ekkor n ≤ k . 4. Egy V ≠ 0 vektortér bármely (véges) generátorrendszere tartalmaz bázist. 5. Ha egy V vektortérnek van (véges) generátorrendszere, akkor bármely lineárisan független rendszer kiegészíthető bázissá. Dimenzió, a dimenzió egyértelműsége. [Lineáris Algebra – 126. oldal] Egy V vektortér dimenzióján egy bázisának elemszámát értjük. Ha a vektortérnek nincs véges generátorrendszere, akkor a dimenziója végtelen. A 0 tér dimenziója 0. A V vektortér dimenzióját dimV-vel jelöljük. Mivel a bázis minimális generátorrendszer, ezért adott vektortér minden bázisának elemszáma megegyezik, tehát a dimenzió egyértelmű.
_____________________________________________________________________________________ 18
A05
Lineáris leképezés fogalma, példák. Lineáris leképezés mátrixa, vektor képének meghatározása a mátrix segítségével. Lineáris leképezések szorzata, szorzat mátrixa (*). Lineáris leképezések magtere, képtere, ezek altér volta. Dimenziótétel (*).
Lineáris leképezés fogalma, példák [Lineáris Algebra – 134. oldal] Legyen V1 és V2 ugyanazon T kommutatív test feletti vektorterek. A V1 -ről a V2 -be ható A függvényt (homogén) lineáris leképzésnek nevezzük, ha művelettartó, azaz 1. minden u, v ∈ V1 -re A(u + v) = Au + Av ; 2. minden u ∈ V , λ ∈ T -re A(λ u ) = λ ( Au ) . A lineáris leképezés tehát a V1 vektortér minden eleméhez egyértelműen hozzárendel egy V2 -beli vektort. Több V1 -beli elemhez ugyanazt a V2 -beli vektort rendelhetjük hozzá, azaz egy V2 -beli vektornak lehet több ősképe is V1 -ben. Példák: Legyen V1 = V2 a síkvektorok szokásos vektortere ( T = ). Ekkor lineáris leképezés: •
Az origó körül történő forgatás;
•
Az origóból történő középpontos nagyítás;
•
Az origón átmenő bármely egyenesre való tükrözés
Ha V = V1 = V2 , akkor feleltessük meg minden elemnek önmagát. Ezt a lineáris leképezést az identikus leképezésnek nevezzük és ε -vel jelöljük. Magtere a 0 , képtere a teljes V .
I. A01 = 0 2 , ahol 0i a Vi vektortér nulleleme. II. A(−u ) = − A(u ) . III. A(λ1 u1 + ... + λk u k ) = λ1 Au1 + ... + λk Au k . Azokat a lineáris leképezéseket, amelyeknél V = V1 = V2 , a V vektortér lineáris transzformációinak nevezzük. Legyen V1 és V2 tetszőleges vektortér ugyanazon T test felett. Ekkor az összes V1 → V2 lineáris leképezésből álló halmaz vektorteret alkot a T test felett. Ezt a vektorteret Hom(V1 ,V2 ) -vel jelöljük. Lineáris leképezés mátrixa [Lineáris Algebra – 160. oldal] Legyen a V1 vektortér egy bázisa a1 ,..., a n , a V2 vektortér egy bázisa pedig b1 ,..., b k . Egy A ∈ Hom(V1 ,V2 ) leképezésnek az a1 ,..., a n és b1 ,..., b k bázispár szerinti mátrixán azt a k × n -es mátrixot értjük, amelynek j-edik oszlopában az Aa j vektornak a b1 ,..., b k bázis szerinti koordinátái állnak. Ezt a mátrixot [ A]a ,b -vel jelöljük. Aa1 = α11 b1 + α 21 b 2 + ... + α k1 b k Aa 2 = α12 b1 + α 22 b 2 + ... + α k 2 b k Aa n = α1n b1 + α 2 n b 2 + ... + α kn b k Ekkor
_____________________________________________________________________________________ 19
[ A]a ,b Az
[ A]a ,b
⎛ α11 α12 … α1n ⎞ ⎜ α 21 α 22 … α 2 n ⎟⎟ ⎜ . = ⎜ ⎟ ⎜ ⎟ ⎝ α k1 α k 2 … α kn ⎠
mátrix oszlopai tehát tulajdonképpen rendre az a j báziselemek képei, mégpedig a b i
báziselemek segítségével felírva. A mátrix természetesen erősen függ attól, hogy milyen bázisokat választottunk a két vektortérben, más bázispár esetén általában a mátrix is egészen más lesz. Vektor képének meghatározása a mátrix segítségével [Lineáris Algebra – 162. oldal] Legyen V1 vektortér bázisa a1 ,..., a n , a V2 vektortér egy bázisa pedig b1 ,..., b k , továbbá A ∈ Hom(V1 ,V2 ) és v ∈ V1 . Ekkor
[ Av ]b = [ A]a ,b ⋅ [v ]a
ahol a jobb oldalon a két mátrix szorzata áll. Lineáris leképezések szorzata [Lineáris Algebra – 152. oldal] Legyenek V1 , V2 és V3 ugyanazon T test feletti vektorterek, A ∈ Hom(V2 ,V3 ) , B ∈ Hom(V1 ,V2 ) . Ekkor az A és B lineáris leképezések szorzatán azt az AB -vel jelölt V1 → V3 leképezést értjük, amely minden u ∈ V1 vektorhoz az A( Bu ) ∈ V3 vektort rendeli hozzá. Azaz ( AB )u = A( Bu ) . Az AB szorzatot tehát úgy kapjuk, hogy előbb a második tényezőként szereplő B leképzést alkalmazzuk, majd ezután az A -t. Szorzat mátrixa (*) [Lineáris Algebra – 163. oldal] Legyen V1 vektortér bázisa a1 ,..., a n , a V2 vektortér egy bázisa pedig b1 ,..., b k , V3 egy bázisa pedig c1 ,..., c r . Legyen továbbá A ∈ Hom(V2 ,V3 ) , B ∈ Hom(V1 ,V2 ) . Ekkor
[ AB ]a ,c = [ A]b,c ⋅ [ B ]a ,b .
Lineáris leképezések magtere [Lineáris Algebra – 135. oldal] Legyen A lineáris leképezés V1 -ről V2 -be. Az A leképezés magtere a V2 nullvektorára képződő elemek halmaza, ezt KerA -val jelöljük. Tehát KerA = { x ∈ V1 | Ax = 0} . Lineáris leképezések képtere [Lineáris Algebra – 135. oldal] Legyen A lineáris leképezés V1 -ről V2 -be. Az A leképezés képtere a képelemek halmaza, ezt Im A -val jelöljük. Tehát Im A = y ∈ V2 | ∃x ∈ V1 ; Ax = y = { Ax = x ∈ V1}
{
}
_____________________________________________________________________________________ 20
Magtér, képtér altér mivolta. [Lineáris Algebra – 135. oldal]
Im A altér V2 -ben, KerA altér V1 -ben. Dimenziótétel (*). [Lineáris Algebra – 146. oldal] Tegyük fel, hogy V1 véges dimenziós és V2 tetszőleges vektortér a T test felett, továbbá legyen A tetszőleges lineáris leképezés V1 -ről V2 -be. Ekkor dim KerA + dim Im A = dim V1 .
_____________________________________________________________________________________ 21
A06
Lineáris transzformációk, illetve négyzetes mátrixok sajátértékei, sajátvektorai. A sajátértékek és sajátvektorok meghatározása. Sajátaltér, ennek altér volta.
Lineáris transzformációk, illetve négyzetes mátrixok sajátértékei, sajátvektorai. [Lineáris Algebra – 170. oldal] Legyenek V1 és V2 ugyanazon T kommutatív test feletti vektorterek. A V1 -ről V2 -be ható A függvényt (homogén) lineáris leképezésnek nevezzük, ha művelettartó, azaz (i) minden u, v ∈ V1 -re A(u + v) = Au + Av ; (ii) minden u ∈ V1 , λ ∈ T -re A(λ u ) = λ ( Au ) . Azokat a lineáris leképezéseket, amelyeknél V = V1 = V2 , a V vektortér lineáris transzformációinak nevezzük. [Lineáris Algebra – 134. oldal] Továbbiakban V mindig véges dimenziós, nemnulla vektortér a T kommutatív test felett és A tetszőleges lineáris transzformáció. Egy λ ∈ T skalárt az A lineáris transzformáció sajátértékének nevezünk, ha létezik olyan v ∈ V nemnulla vektor, amelyre Av = λ v . Egy v ∈ V nemnulla vektort az A lineáris transzformáció sajátvektorának nevezünk, ha létezik olyan λ ∈ T skalár, amelyre Av = λ v . Egy transzformáció mátrixa akkor és csak akkor diagonális, ha a mátrixot sajátvektorokból álló bázis szerint írtuk fel. Ekkor a főátlóban álló elemek épp a megfelelő bázisvektorokhoz tartozó sajátértékek. A sajátértékek és sajátvektorok meghatározása. Legyen a1 ,… , a n bázis V-ben, A ∈ HomV . Egy λ ∈ T skalár akkor és csak akkor sajátértéke A-nak, ha az
[ A − λε ]a
mátrix determinánsa det( [ A − λε ]a )=0.
Legyen az A ∈ HomV transzformáció mátrixa (valamilyen bázisban) ⎛ α 11 α 12 … α 1n ⎞ ⎜ ⎟ ⎜ α 21 α 22 … α 2 n ⎟ [A]= ⎜ ⎟. ⎜ ⎟ ⎜α ⎟ ⎝ n1 α n 2 … α nn ⎠ Az A karakterisztikus polinomján a α11 − x α12 … α 21 α 22 − x … k A ( x) = det [ A − xε ] =
α n1
α n2
α 1n α 2n
… α nn − x
polinomot értjük. Az f polinom az A transzformáció minimálpolinomja, ha f a(z egyik) legkisebb fokú olyan (nemnulla) polinom, amelynek az A gyöke. Az A minimálpolinomját mA -val jelöljük. Egy f polinomnak az A „helyen” felvett helyettesítési értéke, f(A) is egy lineáris transzformáció. A0 = ε (identikus transzformáció). f(A)= α 0ε + α1 A + … + α k Ak . Az A transzformáció gyöke az f polinomnak, ha f(A)=0. Minden A-nak létezik minimálpolinomja, és ez konstans szorzó erejéig egyértelmű. [Cayley-Hamilton] A minimálpolinom osztója a karakterisztikus polinomnak. A minimálpolinom (T-beli) gyökei éppen a sajátértékek. _____________________________________________________________________________________ 22
Sajátaltér, ennek altér volta. 1. Minden sajátvektorhoz csak egy sajátérték tartozik. 2. Egy adott λ sajátértékhez tartozó összes sajátvektor és a 0 alteret alkotnak. Ezt az alteret a λ -hoz tartozó sajátaltérnek nevezzük. Bizonyítás: 1. Ha valamely v ≠ 0 vektorra λ és µ -vel is teljesül Av = λ v = µ v , akkor ebből v ≠ 0 miatt λ = µ következik. 2. Az adott halmazba pontosan azok a v vektorok tartoznak, amelyekre Av = λ v . Azt kell igazolni, hogy ez a nemüres halmaz zárt az összeadásra és a skalárral való szorzása. Legyen Av = λ v és Az = λ z , ekkor A(v + z ) = Av + Az = λ v + λ z = λ (v + z ) , és hasonlóan A(α v ) = λ (α v ) .
_____________________________________________________________________________________ 23
Kombinatorikus leszámlálási alapfeladatok, példák. Binomiális tétel. Gráfelméleti alapfogalmak: gráf, egyszerű gráf, izomorfia, részgráf, feszített részgráf, élsorozat, út, kör, összefüggőség, összefüggő komponens, fa, feszítőfa. Fák egyszerű tulajdonságai. Cayley-tétel (*).
A07
Kombinatorikus leszámlálási alapfeladatok, példák [Felsőbb Matematika – 21-22. oldal] Ha n különböző elemet valamilyen sorrendben helyezünk el, akkor egy-egy ilyen elhelyezést az n elem egy-egy permutációjának nevezzük. E permutációk száma: Pn := n ! . A faktoriális értelmezése:
n ! = 1⋅ 2 ⋅ 3 ⋅ ... ⋅ n,1! = 0, 0! = 0 . Ha az elemek között k elem megegyezik (ismétlődik), akkor az ún. ismétléses permutációk száma: n! Pnk := . k! Ha az elemek között r-féle különböző elem szerepel úgy, hogy az egymással megegyező elemek száma rendre k1 , k2 ,… , kr , akkor az n elemnek n! Pnk1 ,k2 ,…,kr := k1 !k2 !… kr ! ismétléses permutációja van. Példák: 1. 5 elem permutációinak száma: P5 = 5! = 1⋅ 2 ⋅ 3 ⋅ 4 ⋅ 5 = 120 . 2. Hány permutáció alkotható a MATEMATIKA szó betűiből? Az elemek (betűk) száma n=10. Ezek között megegyezők is vannak: két M betű, három A betű, és két T betű. Tehát k1 = 2, k2 = 3, k3 = 2 . Az ismétléses permutációk száma: 10! Pn2,3,2 = = 151200 2!3!2! Ha n különböző elem közül minden lehetséges módon kiválasztunk k elemet, és ezek összes permutációit vesszük, akkor megkapjuk n elem k-adosztályú variációit. Ezek száma: n! Vn ,k := n(n − 1)(n − 2)… (n − k + 1) = ,k ≤ n . (n − k )! Ha egy-egy variációban ugyanaz az elem többször is szerepelhet (legfeljebb k-szor), akkor n elem kadosztályú ismétléses variációhoz jutunk. Ezek száma: Vni, k := n k . Példák: 1. Öt elem harmadosztályú (ismétlés nélküli) variációinak száma: 5! 5! = = 5 ⋅ 4 ⋅ 3 = 60 . V5,3 = (5 − 3)! 2! 2. Hány 5-jegyű szám írható fel a 0, 1, 2 számjegyekkel? A számjegyek ismétlődhetnek. E három elem ötödosztályú ismétléses variációi közül azok alkothatnak ötjegyű számot, amelyek nem nullával kezdődnek. Ezek száma: i i V3,5 − V3,4 = 35 − 34 = 162 Ha n különböző elem közül minden lehetséges módon, de sorrendre való tekintet nélkül, kiválasztunk k elemet, akkor megkapjuk n elem k-adosztályú kombinációit. Ezek száma: _____________________________________________________________________________________ 24
⎛n⎞ n! Cnk := ⎜ ⎟ = ,k ≤ n . ⎝ k ⎠ k !(n − k )! Ha a kombinációban ugyanaz az elem többször is szerepelhet, akkor ismétléses kombinációról van szó. Ezek száma: ⎛ n + k − 1⎞ Cni ,k := ⎜ ⎟. ⎝ k ⎠ Példa: 90 elemből 5 elemet ⎛ 90 ⎞ 90! C905 := ⎜ ⎟ = ⎝ 5 ⎠ 5!85! Binomiális tétel [Felsőbb Matematika – 23. oldal] Ez a Newtontól származó tétel a kéttagú kifejezések (binomok) pozitív egész kitevőre való hatványozási szabályát rögzíti. ⎛ n⎞ ⎛n⎞ ⎛ n⎞ ⎛n⎞ (a + b) n = ⎜ ⎟ a n + ⎜ ⎟ a n −1b + ⎜ ⎟ a n − 2b 2 + … + ⎜ ⎟ b n , n ∈ ⎝ 0⎠ ⎝1⎠ ⎝ 2⎠ ⎝n⎠ ⎛n⎞ A tételben szereplő ⎜ ⎟ alakú, ún. binomiális együtthatók értelmezése megegyezik a kombinációknál ⎝k ⎠ látottakkal. Gráf, egyszerű gráf, izomorfia [Gráfelmélet – 15. oldal] Egy gráf egy rendezett pár, G=(V,E), ahol V egy nemüres halmaz, E pedig ebből a halmazból képezhető párok egy halmaza. V elemeit pontoknak vagy csúcsoknak, E elemeit éleknek nevezzük. Ha egy G gráfról beszélünk, akkor V(G)-vel illetve E(G)-vel jelöljük a gráf pontjainak illetve éleinek halmazát, míg a pontok illetve élek számát v(G)-vel illetve e(G)-vel jelöljük. Azokat a gráfokat, amelyekben nincsenek hurokélek és többszörös élek, egyszerű gráfnak nevezzük. [Gráfelmélet – 16. oldal] A G=(V,E) és a G’=(V’,E’) gráfok izomorfak, ha van olyan egy-egy értelmű megfeleltetés (bijekció) V és V’ között, hogy G-ben pontosan akkor szomszédos két pont, ha G’-ben a nekik megfelelő pontok is szomszédosak, és szomszédos pontpárok esetén ugyanannyi él fut közöttük. Részgráf, feszített részgráf [Gráfelmélet – 17. oldal] A G’=(V’,E’) gráf a G=(V,E) gráf részgráfja, ha V ' ⊆ V , E ' ⊆ E valamint egy pont és egy él pontosan akkor illeszkedik egymásra G’-ben, ha G-ben is illeszkedik. Ez utóbbi azért szükséges, mert különben előfordulhatna, hogy egy él végpontja nem tartozik a gráfhoz. Ha E’ azokból az E-beli élekből áll, amelyeknek mindkét végpontja V’-ben van, és E’ az összes ilyen élet tartalmazza, akkor G’ a G gráf V’ által feszített részgráfja. Élsorozat, út, kör [Gráfelmélet – 17. oldal] Egy (v0 , e1 , v1 , e2 , v2 ,..., vk −1 , ek , vk ) sorozatot élsorozatnak nevezünk, ha ei a vi−1 -t és vi -t összekötő él. Ha v0 = vk , akkor az élsorozat zárt. Ha a csúcsok mind különbözőek, akkor egy utat definiáltunk. Ha v0 = vk és különben a csúcsok mind különbözőek, akkor ez egy kör a gráfban. _____________________________________________________________________________________ 25
Az út hosszán az őt alkotó élek számát értjük. Összefüggőség, összefüggő komponens [Gráfelmélet – 17-18. oldal] Definiáljuk a p ≡ q relációt úgy, hogy p ≡ q akkor és csak akkor, ha p, q ∈ V (G ) és vezet út p és q között, vagy p=q. Ez egy ekvivalencia reláció. A fenti ekvivalencia osztályokat határoz meg G pontjain. Az egy osztályba eső pontok által feszített részgráfokat a G gráf összefüggő komponenseinek hívjuk, számukat c(G)-vel jelöljük. Ha a komponensek száma 1, vagyis ha G bármely két pontja között vezet út, akkor a G gráf összefüggő. Fa, feszítőfa [Gráfelmélet – 18-19. oldal] Az összefüggő körmentes gráfokat fáknak nevezzük. Az F gráf a G gráf feszítő fája, ha F fa, pontjainak halmaza megegyezik G pontjainak halmazával, és F élei szerepelnek G-ben is. Fák egyszerű tulajdonságai [Gráfelmélet – 19. oldal] Minden legalább 2 pontú fában van legalább két elsőfokú pont. Egy n pontú fa éleinek a száma n-1. Minden összefüggő G gráf tartalmaz feszítő fát. Cayley-tétel (*) [Gráfelmélet – 20. oldal] Az {1,2,…,n} pontokon n n−2 különböző fa adható meg.
_____________________________________________________________________________________ 26
A08
Minimális költségű feszítőfa keresése. Piros-kék algoritmus (*). Prim módszere, a módszer lépésszáma naív és kupacos (*) implementáció esetén. Kruskal algoritmusa, megvalósítása UNIO-HOLVAN adatszerkezettel, lépésszáma (*). Boruvka módszere (*).
Minimális költségű feszítőfa keresése [Algoritmusok elmélete – 151. oldal] Legyen G=(V,E) egy összefüggő gráf. A G gráf egy körmentes összefüggő F=(V,E’) részgráfja a gráf egy feszítőfája. Legyen továbbá az éleken értelmezve egy c:E → súlyfüggvény. Ekkor a G gráf egy F feszítőfája minimális költségű, ha költsége (a benne szereplő élek súlyainak összege) minimális G összes feszítőfája közül. Egy feszítőfa egy olyan fa, ami a G minden pontját tartalmazza, és az élei a G élei közül valók. A feladat: adott egy összefüggő irányítatlan gráf és az élein értelmezett súlyfüggvény. Meg kell keresni a gráf egy minimális költségű feszítőfáját. Piros-kék algoritmus (*) [Algoritmusok elmélete – 153. oldal] A minimális feszítőfa keresési algoritmusok közös elve, hogy valamilyen módon sorra nézik a G éleit és bizonyos éleket bevesznek a végső minimális feszítőfába, másokat pedig kihagynak. Tekinthetjük úgy mintha két színnel színeznénk a G éleit aminek során a kék élek belekerülnek a végeredményt jelentő minimális feszítőfába, a pirosak pedig nem. Tekintsük a súlyozott élű G gráf éleinek egy részleges színezését, melynél bármely él piros, kék vagy színtelen lehet. Ez a színezés takaros, ha van G-nek olyan minimális költségű feszítőfája, ami az összes kék élet tartalmazza, és egyetlen piros élet sem tartalmaz. A színezés során két szabályt használunk és egy élet csak akkor festünk be, ha a szabályok egyike alkalmazható: Kék szabály: Válasszunk ki egy olyan ∅ ≠ X ⊂ V csúcshalmazt, amiből nem vezet ki kék él. Ezután a legkisebb súlyú X-ből kimenő színezetlen élet fessük kékre. Piros szabály: Válasszunk G-ben egy olyan egyszerű kört, amiben nincs piros él. A kör egyik legnagyobb súlyú színtelen élét fessük pirosra. A piros-kék eljárás működése során mindig takaros színezésünk van. Ezen felül a színezéssel sosem akadunk el: végül G minden éle színes lesz. Következmény: Ha a piros-kék algoritmussal befestjük az összefüggő G=(V,E) gráf minden élét, akkor a kék élek egy minimális költségű feszítőfa élei. Ez már akkor is igaz, amikor van |V|-1 kék élünk (és esetleg van még színezetlen él). Az algoritmus tanulsága, hogy bárhol és bármikor alkalmazva sorra a két szabályt, végül mindenképpen egy minimális költségű feszítőfát kapunk. A recept helyessége szempontjából közömbös a sorrend viszont a hatékonyságéból nem. A következő nevezetes módszerek az eljárás pontosított változatai. Prim módszere [Algoritmusok elmélete – 155. oldal] Ez az algoritmus csak a kék szabályt alkalmazza. Legyen s a G egy rögzített csúcsa. Minden egyes színező lépéssel az s-et tartalmazó F kék fát bővítjük. Kezdetben a F csúcshalmaza {s}, végül pedig az egész V. A következő kék élnek az egyik legkisebb súlyú élet választjuk azok közül, amelyek F-beli pontból F-en kívüli pontba mennek. procedure Prim(G:gráf; var F:élek halmaza); var U:csúcsok halmaza; u,v: csúcsok; _____________________________________________________________________________________ 27
begin F:=Ø; U:={1}; while U<>V do begin legyen (u,v) egy legkisebb súlyú olyan él, melyre u ∈ U és v ∈ V\U; F:=F ∪ {(u,v)}; U:=U ∪ {v} end
(*)
end Prim módszer lépésszáma naiv implementáció esetén Tfh. a gráf az élsúlyokat tartalmazó C szomszédossági-mátrixával adott. C[i,j]= ∞ ha (i,j) nem éle G-nek. A (*) sor megvalósításához minden lépésben ki kell tudni választani az épp aktuális U és V\U halmazok közt futó legkisebb súlyú élek egyikét. Az összes él megvizsgálása túl sok idő lenne ezért bevezetünk két tömböt: ⎧*, ha i ∈ U KÖZEL[i]= ⎨ ⎩egy az i-hez legközelebbi U-beli csúcs, ha i ∈ V\U ⎧*, ha i ∈ U MINSÚLY[i]= ⎨ ⎩C[i,j], ha KÖZEL[i]=j ≠ * A következő kék él az (i,KÖZEL[i]) élek közül kerül majd ki. Ezért ezeket kékes éleknek nevezzük. Kezdetben U={1}, így a kezdőértékek: ⎧*, ha i=1 KÖZEL[i]= ⎨ ⎩1, ha i ≠ 1 ⎧*, ha i=1 MINSÚLY[i]= ⎨ ⎩C[i,1], ha i ≠ 1 Így a (*) sor megvalósítása: • A következő kék él kiválasztása: megkeressük a MINSÚLY[] tömb minimumát, ami a legrövidebb kékes él hossza. Ez legyen k-nál. Minimumkeresés O(n) lépés. A V\U-beli csúcsok közül k egyike az U-hoz legközelebbieknek. Így (u,v) él lehet a (KÖZEL[k],k) él. Ezt fogjuk F-be tenni, k-t pedig U-ba. Ezután MINSÚLY[k]:=KÖZEL[k]:=*. Ezek időigénye O(1). • A két tömb felfrissítése (azért kell, mert U bővült) O(n) lépésben: if KÖZEL[i]<>* and C[k,i]<MINSÚLY[i] then begin KÖZEL[i]:=k; MINSÚLY[i]:=C[k,i] end
Mindent egybevetve a while-ciklus belsejének végrehajtása O(n) idő. A ciklus n-szer fut le, így az egész algoritmus összidőigénye O( n 2 ). Prim módszer lépésszáma kupacos implementáció esetén(*) O(e log e) Kruskal algoritmusa Több helyen kezdünk el kék fákat növeszteni és fokozatosan kapcsoljuk össze a diszjunkt darabokat. A kék élek F halmazát bővítjük a legkisebb súlyú olyan éllel, amely az eddig kiválasztott élekkel együtt nem alkot kört. Egy ilyen él két diszjunkt kék fát köt össze. procedure Kruskal(G: gráf; var F,H:élek halmaza); begin F:=Ø; H:=E; while H<> Ø do begin _____________________________________________________________________________________ 28
Töröljük a H minimális súlyú (v,w) élét. Ha F ∪ {(v,w)}-ben nincs kör (azaz a v,w pontok különböző kék fákban vannak), akkor F:= F ∪ {(v,w)} end end H kezdetben a gráf összes éleinek halmaza. Arra kell hatékonya választ találni, hogy a kiválasztott (v,w) él az F eddigi éleivel kört alkot-e. Kruskal algoritmus megvalósítása UNIÓ-HOLVAN adatszerkezettel Adott egy n elemű S halmaz és ennek bizonyos U1 ,… ,U m részhalmazai, melyekre U i ∩ U j = ∅ (i<>j) és
U1 ∪ … ∪ U m = S (vagyis az U j részhalmazok S egy partícióját adják). Műveletek: UNIÓ( U i ,U j ) = az U i ,U j halmazokat az uniójukkal helyettesíti. HOLVAN(v) eredménye [ v ∈ S ] annak részhalmaznak a neve, amelynek v eleme. Az adatszerkezet nevezetes alkalmazásainál több UNIÓ és HOLVAN műveletből álló lépéssor végrehajtására van szükség abból a kezdőhelyzetből indulva, amelyben mindegyik részhalmaz egyelemű. Kruskal algoritmusban: S:=V(G), az U j részhalmazok pedig az F által meghatározott kék gráf fáinak a csúcshalmazai. Az éppen vizsgált (v,w) él az F-hez adva pontosan akkor nem eredményez kört, ha a végpontok különböző komponensben vannak, azaz HOLVAN(v)<>HOLVAN(w). Miután (v,w) élet F-be tettük, egyesítenünk kell a v-t és a w-t tartalmazó kék fákat. Ezt egy UNIÓ művelettel érhetjük el. Az induló feltétel is teljesül, ugyanis kezdetben n darab egypontú fánk van. A Kruskal algoritmus költsége (*) O(e log e) Boruvka módszere (*) [Algoritmusok elmélete – 155. oldal] Minden egyes kék fához válasszuk ki a legkisebb súlyú belőle kimenő (színtelen) élet. Színezzük kékre a kiválasztott éleket. Ennek előnye, hogy nagyszerűen párhuzamosítható.
_____________________________________________________________________________________ 29
A09
Legrövidebb utak keresése. Szélességi bejárás, lépésszáma. Dijkstra algoritmusa (*), lépésszáma mátrixos (*) és éllistás (*) megadással. Bellman-Ford algoritmusa, lépésszáma mátrixos megadás esetén. Floyd algoritmusa, lépésszáma mátrixos megadás
esetén (*). Legrövidebb utak keresése [Algoritmuselmélet – 115. oldal] A G gráf egy u-t v-vel összekötő u~v irányított útjának a hossza az úton szereplő élek súlyainak összege. A legrövidebb u~v úton egy olyan u~v utat értünk, amelynek a hossza minimális a G-beli u~v utak között. A G-beli u és v utak távolságán d(u,v)-t értjük, amely 0, ha u=v és ∞ , ha nincs u~v út. Jelöljünk ki a G gráfban egy s ∈ V csúcsot forrásnak. Célunk, hogy pontoknak az s-től való távolságát meghatározzuk. (Tegyük fel, hogy c(f) élsúlyok nemnegatívak.) Adott G=(V,E) irányított gráf, a c : E → + nemnegatív értékű súlyfüggvény, és egy s ∈ V csúcs (a forrás). Határozzuk meg minden v ∈ V -re a d(s,v) távolságot. Szélességi bejárás és lépésszáma [Algoritmuselmélet – 147. oldal] A gráf csúcsainak olyan bejárási sorrendje, ami szerint csak akkor foglalkozunk a kezdőponttól távolabbi csúcsokkal, ha a közelieket már mind meglátogattuk. A módszer általános lépésének lényege, hogy vesszük a sor elején lévő x csúcsot. Ezt töröljük a sorból, meglátogatjuk azokat az y szomszédait, amelyeket eddig még nem láttunk, majd ezeket az y csúcsokat a sor végére tesszük, Az algoritmus keretét adó bejár eljárás: procedure bejár( * elvégzi a G gráf szélességi bejárását * ) begin for v := 1 to n do bejárva[v] := hamis; for v := 1 to n do if bejárva[v] = hamis then szb(v); end procedure szb( v : csúcs ) var Q : csúcsokból álló sor, x, y : csúcsok; begin bejárva[v] := igaz; sorba( v, Q ); while ( Q nem üres ) do begin x := első( Q ); for minden x → y ∈ E élre do if bejárva[y] = hamis then begin bejárva[y] := igaz; sorba( y, Q ); end end end A szélességi bejárás költsége O(n+e), mert minden csúcsot pontosan egyszer teszünk be a sorba, és minden irányított élet egyszer vizsgálunk meg. _____________________________________________________________________________________ 30
Dijkstra algoritmusa (*) [Algoritmuselmélet – 116- oldal] Egy a G csúcsaival indexelt D[] tömböt használunk. D[v] az eljárás során eddig megismert legrövidebb s~v utak hosszát tartalmazza. A D[v] mennyiség mindenkor a felső közelítése lesz a keresett d(s,v) távolságnak. A G gráf az alábbi C adjacencia-mátrixával adott: v=w ⎧ 0 ⎪ C [ v, w] = ⎨c(v, w) v ≠ w, (v, w) éle G-nek . ⎪ ∞ különben ⎩ Kezdetben D[v]:=C[s,v] minden v ∈ V csúcsra. Válasszuk ki ezután az s csúcs szomszédai közül a hozzá legközelebbit, vagyis egy olyan x ∈ V \ {s} csúcsot, melyre D[x] (= C[s,x]) minimális. x-et betesszük s mellé a KÉSZ halmazba. A KÉSZ halmaz azokat a csúcsokat tartalmazza, amelyeknek az s-től való távolságát már tudjuk. Ezek után módosítsuk a többi csúcs D[w] értékét, ha az eddig ismertnél rövidebb úton el lehet érni oda x-en keresztül, azaz ha D[x]+c(x,w) < D[w] . Most újra válasszunk ki az x ∈ V \ KÉSZ csúcsok közül egy olyat, amelyre D[v] minimális. Majd megint módosítsuk a D[]-értéket, és így tovább, míg minden csúcs be nem kerül a KÉSZ halmazba. Az algoritmus: (1) KÉSZ := {s} for minden v ∈ V csúcsra do D[v] := C(s,v) (* a d(s,v) távolság első közelítése *) (2) for i :=1 to n-1 do begin Válasszunk olyan x ∈ V \KÉSZ csúcsot, melyre D[x] minimális. Tegyük x-et a KÉSZbe. for minden w ∈ V \KÉSZ csúcsra do (3) D[w] := min{D[w], D[x] + C[x,w]} (* d(s,w) új közelítése *) end Dijkstra algoritmus lépésszáma mátrixos (*) és éllistás (*) megadással Mátrixos esetben a lépésszám a következőképp alakul: A kezdőérték beállítása O(n) elemi lépést vesz igénybe. A (2) ciklus belsejében a minimumkeresés és a (3) ciklus szintén O(n)-et, így mivel a (2) ciklus n-1-szer fut le, az algoritmus összidőigénye O(n 2 ) . Ha a G gráf ritka, akkor az időigény csökkenthető, amennyiben a gráfot éllistával tároljuk. Az előző algoritmust a következőképp módosítjuk: a V \ KÉSZ csúcsait kupacba rendezve tartjuk a D[] érték szerint. A kezdeti kupacépítés O(n) költséggel végezhető el. A (2) ciklus belsejében a minimumkeresést egy O(logn) MINTÖR művelettel helyettesítjük A D[] értékek újraszámolását és a kupac-tulajdonság helyreállítását csak a választott csúcs szomszédaira kell elvégezni. Minden csúcsot egyszer választunk ki, a szomszédok számának összege e. Tehát itt az összidőigény O((n+e)logn). Bellman-Ford algoritmusa és lépésszáma mátrixos megadás esetén [Algoritmusok – 120-122. oldal] Ez az algoritmus akkor is működik, ha bizonyos élsúlyok negatívak. Csupán annyit teszünk fel, hogy G nem tartalmaz negatív összhosszúságú irányított kört. Tegyük fel, hogy G=(V,E) súlyozott élű irányított gráf a C adjacencia-mátrixával adott (ebben a diagonális elemek nullák, az i,j helyzetű elem a c(i,j) élsúly, ha i → j éle G-nek, a többi elem pedig ∞ ). Az egyszerűség kedvéért tegyük még fel, hogy V = {1, 2,… , n} és s=1. A módszer tulajdonképpen egy T[1 : n-1, 1: n ] táblázat sorról sorra haladó kitöltése. Azt szeretnénk elérni, hogy minden i,j-re (1 ≤ i ≤ n − 1,1 ≤ j ≤ n) teljesüljön, hogy _____________________________________________________________________________________ 31
(*) T[i,j]= a legrövidebb olyan 1~j irányított utak hossza, melyek legfeljebb i élből állnak. Ekkor a T[n-1,j] a legrövidebb 1~j utak hosszát tartalmazza. A módszert úgy tekintjük, hogy a keresett távolságokat n-1 menetben közelítjük. Az első menet, a T[1,j] sor kitöltése kézenfekvő, hiszen nyilván T[1,j] = C[1,j]. Tegyük fel ezután, hogy az i-edik sort már kitöltöttük, azaz a T [i,1] , T [i, 2] ,… , T [i, n ] értékeire (*) igaz. Ekkor (**)
{
}
T [i + 1, j ] := min T [i, j ] , min {T [i, k ] + C [ k , j ]} k≠ j
adja az i+1. sor helyes értékeit. Ugyanis egy legfeljebb i+1 élből álló π = i ~ j út kétféleképpen keletkezhet: 1. Az útnak kevesebb, mint i+1 éle van. Ekkor ennek hossza szerepel a T[i,j]-ben. 2. Az út éppen i+1 élből áll. Legyen l a π út utolsó előtti pontja. Ekkor a π út 1~l szakasza i élből áll, és a π minimalitása miatt minimális hosszúságú a legfeljebb i élű 1~l utak között. A hossza tehát T már elkészült darabjára tett felvetésünk miatt T[i,l]. Eszerint a π hossza T[i,l]+C[l,j]. Bellman-Ford algoritmus lépésszáma mátrixos megadás esetén A T táblázat egy értékének a (**) szerinti számítása n-1 összeadást és ugyanennyi összehasonlítást (minimumkeresés n elem közül) igényel. Mindez összesen O (n3 ) elemi műveletet igényel. Floyd algoritmusa Tegyük fel továbbra is, hogy V = {1, 2,… , n} , és hogy a G gráf a C adjacencia-mátrixával adott. A pontpárok távolságának kiszámítására egy n × n -es F mátrixot fogunk használni. Kezdetben F[i,j]=C[i,j]. Ezután egy ciklust hajtunk végre, amelynek a k-adik lefutása után a F[i,j] azon i~j utak legrövidebbjeinek a hosszát tartalmazza, amelyek közbülső pontjai k-nál nem nagyobb sorszámúak. Az Fk = [i, j ] értékeket a következőképp számíthatjuk ki a k-1-edik iteráció utáni Fk −1 = [i, j ] értékekből: Nyilván egy legrövidebb i~j út, melyen a közbülső pontok száma legfeljebb k, vagy tartalmazza a k csúcsot, vagy nem. Ha igen, akkor ezen út első fele egy olyan legrövidebb i~k út, ami mentén a közbülső pontok sorszáma legfeljebb k-1, tehát hosszát Fk −1 = [i, k ] már tartalmazza; második fele meg szintén egy ilyen tulajdonságú legrövidebb k~j út, aminek a hossza Fk −1 = [ k , j ] .
Ha az út nem tartalmazza k-t, akkor Fk = [i, j ] = Fk −1 = [i, j ] . Mivel Fk = [i, k ] = Fk −1 = [i, k ] és Fk = [ k , j ] = Fk −1 = [ k , j ] , az algoritmust végrehajthatjuk az F mátrix egyetlen példányával.
(1) for i := 1 to n do for j := 1 to n do F[i,j] := C[i,j] (2) for k := 1 to n do for i := 1 to n do for j := 1 to n do F[i,j] := min{F[i,j], F[i,k] + F[k,j]}. Floyd algoritmus lépésszáma mátrixos megadás esetén (*) Az algoritmus lépésszáma n3 -nel arányos, hiszen a domináló rész a három egymásba ágyazott ciklus. Ez nagyságrendben ugyanannyi, mintha a Dijkstra mátrixos változatát minden csúcsra mint forrásra lefuttatnánk.
_____________________________________________________________________________________ 32
Mélységi bejárás, lépésszáma, mélységi és befejezési számozás, az élek osztályozása irányított és irányítatlan gráfok esetén. Alkalmazások: DAG tulajdonság ellenőrzése (*), topologikus sorrend keresése (*), legrövidebb és leghosszabb út keresése DAG-ban, PERT módszer.
A10
Mélységi bejárás, lépésszáma [Algoritmusok elmélete – 127. oldal] Legyen G=(V,E) egy irányított gráf, ahol V={1,...,n}. L[v] legyen a v csúcs éllistája. A bejárva[1:n] logikai vektor pedig adja meg minden ponthoz, hogy jártunk-e már ott. Ezek utána a mélységi bejárás: procedure bejár begin for v:=1 to n do bejárva[v]:=hamis; for v:=1 to n do if bejárva[v]=hamis then mb(v) end procedure mb(v:csúcs) var w:csúcs; begin (1) bejárva[v]:=igaz; for minden L[v]-beli w csúcsra do (2) if bejárva[w]=hamis then mb(w) end Minden csúcsra pontosan egyszer hívjuk meg az mb eljárást és ott egy csúcs minden szomszédját pontosan egyszer vizsgáljuk meg. Ezért az algoritmus időigénye O(n+e) vagy ami ugyanaz: O(max(n,e)). Ha az eredeti kezdőpontból nem érhető el minden pont (irányított gráf esetén) és bejártuk az eredeti kezdőpontot, akkor tetszőlegesen választható új kezdőpontként egy még nem bejárt csúcs. Mélységi és befejezési számozás A G (irányított) gráf csúcsainak egy mélységi számozása a gráf v csúcsához azt a számot rendeli, mely megadja, hogy az mb eljárás (1) sorában a csúcsok közül hányadikként állítottuk bejárva[v] értékét igazra. A v csúcs mélységi számát mszám[v] jelöli. A G (irányított) gráf csúcsainak egy befejezési számozása a gráf v csúcsához azt a sorszámot rendeli, mely megadja, hogy a csúcsok közül hányadikként ért vége az mb(v) hívás. A v csúcs befejezési számát bszám[v] jelöli. A befejezési szám mutatja meg, hogy hányadik lépésben jártuk be egy csúcs összes szomszédját. A számozás megvalósításához az algoritmusban felhasználunk egy msz és bsz integert, amikben a kiadott legnagyobb mélységi és befejezési sorszámok lesznek tárolva (gyakorlatilag időbélyegek). Az (1) sor után növeljük msz-t és tároljuk mszám[v]-ben, a (2) utasítás után (az end előtt) pedig bsz-szel és bszám[v]-vel tesszük ugyanezt. Ezek mind konstans extra munkák csúcsonként tehát a lépésszám nem változik. mszám[] és bszám[] kezdetben csupa 0. Az élek osztályozása A G=(V,E) irányított gráf vÆw éle faél (az adott mélységi bejárásra vonatkozóan), ha megvizsgálásakor a (2) sorban a (bejárva[w]=hamis) feltétel teljesül. T jelölje azt a gráfot, amelynek csúcshalmaza V, élei pedig a faélek. _____________________________________________________________________________________ 33
T-t a G egy mélységi feszítő erdejének nevezzük. Ha T csak egy komponensből áll, akkor mélységi feszítőfáról beszélünk. Nevezzük a G gráf y csúcsát az x csúcs T-beli leszármazottjának, ha van xÆy irányított út T-ben. Az x csúcs részfáját az x leszármazottai és a köztük menő faélek alkotják. Tekintsük a G irányított gráf egy mélységi bejárását és a kapott T mélységi feszítő erdőt. Ezen bejárás szerint G egy xÆy éle faél, ha xÆy éle T-nek; előreél, ha xÆy nem faél, y leszármazottja x-nek T-ben és x<>y visszaél, ha x leszármazottja y-nak T-ben (a hurokél is ilyen) keresztél, ha x és y nem leszármazottai egymásnak. Az élek osztályozása az algoritmusban: xÆy egy ha az él vizsgálatakor . faél mszám[y]=0 visszaél mszám[y]<=mszám[x] és bszám[y]=0 előreél mszám[y]>mszám[x] keresztél mszám[y]<mszám[x] és bszám[y]>0 Ezek az összehasonlítások szintén konstans lépésszámú plusz munkák csúcsonként úgyhogy nem változik az O(n+e) lépésszám a bejáráskor ha közben osztályozunk is. DAG tulajdonság ellenőrzése (*) Egy G irányított gráf DAG (directed acyclic graph), ha nem tartalmaz irányított kört. A következő tétel azt jelenti, hogy a mélységi bejárással O(n+e) időben eldönthető DAG-e egy irányított gráf. Legyen G=(V,E) egy irányított gráf. Ha G egy DAG, akkor egyetlen mélységi bejárása során sincs visszaél. Fordítva: ha G-nek van olyan mélységi bejárása, amelyre nézve nincs visszaél, akkor G egy DAG. DAG topologikus rendezése Legyen G=(V,E) (|V|=n) egy irányított gráf. G egy topologikus rendezése a csúcsoknak egy olyan v1 ,… vn sorrendje, melyben xÆy ∈ E esetén x előbb van, mint y (azaz ha x= vi ,y= v j , akkor i<j) Egy irányított gráfnak akkor és csak akkor van topologikus rendezése, ha DAG. Legrövidebb és leghosszabb út keresése DAG-ban Topologikus rendezést használva lineáris időben, azaz O(n+e) lépésben megoldható a leghosszabb út keresés. Tfh már meghatároztuk a G csúcsainak egy x1 , x2 ,… , xn topologikus rendezését. Feltehetjük, hogy s = x1 , mert csak a kisebbtől a nagyobb sorszámú felé mehet él. A d( s, xi ) távolságokra érvényes: d ( s, xi ) = min
( x j , xi )∈E
{d (s, x ) + c( x , x )} , j
j
i
ahol c( x j , xi ) az xi Æ x j él súlya. Ezt használva sorban minden i-re kiszámíthatjuk a d távolságokat. Az a lényeg, hogy ha ( x j , xi ) él, akkor j
A leghosszabb út keresése DAG-okban ugyanúgy lineáris művelet, csak az előző algoritmusban nem minimumot, hanem maximumot számolunk. Tehát: l ( s, xi ) = max {l ( s, x j ) + c( x j , xi )} ( x j , xi )∈E
Ha G egy éllistával adott súlyozott élű DAG, akkor az egy forrásból induló legrövidebb és leghosszabb utak meghatározásának feladatai O(n+e) lépésben megoldhatók. PERT módszer A Program Evaluation and Review Technique tervezési módszer súlyozott élő DAG-okkal ábrázolja egy összetett feladat részei közötti viszonyokat. A csúcsok a nagy feladat részei, eleminek mondható teendői. Az x teendőből irányított él vezet az y teendőbe, ha x-et előbb kell elvégezni, mint y-t. Külön csúcsok (pl. K és V) jelölik a teljes feladat kezdetét és végét. Értelmesen definiált élekkel minden topologikus rendezésnél K lesz az első és V az utolsó él. Az éleken nemnegatív súlyok vannak. c(x,y) azt mondja meg, hogy mennyi időnek kell eltelnie x megkezdésétől y megkezdéséig. Az x részfeladat legkorábbi kezdési időpontja l(K,x) lesz, ami O(n+e)-ben megtehető. A módszertan fontos fogalmai a kritikus út, él és csúcs. Kritikus úton olyan KÆV utat értünk, amelynek hossza l(K,V). A kritikus élek és csúcsok pedig a kritikus utakon levő élek, illetve csúcsok. Az elnevezés onnan ered, hogy ha a kritikus utakon késve kezdődnek a tevékenységek, ez az egész munka befejezését késlelteti. A kritikus csúcsokat és éleket a G PERT-gráf topologikus rendezésében visszafele azaz V-től K felé haladva határozhatjuk meg. Első lépésként megjelöljük V-t mint kritikus csúcsot. Általában tfh. az xi csúcsnál tartunk és xi kritikus csúcs.
l ( K , xi ) = l ( K , x j ) + c( x j , xi ) teljesül. Az eljárás során minden élet egyszer veszünk szemügyre, így a költség O(n+e), tehát:
Ekkor az x j Æ xi élet és az x j csúcsot akkor kell megjelölnünk, ha
Egy éllistával adott PERT-gráf esetén a részfeladatok legkorábbi kezdési ideje, ezenfelül a kritikus élek és csúcsok lineáris időben meghatározhatók.
_____________________________________________________________________________________ 35
Síkbarajzolhatóság, kapcsolat a gömbre rajzolhatósággal, Euler-tétel (*), felső becslés az élek számára. Kuratowski-gráfok, ezek síkba nem rajzolhatósága, Kuratowskitétel (NB), Fáry-Wagner-tétel (NB). Dualitás, gyenge izomorfia fogalma, absztrakt dualitás, Whitney tételei (NB).
A11
Síkbarajzolhatóság és kapcsolata a gömbre rajzolhatósággal [Gráfelmélet – 22. oldal] Ha egy gráf lerajzolható a síkba úgy, hogy az élei ne messék egymást, akkor a gráf síkbarajzolható. A síkbarajzolt gráf a síkot tartományokra osztja. Hasonlóan definiáljuk a gömbre rajzolható gráfot. Egy G gráf pontosan akkor síkbarajzolható, ha gömbre rajzolható Egy síkban lévő gráf leképezhető egy gömbfelületre oly módon, hogy ezt a gömbfelületet valamelyik pontjával a síkra helyezzük, az érintkezési pontot tekintjük a gömbfelület déli pólusaként, és az északi pólusból, mint vetítési pontból olyan egyenes vonalakat húzunk, amelyek a síkban lévő gráf minden egyes pontját összekötik az északi pólussal. Ezeknek a vonalaknak egy-egy további metszéspontja van a gömbfelülettel, ezek szolgáltatják a kívánt vetítést. Ez az ún. sztereografikus projekció. Ez az eljárás megfordítható, ha az északi pólus nem pontja a gráfnak és nem halad át rajta él, így a gömbre rajzolt gráfok leképezhetők a síkba. Euler-tétel (*) [Gráfelmélet – 23. oldal] Egy összefüggő síkbeli gráf, amelynek n csúcsa, e éle és t tartománya van (beleértve a külső, nem korlátos tartományt is), eleget tesz az Euler-formulának: n-e+t=2. Felső becslés az élek számára [Gráfelmélet – 23. oldal] Ha G egyszerű, síkbarajzolható gráf és pontjainak száma legalább 3, akkor az előbbi jelölésekkel e ≤ 3n-6 . Mivel a gráf síkbarajzolható és egyszerű, minden tartományát legalább 3 él határolja. Nyilvánvaló, hogy egy él viszont legfeljebb két tartományt határához tartozik. Így 3t ≤ 2e . Az Euler-formulát felhasználva az 3(e − n + 2) ≤ 2e egyenlőtlenséget kapjuk. Ebből átrendezéssel következik, hogy e ≤ 3(n − 2) = 3n − 6 . Ha G-ben minden kör legalább 4 hosszú, akkor e ≤ 2n − 4 is teljesül. Kuratowski-gráfok és síkbarajzolhatóságuk [Gráfelmélet – 24. oldal] Az ábrán látható két gráfot Kuratowski-gráfoknak nevezzük. Az első K 5 , az öt pontú teljes gráf. A másik K 3,3 , a “három ház – három kút” gráf.
_____________________________________________________________________________________ 36
A Kuratowski-gráfok, K 5 és K 3,3 nem rajzolhatók síkba. A K 3,3 esetében a pontok száma 6, az élek száma 9, így az Euler-formulából t=5. Minden egyes tartomány határának legalább négy élet kell tartalmaznia, hiszen ha volna olyan, amelynek a határa három élből állna, akkor ezek között lenne két ház, vagy két kút, amelyek össze vannak kötve, ez pedig ellentmondás. Minden él két tartománynak a határán van, így teljesül 4t ≤ 2e , de ez a 9 ≥ 10 ellentmondáshoz vezet. Tehát K 3,3 nem síkbeli. K 5 esetében minden tartomány határa legalább három élet tartalmaz, vagyis 3t ≤ 2e . Mivel azonban az Euler-formulából t=7 és e=10, ismét ellentmondásra jutunk. Kuratowski-tétel (NB) Egy gráf síkbarajzolhatóságát nyilván nem befolyásolja, hogyha egy élet egy 2 hosszú úttal helyettesítünk, azaz egy élet egy új 2 fokú csúcs felvételével két élre bontunk, vagy ha 2 fokú csúcsra illeszkedő éleket egybeolvasztunk, és a csúcsot elhagyjuk. A G és H gráfok topológikusan izomorfak,ha a fent említett transzformációk ismételt alkalmazásával izomorf gráfokba transzformálhatóak. Egy gráf akkor és csak akkor síkbarajzolható, ha nem tartalmaz olyan részgráfot, amely topológikusan izomorf K 3,3 -mal vagy K 5 -el. Fáry-Wagner-tétel (NB) Ha G egy egyszerű, síkbarajzolható gráf, akkor létezik olyan síkbeli ábrázolása is, hogy minden élet egy egyenes szakasszal rajzolhatunk le. Dualitás, gyenge izomorfia fogalma, absztrakt dualitás [Gráfelmélet – 35-41. oldal] A G gráfhoz gyártsunk egy G* gráfot az alábbi utasítással: G tartományaihoz rendeljük az új G* gráf pontjait és G*-ban akkor kössünk össze két pontot éllel, ha a megfelelő két G-beli tartománynak van közös határvonala. Az így gyártott G* gráfot a G duálisának nevezzük. Két gráfot gyengén izomorfnak nevezünk, ha élei között kölcsönösen egyértelmű és körtartó leképezés hozható létre. Körmátrix, vágásmátrix, körtartó leképezés: [Gráfelmélet – 33-35. oldal] A G és G* gráfok egymás absztrakt duálisai, ha létezik köztük olyan, kölcsönösen egyértelmű leképezés, mely kört vágásba, vágást körbe visz. Whitney tételei (NB) I. Egy gráfnak akkor és csak akkor létezik absztrakt duálisa, ha síkbarajzolható. II. Legyen G síkbarajzolható gráf és H vele gyengén izomorf. Ekkor H is síkbarajzolható, G * és H * szintén gyengén izomorfak, végül (G * )* és ( H * )* gyengén izomorfak G-vel, ill. H-val. _____________________________________________________________________________________ 37
A12
Hamilton-körök és -utak. Szükséges feltétel Hamilton-kör/út létezésére. Elégséges feltételek: Ore (*) és Dirac tétele. Hamilton-kör keresés bonyolultsága (*). Euler-körök és -utak, ezek létezésének szükséges és elégséges feltétele.
Hamilton-körök és –utak [Gráfelmélet – 27. oldal] Egy G gráfban Hamilton-körnek nevezünk egy H kört, ha G minden pontját (pontosan egyszer) tartalmazza. Egy utat pedig Hamilton-útnak, ha G minden pontját pontosan egyszer tartalmazza. Szükséges feltétel Hamilton-kör/út létezésére A Hamilton-gráf olyan gráf amiben van Hamilton-kör. Ha a G gráfban létezik k darab olyan pont, amelyeket elhagyva a gráf több mint k komponensre esik szét, akkor nem létezik G-ben Hamilton kör. Ha létezik k darab olyan pont melyeket elhagyva G több mint k+1 komponensre esik szét, akkor nem létezik G-ben Hamilton út. Bizonyítás: vesszük azt a k darab csúcsot, melyek elhagyásával G több mint k komponensre esik szét. Az elhagyott pontok közötti részen az eredeti Hamilton-kör élei futnak így ezek már nem összefüggőek. Ilyen „ívekből” k darabot kapunk. Vagyis G nem eshet szét k-nál több komponensre. Ha G Hamilton-gráf, akkor minden pontjának fokszáma legalább 2. [http://www.larry.denenberg.com/math22/LectureV.pdf] Elégséges feltételek: Ore (*) és Dirac tétele Ore: Ha az n pontú G gráfban nincs olyan x, y ∈ V(G) amelyre d(x)+d(y)
_____________________________________________________________________________________ 38
Gráfok színezése. χ (G ) fogalma és viszonya ω (G) -hez, illetve ∆(G ) -hez. Brooks tétele (NB). Mycielski konstrukciója (*). Intervallumgráfok színezése. Perfekt gráf fogalma. Síkbarajzolható gráfok kromatikus száma (*). 3-SZÍN nyelv bonyolultsága (*). Élkromatikus szám, χ e (G ) viszonya ∆(G ) -hez, Vizing-tétel (*).
A13
[Gráfelmélet – 89-92. oldal] Gráfok színezése A G gráf színezésén egy f : V → {1,… , k } leképzést értünk, melyre ha (v, w) ∈ E akkor f (v) ≠ f ( w) . Azaz egy G hurokmentes gráf k színnel kiszínezhető, hogyha minden csúcsot ki lehet színezni k szín felhasználásával úgy, hogy bármely két szomszédos csúcs színe különböző legyen.
χ (G) fogalma és viszonya ω (G) -hez, illetve ∆(G ) -hez G kromatikus száma χ (G ) = k , ha G k színnel kiszínezhető, de k-1 színnel nem. Egy ilyen színezésnél az azonos színt kapott pontok halmazát színosztálynak nevezzük. G egy teljes részgráfját klikknek nevezzük. A G-ben található maximális méretű klikk méretét, azaz pontszámát ω (G ) -vel jelöljük és a gráf klikkszámának nevezzük. Minden G gráfra χ (G ) ≥ ω (G ) . Ez az alsó korlát a kromatikus számra éles például olyankor, ha a gráf egy teljes gráf. Másrészt van olyan gráf is amire nagyon rossz ez a korlát. Ha a maximális fokszám G-ben ∆ , akkor χ (G ) ≤ ∆ + 1 Brooks tétele (NB) Ha G egyszerű, összefüggő, nem teljes gráf, és nem páratlan hosszúságú kör, akkor χ ( g ) ≤ ∆ , azaz ekkor a kromatikus szám nem nagyobb, mint a maximális fokszám. Mycielski konstrukciója (*) [Gráfelmélet – 90. oldal] Minden k ≥ 2 egész számra van olyan Gk gráf, hogy ω (Gk ) = 2 és χ (Gk ) = k . [Bizonyítás: Gráfelmélet – 90.oldal] Síkbarajzolható gráfok kromatikus száma (*). Ha G síkbarajzolható gráf, akkor χ (G ) ≤ 4 Intervallumgráfok színezése, perfekt gráf fogalma [Berge] Egy G gráf perfekt, ha χ (G ) = ω (G ) és G minden G’ feszített részgráfjára is teljesül, hogy χ (G ') = ω (G ') . Legyen I1 = [ a1 , b1 ] , I 2 = [ a2 , b2 ] ,… korlátos zárt intervallumok, és minden ai , bi legyen pozitív egész.
{
Legyenek p1 , p2 ,… egy G gráf pontjai és pi , p j } akkor és csak akkor legyen él G-ben, ha I i ∩ I j ≠ 0 . Az így előálló perfekt gráfokat intervallumgráfoknak nevezzük. Ha G intervallumgráf, akkor χ (G ) = ω (G ) . [http://www.math.gatech.edu/~trotter/Section6-Coloring.htm] _____________________________________________________________________________________ 39
3-SZÍN nyelv bonyolultsága (*) [Algoritmuselmélet – 262. oldal] Rögzítsük gráfok egy kódolását bitsorozatokkal. Például egy n szögpontú gráf adjacencia-mátrixát tárolhatjuk egy n2 hosszúságú bitsorozatként. Legyen a 3-SZÍN a 3 színnel színezhető gráfok kódjaiból álló nyelv.
3 − SZÍN ∈ NP . A nyelv az NP legnehezebbjei közül való, a 3-SZÍN nyelv NP-teljes. Élkromatikus szám, χ e (G ) viszonya ∆(G ) -hez, Vizing-tétel (*) [Gráfelmélet – 98. oldal] Egy G gráf élei k színnel kiszínezhetők, hogyha minden élet ki lehet színezni k szín felhasználásával úgy, hogy két szomszédos él színe különböző legyen. G élkromatikus száma χ e (G ) = k , ha G élei k színnel kiszínezhetők, de k-1 színnel nem. Az élkromatikus szám megegyezik a gráf élgráfjának kromatikus számával. Az élkromatikus szám nem lehet kisebb a maximális fokszámnál, hiszen az egy pontra illeszkedő éleket mind különböző színekre kell színezni. Viszont egyszerű gráfokra az élkromatikus szám ennél legfeljebb eggyel lehet nagyobb. [Vizing] Ha G egyszerű gráf, akkor χ e (G ) ≤ ∆ + 1 .
_____________________________________________________________________________________ 40
Páros gráfok. Párosítások páros gráfban, magyar módszer (*), lépésszáma. König tétele (*), Hall tétele (*), Frobenius tétele (*). Párosítások tetszőleges gráfban, υ és τ kapcsolata, Tutte tétele (csak a szükségesség bizonyításával). Gallai tételei (közülük szabadon választhatóan az egyik bizonyításával).
A14
Páros gráfok [Gráfelmélet – 63. oldal] Egy G gráfot páros gráfnak nevezünk, ha a G pontjainak V(G) halmaza két részre, egy A és B halmazra osztható úgy, hogy G minden élének egyik végpontja A-ban, másik végpontja B-ben van. Ennek jelölése: G = (A,B). A K a ,b -vel jelölt teljes páros gráf olyan G=(A,B) páros gráf, ahol |A|=a és |B|=b és amelyben minden A-beli pont össze van kötve minden B-beli ponttal. Pl. K 3,3 Kuratowski-gráf. Egy G gráf akkor és csak akkor páros gráf, ha minden G-ben levő kör páros hosszúságú. Párosítások páros gráfban Párosításnak vagy részleges párosításnak nevezünk egy M élhalmazt, ha semelyik két élnek sincs közös pontja. Az ilyen éleket független éleknek is nevezzük. A részleges párosítás lefedi éleinek végpontjait. Egy párosítást teljes párosításnak nevezünk, ha a gráf minden pontját lefedi. Ezt az algel könyv szerint meg lehet úgy is fogalmazni, hogy a G(V,E) gráfnak M egy párosítása, ha a G’=(V,M) gráfban minden pont foka legfeljebb egy. Magyar módszer (*) és lépésszáma [Algoritmusok elmélete – 168. oldal] Legyen G egy tetszőleges gráf, és E’ a G egy párosítása. Egy G-beli utat E’-alternáló útnak hívunk, ha felváltva tartalmaz párosított és nem párosított éleket. Legyen E’ a G=(V,E) gráf egy párosítása. Ekkor egy olyan E’-alternáló út, melynek mindkét végpontja párosítatlan, E’-re nézve javító út, vagy röviden E’-javító út. Ugyanis kivéve a párosított pontokat E’-ből és hozzávéve a párosítatlanokat, egy eggyel hosszabb E’alternáló utat kapunk. Legyen G=(V,E) egy tetszőleges gráf és E’ egy párosítása. Ha E’-re nézve nincs javító út G-ben, akkor E’ a G egy maximális párosítása. A G=(V1, V2;E) páros gráfban akkor és csak akkor van az E’ párosításra nézve javító út, ha az E’-hez tartozó alternáló erdőben valamelyik páratlan szinten megjelenik egy párosítatlan pont. Alternáló erdő építése: Adott a G=(V1, V2; E) páros gráf és egy E’ párosítása. Egy E’-hez tartozó alternáló erdő felépítése szintről szintre: 0. szint V1 azon pontjai, melyeket E’ nem fed le, vagyis a párosítatlan pontok . . 2k-1. szint V2 azon még fel nem vett pontjai, melyek egy párosítatlan, azaz egy E\E’-beli éllel elérhetők egy 2k-2. szintbeli pontból; ezen éllel együtt. . . 2k. szint V1 azon még fel nem vett pontjai, melyek egy párosított, azaz egy E’-beli éllel elérhetők egy 2k-1. szintbeli pontból; ezen éllel együtt. _____________________________________________________________________________________ 41
Egy csúcsot legfeljebb egyszer veszünk fel, mégpedig az első lehetséges szinten. A gráfban nincs kör és könnyen összeállítható a mélységi bejárás módosításával. Ha G éllistával adott, akkor O(e) költséggel megvan az alternáló erdő. Legfeljebb n/2-szer kell javítót utat keresni, így: A magyar módszer időigénye O(ne). König tétele (*) [Gráfelmélet – 68. oldal] Ha G=(A,B) páros gráf, akkor ν (G ) = τ (G ) . Ha nincs G-ben izolált pont, akkor α (G ) = ρ (G ) is teljesül.
ν (G ) a független élek maximális száma. X ⊆ V (G ) lefogó ponthalmaz, ha G minden élének legalább egyik végpontját tartalmazza. A lefogó pontok minimális száma τ (G ) . Y ⊆ E (G ) egy lefogó élhalmaz, ha minden pontot lefog. Lefogó élek minimális száma ρ (G ) . X ⊆ V (G ) független ponthalmaz, ha nincs benne két szomszédos pont. A független pontok maximális száma α (G ) . Hall tétele (*) Egy G=(A,B) páros gráfban akkor és csak akkor van A-t lefedő párosítás, ha minden X ⊆ A részhalmazra N ( X ) ≥ X N(X) jelöli egy X ⊆ V (G ) ponthalmaz szomszédainak halmazát. Frobenius tétele (*) Egy G=(A,B) páros gráfban akkor és csak akkor van teljes párosítás, ha |A|=|B| és N ( X ) ≥ X minden X ⊆ A -ra Párosítások tetszőleges gráfban, υ és τ kapcsolata, Tutte tétele (csak a szükségesség bizonyításával) [Gráfelmélet – 69. oldal] [Tutte] Egy G gráfban akkor és csak akkor létezik teljes párosítás, ha minden X ⊆ V (G ) -re c p (G − X ) ≤ X , azaz akárhogyan hagyunk el a gráfból néhány pontot, a maradékban a páratlan komponensek száma ennél több nem lehet. Gallai tételei
τ (G ) + α (G ) = v(G ) = V (G ) minden hurokmentes gráfra.
ν (G) + ρ (G ) = v(G ) minden G gráfra, amelyben nincs izolált pont.
_____________________________________________________________________________________ 42
A15
Hálózat, hálózati folyamok. A javító utas algoritmus. Ford-Fulkerson tétel (*), Edmonds-Karp tétel (NB). Egészértékűségi lemma. A folyamprobléma általánosításai. Menger tételei (*). Többszörös összefüggõség, élösszefüggõség. Dirac tétele (NB).
[Gráfelmélet – 69-79. oldal] Hálózat, hálózati folyamok [Gráfelmélet – 70. oldal] Legyen G egy irányított gráf. Rendeljünk minden élhez egy c(e) nemnegatív valós számot, amit az él kapacitásának nevezünk. Jelöljünk ki továbbá két s,t pontot G-ben, melyeket termelőnek illetve fogyasztónak hívunk. Ekkor a (G;s;t;c) négyest hálózatnak nevezzük. Legyen f(e) az a vízmennyiség, ami az e élen folyik át. Ez az f függvény megengedett függvény, ha f (e) ≤ c(e) minden élre, és m(v) = ∑ { f (e) | e végpontja v} − ∑ { f (e) | e kezdőpontja v} = 0
minden v ∈ V (G ) -re, kivéve az s és t pontokat. Egy megengedett függvényt folyamnak hívunk. Könnyen belátható, hogy m(t)=-m(s) . Ezt a közös értéket a folyam értékének nevezzük és m f -el jelöljük. Egy élet telítettnek hívunk egy folyamban, ha f(e)=c(e), és telítetlennek, ha f (e) < c(e) . A javító utas algoritmus [Gráfelmélet – 70. oldal] Legyen a gráfban s = v0 , v1 ,…, vk −1 , vk = t egy út, aminek most nem kell feltétlenül az irányítás szerint haladnia. Növelhetjük a folyam értékét abban az esetben, ha minden i=0,1,2,…,k-1-re vagy ei = (vi , vi+1 ) és f (ei ) < c(ei ) , vagy ei = (vi+1 , vi ) és f (ei ) > 0 . Ekkor az első típusú éleken növeljük a folyam értékét, míg a második típusúakon csökkentjük, így az össz folyamérték nő. Az ilyen utakat javító utaknak hívjuk. Egy folyam értéke akkor és csak akkor maximális, ha nincs javító út s-ből t-be. Ford-Fulkerson tétel (*) [Gráfelmélet – 72. oldal] Legyen s ∈ X ⊆ V (G ) − {t} , így nyilván t ∈ V (G ) − X és s ∉ V (G ) − X . Azoknak az éleknek a C halmazát, amelyeknek egyik végpontja X-beli másik V(G)-X beli a hálózati folyam egy (s,t) vágásának nevezzük. A vágás értéke, c(C), azon az éleken levő kapacitások összege, amelyek egy X-beli pontból egy V(G)-X-beli pontba mutatnak. Ezeket előremutató éleknek nevezzük. Tehát a vágás értékében nem játszanak szerepet a visszafelé mutató élek, vagyis azok, amelyek egy X-beli pontba mutatnak. A maximális folyam értéke egyenlő a minimális vágás értékével, azaz max{ m f | egy folyam s-ből t-be} = min{c(C)|C vágás}. E tétel segítségével könnyen belátható egy adott folyamról, hogy az maximális. Edmonds-Karp tétel (NB) Ha mindig a legrövidebb javító utat vesszük, akkor a maximális folyam meghatározásához szükséges lépések száma felülről becsülhető a pontok számának polinomjával. Egészértékűségi lemma Ha a kapacitások egész számok, akkor létezik egész értékű maximális folyam. Az állítás nyilvánvaló, hiszen a kiindulási, azonosan 0 folyam rendelkezik a kívánt tulajdonsággal, majd az algoritmus során minden lépésben a folyamértékek minden élen csak egész számmal változhattak. _____________________________________________________________________________________ 43
A folyamprobléma általánosításai [Gráfelmélet – 74. oldal] Tegyük fel, hogy a hálózatban több termelő s1 , s2 ,… , sk és több fogyasztó t1 , t2 ,…, tl van. A feladat az összes termelőtől az összes fogyasztóig eljutó termékmennyiség maximalizálása. Vegyünk fel két s’, t’ pontot, és kössük össze s’-t s1 , s2 ,… , sk -val, t1 , t2 ,…, tl -t pedig t’-vel, az új élek mindegyikének kapacitása legyen ∞ . Ha ebben a hagyományos folyamban meghatározzuk a maximális folyamot, akkor az eredeti éleken szereplő folyamértékek a keresett értékek. Ha nem csak az élekhez, hanem a pontokhoz is rendelünk c(v) kapacitásokat, és megköveteljük, hogy minden v-re ∑ f (u, v) ≤ c(v) . {u|( u ,v )∈E}
Minden v pontot helyettesítsünk két ponttal, v’ és v’’-vel. Ha egy él az u pontból a v pontba mutatott, akkor helyette vegyünk fel egy u’’-ből v’-be mutató élet a hozzá tartozó kapacitással együtt. Ezen kívül minden v’-ből mutasson él v’’-be és ennek kapacitása c(v) legyen. Még könnyebb a visszavezetés abban az esetben, amikor megengedünk irányítatlan éleket. Ekkor az ilyen c kapacitású {u,v} él helyett felveszünk két c kapacitású (u,v) és (v,u) élet. Menger tételei (*) [Gráfelmélet – 75. oldal] Ha G egy irányított gráf, s, t ∈ V (G) , akkor az s-ből t-be vezető páronként élidegen irányított utak maximális száma megegyezik az irányított s-t utakat lefogó élek minimális számával. Ha G egy irányított gráf, s, t ∈ V (G) két nem szomszédos pont, akkor az s-től t-be vezető végpontoktól eltekintve pontidegen irányított utak maximális száma megegyezik az irányított s-t utakat s és t felhasználása nélkül lefogó pontok minimális számával. Ha G egy irányítatlan gráf, s, t ∈ V (G ) , akkor az s-től t-be vezető élidegen irányítatlan utak maximális száma megegyezik az irányítatlan s-t utakat lefogó élek minimális számával. Ha G egy irányítatlan gráf, s, t ∈ V (G ) két nem szomszédos pont, akkor az s-ből t-be vezető pontidegen irányítatlan utak maximális száma megegyezik az irányítatlan s-t utakat s és t felhasználása nélkül lefogó pontok minimális számával. Többszörös összefüggõség, élösszefüggõség [Gráfelmélet – 77. oldal] Egy G gráfot k-szorosan összefüggőnek nevezünk, ha legalább k+1 pontja van, és akárhogy hagyunk el belőle k-nál kevesebb pontot, a maradék gráf összefüggő marad. A gráf k-szorosan élösszefüggő, ha akárhogy hagyunk el belőle k-nál kevesebb élet, összefüggő marad. A G gráf akkor és csak akkor k-szorosan összefüggő, ha legalább k+1 pontja van, és bármely két pontja között létezik k pontidegen út. Hasonlóan G akkor és csak akkor k-szorosan élösszefüggő, ha bármely élen át vezet kör. [Menger] A G gráf akkor és csak akkor 2-szeresen összefüggő, ha tetszőleges két ponton át vezet kör. Igaz az is, hogy akkor és csak akkor 2-szeresen összefüggő, ha bármely két élen át vezet kör. Dirac tétele (NB) [Gráfelmélet – 78-79. oldal] Ha a G gráf k-szorosan összefüggő, akkor bármely x1 , x2 ,… , xk pontján át vezet kör.
_____________________________________________________________________________________ 44
Oszthatóság, felbonthatatlan és prímtulajdonságú számok. A számelmélet alaptétele (*). Osztók száma. A prímek számának végtelensége. Kongruencia fogalma, alapműveletek kongruenciákkal. Lineáris kongruenciák, a megoldhatóság szükséges és elégséges (*) feltétele. Wilson tétele (*).
A16
Oszthatóság, felbonthatatlan és prímtulajdonságú számok [Gráfelmélet – 144. oldal] Legyenek a, b ∈ . Azt mondjuk, hogy b osztható a-val, vagy a osztója b-nek (a osztja b-t), ha van olyan q ∈ Z , amelyre b=aq. Jelölése a|b. Az egész számok gyűrűjének számelmélete az oszthatóság és a prímszám fogalmán alapul. Adottak az a és b 0-tól különböző természetes számok. Ekkor egyetlen olyan (q, r ) ∈ × létezik, melyre a = bq + r és 0≤ r
számpár
A p>1 egész számot prímszámnak vagy prímnek nevezzük, ha p-nek nincs olyan d osztója, amelyre 1
pkα k = ∏ piαi ,
n = p1α1 p2α 2
i =1
ahol a pi -k prímszámok és az α i > 0 kitevők egyértelműek. A fenti felbontást n kanonikus alakjának nevezzük. Osztók száma Legyen n = p1α1 p2α 2 pkα k , d|n. Ekkor d előáll d = p1β1 p2β2 osztója n-nek. Ekkor az osztók száma:
pkβk , ahol β i ≤ α i . Minden ilyen alakú szám
k
d (n) = ∏ (α1 + 1) i =1
β1
β2
Bizonyítás: d|n esetén d = p1 p2
βk
pk , ahol β i ≤ α i . β i így α i + 1 féle értéket vehet fel, n osztóinak
k
száma d (n) = ∏ (α1 + 1) . Az i-edik elem helyén minden osztóban az 1, pi , pi2 ,… , piαi számok i =1
valamelyike szerepel tényezőként. _____________________________________________________________________________________ 45
Legyen n = p1α1 p2α 2
pkα k , m = p1β1 p2β2
pkβk .
Ekkor n és m legnagyobb közös osztója (n,m)= p1min{α1 , β1} p2min{α 2 , β 2 } A legkisebb közös többszöröse pedig [n,m]= p1max{α1 , β1} p2max{α 2 , β 2 }
min{α k , β k }
pk
max{α k , β k }
pk
.
.
Az a,b számokat relatív prímeknek nevezzük, ha legnagyobb közös osztójuk 1. A prímek számának végtelensége [Euklidész II. tétele] A prímszámok száma végtelen. Bizonyítás: Adott a prímszámok véges halmaza, { p1 , p2 ,… , pk } , és képezzük az n = p1 p2 ⋅… ⋅ pk + 1 számot. Ennek a számelmélet alaptétele alapján van egy prímosztója. Ez a p nem lehet a pi ∈ {1, 2,… , k } egyike sem, mert akkor kellene osztania az n − p1 p2 ⋅… ⋅ pk = 1
számot is, ami ellentmondás. Tehát van még egy prímszámunk a { p1 , p2 ,… , pk } halmazon kívül. Ez azt jelenti, hogy egyetlen véges prímszámhalmaz sem tartalmazhatja az összes prímszámot. [Bege Antal – Bevezetés a számelméletbe – 42. oldal] Kongruencia fogalma, alapműveletek kongruenciákkal Adottak az a és b egész számok, valamint az m ∈ ∗ szám. Azt mondjuk, hogy az a szám kongruens bvel az m modulusra nézve, ha az a-b osztható m-mel (a-b|m). Jelölése: a≡b mod( m) . A ≡ relációt kongruenciának nevezzük. Az a és b kongruens mod m, ha a és b is ugyanazt a maradékot adják m-mel osztva. A kongruenciareláció ekvivalenciareláció, vagyis teljesülnek következő tulajdonságok: 1. reflexív a≡a (mod m) 2. szimmetrikus a≡b (mod m) ⇒ b ≡ a (mod m) 3. tranzitív a≡b (mod m) és b ≡ c (mod m) ⇒ a ≡ c (mod m) A kongruenciára nézve érvényesek a következő tulajdonságok: 1. a ≡ b (mod m) ⇒ a + c ≡ b + c (mod m) 2. a ≡ b (mod m) ⇒ a − c ≡ b − c (mod m) 3. a ≡ b (mod m) ⇒ a ⋅ c ≡ b ⋅ c (mod m) 4. a ≡ b (mod m) ⇒ a ⋅ c ≡ b ⋅ c (mod mc ), c≠0 Lineáris kongruenciák, a megoldhatóság szükséges és elégséges (*) feltétele Legyenek a,b,c egész számok. Az ax ≡ b(c) lineáris kongruenciában az x ismeretlen, és keressük azon x számokat, amelyre a c|ax-b igaz. Nyílván ha x kielégíti a feltételt, akkor kc+x si tetszőleges k egész számra, így a megoldásokat modulo c fogjuk keresni. Az ax ≡ b(c) kongruenciában a és b leosztható és megszorozható tetszőleges c-hez relatív prím számmal, a,b,c pedig leosztható tetszőleges egész számmal, a kongruencia megoldáshalmaza nem változik. Az ax ≡ b mod(c) kongruencia akkor és csak akkor oldható meg, ha (a,c)|b. A megoldások száma (a,c) modulo c. Wilson tétele (*) Ha p prím, akkor _____________________________________________________________________________________ 46
( p − 1)! ≡ −1(mod p) . [http://mathworld.wolfram.com/WilsonsTheorem.html] [Ivan Nieven – Bevezetés a számításelméletbe – 30. oldal]
_____________________________________________________________________________________ 47
A17
Teljes és redukált maradékrendszer, ϕ -függvény definíciója. Euler-Fermat-tétel (*), kis Fermat-tétel. Euklideszi algoritmus.
Teljes és redukált maradékrendszer [Gráfelmélet – 108. oldal] Legyen m > 1 rögzített egész szám. Ekkor azt mondjuk, hogy a kongruens b-vel az m modulusra vonatkozólag (jelölve a ≡ b(mod m) ), ha a és b számok m-mel osztva ugyanazt a maradékot adják. Egyegy ilyen osztályt hívunk maradékosztálynak. Egy m modulusú maradékosztályt redukált maradékosztálynak hívunk, ha minden tagja relatív prím mhez. [Harvey Cohn – Advanced Number Theory – 12. oldal]
ϕ -függvény definíciója, Euler-Fermat-tétel (*) [Gráfelmélet – 110. oldal]
ϕ (m) jelöli az 1,2,…,m-1 számok közül az m-hez relatív prímek számát. Speciálisan ϕ ( p) = p − 1 , ha p prímszám, vagy ϕ (m) == ( p − 1)(q − 1) , ma m=pq, ahol p és q két különböző prímszám. Ha t és m relatív prímek (vagyis a legnagyobb közös osztójuk, d(t,m), eggyel egyenlő), akkor t ϕ ( m ) ≡ 1(mod m) Kis Fermat-tétel Bármely p prímre és a egészre: a p = a (mod p ) Bizonyítások: [http://en.wikipedia.org/wiki/Proofs_of_Fermat%27s_little_theorem] Euklideszi algoritmus [Gráfelmélet – 108. oldal] Az algoritmus a és b legnagyobb közös osztóját, d(a,b)-t határozza meg. Ha a>b, akkor az a:b maradékos osztást elvégezzük, majd b-t osztjuk a maradékkal, stb…: (0 ≤ m1 < b) a = h1b + m1
b = h2c + m2 m1 = h3m2 + m3
(0 ≤ m2 < m1 ) (0 ≤ m3 < m2 )
A k-adik lépésben a hányadost hk -val, a maradékot mk -val jelöljük. Az eljárás akkor ér véget, ha nincs az osztásnak maradéka, vagyis: mn−2 = hn mn−1 . Ekkor persze mn−3 = hn−1mn−2 + mn−1 = (hn−1hn + 1)mn−1 , és ugyanúgy visszahelyettesítve a is, b is mn−1 konstansszorosa lesz. Belátható, hogy épp mn−1 = d (a, b) .
_____________________________________________________________________________________ 48
A18
Számelmélet és algoritmusok: alapműveletek, hatványozás az egészek körében és modulo m. Prímtesztelés (feladata, Fermat-féle teszt, Carmichael számok). Nyilvános kulcsú titkosírás.
Számelmélet és algoritmusok: alapműveletek, hatványozás az egészek körében [Gráfelmélet – 107. oldal] Az, hogy egy mennyiség c ∗ log x -szel becsülhető akkor is értelmes, ha nem rögzítjük le a logaritmus alapját, mert bármilyen logaritmusra át tudunk állni alkalmas c választásával. Egy k-jegyű x szám leírásához ⎡⎢ log10 x ⎤⎥ számjegy kell. Ha két x,y szám között akarunk valamilyen ⎡⎢ log10 x ⎤⎥ + ⎡⎢ log10 y ⎤⎥ ≈ log10 xy azaz x*y logaritmusával arányos. Az írásbeli összeadás és kivonás a számjegyek számával arányos, így ezek polinom rendű (ráadásul lineáris) algoritmusok. Az írásbeli osztás és szorzás is polinomrendű algoritmusok (csak nem lineárisak). A hatványozás nem végezhető el polinom időben, mert pl. 2 x végeredményének kiírásához már log 2 x = x lépés kell, ami az input hosszának (log x-nek) exponenciális függvénye.
alapműveletet megvalósítani, akkor az input hossza
Hatványozás modulo m A kongruencia ekvivalenciareláció, azaz osztályokba sorolja az egész számok halmazát. Egy-egy ilyen osztályt hívunk maradékosztálynak. Más szóval egy osztályt alkot az összes m-mel osztható szám, egy másikat azok a számok melyek mmel osztva egy maradékot adnak, egy újabb osztályt azok melyek kettő maradékot adnak stb. A mod m maradékosztályok is gyűrűt alkotnak, akár az egész számok. A maradékosztályok körében a hatványozás is polinomrendben végezhető el: t l (mod m) kiszámításához csak ( log t + log l + log m ) nagyságrendű lépés kell. Ez azért van, mert a t , t 2 , t 3 , t 4 … számoknak megfelelő maradékosztályok sorozata előbb-utóbb önmagát fogja ismételni (mivel csak m darab maradékosztály van). Prímtesztelés feladata [Gráfelmélet – 111. oldal] Kérdés: hogy lehet eldönteni egy n számról, hogy prím-e. Erasztothenész-féle szita-algoritmus: felírjuk az összes számot n-ig, majd egymás után kihúzzuk a 2-vel oszthatókat, aztán a 3-mal oszthatókat, aztán az 5-tel oszthatókat, stb... Másik lehetőség: minden n-nél kisebb számról megnézni, hogy nem osztója-e n-nek (elég sqrt(n)-ig elmenni). Ezek nem polinomrendű algoritmusok, de ha n nem prímszám, akkor legalább rögtön megmutatják annak összes osztóját. A hatékony prímtesztelés feladata, hogy olyan eljárást nyújtson, ami ha nem is biztosan, de nagy valószínűséggel megmutatja egy számról, hogy prím-e, anélkül, hogy ha összetett számnak bizonyul megtalálja az osztóit. Fermat-féle teszt, Carmichael számok [Euler-Fermat] Ha t és m relatív prímek, akkor t ϕ ( m ) ≡ 1(mod m) ahol ϕ (m) jelöli az 1,2,...,m-1 számok közül az m-hez relatív prímek számát. Pl. ϕ (m) =p-1 ha p prímszám, vagy ϕ (m) =(p-1)(q-1) ha m=pq, ahol p és q két különböző prímszám.
_____________________________________________________________________________________ 49
Ha n prím, akkor t n −1 ≡ 1(mod n) teljesül minden olyan t-re, mely n-hez relatív prím (vagyis melyre t ≠ 0(mod n) teljesül). Ha egy konkrét t,n párra t n −1 ≡ 1(mod n) teljesül, akkor ez nem bizonyítja azt, hogy n prím (n lehet összetett szám, de t a cinkosa). Ha viszont t n −1 ≡ 1(mod n) nem teljesül, akkor minden további vizsgálat nélkül biztosak lehetünk benne, hogy n nem prím (t az n árulója). Ha egy összetett szám nem Carmichael szám (olyan szám aminek minden hozzá relatív prím cinkosa), akkor legalább annyi az árulója mint a cinkosa. Mivel a cinkosok szorzata cinkos, míg egy cinkos és egy áruló szorzata áruló. Ha tehát egymástól függetlenül véletlenszerűen választunk véletlenszerűen q darab maradékosztályt és mindegyikre m n −1 ≡ 1(mod n) teljesül, akkor n lehet összetett szám, de ennek a valószínűsége (1/ 2) q -nál kisebb. Tehát a teljes prímteszt algoritmus: 1. 2. 3. 4. 5. 6.
i=1 válasszunk ki véletlenszerűen egy 1<m
STOP 1 : n összetett szám, d(n,m) egy osztója STOP 2 : összetett szám, de egyetlen osztóját sem találtuk meg STOP 3 : n valószínűleg prím (a hiba valószínűsége < (1/ 2)100 ) 2. és 3. lépés is elvégezhető polinom időben, így ez a prímtesztelő-algoritmus polinomrendű. Nyilvános kulcsú titkosírás [Gráfelmélet – 115. oldal] Számítógépmemóriában szeretnénk elhelyezni fontos információt azzal, hogy csak a jogosultak olvashassák ki – anélkül, hogy a jogosultságot ellenőrző jelszót is eltároljuk a rendszerben. Válasszunk ki két 200-jegyű p és q prímszámot, n=pq értéket tároljuk a memóriában és nyilvánítsuk azokat jogosulttá, akik n valamely osztóját mondják meg. Egy kapott k számról gyorsan kideríthető, hogy valóban osztó-e (egyenlő-e p-val vagy k-val) de n-ből p és q előállítása (mai tudásunk szerint) reménytelenül nehéz. Így még n titokban tartása sem kötelező. A valóságban a kódolás és dekódolás bonyolultabb, mert nem lehet csakúgy p-t vagy q-t a rendszer rendelkezésére bocsátani, mert onnantól kezdve ugyanúgy nem vagyunk biztonságban mint előtte. A kódolva küldendő üzeneteket 400-jegyű számok sorozatára bontjuk. A kódolást tekinthetjük egy y=C(x) függvénynek, mely a 400-jegyű x számhoz egy másik 400-jegyű z számot rendel. A függvény inverzét az x=D(y) függvényt dekódoló függvénynek nevezhetjük. Tfh. mindenki nyilvánosságra hozza a saját C függvényét, de titokban tartja a D dekódoló függvényt. Ekkor ha az i-edik személy (feladó) el akarja küldeni az x üzenetet a j-edik személynek (a címzettnek) akkor az általa is hozzáférhető Cj kódolófüggvényt alkalmazva az y=Cj(x) üzenetet küldi el. A címzett alkalmazza a csak általa ismert Dj dekódoló függvényt és megkapja a Dj(y)=Dj(Cj(x))=x üzenetet. A rendszerben részt vevő többi ember számára y dekódolhatatlan. Kérdés, hogy lehet olyan C, D függvényeket készíteni, hogy bármely x-re Ci(x) vagy Di(x) kiszámítása gyorsan elvégezhető legyen, de Ci ismeretében Di-re ne lehessen következtethető. Ezekhez használhatjuk fel a prímszámokat. Tfh az i-ik résztvevő választ két 200-jegyű prímet, pi-t és qi-t. Legyen ni=pi*qi. ϕ (ni ) = ( pi − 1)(qi − 1) és ezt a mennyiséget jelöljük mi-vel. A résztvevő ezen kívül választ egy olyan ei számot is, melyre 1<=ei<=ni teljesül és amely relatív prím (pi-1)-hez és (qi-1)-hez is. Végül megoldva egy ax ≡ b(mod m) típusú kongruenciát meghatározza azt a di számot, amelyre ei*di=1(mod m). Ezek után az i-ik résztvevő nyilvánosságra hozza az ni és ei számokat, viszont titokban tartja a pi, qi, mi és di számokat. A Ci kódolófüggvény egy x üzenethez hozzárendeli azt az y=Ci(x) számot amelyre y ≡ x ei (mod ni ) míg a Di dekódolófüggvény az y-hoz annak _____________________________________________________________________________________ 50
h
di-ik hatványát rendeli (mod ni). Így y di ≡ x ei di = x hmi +1 = ⎡⎣ xϕ ( ni ) ⎤⎦ * x ≡ x(mod ni ) . Mindez csak akkor működik, ha x relatív prím ni-hez. Ezt úgy biztosíthatjuk, hogy az üzenetet nem 400, hanem 399 jegyű számsorozatokra bontjuk, majd mindegyik sorozat utolsó elemét úgy választjuk meg, hogy e feltétel teljesüljön. Dekódolás után elhagyjuk az utolsó számjegyet.
_____________________________________________________________________________________ 51
Művelet fogalma, félcsoport, csoport, Abel-csoport, részcsoport, elem rendje. Példák: csoportok számokon, mátrixokon, rajzok szimmetriacsoportja, ciklikus csoport, diédercsoport, szimmetrikus csoport. Csoportok izomorfiája. Mellékosztály, Lagrange tétele (*), elemrend és csoport rendjének kapcsolata.
A19
Művelet fogalma, félcsoport, csoport, Abel-csoport, részcsoport, elem rendje [Gráfelmélet – 121. oldal] Legyen H tetszőleges halmaz, jelölje H n a H halmaz elemeiből képzett n hosszú sorozatokat. Az f : H n → H mindenütt értelmezett függvényt n változós műveletnek nevezzük. Kétváltozós művelet például az egész számok összeadása, kivonása (f(a,b)=a+b, f(a,b)=a-b). Egy H halmazon értelmezett 2-változós műveletet (jelöljük ∗ -gal) kommutatívnak nevezünk, ha tetszőleges a, b ∈ H esetén a ∗ b = b ∗ a ; asszociatívnak nevezünk, ha tetszőleges a, b, c ∈ H estén (a ∗ b) ∗ c = a ∗ (b ∗ c) . Az S halmazt a rajta értelmezett ∗ művelettel félcsoportnak nevezzük, ha ∗ asszociatív. Ha ∗ kommutatív is, akkor kommutatív (vagy Abel-féle) félcsoportról beszélünk. Példák: 1. A pozitív számok az összeadásra nézve félcsoportot alkotnak. 2. Az n × n -es mátrixok a szorzással félcsoportot alkotnak. 3. A pozitív valós számok a szorzásra nézve félcsoportot alkotnak. Ha az S félcsoportban van olyan e elem, amelyre igaz az, hogy e ∗ a = a ∗ e = a minden a ∈ S esetén, akkor e-t neutrális vagy egységelemnek hívjuk, S-et pedig egységelemes félcsoportnak nevezzük. Egy G halmazt a i művelettel csoportnak nevezünk, ha • (aib)ic = ai(bic) minden a, b, c ∈ G estén • ∃e ∈ G , amelyre ei a = a ie = a , ∀a ∈ G • ∀a ∈ G -re ∃a ' ∈ G úgy, hogy a ia ' = a 'i a = e A csoport elemszámát |G|-vel jelöljük, és G rendjének nevezzük. Legyen G csoport. Egy H ⊆ G részhalmazt részcsoportnak nevezünk, ha H is csoport ugyanarra a műveletre nézve. Jelölése: H ≤ G . Példák: Minden csoportnak részcsoportja maga a csoport, és az egységelemet tartalmazó egyelemű halmaz. Ezeket a részcsoportokat triviális részcsoportoknak, az ezektől különböző részcsoportokat valódi részcsoportoknak nevezzük. A valós számok additív csoportjának részcsoportja a racionális számok, annak pedig az egész számok additív csoportja. Legyen a ∈ G . Ekkor a = {a n | n ∈
} , azaz egy elem által generált részcsoport
az a hatványaiból áll.
Különböztessünk meg két esetet: • a összes hatványa különböző • vannak olyan k,l egész számok, hogy a k = al . Ekkor a k −l = 1 , azaz van a-nak olyan hatványa, amely egységelem. Legyen n a legkisebb ilyen szám. A legkisebb ilyen számot a rendjének nevezzük, és o(a)-val jelöljük. Ha nincs ilyen szám, akkor végtelen rendű elemről beszélünk. Egy elem rendje megegyezik az általa generált csoport rendjével. Az egy elem által generált csoportokat ciklikus csoportnak nevezzük. Példák: csoportok számokon, mátrixokon, rajzok szimmetriacsoportja, ciklikus csoport, diédercsoport, szimmetrikus csoport Példák: 1. Az egész, a racionális és valós számok Abel-csoportot alkotnak az összeadásra nézve, a természetes számok viszont nem. _____________________________________________________________________________________ 52
2. Az n × n -es invertálható mátrixok csoportot alkotnak a szorzásra nézve. 3. A szabályos n-szög egybevágóságai csoportot alkotnak, ahol a művelet az egymás után való elvégzés. Itt a csoport egységeleme a helybenhagyás, a csoport rendje 2n, ugyanis van n darab tengelyes tükrözés és a helybenhagyással együtt n forgatás. A csoportot Dn -nel jelöljük. 4. n elem permutációi (önmagára való bijektív leképezései) csoportot alkotnak a kompozícióra. A csoportot n-ed fokú szimmetrikus csoportnak nevezzük, Sn -nel jelöljük, rendje n!. Egy H halmaz elemeinek összes permutációinak csoportját S H -val jelöljük. 5. Egy Γ gráf automorfizmusai (Aut( Γ )) (csúcs és éltartó bijeketív leképezései) csoport a kompozícióra, mint műveletre. Csoportok izomorfiája A G1 , G2 csoportokat izomorfaknak nevezzük, ha van köztük egy kölcsönösen egyértelmű művelettartó leképezés, azaz van olyan φ : G1 → G2 leképezés, amely bijektív és tetszőleges g , h ∈ G1 esetén φ ( g )φ (h) = φ ( gh) teljesül. Jelölése: G1 φ G2 , vagy egyszerűen G1 G2 . Példa: ( + ,i) ( , + ) , ahol a φ izomorfizmus minden pozitív valós számhoz hozzárendeli a logaritmusát, azaz φ (a) = log(a) . A bijektivitás a logaritmus függvény monotonitásából adódik, a művelettartás pedig a log(ab) = log(a ) + log(b) összefüggés következménye. Mellékosztály, Lagrange tétele (*) Legyenek K,M részhalmazok G-ben. A KM szorzaton a KM = {km | k ∈ K , m ∈ M } halmazt értjük. Legyen H ≤ G részcsoport, g ∈ G . A Hg (gH) szorzatot H g szerinti jobboldali (baloldali) mellékosztályának, g-t pedig a mellékosztály reprezentánsának nevezzük. Legyen H ≤ G . Ekkor • g ∈ Hg ; • a Hg mellékosztály minden eleme reprezentálja a Hg mellékosztályt; • két különböző jobboldali mellékosztály vagy egybeesik, vagy diszjunktak; • ha H véges, akkor bármely mellékosztály elemszáma megegyezik H rendjével. [Langrange] Legyen G véges, H ≤ G . Ekkor H rendje osztja G rendjét. Az elemrend és csoport rendjének kapcsolata Mivel egy elem rendje megegyezik az általa generált részcsoport rendjével, ezért egy elem rendje osztja a csoport rendjét. Legyen |G|=p, p prím. Ekkor egy egységelemtől különböző csoportelem által generált ciklikus csoport rendje csak p lehet, azaz minden prímrendű csoport ciklikus.
_____________________________________________________________________________________ 53
A20
Gyűrű és test fogalma. Példák: , , , n × n -es mátrixok, polinomok,
p
. Komplex
számok, algebrai és trigonometrikus alak, alapműveletek komplex számokkal. Komplex szám n-edik gyöke, egységgyökök.
Gyűrű fogalma [Gráfelmélet – 141. oldal] A R halmaz a + és * műveletekkel gyűrű, ha 1. a+b=b+a ∀a, b ∈ R esetén 2. (a+b)+c=a+(b+c) ∀a, b, c ∈ R esetén 3. van olyan R-beli elem (jelöljük 0-val), hogy a+0=0+a ∀a ∈ R esetén 4. ∀a ∈ G -re ∃a ' ∈ G úgy, hogy a+a’=0 (ahol 0 a 3. pontban szereplő elem); 5. (a*b)*c=a*(b*c) ∀a, b ∈ R esetén 6. (a+b)*c=a*c+b*c ∀a, b ∈ R esetén 7. c*(a+b)=c*a+c*b ∀a, b ∈ R esetén Az első négy axióma azt mondja ki, hogy R Abel-csoport az összeadásra nézve, az 5. pedig, hogy félcsoport a szorzásra nézve. A hatodik illetve hetedik axiómákat jobboldali illetve baloldali disztributív törvénynek nevezzük. Ha a szorzás is kommutatív, kommutatív gyűrűről, ha van a szorzásra nézve egységelem, egységelemes gyűrűről beszélünk. A harmadik axiómában említett elemet nullelemnek nevezzük. Egy a R-beli elem összeadásra vonatkozó inverzét (negyedik axióma) ellentettnek hívjuk, és –a-val jelöljük. Az a-b=a+(-b) műveletet kivonásnak nevezzük. Test fogalma, példák: , , , n × n -es mátrixok, polinomok,
p
.
[Gráfelmélet – 153. oldal] Egy R egységelemes gyűrűt ferdetestnek hívunk, ha a szorzásra nézve is van inverz. Egy ferdetestet testnek nevezünk, ha a szorzás kommutatív. A könyvben is csak fel van sorolva, hogy a tételben felsorolt halmazok gyűrűk. Bizonyítás nem nagyon van egyik helyen sem, de az axiómák alapján nem nehéz. Komplex számok, algebrai és trigonometrikus alak, alapműveletek komplex számokkal Komplex számoknak nevezzük az a+bi alakú számokat, ahol a és b is valós számok. Például komplex szám a 3+2i vagy a -12+25i. Az a+bi komplex szám valós részén értjük a-t, képzetes részén pedig b-t. Például a 3+2i valós része a 3, képzetes része a 2. -12+25i valós része a -12, képzetes része a 25. A "képzetes" elnevezés az "immaginárius" szóból ered, ezért is jelöljük "i"-vel a komplex számoknak nem valós, "képzetes" részét. (Az "i"-t az "immaginárius" rövidítésére használták.) A "komplex" elnevezés pedig arra utal, hogy ezek a számok összetettek, több (kettő) részből állnak. Azt a számot, aminek csak valós része van, tiszta valós számnak, amelyiknek pedig csak képzetes része van, tiszta képzetes számnak nevezzük. Például a 3, azaz 3+0i tiszta valós szám, mert nincs képzetes része, csak valós. A 25i, azaz 0+25i pedig tiszta képzetes szám, mert nincs valós része, csak képzetes. Két komplex szám egyenlő, ha valós részeik és képzetes részeik is egyenlők. Például a 3+2i nem egyenlő a -3+2i-vel, a 3-2i-vel, a -3-2i-vel, a 2+3i-vel stb. Egy a+bi komplex szám konjugáltján az a-bi komplex számot értjük. (A képzetes rész előjelét az ellenkezőjére változtatjuk.) Például a 3+2i konjugáltja 3-2i, a -12+25i konjugáltja -12-25i, a 27-42i konjugáltja a 27+42i. Még egyszer fontos megjegyeznünk, hogy minden valós szám olyan komplex szám, amelynek képzetes része 0. Azaz komplex szám a 3 (+0i) vagy a 0 (+0i) is. A valós számok tehát tiszta valós komplex számok.
[http://orange.ngkszki.hu/~trembe/szamok/007.html] _____________________________________________________________________________________ 54
Bármely komplex szám felírható
r cos ϕ + (r sin ϕ )i = r (cos ϕ + i sin ϕ )
alakban is. Ezt nevezzük a komplex szám trigonometrikus alakjának. Az r a komplex szám abszolútértéke, a ϕ -t pedig a komplex szám argumentumának vagy irányszögének nevezzük. [http://www.szgti.bmf.hu/harp/matek/komplex/node28.html] Komplex szám n-edik gyöke, egységgyökök. Az n-edik gyök: n
r (cos ϕ + i sin ϕ ) = n r (cos
ϕ + k ⋅ 360° n
+ i sin
ϕ + k ⋅ 360° n
),
ahol k=0;1;...;n-1. Tehát az n-edik gyök n különböző komplex számot jelent. [http://www.szgti.bmf.hu/harp/matek/komplex/node37.html] Az n-edik (n pozitív egész) egységgyök egy olyan z komplex szám, ahol z n = 1 Az n-edik egységgyökök az egységsugarú körön helyezkednek el egy szabályos n-szög csúcsaiként. [http://www.sciencedaily.com/encyclopedia/root_of_unity]
_____________________________________________________________________________________ 55
Rendezési feladat. Buborékrendezés, lépésszáma (*). Beszúrásos rendezés, lépésszáma. Rendezett sorozatok összefésülése, az összefésülés lépésszáma, összefésüléses rendezés, lépésszáma (*). Alsó korlát az összehasonlítás alapú rendezésekre (*). Gyorsrendezés, lépésszáma (*). Ládarendezés, radixrendezés (*), lépésszámuk (*).
B01
Rendezési feladat [Algoritmusok – 30. oldal] Adott az (U,<) rendezett halmazból (típusból) való elemekből álló A[1:n] tömb. Rendezzük át az A elemeit úgy, hogy azok a < szerint nem csökkenő sorrendben legyenek. A módszerek költségének számításakor általában összehasonlításokat és az elemek mozgatásait.
két
tényezőt
veszünk
figyelembe:
az
Buborékrendezés, lépésszáma (*) [Algoritmusok – 30. oldal] Az alapötlet az, hogy a rosszul álló szomszédos elempárokat megcseréljük: ha valamely i-re A[i]>A[i+1], akkor a két cella tartalmát kicseréljük. Ha már nincs ilyen értelemben rosszul álló pár, akkor A rendezett állapotban van. A tömb elejéről indulva a rosszul álló szomszédos elemeket cserélgetve eljutunk a tömb végéig. Ekkor a legnagyobb elem(ek egyike) A[n]-ben van. Utána ismételjük ezt az A[1:n-1] tömbre, majd az A[1:n-2] tömbre, stb. Végül A rendezett lesz. procedure buborék (* az A[1:n] tömböt csökkenően rendezi *) for ( j = n – 1, j > 0, j := j – 1 ) do for ( i = 1, i ≤ j , i := i + 1 ) do { ha A[i+1]
+ ⎡⎢ log 2 n ⎤⎥
_____________________________________________________________________________________ 56
összehasonlítást jelent. Innen tetszőleges n-re K ≤ n ⎡⎢log 2 n ⎥⎤ . A K költségét a fenti kifejezés alapján másként, valamivel pontosabban is becsülhetjük. Világos, hogy ⎢⎡ log 2 n ⎥⎤ < 1 + log 2 k , amiből, K < n − 1 + log 2 n +
+ log 2 n = n − 1 + log 2 (n !) .
Rendezett sorozatok összefésülése, az összefésülés lépésszáma Tegyük fel, hogy az A[i:k] valamint B[1:l] tömbök rendezettek, és tartalmukat rendezetten tárolni akarjuk a C[1:k+l] tömbben. A C[1]-be nyilván az A[1] és B[1] elemek közül a nem nagyobb kerül. Ha ez mondjuk A[1], akkor az A[2] és B[1] egyike lesz a C[2]. Általában, ha az A[1:i] és B[1:j] résztömböket már feldolgoztuk, tartalmuk nem csökkenően C[1:i+j] –ben vannak, akkor nyilván C [i + j + 1] := min { A [i + 1] , B [ j + 1]} a jó választás. Ezt az eljárást összefésülésnek nevezzük (jelölése: MERGE). Minden egyes összehasonlítás után egy elem a helyére kerül, kivéve az utolsót, amivel két elem helyét derítjük ki. A költség tehát k+l-1 összehasonlítás és k+l mozgatás. Az összefésülés igen hatékony eljárás, hiszen a bemenő adatok hosszával arányos időben, lényegében egyetlen végigolvasással elrendezi a két sorozatot. Összefésüléses rendezés, lépésszáma (*) [Algoritmusok – 35. oldal] Az összefésüléses rendezés alapötlete, hogy először rendezzük külön-külön az A[1:n] tömb első felét és második felét, majd ezek tartalmát fésüljük össze. Mindezek a következő MSORT nevű rekurzív eljárást sugallják, melynek paramétere a rendezendő tömb. Ha n>1, akkor MSORT(A[1:n]):= MERGE(MSORT(A[1: ⎡⎢ n / 2 ⎤⎥ ],MSORT(A[ ⎡⎢ n / 2 ⎤⎥ +1:n])). Hogy elvarrjuk a rekurzió alját, legyen MSORT(A[i,i]) az üres utasítás. Az összefésülés megoldható helyben is: tegyük fel, hogy az A[1:2n] tömb A[1:n] és A[n+1:2n] részei rendezettek. Ekkor a két rész összefésülhető az A tömbbe O(n) összehasonlítással úgy, hogy A-n kívül még legfeljebb csak konstans számú cellát (pl. változókat) használunk. Az összefésüléses rendezés költsége – mindkét tényezőt figyelembe véve – O(nlogn). Alsó korlát az összehasonlítás alapú rendezésekre (*) Tegyük fel, hogy egy pusztán két kimenetelű döntéseket használó program legfeljebb k ilyen döntés alapján rendezi n elem bármelyik bemeneti sorrendjét. Ekkor k ≥ log 2 (n !) teljesül. Két kimenetelű döntések: if feltétel then akció1 else akció2; ahol akciói ugrás egy másik utasításra vagy egy rendezés. Gyorsrendezés, lépésszáma (*) [Algoritmusok – 42. oldal] A módszert C. A. R. Hoare találta 1960-ban. A rendezendő A[1:n] tömb egy véletlen elemét vesszük. Ezután a tömb elejébe mozgatjuk az s-nél kisebb elemeket, a végébe az s-nél nagyobbakat. A kettő között helyezkednek el az s előfordulásai. Nevezzük PARTICIÓnak az eljárást, ami megvalósítja ezt. A PARTÍCIÓ(s) tehát felbontja három részre az A tömböt. Az A[1:k] résztömb elemei s-nél kisebbek, A[k+1:l] minden eleme s, végül A[l+1:n] elemei snél nagyobbak. s-nél kisebb elemek s ..... s s-nél nagyobb elemek Tegyük fel, hogy az A[1:n] tömbbel és az s elemmel dolgozunk. Az i és j változók értéke kezdetben 1, illetve n. Először i-t növeljük, amíg A[i]<s teljesül. Utána j-t csökkentjük, amíg A [ j ] ≥ s . Ha mindkettő _____________________________________________________________________________________ 57
megáll (nem lehet továbblépni), és i<j, akkor kicseréljük A[i] és A[j] tartalmát. Ezután i:=i+1 és j:=j-1. Ha a két mutató összeér (már nem teljesül i<j), akkor s előfordulásait a felső rész elejére mozgatjuk. Innen világos, hogy PARTÍCIÓ(s) költsége O(n). A gyorsrendezés megvalósítása fentiek felhasználásával: GYORSREND(A[1:n]) 1. Válasszunk egy véletlen s elemet az A tömbből. 2. PARTÍCIÓ(s); az eredmény legyen az A[1:k], A[k+1:l], A[l+1:n] felbontás. 3. GYORSREND(A[1:k]); GYORSREND(A[l+1:n]). A rendezéshez felhasznált összehasonlítások várható száma: C (n) < 2n ln n + O(n) ≈ 1,39n log 2 n + O (n) . Ládarendezés, lépésszáma (*) [Algoritmusok – 47. oldal] Tegyük fel, hogy az A[1:n] tömböt szeretnénk rendezni, és tudjuk, hogy A elemei az m elemű U univerzumból kerülnek ki. Ekkor lefoglalhatunk egy U elemeivel indexelt B tömböt (U egy rendezett típus). Ennek elemei – a ládák – U-beli elemek listái lesznek. Kezdetben minden lista (láda) üres. Az eljárás első fázisában végigolvassuk az A tömböt, és az s=A[i] elemet a B[s] lista végére fűzzük. A második fázisban az elejétől a végéig növő sorrendben végigmegyünk B-n, és a B[i] listák tartalmát visszaírjuk A-ba. Az eljárás költsége O(n+m) elemi lépés. Példa: Tegyük fel, hogy a rendezendő A[1:7] tömb elemei 0 és 9 közötti egészek: A: 5,3,1,5,6,9,6 Ekkor egy tízelemű B[0:9] tömböt célszerű használni. Az első fázis után a B így képzelhető el: B:-,1,-,3,-,55,66,-,-,9 Radixrendezés, lépésszáma (*) [Algoritmusok – 48. oldal] Tegyük fel, hogy a rendezendő kulcsok összetettek, több komponensből állnak, és a < reláció a komponensek rendezéséből lexikografikus rendezés. Legyenek az U elemei k hosszúságú t1 … tk alakú szavak, ahol a ti komponens az Li rendezett típusból való. Tegyük fel még, hogy az Li típusnak összesen si eleme van. Legyen t1 … tk és u1 … uk két kulcs U-ból. A lexikografikus (szótárszerű) rendezés definíciója szerint t1 … tk > u1 … uk éppen akkor teljesül, ha ti > ui a legkisebb i indexre nézve, amelyre ti ≠ ui . A radix rendezés receptje: először rendezzük a sorozatot az utolsó, a k-adik komponensek szerint ládarendezéssel. Utána az eredményül kapott sorozatot ládarendezzük a k-1-edik komponens szerint, és így tovább, végül az első komponens szerint. Arra kell ügyelni, hogy az elemeket mindig a ládájukat jelentő lista végére rakjuk. A rendezés költsége a k ládarendezés költségének az összege. A ládarendezésről mondottak szerint ez k ⎛ ⎞ O ⎜ kn + ∑ si ⎟ . i =1 ⎝ ⎠
_____________________________________________________________________________________ 58
B02
Kupac adatszerkezet, műveletek, lépésszámuk, kupacépítés (*). Kupacos rendezés, lépésszáma. Lineáris és bináris keresés rendezett halmazban, a keresés lépésszáma, alsó korlát. Bináris keresőfák, műveletek, lépésszámuk.
Kupac adatszerkezet, műveletek [Algoritmusok – 37. oldal] A kupac adatszerkezettel egy (U,<) rendezett halmaz (a kulcsok univerzuma) egy S véges részhalmazát szeretnénk tárolni. Két művelet tartozik a szerkezethez: BESZÚR (U egy elemének hozzávétele S-hez) és MINTÖR (az S halmaz < szerinti minimális elemének törlése). Kupac műveletek lépésszáma, kupacépítés (*). A kupac adatszerkezet egy hatékony implementációja a bináris kupac. A bináris fa egy olyan fa, amelynek csúcsai szinteken helyezkednek el. A szintek száma l. A legfelső szinten levő egyetlen csúcs a gyökér. Tetszőleges csúcsból maximum két él indul ki. Ezek a csúcs bal és jobb fiai. Minden gyökértől különböző csúcsnak van egy és pontosan egy apja. Az a csúcs aminek nincs fia a levél. A nem-levél csúcsokat szokás belső csúcsoknak is nevezni. Egy tömb tekinthető bináris fának, ahol a csúcsok az A[1:n] elemek. A[i] bal fia A[2i], jobb fia pedig A[2i+1]. Az ilyen alakban ábrázolható bináris fákat teljesnek nevezzük. Ezek levelei maximum 2 szinten, a legalsón és esetleg a felette levőn helyezkednek el és legfeljebb egy kivétellel minden belső csúcsuknak 2 fia van. A kupac elemeit egy bináris fában tároljuk. A fa csúcsaiban vannak a tárolni kívánt S halmaz elemei. Egy csúcsban egy elem van, de ugyanaz az elem előfordulhat több csúcsban is. A fára teljesül a kupactulajdonság: egy tetszőleges csúcs eleme nem lehet nagyobb a fiaiban levő elemeknél. Ha a kupacnak n eleme van, akkor a keretül szolgáló teljes bináris fa egy n elemű tömbben tárolható. Először tetszőleges sorrendben beolvassuk az elemeket a tömbbe majd gondoskodunk a kupactulajdonságról. Ehhez a segédeljárás a következő: felszivárog(f) {Ha min {a1 , a2 } < a , akkor min {a1 , a2 } és a helyet cserél. Ha az a elem ai -vel cserélt helyet, akkor felszivárog( fi ).} Itt f egy részfa gyökere, a az itt tárolt elem, f (a kupac-tulajdonságot már teljesítő) fiai f1 , f 2 , a bennük levő elemek a1 , a2 . Tehát a addig megy lefelé a fában, amíg sérti a kupac-tulajdonságot. Ha f egy teljes bináris fa gyökere, a fa csúcsaiban S elemeivel, akkor az egész fát kupaccá teszi: kupacépítés(f) {Az f fa v csúcsaira lentről felfelé, jobbról balra felszivárog(v).} Azaz a fának megfelelő A tömbben A[n]-től A[1]-ig felszivárogtatunk. Az eljárás lineáris költséggel megvalósítható. MINTÖR megvalósítása: a törlendő elem a kupac-tulajdonság miatt a fa f gyökerében van. Ezt kivesszük innen, majd f-be tesszük a fa utolsó szintjén a jobb szélső csúcsban levő elemet; az utóbbi csúcsot töröljük, majd felszivárog(f) következik. Összköltség O(l)=O(log n). BESZÚR(s) megvalósítása: új levelet adunk a fához (ügyelve a teljességre). Ebbe tesszük az s elemet. Ezután s-t mozgatjuk felfelé, amíg az őt tartalmazó csúcs apjában levő s’ elemre igaz, hogy s<s’. Összköltség O(l)=O(log n). Kupacos rendezés, lépésszáma. Bemenete a rendezendő sorozatot tartalmazó A[1:n] tömb. Először kupacot építünk, utána n darab MINTÖR adja nem csökkenő sorrendben az elemeket. Az összköltség: O(n)+O(n log n)=O(n log n). _____________________________________________________________________________________ 59
Lineáris és bináris keresés rendezett halmazban, a keresés lépésszáma, alsó korlát [Algoritmusok – 27. oldal] A keresés lényege, hogy adott az (U,<) rendezett halmaz véges S részhalmaza. A bemenet része egy s elem az U-ból. A feladat annak eldöntése, hogy s eleme-e S-nek és ha igen, akkor mi az ott elfoglalt helye. Ezt a feladatot szeretnénk összehasonlítások sorozatával megoldani. Lineáris keresés: addig lépkedünk végig összehasonlítgatásokkal az s1 , s2 ,… , si … ∈ S elemeken, amíg ki nem derül, hogy s benne van-e S-ben vagy nincs. A legkedvezőtlenebb esetben ez |S|=n összehasonlítást jelent. Átlagos esetben azt feltételezzük, hogy a keresett elem egyenlő eséllyel lehet a ( −∞, s1 ] , ( s1 , s2 ] ,… , ( sn−1 , sn ] , ( sn , ∞ ) intervallumok bármelyikében. Ha az elsőben van, akkor 1 összehasonlítást végeztünk, ha az utolsóban, akkor n-et. Ennek az n+1 számnak az átlaga: (n/2)+1. Átlagos esetben ennyi összehasonlítást végzünk. Bináris keresés: először az S halmaz középső elemét hasonlítjuk össze s-sel. Ennek az si elemnek az i sorszáma lehet k vagy k+1, ha n=2k. Ha n=2k+1, akkor i=k+1. Ha si =s, akkor egyetlen lépésben végeztünk. Ha si <s, akkor elég az si „feletti”, ellenkező esetben az si „alatti” részhalmazban újrakezdeni a keresést. Így mindig egy feleakkora halmazzal folytathatjuk a keresést, összesen tehát j+1
majd töröljük az y csúcsot. Utóbbi egy könnyű törlést jelent, mert y-nak nem lehet jobboldali fia. A kereső-fa tulajdonság sértetlen maradt. Az összköltség ekkor is O(l).
_____________________________________________________________________________________ 61
B03
AVL-fák, szintszám (*), műveletek (*), lépésszámuk (*). 2-3 fák, szintszám, műveletek, lépésszámuk. B-fák, műveletek (*), lépésszámuk (*).
AVL-fák, szintszám (*), műveletek (*), lépésszámuk (*) [Algoritmusok – 71. oldal] Bináris keresőfák esetén a keresés és a többi művelet szempontjából lényeges jellemző a fa szintjeinek száma (~magassága). Egy fa magassága akkor mondható jónak, ha legfeljebb c log 2 n , ahol n a csúcsok száma és c egy kis pozitív állandó. Az olyan fa- konstrukciókat, ahol c értéke 1-nél nem sokkal nagyobb, kiegyensúlyozott fáknak nevezzük. Jelölje m(f) az f bináris fa magasságát. Legyen x az f egy csúcsa; ekkor m(x) jelöli az x-gyökerű részfa magasságát. [AVL-tulajdonság] Egy bináris keresőfa AVL-fa, ha minden x csúcsára teljesül, hogy m(bal ( x)) − m( jobb( x)) ≤ 1 . A feltétel szerint egy csúcs jobb és bal részfájának a magassága közel egyenlő. Egy n-pontú AVL-fa szintjeinek k száma nem több mint O(logn), pontosan k ≤ 1, 44log 2 (n + 1) . Az AVL-tulajdonságot a forgatással őrizhetjük meg. Legyen S egy bináris keresőfa, melynek gyökere az x csúcs, ennek bal fia y. Jelölje f az y bal, g pedig a jobb részfáját. Legyen h az x jobb részfája. A bináris keresőfa-tulajdonság megmarad, ha S fát átalakítjuk úgy, hogy y lesz a gyökere, ennek bal részfája marad f, az y jobb fia x, ennek részfái g (bal) és h (jobb). Ezt a műveletet nevezzük jobb forgatásnak. Inverze a bal forgatás. Legyen az S bináris keresőfa, gyökere az x csúcs, ennek bal fia y, y jobb fia z. Végezzünk el egy bal forgatást az y gyökerű részfára, majd egy jobb forgatást az így kapott S-re. Ennek az operációnak (és tükörképének is) a neve dupla forgatás. A beszúrás és törlés magvalósítására a naiv algoritmusokat használjuk, kiegészítve azzal, hogy a művelet elvégzése után forgatásokkal visszaállítjuk (ha szükséges) az AVL-tulajdonságot. Legyen S egy n csúcsból álló AVL-fa. BESZÚR(s,S) után legfeljebb egy (esetleg dupla) forgatással helyreállítható az AVL-tulajdonság. A beszúrás költsége ezzel együtt is O(logn). Az n szögpontú AVL-fából való naív törlés utána legfeljebb 1.44 log 2 n (szimpla vagy dupla) forgatás helyreállítja az AVL-tulajdonságot. 2-3 fák, szintszám, műveletek, lépésszámuk [Algoritmusok – 64. oldal] Igen hatékony keresőfa konstrukció, tárolási szerkezete fa, azonban egy nem levél csúcsnak 2 vagy 3 fia lehet. A cél egy rekordtípus hatékony tárolása és elérése úgy, hogy a rekordok a levelekben vannak míg a belső csúcsok csak kulcsokat és mutatókat tartalmaznak. A 2-3-fa egy (lefelé) irányított gyökeres fa, melyre igazak az alábbiak: 1. A tárolni kívánt rekordok a fa leveleiben helyezkednek el, a kulcs értéke szerint balról jobbra növekvő sorrendben. Egy levél egy rekordot tartalmaz. 2. Minden belső (azaz nem levél) csúcsból 2 vagy 3 él megy lefelé; ennek megfelelően a belső csúcsok egy illetve két s ∈ U kulcsot tartalmaznak. A belső csúcsok szerkezete tehát kétféle lehet. Az egyik típus így ábrázolható: m1 | s1 | m2 | s2 | m3 Itt m1 , m2 , m3 mutatók a csúcs részfáira, s1 , s2 pedig U-beli kulcsok, melyekre teljesül, hogy s1 < s2 . Az m1 által mutatott részfa minden kulcsa kisebb, mint s1 , az m2 részfájában s1 a legkisebb kulcs, és minden kulcs kisebb, mint s2 . Végül m3 részfájában s2 a legkisebb kulcs. Előfordulhat, hogy egy csúcsból az utolsó két mező hiányzik. A belső csúcsoknak ez a típusa valamivel egyszerűbb alakú: _____________________________________________________________________________________ 62
m1 | s1 | m2 Ez esetben a csúcsnak csak két részfája van; a baloldaliban vannak az s1 -nél kisebb kulcsú rekordok, a jobboldaliban pedig s1 a legkisebb kulcs. 3. A fa levelei a gyökértől egyforma távolságra vannak. Ha a fának m szintje van, akkor a levelek száma legalább 2m−1 . Megfordítva, ha |S|=n (itt S ⊆ U a fában tárolt kulcsok halmaza; |S| megegyezik a tárolt rekordok számával), akkor m ≤ log 2 n + 1 . Bizonyítás: A 3. tulajdonság szerint a fa i-edik szintjén levő csúcsok mind belső csúcsok, ha 1 ≤ i ≤ m −1 . A 2. tulajdonság szerint minden ilyen csúcsnak legalább két fia van. Ezekből könnyű indukcióval adódik, hogy az i-edik szinten legalább 2i−1 csúcs van ( 1 ≤ i ≤ m ). Ezt i=m-re alkalmazva 2m−1 ≤ n amiből logaritmusokat véve m − 1 ≤ log 2 n . A KERES(s,S) első lépéseként az s kulcsot összehasonlítjuk az S gyökerében lévő s1 és esetleg s2 kulcsokkal. Ennek eredményeként megtudhatjuk, hogy a 3 részfa melyikében kell folytatni a keresést ( s < s1 , s1 ≤ s ≤ s2 , s2 < s ). A keresést azután ugyanígy folytatjuk egy szinttel lejjebb. Ha a fában tárolt rekordok száma n, a fa szintjeinek száma pedig m, akkor szintenként nem több, mint két kulcs-összehasonlítást kell végezni. Így a keresés összköltsége: O(logn). A továbbiakban tegyük fel, hogy U=A,B,C,.... a szokásos rendezéssel. A BESZÚR(s,S) végrehajtása kereséssel kezdődik, és csak akkor van érdemi munka, ha nincs a fában s kulcsú levél. Tegyük fel, hogy ez a helyzet, és jelölje x a legalsó belső csúcsot a kereső út mentén. Tegyük fel, hogy x így néz ki: m1 | J | m2 Az m1 által meghatározott levél kulcsa legyen C (a másik levélé szükségképpen J). Ha például s=K, akkor x így módosul: m1 | J | m2 | K | m3 Az m3 mutató fog az új levélre mutatni. Ha viszont s=I, akkor x tartalma a következő lesz: m1 | I | m2 | J | m3 Ha s a legkisebb kulcsot is megelőzi, mondjuk s=A, akkor x így alakul: m3 | C | m1 | J | m2 Az új rekord beillesztése tehát elég egyszerű, ha x-nek két fia van. Más a helyzet, ha x már két kulcsot tartalmaz. Tegyük fel, hogy x legutóbbi ábra szerinti állapotban van. Ha az s=H kulcsú rekordot akarjuk beilleszteni, akkor alkalmazzuk a csúcsvágás elnevezésű ötletet: az x mellé egy további y csúcsot veszünk. A két csúcs tartalma: m3 | C | m1 illetve m4 | J | m2 lesz. Az m4 fog a H kulcsú rekordra mutatni. Ezután az új y csúcsot is a fába kell illeszteni. Ez azt jelenti, hogy az x apjába kell egy kulcs-mutató párt tennünk. A beillesztendő kulcs mindig a nagyság szerint a középső. Az egy szinttel feljebb történő beszúrást ugyanazzal a módszerrel végezzük, ahogy x-nél eljártunk. Ha x apjának csak két gyermeke volt, akkor az egyszerű ágon fejezzük be a munkát. Ha nem, akkor itt is csúcsvágást alkalmazunk. A csúcsvágások sora elgyűrűzhet esetleg a fa gyökeréig. Ekkor a csúcsvágás után keletkező x és y rekordok fölé egy új gyökeret teszünk. A szintek száma eggyel nőtt, viszont a növekedés a fa tetején történt miáltal megtartottuk a 2-3 fákkal kapcsolatos 3. követelményt. A TÖRÖL(s,S) eljárás esetén, ha x-nek 3 fia van, akkor az s kulcsú levél törlése után x-ben az értelemszerű változásokat elvégezve készen vagyunk. Gondot jelent viszont, ha x-nek csak 2 fia van, hiszen ekkor törlés esetén megsérülne a 2. követelmény. Még mindig könnyű dolgunk van, ha x valamelyik szomszédos testvérének 3 fia van; ekkor ezek közül egyet áttehetünk x-be. Csak x-et, adakozó testvérét és az apjukat kell módosítani.
_____________________________________________________________________________________ 63
Ha x egyik szomszédos testvérének sincs három részfája, akkor alkalmazzuk a csúcsösszevonás műveletet. Ennek lényege, hogy x-et és az egyik testvérét egyetlen csúccsal helyettesítjük. Legyenek x és a fában szomszédos testvére y az alábbiak: m1 | J | m2 illetve m3 | M | m4 Legyenek m1 illetve m3 által mutatott levelek kulcsai A és K. Ha s=K a törlendő kulcs, akkor az összevonás után x így néz ki: m1 | J | m2 | M | m4 Az y csúcsot töröljük. A K kulcsértéket és a hozzá tartozó mutatót törölni kell x apjából (törlés egy szinttel feljebb). A többi három eset (azaz A vagy J vagy M törlése) hasonlóan végezhető. Csúcsösszevonáshoz vezető törlés után egy szinttel magasabban is felmerül egy törlési igény. Ezt az itt ismertetett módon kezeljük. A beszúrásnál tapasztalt jelenséghez hasonlóan a törlések is elgyűrűzhetnek egészen a gyökérig. Külön figyelemre akkor van szükség, ha a törlés után a gyökérnek csak egyetlen fia maradna. Például tegyük fel, hogy a gyökér m1 | L | m2 alakú és törülnünk kell az L kulcsot és a hozzá tartozó m2 mutatót. Ekkor az m1 által mutatott részfa gyökere lesz az új gyökér. A szintek száma eggyel kevesebb lesz, de megint megőrződtek a 2-3 fákkal kapcsolatos követelmények. Tehát a három fő művelet – a keresés, a beszúrás, a törlés – elvégezhető O(logn) költséggel, ahol n a tárolt rekordok száma. B-fák, műveletek (*), lépésszámuk (*) A B-fák adják a keresőfa adatszerkezet ma ismert legjobb külső táras megvalósítását. A cél egy rekordokból álló állomány tárolása külső táron úgy, hogy az elérés alapjául egy (U,<) rendezett halmazból való kulcsok szolgálnak. A csúcsokon a külső tár lapjai vannak, ezért a lapelérések számát próbáljuk optimalizálni. A kitüntetett művetek a következők: BESZÚR, TÖRÖL, KERES, MIN, MAX, TÓLIG. A B-fák a 2-3-fák természetes általánosításai. A lényegi különbség, hogy a B-fáknak háromnál több fia is lehet, és a fa egy levelében egynél több rekord is helyet kaphat. Legyen m ≥ 3 egész szám. Ekkor m-edrendű B-fa, röviden Bm -fa egy gyökeres, (lefelé) irányított fa, melyre érvényesek az alábbiak: 1. A gyökér foka legalább 2, kivéve esetleg, ha a fa legfeljebb kétszintes. ⎡m⎤ 2. Minden más belső csúcsnak legalább ⎢ ⎥ fia van. ⎢2⎥ 3. A levelek a gyökértől egyforma messze vannak. 4. Egy csúcsnak legfeljebb m fia lehet. A B-fák belső csúcsai is hasonlítanak a 2-3-fák belső csúcsaira, az eltérés annyi, hogy itt több bejegyzés lehet: m0 | s1 | m1 | s2 | m2 | … | si | mi
⎡m⎤ ahol a 2. és 4. követelményeknek megfelelően ⎢ ⎥ − 1 ≤ i ≤ m − 1 . ⎢2⎥ Tegyük fel, hogy egy B-fának n levele és k szintje van, ekkor log 2 n − 1 k≤ +2, ⎡m⎤ log 2 ⎢ ⎥ ⎢2⎥ ahol k a egyben a kereséshez szükséges lapelérések számát is jelöli. Tehát a műveletek költsége arányos a szintek számával. _____________________________________________________________________________________ 64
B04
Vödrös hash-elés, a műveletek lépésszáma (*). Nyitott címzésű hash-elés: lineáris és kvadratikus maradék próba (*), kettős hash-elés. Jó hash-függvények (*). A hash-elés alkalmazhatósága, összehasonlítva a keresőfákkal.
Vödrös hash-elés, a műveletek lépésszáma (*) [Algoritmusok – 87. oldal] Hashelés lényege: olyan h függvény konstruálása és alkalmazása, ami kulcsok egy nagy halmazát (pl. összes lehetséges magyar személyi szám) képezi le értékek egy kisebb halmazára (pl. a 0 és 12 millió közötti intervallum egész számai). Ennek alkalmazásával egy olyan módszerhez jutunk, amely gyors és egyszerű megvalósítását teszi lehetővé a beszúrásnak, törlésnek és módosításnak. Nem tételezzük fel a lehetséges kulcsok rendezettségét. A hash-es megoldások átlagos értelemben nagyon gyorsak, a legrosszabb esetben viszont nagyon lassúak is lehetnek. Vödrös hash-elés: szokásos láncolásnak is nevezni. A vödörkatalógus egy h értékkészletének elemeivel indexelt V tömb, melynek elemei mutatók, pontosabban lapláncok (vödrök) fejei. A vödrök lapjain helyezkednek el a tárolni kívánt rekordok. A V[i] mutatóval kezdődő vödörbe kerülnek azok a rekordok, amelyek K kulcsaira h(K)=i teljesül. Beszúrás és keresés előtt kiszámítjuk h(K) értékét, majd a megfelelő vödörbe beillesztjük az új elemet, illetve szekvenciális kereséssel elindulunk a vödör lapjain és kiderítjük, hogy megtalálható-e a keresett elem. Törlés és módosítás ugyanilyen egyszerű. Ha a módosítás kulcsot is érint, akkor törlés és újra beillesztés is kellhet, mert h értéke a kulcs változásával szintén megváltozhat. Külső táras adatszerkezetről lévén szó, a lapelérések száma a lényeges. A keresés átlagos költsége maximum 1+p/M lapelérés (M vödör van és p lapnyi rekordot tárolunk összesen). Nyitott címzésű hash-elés Csak belső memóriás módszerként hasznos. A rekordokat a T[0 : M-1] tömbben kívánjuk elhelyezni. A K kulcsú rekordnak a T[h(K)] helyet szánjuk, feltéve, hogy az nem foglalt. Ellenkező esetben valamilyen szisztematikus módon próbálunk helyet keresni a T további celláiban. A nyitott címzésű módszerek ütközésfeloldásra a 0,1,...,M-1 számok egy 0, h1 ( K ), h2 ( K ),… , hM −1 ( K ) permutációját használják (azaz végigpróbálgatják a h( K ) + hi ( K ) sorszámú cellákat az első üres helyig). Ezt az ütközésfeloldást használja mind a beszúrás mind a keresés (utóbbi addig megy, amíg meg nem találjuk a keresett elemet vagy üres cellához vagy a tábla végéhez nem érünk – utóbbi két esetben nincs meg amit keresünk). Lineáris és kvadratikus maradék próba (*) Lineáris próba esetén hi ( K ) := −i , azaz a K kulcsú rekord beillesztése során a h(K) című cellától indulva addig lépkedünk egyesével balra (T[0] után a tömb végére ugorva) amíg üres helyet nem találunk. 1⎛ 1 ⎞ Sikeres keresések során megvizsgált cellák átlagos száma CN = ⎜1 + ⎟ 2 ⎝ 1−α ⎠ 2 1⎛ ⎛ 1 ⎞ ⎞ ' Sikertelen keresések során megvizsgált cellák átlagos száma CN = ⎜1 + ⎜ ⎟ ⎟ 2 ⎜⎝ ⎝ 1 − α ⎠ ⎟⎠ N α= a telítettségi tényező (táblában levő rekordok / tábla celláinak száma) M Törlésnél arra kell figyelni, hogy az eltávolított elem helyére nem NULL-t kell tenni, hanem egy TÖRÖLT szimbólumot, különben a keresés elakadna a kivett elem helyén. Álvéletlen próbálás: a 0, h1 ( K ), h2 ( K ),… , hM −1 ( K ) próbasorozat a 0...M-1 számoknak egy K kulcstól független álvéletlen permutációja. A lineáris próbálgatásnál elsődleges csomósodás volt, ami azt jelenti, hogy ha egy R’ rekord beillesztése során elérjük a már tárolt R rekord keresési útját, akkor azt rendszerint végig is kell járni. Álvéletlen próbánál másodlagos csomósodás van, ami azt jelenti, hogy ha a K és L kulcsokra h(K)=h(L), akkor a K és L kulcsok teljes próbasorozata is megegyezik, így ha sok azonos címre kerülő kulcs van, akkor a közös próbasorozatok mentén alakul ki a csomósodás. _____________________________________________________________________________________ 65
Kvadratikus maradék próba: az álvéletlen próbálás egy példája. M:=4k+3 alakú prím, ahol k egy egész. A próbasorozat legyen 2
⎛ M −1 ⎞ ⎛ M −1 ⎞ 0,1 , −(1 ), 2 , −(2 ),… , ⎜ ⎟ ,−⎜ ⎟ ⎝ 2 ⎠ ⎝ 2 ⎠ A keresési költségek: 2
2
2
2
2
CN ≈ 1 − log(1 − α ) −
α
2 1 C N' ≈ − α − log(1 − α ) (1 − α ) Ezek az összefüggések érvényesek az összes olyan módszerre, ahol hi ( K ) = f i (h( K )) , vagyis ahol a h(K) érték már az egész próbasorozatot meghatározza. Kettős hash-elés Lényege, hogy a h mellett egy másik h’ hash-függvényt is használunk, ahol megköveteljük, hogy h’(K) értékek relatív prímek legyenek a M táblamérethez. Ekkor a K kulcs próbasorozata hi ( K ) := −ih '( K ) . A különböző K és K’ kulcsok próbasorozatai jó eséllyel akkor is különbözőek lesznek, ha h(K)=h(K’) és így kiküszöbölődik mindkét féle csomósodás. Másrészt sikertelen keresés esetén minden érdekes α -ra gyorsabb, mint a lineáris próba, viszont sikeres kereséskor csak az α ≥ 0,8 tartományban gyorsabb annál. Jó hash-függvények (*). A h-val szembeni követelmény, hogy legyen gyorsan kiszámítható és minél kevesebb ütközést okozzon. A következő két módszer szolgál ilyen függvények előállítására: Osztómódszer: h( K ) := K (mod M ) , ahol M a tábla vagy a vödörkatalógus mérete. Feltesszük, hogy a kulcsok egész számok. h(K) számítása gyors és egyszerű, csak egy maradékos osztás kell hozzá. Szorzómódszer: Itt egy rögzített β paraméter használatos, ami egy valós szám. Ekkor
h( K ) := ⎢⎣ M *{β K }⎥⎦ . A kettős hash-elés második függvénye: Ha M prím, akkor a következő függvény megteszi: h '( K ) := K (mod M − 1) + 1 .
A hash-elés alkalmazhatósága, összehasonlítva a keresőfákkal Átlagos viselkedés – legrosszabb eset: Hashelt szervezésnél az alapműveletek átlagos értelemben gyorsabbak, ezért pl. ügyviteli alkalmazásoknál, ahol nagy mennyiségű teendőt kell összességében kedvező időben elvégezni ez használatos. A keresőfák viszont garanciát nyújtanak a legrosszabb esetek idejére is, így pl. valós idejű feladatokban őket kell használni. Rendezés a felhasználói igényekben: ha komoly feltétel az adatok rendezhetősége, akkor a keresőfáknál megismert MIN, MAX és/vagy TÓLIG eljárások használhatók erre. A hash-elt szervezés csak bonyolult kiegészítő megoldásokkal tudja figyelembe venni az univerzum rendezettségét. Dinamika: Ha nem tudunk a méretre realisztikus felső korlátot adni, akkor a rendkívül rugalmasan és tág határok között változtatható méretű keresőfákat kell alkalmazni. A hash-elt szervezésnél ha betelik a tábla vagy a telítettség már túl nagy, akkor új, nagyobb táblával (vödörkatalógussal) kell újraszervezni az állományt.
_____________________________________________________________________________________ 66
B05
A Turing-gép fogalma, működése. A többszalagos Turing-gép szimulálása egyszalagossal, az idő és tárkorlát változása (*). A Chomsky nyelvosztályok kapcsolata a Turing-gép változataival (*). Univerzális Turing-gépek létezése (*). Church-Turing-
tézis.
A Turing-gép fogalma, működése [Algoritmusok – 191. oldal] Legyen k egy pozitív egész szám. Egy k-szalagos Turing gép egy hetessel jellemezhető: M = (Q, T , ü, I , q0 , δ ) , ahol • Q: egy véges halmaz, az M gép belső állapotainak halmaza. A gép a működése során mindig valamelyik q ∈ Q állapotban van. • T: egy véges halmaz, a szalagjelek halmaza. Egy szalagmezőn mindig egy T-beli jel van. • ü: egy kitüntetett szalagjel, az üresjel. A bemenetként felírt jeleken és a gép számítása során kiírt jeleken kívül minden szalagcellában ü van. Az üresjelet tekinthetjük úgy, mint a még nem használt mezők tartalmát. • I: I ⊆ T \ {ü} az input jelek vagy bemenő jelek halmaza, más szóval az input abc. A gépnek adott bemenetet az I elemeiből kell összeállítani. Az üresjel nem lehet input jel. • q0 : q0 ∈ Q a kezdő állapot. A gép a munka megkezdése előtt a q0 állapotban van. • F: F ⊆ Q az elfogadó állapotok halmaza. Bizonyos számításoknál csak egy kétértékű döntést várunk a géptől. Ekkor csak azt nézzük, hogy a gép milyen állapotban állt meg. Az egyik választ az jelenti, hogy ez a végállapot F-beli, a másikat pedig az, hogy nem F-beli. Ezzel összhangban a Q\F-be tartozó állapotokat elutasító állapotoknak nevezzük. • δ : A δ : Q × T k → Q × (T × { jobb, bal , helyben}) k egy parciálisan értelmezett függvény a gép átmenetfüggvénye. Az átmenetfüggvény tekinthető a gép programjának. A δ függvény mondja meg, hogy a gép a q állapotban van, és az i-edik fej alatt lévő szalagjel ai (1 ≤ i ≤ k ) , akkor mit kell lépni. Ennek megfelelően a δ (q; a1 , a2 ,…, ak ) nincs értelmezve, ha ez a lépés a megállás. A többi esetben a δ (q; a1 , a2 ,…, ak ) érték 2k+1 összetevőből áll. Ezek: a gépnek a lépés utáni q ' ∈ Q állapota; továbbá az i-edik szalagra kiírt bi szalagjel, valamint az i-edik fej elmozdulása ( 1 ≤ i ≤ k ). Az elmozdulás legfeljebb mezőnyi, ezért leírható a jobb, bal, és helyben lehetőségek egyikeként. A δ függvényről még feltesszük, hogy az F-beli állapotokon nincs értelmezve. Az I input abc elemeiből álló véges sorozatokat szavaknak nevezzük. Az I jeleiből alkotott szavak halmazát I*-gal jelöljük. I* részhalmazait nyelveknek nevezzük. A gép a működés előtt kezdőhelyzetben van. A gép állapota q0 kezdőállapot, az író-olvasó fejeik a szalagjaik első cellájára mutatnak, az s ∈ I * bemenet az első szalag elejére van írva, az összes többi mezőn az ü üresjel található. A gép a kezdőhelyzetből kiindulva lépéseket tesz. A lépések tartalmát jelentő változásokat a δ függvény írja le: a lépés előtti állapotnak és a fejek alatti jeleknek megfelelő δ érték adja meg az új állapotot, a kiírandó jeleket és a fejmozgásokat. Ha a gép egy olyan helyzethez ér, amelyre δ nincs értelmezve, akkor megáll. Ez történik egyebek között akkor, ha a gép elfogadó (azaz Fbeli) állapotban van.
A többszalagos Turing-gép szimulálása egyszalagossal [Algoritmusok – 198. oldal] Bizonyos Turing-gépek helyettesíthetők, szimulálhatók másfélékkel, azonban ezek is ugyanazt a nyelvet ismerik fel, illetve ugyanazt a függvényt számolják ki. Legyen M egy k-szalagos Turing-gép. Van olyan egyszalagos M’ Turing-gép, melyre LM = LM ' (vagy f M = f M ' ), továbbá
TM ' (n) ≤ 2TM2 (n) , _____________________________________________________________________________________ 67
S M ' ( n) ≤ S M ( n) + n . Bizonyítás: [Algoritmusok – 199. oldal] Az idő és tárkorlát változása (*) [Algoritmusok – 197. oldal] A Turing-gép egyik előnye, hogy segítségével egyszerűen vizsgálhatjuk a számítások idő- és tárigényét. Az M Turing-gép számolási ideje az s inputon a megállásig végrehajtott lépések száma, tárigénye pedig a felhasznált szalagcellák száma. Jelölje TM (n) az M gép maximális számolási idejét az n jelből álló bemeneteken. Az n hosszú szavakon a maximális tárigényt S M (n) -nel jelöljük. Ha van olyan n jelből álló s ∈ I * szó, amellyel elindítva M nem áll meg véges sok lépés után, akkor TM (n) értékét végtelennek tekintjük. Hasonló mondható az S M függvényről is. Van olyan L nyelv, amelyre igazak az alábbiak: 1. Az L felismerhető egy olyan M Turing-géppel, melyre TM (n) véges minden n-re. 2. Tetszőleges, az L-et felismerő N Turing-géphez van olyan N’ Turing-gép, amelyre L = LN ' szintén teljesül, továbbá TN ' (n) = O(log TN (n)) . A Chomsky nyelvosztályok kapcsolata a Turing-gép változataival (*) Minden 0-s nyelvosztályhoz tartozó nyelvhez szerkeszthető egy olyan Turing-gép, amely pontosan a nyelvtan által generált mondatokat, és csakis azokat fogadja el. Az 1-es osztályú, vagyis környezetfüggő nyelvek ekvivalensek a lineárisan korlátos automatákkal. A lineárisan korlátos automata nagyon hasonlít a Turing-gépre. Van egy véges állapothalmaza, van egy íróolvasófejjel ellátott szalagja, a különbség csupán annyi, hogy a szalag korlátos, pontosabban olyan terjedelmű, amilyen a bemeneti jelsorozat. Univerzális Turing-gépek létezése (*) Az univerzális Turing-gépek a fordítóprogramok népes családján belül az interpreterek közé tartoznak. Bemenetük két részből áll. Az egyik komponens az interpretálandó program, ami egy M Turing-gép leírása. A másik része az interpretálandó M gép tetszőleges s ∈ I * bemenete. Az univerzális gép az M leírását, más szóval kódját értelmezve lépésről lépésre utánozza M működését. Minden szóba jövő gépet egy w ∈ I * szóval írunk le. Tetszőleges w ∈ I * szóhoz legfeljebb egy gép van – ennek jele legyen M w –, amelynek a kódja w. Az M ismeretében a w kód algoritmussal kiszámítható. A w leírás ismeretében pedig az M w gép jellemzői (állapotai, átmenetfüggvénye, stb.) algoritmussal megkaphatók. Van olyan 3-szalagos U Turing-gép, amelyre teljesül a következő: ha w, s ∈ I * és M w létezik, akkor az U gép a w#s bemenetet pontosan akkor fogadja el (utasítja el, kerül vele végtelen ciklusba), ha M w az s bemenetet elfogadja (elutasítja, végtelen ciklusba kerül vele). Church-Turing-tézis. Ami algoritmussal – azaz véges eljárással – kiszámítható (eldönthető), az Turing értelemben kiszámítható (eldönthető). Nevezetesen: • Egy f : I * → I * parciális függvény kiszámítható ⇔ f parciálisan rekurzív. • Egy f : I * → I * (teljes) függvény kiszámítható ⇔ f rekurzív. • Egy L ⊆ I * nyelvre a nyelvbe tartozás problémája algoritmussal eldönthető ⇔ L rekurzív.
_____________________________________________________________________________________ 68
Rekurzív és rekurzívan felsorolható nyelvek és rekurzív, illetve parciálisan rekurzív függvények. Az R, RE, coR és coRE nyelvosztályok kapcsolata. Nevezetes nyelvek, bonyolultságuk: diagonális nyelv, univerzális nyelv (*), megállási nyelv, dominó probléma (*), Post megfeleltetési feladata (NB), környezetfüggetlen nyelvtanokkal kapcsolatos eldönthetetlen feladatok (*).
B06
Rekurzív és rekurzívan felsorolható nyelvek és rekurzív, illetve parciálisan rekurzív függvények. [Algoritmusok – 202. oldal] Az M Turing-gép által felismert LM nyelv azokból az s ∈ I * szavakból áll, amelyekkel mint bemenetekkel elindítva az M megáll, mégpedig elfogadó állapotban. A továbbiakban I egy nemüres véges halmaz. Az L ⊆ I * nyelvet rekurzíve felsorolhatónak nevezzük, ha van olyan M Turing-gép, melyre L = LM , azaz a gép által felismert nyelv éppen L. Az L ⊆ I * nyelv rekurzív, ha van olyan M Turing-gép, melyre L = LM és M minden s ∈ I * szóra megáll. Az f : I * → I * parciális függvény parciálisan rekurzív függvény, ha létezik olyan M Turing-gép, hogy f = f M . Ha ezen túl még f minden s ∈ I * inputra értelmezve van, akkor f egy rekurzív függvény. A rekurzív nyelv/függvény rekurzív felsorolható is. A rekurzív elnevezés onnan ered, hogy a rekurzív függvények azok a függvények, melyek bizonyos egyszerű függvényekkel rekurzió segítségével felépíthetők. A rekurzív felsorolható kifejezés arra utal, hogy a nyelv szavai egy alkalmas eljárással felsorolhatók. Church-Turing tézis: Ami algoritmussal – azaz véges eljárással – kiszámítható (eldönthető), az Turing értelmében kiszámítható (eldönthető). Nevezetesen: • Egy f : I * → I * parciális függvény kiszámítható ⇔ f parciálisan rekurzív. • Egy f : I * → I * (teljes) függvény kiszámítható ⇔ f rekurzív. • Egy L ⊆ I * nyelvre a nyelvbe tartozás problémája algoritmussal eldönthető ⇔ L rekurzív. A következő két tétel a Cantor-féle átlós módszerrel bizonyítható (a kakukktojás nyelvnek akkor eleme egy szó ha nincs a rekurzív felsorolható nyelvek szavai között) Van olyan L ' ⊆ I * nyelv, amely nem rekurzíve felsorolható. Létezik olyan f : I * → I * parciális függvény, amely nem parciálisan rekurzív. Az R, RE, coR és coRE nyelvosztályok kapcsolata. [Algoritmusok – 208. oldal] *
R ⊂ RE ⊂ 2 I R = coR R = RE ∩ coRE Diagonális nyelv
{
Ld = w ∈ I * ;az M w gép létezik, és w ∉ LM w
}
Tétel: Ld nem rekurzíve felsorolható. Biz.: azokat a Turing-gépeket kell nézni, amelyek nem fogadják el a saját kódjukat és indirekt kell bizonyítani az állítást: Ha a tétel ellenkezőjét tesszük fel mindkét irányban, akkor arra jutunk, hogy M akkor és csak akkor ismeri fel a saját kódját, ha nem ismeri fel a saját kódját, ami képtelenség. _____________________________________________________________________________________ 69
Univerzális nyelv (*)
{
Lu = w # s ∈ I * ; az M w gép létezik, és s ∈ LM w
}
Tétel: Lu egy rekurzíve felsorolható, de nem rekurzív nyelv. Megállási nyelv. [Algoritmusok – 216. oldal] A megállási probléma kérdése az, hogy egy (a kódjával adott) Turing-gép adott bementtel egyáltalán megáll-e. A vonatkozó nyelv:
Lh = {w # s ∈ I * | az M w gép létezik és az s bemenettel elindítva véges sok lépésben megáll} Tétel: Lh ∈ RE \ R A megállási probléma akkor is algoritmikusan eldönthetetlen marad, ha az M w gépet üres inputtal futtatjuk.
Lε = {w ∈ I * : M w létezik és az ε (üres) inputon megáll} Tétel: Lε ∈ RE \ R Dominó probléma (*) [Algoritmusok – 222. oldal] Dominó alatt egy olyan egységnyi élű négyzet alakú lapot értünk, melynek a négy élére egy-egy jel van írva. A dominó típusa az e jelekből álló rendezett négyes. A kérdés, hogy ha adott a dominó-típusok egy véges F halmaza, akkor a sík lefedhető-e hézagtalanul szabályosan illeszkedő F-beli típusú dominókkal. Az egyes típusokból végtelen sok példány használható, és elforgatni nem szabad őket. A megfelelő nyelv és tétel a következő:
{
}
D = F ∈ {0,1,*, #} ; a sík lefedhető F-típusú dominókkal *
Tétel: A D nyelv nem rekurzív. Post megfeleltetési feladata (NB). Legyen Σ egy véges abc. Post megfeleltetési problémájának egy példánya (bemente) egy (s,t) ( s, t ∈ Σ* ) alakú rendezett párokból álló véges P halmaz. P-t megoldhatónak nevezzük, ha vannak olyan (nem feltétlenül különböző) P-beli (s,t) párok, hogy azok első komponenseinek összeolvasásával adódó szó megegyezik a második komponensek egymás után fűzésével kapott szóval. Például P={(iz,riz),(kar,ka),(ma,ma)} egy lehetséges megoldása a karizma szó. PCP jelöli a megfeleltetési feladat megoldható példányainak leírásaiból álló nyelvet. PCP nem rekurzív, de rekurzíve felsorolható. Környezetfüggetlen nyelvtanokkal kapcsolatos eldönthetetlen feladatok (*) [http://www.cs.may.ie/~jpower/Courses/parsing/node44.html] Nem eldönthetők a következő problémák: • Két CF képes-e ugyanazokat a mondatokat generálni. • Adott E véges abc mellett az abc felett képzett nyelvtan képes-e generálni az összes E* mondatot. • Egyértelmű-e a CF nyelvtan. • L1 CF nyelvtan tartalmazza-e L2 CF nyelvtant • L1 CF nyelvtan egyenlő-e L2 CF nyelvtannal.
_____________________________________________________________________________________ 70
B07
Kolmogorov-bonyolultság: adott Turing-gépre vett bonyolultság, invariancia-tétel, a Kolmogorov-bonyolultság definíciója, a definíció értelmessége. Összenyomhatatlanság, összenyomhatatlan szavak létezése (*), a C függvény bonyolultsága (*).
Kolmogorov-bonyolultság: adott Turing-gépre vett bonyolultság [Algoritmusok – 229.] A Kolmogorov-bonyolultság segítségével tanulmányozhatjuk, hogy véges sorozatok mennyire nyomhatók össze valamilyen algoritmussal. Tehát segítségével megadható, hogy egy I*-beli szó mennyire tömören írható le, vagy másképp, milyen rövid, milyen kevés jelből álló kóddá nyomható össze optimálisan. Ha a matematikai képlettel tömören leírható számokat hatékonyan szeretnénk kódolni, akkor a leírást kibontó gépnek „értenie” kell az egyszerű aritmetikai képleteknél általánosabban az algoritmusokat is. Ilyen gépek az univerzális Turing-gépek. Rögzítsünk tehát egy U univerzális Turing-gépet, és értelmezzük az x ∈ I * szó bonyolultságát mint a legrövidebb y#z input szó hosszát, melyre U az x szót számítja ki. Legyen továbbra is I={0,1}. Olyan Turing-gépekre szorítkozunk, amelyeknek a bemenő abc-je I, és a számításaik eredménye is I-beli betűkből áll. Egy ilyen M gép az f M : I * → I * parciális függvényt számolja ki. Jelöljük CM ( x) -el annak a legrövidebb bemenő szónak a hosszát, mellyel elindítva M az x szót adja eredményül: ⎪⎧min { y : y ∈ I *, f M ( y ) = x} CM ( x ) = ⎨ ∞ ⎪⎩ A CM ( x) szám méri, hogy x mennyire nyomható össze akkor, ha a kibontást, vagyis az összenyomott szó visszafejtését az M algoritmus végzi. CM ( x ) a legtömörebb kódszó hossza, mely az M algoritmus számára x-et kódolja. Az x ismeretében könnyen szerkeszthetünk olyan M 1 gépet, mely az üres bemeneten x-et számolja ki. Olyan M 2 gép is van, amely sosem adja eredményül x-et. Ekkor
CM1 ( x) = 0 és CM 2 ( x) = ∞ . Invariancia-tétel Legyen U egy univerzális Turing-gép. Ekkor tetszőleges M Turing-gépre létezik egy (csak M-től függő) cM ∈ + állandó, mellyel minden x ∈ I * szóra teljesül a következő egyenlőtlenség: CU ( x) ≤ CM ( x) + cM . Bizonyítás: Tegyük fel, hogy az M gép leírása a w ∈ I * szó, és legyen y egy legrövidebb szó, amiből M az x-et bontja ki: y ∈ I * , f M ( y ) = x , és y = CM ( x) . Az univerzális gép definíciója szerint ekkor U a w#y bemeneten x-et adja eredményül; más szóval fU ( w # y ) = x . Ebből a CU függvény értelmezése alapján következik, hogy CU ( x) ≤ w # y = w # + y = w # + CM ( x) . A cM = w # választás tehát megfelel a követelményeknek. Az invariancia-tétel szerint a CU ( x) érték csak legfeljebb egy x-től független állandóval haladhatja meg CM ( x) értékét. Ezt úgy is értelmezhetjük, hogy az U-hoz tartozó összenyomhatóság mértéke nem marad el számottevően semelyik másik M gép szerinti összenyomhatóságtól sem. Kolmogorov-bonyolultság definíciója, a definíció értelmessége Legyen x ∈ I * . A C ( x) := CU ( x) mennyiség az x szó Kolmogorov-bonyolultsága. Nem adtuk meg U-t elég pontosan ahhoz, hogy számolni tudjunk vele, tehát a C(x) kiszámítása nehéz feladat, hiszen C nem rekurzív. Ezért a C ( xn ) alakú sorozatok növekedési rendjét érdemes vizsgálni, ahol _____________________________________________________________________________________ 71
x1 , x2 ,… növekvő hosszúságú I*-beli szavak sorozata. Például az n = 2k − 10 alakú számokra C (n) = log 2 log 2 n + c ' teljesül alkalmas c’ állandóval. Összenyomhatatlanság, összenyomhatatlan szavak létezése (*) Legyen x ∈ I * . Ekkor C ( x) ≤ x + k , ahol k egy x-től független állandó. Egy I*-beli szó Kolmogorov-bonyolultsága nem haladja meg lényegesen a szó hosszát. Az x ∈ I * szó összenyomhatatlan, ha C ( x) ≥ x .
Legyen k ∈ + . Legfeljebb 2k +1 − 1 x ∈ I * szó van, amelyre C ( x) ≤ k . Következésképpen minden n ≥ 1 egészre létezik n hosszúságú összenyomhatatlan szó. Ha n>8, akkor az n hosszú I*-beli szavak több, mint 99 százalékának a Kolmogorov-bonyolultsága nagyobb, mint n-8. A C függvény bonyolultsága (*) A C : I * → I * függvény nem rekurzív. Mivel C nem rekurzív, ezért kiszámítása nehéz feladat.
_____________________________________________________________________________________ 72
B08
Idő- és tárkorlátos Turing-gépek. Tár-idő-tétel (*). Nevezetes nyelvosztályok: P, PSPACE, EXPTIME, ezek kapcsolata.
Idő- és tárkorlátos Turing-gépek [Algoritmusok – 247. oldal] Jelölje TM (n) az M gép maximális számolási idejét az n jelből álló bemeneteken. Az n hosszú szavakon a maximális tárigényt S M (n) -nel jelöljük. Számolási idő a megállásig végrehajtott lépések száma. Tárigény pedig a felhasznált (olvasott) szalagcellák száma. Ha az input szalag csak olvasható és/vagy az output szalag csak írható, akkor értelmezhető úgy a tárigény, hogy ezek ne számítsanak bele abba. [Algoritmusok – 197. oldal] Van olyan L nyelv, amelyre igazak az alábbiak: 1. Az L felismerhető egy olyan M Turing-géppel, melyre TM (n) véges minden n-re. 2. Tetszőleges, az L-et felismerő N Turing-géphez van olyan N’ Turing-gép, amelyre L = LN ' szintén teljesül, továbbá TN ' (n) = O(log TN (n)) Ez a gyorsítási tétel. Azt mondja ki, hogy minden feladatmegoldásra létezik „gyorsabb” algoritmus. Azért sántít, mert a „gyorsaság” értelmezése nem elég pontos. [Algoritmusok – 198. oldal] Ha pontos fogalmat szeretnénk alkotni egy algoritmus gyorsaságáról, illetve tárkezelésének hatékonyságáról, akkor az idő- és tárfelhasználást az input hosszának függvényében vizsgáljuk. Ehhez: Legyen t : + → + egy függvény, melyre n ∈ + esetén t (n) ≥ n teljesül. Az M Turing-gép t(n) időkorlátos, ha n hosszú inputokon legfeljebb t(n) lépést tesz (azaz TM (n) ≤ t (n) )
t (n) ≥ n azt a feltevést tartalmazza, hogy a gép az inputot legalább végigolvashatja. Az M algoritmust (TG-t) akkor tekinthetjük gyorsnak, ha t(n) egy lassan növekedő függvény. TIME (t (n)) := { L ⊆ I * | L felismerhető egy O(t (n)) időkorlátos M Turing-géppel} Lényeges rész, hogy az n hosszú x inputon a számítás mindig befejeződik legfeljebb ct(n) lépésben, tekintet nélkül arra, hogy x ∈ L igaz-e. Azaz TIME(t(n)) nyelvosztály rekurzív nyelvekből áll. Legegyszerűbb példánya a TIME(n), a lineáris időben felismerhető nyelvek.
P = ∪k ≥1TIME (n k ) , a polinom időben felismerhető nyelvek osztálya. Ha az L nyelv nlog n -nél rövidebb időben nem ismerhető fel, akkor L ∉ P . Bizonyítás: indirekt. Legyen s : + → + egy függvény, melyre n ∈ + esetén s (n) ≥ log 2 n teljesül. Az M Turing-gép s(n) tárkorlátos, ha n hosszú inputokon legfeljebb s(n) tárcellát használ a munkaszalagon (azaz S M (n) ≤ s (n) ). Itt s (n) ≥ log 2 n azért van, mert ennyi hely kell, hogy az n cellából álló szalagrészt címezni tudjuk.
SPACE ( s(n)) := { L ⊆ I * | L felismerhető egy O( s(n)) tárkorlátos M Turing-géppel} A nyelvekhez hasonló módon kaphatunk idő-, illetve tárkorlátokkal meghatározott függvényosztályokat. A definíciókban a nyelveket felismerő TG-k helyett függvényeket kiszámító TG-ket kell szerepeltetni. _____________________________________________________________________________________ 73
Tár-idő-tétel (*) Ha L ∈ SPACE ( s(n)) , akkor van olyan L-től függő c konstans, mellyel L ∈ TIME (c s ( n ) ) teljesül. Ha f ∈ FSPACE ( s(n)) , akkor van olyan f-től függő c konstans, mellyel f ∈ FTIME (c s ( n ) ) . Tehát ha egy nyelv felismerésére van tárkorlátos algoritmus, akkor van időkorlátos is. Nevezetes nyelvosztályok: P, PSPACE, EXPTIME, ezek kapcsolata. TIME(t(n))=coTIME(t(n)) SPACE(s(n))=coSPACE(s(n)) Bizonyítás: fel kell cserélni a TG elfogadó és elutasító állapotait (SPACE-nél kell a tár-idő-tétel szimulációját is alkalmazni) k
EXPTIME:= ∪k ≥1 TIME (2n ) PSPACE:= ∪k ≥1 SPACE (n k ) EXPTIME osztály a gyakorlatban előforduló nyelvek univerzuma. Nemigen van olyan praktikus feladat, ami ezen kívül levő, még nehezebb nyelvhez vezetne. P ⊆ PSPACE ⊆ EXPTIME TIME (t (n)) ⊂ R SPACE ( s (n)) ⊂ R EXPTIME ⊂ R Utolsó 3 tény az átlós módszerrel bizonyítható. P, FP, PSPACE, EXPTIME robosztus abban az értelemben, hogy nagymértékben függetlenek a gépmodelltől, amelynek a segítségével definiáltuk őket. Elméleti értelemben hatékonyan kezelhető feladatok: P nyelvek és FP függvények.
_____________________________________________________________________________________ 74
B09
Nemdeterminisztikus Turing-gépek, idő és tárbonyolultságuk. NP és coNP nyelvosztály, ezek kapcsolata P-vel és R-rel. Tanú-tétel (*). Példák NP és coNP-beli nyelvekre.
Nemdeterminisztikus Turing-gépek, idő és tárbonyolultságuk [Algoritmusok – 255. oldal] A nemdeterminisztikus Turing-gép (röviden NTG) abban tér el a TG-től, hogy a δ átmenetfüggvény nem egyértékű. A δ a lehetséges lépések olykor egynél több elemű véges halmazát jelöli ki: δ (q, a ) ⊆ Q × T × { jobb, bal , helyben} . Ennek megfelelően a gép esetleg több lehetőségből választhat. A q állapotban az a szalagjel mellett a következő lépést a δ (q, a) halmazból kell választani. Az M NTG elfogadja az x ∈ I * inputot, ha az M-et x bemenettel a kiinduló helyzetből indítva van legalább egy elfogadó (egy elfogadó állapotban véget érő) számítási út. Az x ∈ I * input szó pontosan akkor nincs LM -ben, ha az M gépet x inputtal indítva nincs elfogadó út. Az NTG-k számításait néha hasznos egy gyökeres irányított faként elképzelni. A fa csúcsait a gép pillanatnyi helyzeteivel címkézhetjük. Egy csúcsnak annyi fia van, ahány lépés megengedett a csúcsnak megfelelő pillanatnyi helyzetből. Egy M nemdeterminisztikus Turing-gép t(n) időkorlátos, ha n hosszúságú inputokon M minden számítási út mentén legfeljebb t(n) lépést véve megáll. Úgy is fogalmazhatunk, hogy egy tetszőleges n hosszúságú x ∈ I * input esetén a számításhoz rendelt fa magassága legfeljebb t(n)+1. Egy időkorlátos NTG semmilyen számítási úton nem kerülhet végtelen ciklusba. Az NTG nem valósághű számítási modell, nem ismert olyan tényleges fizikai megvalósítás, mely egy t(n) időkorlátos NTG működését t(n)-nel arányos időben szimulálni tudná. NTIME(t(n)):={az O(t(n)) időkorlátos NTG-k által elfogadott nyelvek} NP és coNP nyelvosztály, ezek kapcsolata P-vel és R-rel [Algoritmusok – 257. oldal] Az NTG-k segítségével fogalmazható meg kényelmesen a számításelmélet egyik legérdekesebb nyelvosztályának a definíciója.
NP := ∪k ≥1 NTIME (n k ) . Az NP nyelvosztály ugyanúgy épül fel az NTIME (n k ) alakú nyelvhalmazokból, mint a P a TIME (n k ) alakúakból. A definíciók közötti nyilvánvaló formai hasonlóság alapján az NP osztályt a P nemdeterminisztikus megfelelőjének tekinthetjük. Az NP nemdeterminisztikus polinom idejű Turinggépekkel felismerhető nyelvekből áll. P ⊆ NP . Az NP nyelvosztály tartalmazza P-t. A két osztály közötti analógia korántsem teljes. Nem ismert például, hogy az NP osztály megegyezik-e a coNP nyelvosztállyal ( coNP = { L ⊆ I *; I * \ L ∈ NP} ). A (P=NP?) kérdés a számításelmélet egyik legfontosabb megoldatlan problémája. P ⊆ NP ∩ coNP . Bizonyítás: P ⊆ NP miatt coP ⊆ coNP . Ezután az állítás azonnal adódik a P=coP egyenlőségből. NP ∪ coNP ⊆ PSPACE ⊆ EXPTIME ⊆ ℜ Tanú-tétel (*) [Algoritmusok – 259. oldal] Egy L ⊆ I * nyelvre a következő két állítás egyenértékű: _____________________________________________________________________________________ 75
• •
L ∈ NP Van olyan c>0 állandó, továbbá egy L1 ∈ P nyelv, mely olyan ( x, y ) ∈ ( I *) 2 párokból áll, hogy c
y ≤ x és x ∈ I * esetén x ∈ L pontosan akkor, ha van y ∈ I * úgy, hogy ( x, y ) ∈ L1 . Példák NP és coNP-beli nyelvekre [Algoritmusok – 262. oldal] Legyen 3-SZÍN a 3 színnel színezhető gráfok kódjaiból álló nyelv. Ekkor 3 − SZÍN ∈ NP . A bizonyítás során elég megmutatni, hogy a három színnel való színezhetőségnek van rövid és hatékonyan ellenőrizhető tanúja. Egy n szögpontú 3 színnel színezhető G gráf jó színezése alkalmas tanú lesz. A G irányítatlan gráf egy köre Hamilton-kör, ha abban G minden csúcsa pontosan egyszer szerepel. Legyen H a Hamilton-kört tartalmazó gráfokból álló nyelv. Ekkor H ∈ NP . Az állítás rövid tanúja egy Hamilton-kör. Egy gráf síkba rajzolható, ha a pontjainak kölcsönösen egyértelműen megfeleltethetőek síkbeli pontok, és az élek olyan szakaszoknak, amelyek legfeljebb csak a végpontjaikban találkozhatnak. Legyen SÍK a síkba rajzolható gráfok nyelve. Ekkor SÍK ∈ coNP . Az állítás igazolásához azt kell megmutatni, hogy G ∉ SÍK ténynek is van hatékonyan ellenőrizhető tanúja. Ez pedig következik a K. Kuratowski nevezetes tételéből: a G gráf nem síkba rajzolható ⇔ G topologikusan tartalmaz teljes ötszöget vagy 3 ház – 3 kút gráfot ( K 5 , K3,3 ).
_____________________________________________________________________________________ 76
B10
Karp-redukció, a Karp-redukció tranzitivitása. NP-teljesség. Cook-Levin-tétel (*). További nyelvek NP-teljessége: 3-SAT (*), 3-SZÍN (*), MAXFTLEN, X3C (NB), H (NB), RH (NB), Ládapakolás (NB).
Karp-redukció. [Algoritmusok – 268. oldal] Az f : I * → I * leképezés az L1 ⊆ I * nyelv Karp-redukciója az L2 ⊆ I * nyelvre, ha 1. Tetszőleges x ∈ I * szóra x ∈ L1 pontosan akkor teljesül, ha f ( x) ∈ L2 ; 2. f ∈ FP , azaz f polinom időben számítható. L1 ≺ L2 jelöli azt a tényt, hogy L1 -nek van Karp-redukciója L2 -re. Az első követelmény azt fejezi ki, hogy f hűségesen transzformálja a nyelvbe tartozást. A második pedig azt, hogy f gyorsan kiszámítható: van olyan csak az f-től függő c>0 állandó, hogy az f(x) szó | x |c lépésben megkapható x-ből. Ennek folyománya pl., hogy | f ( x) |≤| x |c Egy Karp-redukcióval az L1 felismerésének problémáját visszavezetjük L2 felismerésének problémájára. A jellemző alkalmazási helyzetben egy eddig ismeretlen L’ nyelvet hasonlítunk össze egy már megismert L nyelvvel. Egy L ≺ L ' Karp-redukció arra enged következtetni, hogy L’ nehéz nyelv, feltéve, hogy ez igaz L-re. L1 ≺ L2 esetén L1 hatékonyan felismerhető ha van hatékony módszerünk L2 felismerésére. 1. Ha L1 ≺ L2 és L2 ∈ P , akkor L1 ∈ P 2. Ha L1 ≺ L2 és L2 ∈ NP , akkor L1 ∈ NP 3. Ha L1 ≺ L2 , akkor L1 ≺ L 2 4. Ha L1 ≺ L2 és L2 ∈ coNP , akkor L1 ∈ coNP 5. Ha L1 ≺ L2 és L2 ∈ NP ∩ coNP , akkor L1 ∈ NP ∩ coNP A Karp-redukció tranzitivitása Ha L1 ≺ L2 és L2 ≺ L3 , akkor L1 ≺ L3 is teljesül. NP-teljesség Az L ⊆ I * nyelv NP-teljes, ha 1. L ∈ NP , 2. tetszőleges L ' ∈ NP nyelv esetén létezik L ' ≺ L Karp-redukció. Egy NP-teljes nyelv tehát legalább olyan nehéz, mint bármely más NP-beli nyelv. Az NP-teljes nyelveket szokás univerzális kereső feladatoknak is nevezni. Az a sejtés, hogy P≠NP, azaz az NP-teljes nyelvekre nem léteznek polinom idejű felismerő módszerek. Ez nem azt jelenti, hogy megoldhatatlanok, mert NP ⊆ PSPACE ⊆ EXPTIME azaz a legnehezebb példányok is legyűrhetők exponenciális idejűnél nem rosszabb algoritmussal. Cook-Levin-tétel (*) Boole-formula: 0,1 logikai konstansokból, 0-1 értékű változókból és a változók negáltjaiból az „és” illetve a „vagy” műveleti jelekkel és zárójelekkel felépített kifejezés. Egy Boole-formula változóinak logikai értéket adhatunk. A változók ilyen kiértékelése után a kézenfekvő módon beszélhetünk a formula értékéről, ami 0 vagy 1 lesz. Egy Boole-formula kielégíthető, ha van a változóinak olyan kiértékelése, melynél a formula értéke 1. SAT a kielégíthető Boole-formulák nyelve. Cook-Levin-tétele szerint a SAT egy NP-teljes nyelv. _____________________________________________________________________________________ 77
3-SAT (*) A φ Boole-formula konjunktív normálformájú, ha φ = φ1 ∧ ∧ φk alakú, ahol a φi formulákban literálok szerepelnek kizárólag ∨ jelekkel összekapcsolva. A φi formulákat φ tagjainak nevezzük. Ha a φi formulákban legfeljebb k literál szerepel, akkor φ -t k-konjunktív normálformájú formulának (k-CNFnek) nevezzük. Jelölje k-SAT a kielégíthető k-CNF-ekből álló nyelvet. A 3-SAT nyelv NP-teljes. Ezzel szemben 2-SAT ∈ P . 3-SZÍN (*) 3-SZÍN a három színnel színezhető gráfok nyelve. A 3-SZÍN nyelv NP-teljes. MAXFTLEN MAXFTLEN= {(G, k ) | G egy gráf, k ∈
+
, és G -nek van k elemű független csúcshalmaza}
MAXFTLEN nyelv NP-teljes. MAXFTLEN ∈ NP nyilvánvaló, mert (G,k) ∈ MAXFTLEN ténynek tanúja lehet egy k-elemű S ⊆ V (G ) független csúcshalmaz. NP-teljességet pedig a 3-SZÍN ≺ MAXFTLEN Karp-redukcióval lehet bizonyítani. MAXFTLEN tételből következik a MAXKLIKK és az Éllefogás nyelvek NP-teljessége. MAXKLIKK= {(G , k ) | G -ben van k pontú teljes részgráf } Éllefogás= {(G , k ) | G -ben van k éllefogó halmaz} X3C (NB) Legyenek U1 ,U 2 , U 3 azonos méretű véges halmazok. U i = t . Tegyük fel, hogy adott még U1 × U 2 × U 3 valamely S részhalmaza. Egy ilyen részhalmaz ( u1 , u2 , u3 ) alakú hármasokból áll, ahol ui ∈U i . Szeretnénk eldönteni, hogy kiválasztható-e S-ből egy 3 dimenziós házasítás. Ezen az S egy olyan t-elemű S’ részhalmazát értjük, mely minden U i -beli pontot lefed. Pontosabban fogalmazva: tetszőleges vi ∈ U i elemhez van olyan s ∈ S ' , melynek i-edik komponense vi . Az S ' = t feltétel miatt egy 3 dimenziós házasítás az U1 ∪ U 2 ∪ U 3 elemeit pontosan egyszeresen fedi le. Jelölje 3-DH az olyan U1 ,U 2 , U 3 ; S ⊆ U1 × U 2 × U 3 rendszereket, melyeknél S-ből kiválasztható egy 3 dimenziós házasítás. A 3-DH feladat NP-teljes. Szorosan kapcsolódó probléma a Pontos fedés hármasokkal: adott egy U véges halmaz, és U háromelemű részhalmazainak egy F = { X 1 , X 2 ,… X k } családja. Eldöntendő, hogy az F-ből kiválaszthatók-e páronként diszjunkt halmazok, melyek együttesen lefedik U-t. Jelölje X3C azokat az (U,F) párokat, melyekre az F-ből kiválasztható U ilyen értelemben vett pontos lefedése. Az X3C nyelv NP-teljes. H (NB) IH és H az irányított illetve irányítatlan Hamilton-kört tartalmazó gráfok nyelve. Mindkettő NP-teljes. _____________________________________________________________________________________ 78
RH (NB) Hátizsák feladat: adottak az s1 ,… , sm > 0 súlyok, ezek v1 ,… , vm > 0 értékei, valamint a b megengedett maximális összsúly. Tegyük fel hogy ezek a számok egészek. A feladat az, hogy találjunk egy olyan I ⊆ {1,… , m} részhalmazt, melyre ∑ i∈I si ≤ b ugyanakkor ∑ i∈I vi a lehető legnagyobb. Polinom idejű extra munka erejéig azonos nehézségű NP-beli feladatot kapunk, ha bevezetünk még egy k>0 értékkorlátot és egy adott s1 ,… , sm ; v1 ,… , vm ;b inputra azt kérdezzük, hogy van-e olyan kímélő kitöltése a hátizsáknak, melynek értéke legalább k. Az így kapott döntési feladat neve Hát. Ez a nyelv NP-teljes, amit egy speciális esete szemléltet: Részhalmazösszeg probléma: a tárgyak súlya és értéke azonos, valamint a súlykorlát megegyezik az értékkorláttal: si = vi és b=k. Az RH nyelv NP-teljes. Ládapakolás (NB) [Algoritmusok – 291. oldal] Ládapakolás feladat: adottak s1 ,… , sm súlyú tárgyak, 0 < si ≤ 1 racionális és k>0 egész. Eldöntendő, hogy a tárgyakat bele lehet-e pakolni legfeljebb k számú egységnyi súlykapacitású ládába. A Ládapakolás feladat nyelve NP-teljes.
_____________________________________________________________________________________ 79
B11
Dinamikus programozás: elve, példák a korábbi algoritmusok közül, hátizsák probléma megoldása kis súlyok esetén, az algoritmus lépésszáma. Közelítő algoritmusok: elv, algoritmus a ládapakolási feladatra (*).
Dinamikus programozás: elve, példák a korábbi algoritmusok közül [Algoritmusok – 302. oldal] A dinamikus programozás módszere gyakran használatos valamilyen numerikus paraméterektől függő érték optimumának a meghatározására. Lényege, hogy az optimumot alkalmas kisebb részfeladatok optimumából próbálja előállítani. A dinamikus algoritmusok vezérlési szerkezete gyakran hasonlít egy táblázat szisztematikus kitöltésére. A kitöltést gyakran egy rekurzív összefüggés teszi lehetővé, ami alapján a bejárási sorrend szerint korábbi elemekből meghatározhatók a későbbiek. A kapott módszer költségét többnyire a kitöltendő táblázat mérete határozza meg. A rekurzív összefüggés megtalálásában sokszor segítségünkre van az optimalitás elve, amivel a Bellman-Ford és Floyd-módszernél már találkoztunk. ⎛n⎞ Binomiális együtthatók számítása dinamikus algoritmussal: Tegyük fel, hogy az ⎜ ⎟ binomiális ⎝k ⎠ együttható értékére vagyunk kíváncsiak. Lehetséges utat jelent a jól ismert ⎛ n ⎞ ⎛ n − 1 ⎞ ⎛ n − 1⎞ ⎜ ⎟=⎜ ⎟+⎜ ⎟ ⎝ k ⎠ ⎝ k − 1⎠ ⎝ k ⎠ azonosság használata. Ennek segítségével a kisebb n értékektől a nagyobbak felé haladva adódnak a ⎛ n − 1⎞ ⎛n⎞ binomiális együtthatók: ha az összes ⎜ ⎟ értéket ismerjük ( 0 ≤ j ≤ n − 1 ), akkor az ⎜ ⎟ alakú ⎝ j ⎠ ⎝k ⎠ ⎛ m⎞ ⎛ m⎞ együtthatók egy-egy összeadással megkaphatók. Az elindulás lehetőségét az ⎜ ⎟ = ⎜ ⎟ = 1 értékek ⎝ 0 ⎠ ⎝ m⎠ biztosítják. A hátizsák probléma megoldása kis súlyok esetén, az algoritmus lépésszáma [Algoritmusok – 303. oldal] Adottak az s1 ,…, sm súlyok, a b súlykorlát, a v1 ,…, vm értékek és a k értékkorlát. A kérdés, hogy van-e olyan I ⊆ {1,… , m} részhalmaz, melyre teljesül, hogy
∑
i∈I
si ≤ b és
∑
i∈I
vi ≥ k . Feltesszük még, hogy a
szereplő mennyiségek mind pozitív egészek. Tekintsük az m és b paramétereket változónak, és engedjük őket egy értelmes tartományban futni. Pontosabban fogalmazva legyen v(i,a) a maximális elérhető érték az s1 ,…, sm súlyokkal, v1 ,…, vm értékekkel és a súlykorláttal megadott feladatra. Ekkor v(0,a)=v(i,0)=0 tetszőleges a és i természetes számokra, és célunk a v(m,b) mennyiség meghatározása, illetve annak eldöntése, hogy fennáll-e a v(m, b) ≥ k egyenlőtlenség. A táblázat egyes elemeinek értéke a következő: v(i, a ) = max {v(i − 1, a ); vi + v(i − 1, a − si )} . Az összefüggés alapján a táblázat kitölthető úgy, hogy vesszük rendre az 1,2,…,m indexű sorokat, ezeken pedig az a indexet növelve haladunk. A táblázatnak mb eleme van. A módszer logaritmikus költsége O(bL), ahol L az input hossza. A Hátizsák probléma apró súlykorlát esetén megoldható polinom időben. Igazolásul elég annyi, hogy L ≥ b , tehát a futási idő az input hosszának polinomjával becsülhető: O( L2 ) . Közelítő algoritmusok: elv, algoritmus a ládapakolási feladatra (*) Nehéz algoritmikus problémák esetén előfordulhat, hogy elegendő a megoldás elég jó közelítése. Ládapakolás (Bin Packing): Inputként adottak az s1 ,…, sm (racionális) súlyok, 0 ≤ si ≤ i . A cél a súlyok elhelyezése minél kevesebb 1 súlykapacitású ládába. _____________________________________________________________________________________ 80
Igen egyszerű és természetes közelítő algoritmus az ff-módszer (fist fit, első alkalmas). Vegyünk először üres ládákat, és számozzuk meg őket az 1,2,…,k egészekkel. Tegyük fel, hogy az s1 ,…, si−1 súlyokat már elhelyeztük. Ekkor si kerüljön az első (legkisebb sorszámú) olyan ládába, amelybe még befér. Jelölje a Ládapakolás probléma egy I inputjára OPT(I) az optimális, FF(I) pedig az ff-módszer által eredményezett ládaszámot. A probléma tetszőleges inputjára teljesül, hogy FF ( I ) ≤ 2OPT ( I ) .
⎡17 ⎤ Pontosabban: a probléma tetszőleges I inputjára teljesül, hogy FF ( I ) ≤ ⎢ OPT ( I ) ⎥ . Továbbá vannak ⎢10 ⎥ 17 tetszőlegesen nagy méretű I inputok, melyekre FF ( I ) ≥ (OPT ( I ) − 1) . 10
_____________________________________________________________________________________ 81
B12
Véges automata. Véges automaták determinizálása és teljesen specifikálása. Minimálautomata, konstrukciója, unicitása (*). Kétirányban mozgó véges automata, kapcsolata az egyirányban mozgó véges automatával (*).
Véges automata [Formális nyelvek – 25. oldal] A reguláris nyelveket elfogadó automataosztály a véges automaták osztálya. A véges automatát, mint matematikai objektumot egy ötös jellemzi: M ( Q, Σ, δ , q0 , F ) ahol • Q az automata állapotainak véges halmaza, • Σ az elemzendő jelsorozat alfabetája, • δ az automata mozgási szabályainak halmaza, amely szintén véges, • q0 az induló állapot, • F az elfogadó állapotok halmaza. A δ ( A, a) = B mozgási szabály akkor alkalmazható, ha az automata az A állapotban van, és az olvasott karakter a. Az új állapot B lesz. Ha minden állapot-karakter párhoz maximum egy mozgási szabály tartozik, akkor az automata működése determinisztikus. Ha minden állapot-karakter pár esetében van mozgási szabály, akkor az automata teljesen specifikált. Az automaták mozgási folyamatát mint konfigurációk egy sorozatát követhetjük nyomon. Valamely automata konfigurációja pillanatfelvétel az automata működéséről, amely mindazt az információt tartalmazza, amelynek alapján az automata további működése meghatározható. Véges automaták esetében egy konfiguráció: ahol • •
k = (q, w)
q egy automata állapot q ∈ Q w pedig tetszőleges jelsorozat w ∈ Σ∗
Az automata L(M) nyelve azon jelsorozatok halmaza, amelyeket az automata elfogad. Véges automaták determinizálása és teljesen specifikálása [Formális nyelvek – 34. oldal] Egy automata akkor fogad el egy jelsorozatot, ha létezik olyan mozgássorozat, amelynek során az automata a teljes jelsorozatot elolvassa és utána elfogadó állapotban áll meg. A nemdeteminisztikus automatáknál minden mozgási lehetőséget egyidejűleg kell figyelemmel kísérnünk, mert nem tudhatjuk, hogy végül melyik vezet eredményre. Az automaták „nemdeterminizmusát” egy számmal jellemezhetjük. Megadjuk a változatok számát annál az állapot-karakter párnál, amely a variánsokban a leggazdagabb. Ez a szám determinisztikus automaták esetében pontosan egy, nemdeterminisztikusokénál egynél nagyobb. Így a determinisztikus automaták nyelvei felfoghatók a nemdeterminisztikus automaták nyelvei részhalmazaként. Viszont ez nem valódi részhalmaz, mivel minden nemdeterminisztikus automatához konstruálható olyan determinisztikus ekvivalens, ami pontosan ugyanazt a nyelvet fogadja el. A gyakorlatban úgy járhatunk el, hogy az eredeti nemdeterminisztikus automatát elemezve meghatározzuk az állapottér azon részhalmazait, amelyek előfordulhatnak mint egyidejűen elérhető állapotok. Ezeket és csakis ezeket a részhalmazokat vesszük aztán bele az új automata állapotterébe. Az egész folyamat kezdete az új automata kezdőállapota lesz, amely egyedül az eredeti automata kezdőállapotát tartalmazó részhalmaz. Ebből kiindulva állapíthatjuk meg, milyen részhalmazok figyelembevételére van szükség. Példa: [Formális nyelvek – 37. oldal.] _____________________________________________________________________________________ 82
A teljesen specifikált automata készítéséhez bevezetünk egy T csapda állapotot. Ha valamelyik állapotkarakter párhoz nincsen mozgási szabály rendelve, akkor egészítsük ki szabályainkat egy olyan mozgással, amely erre az állapot-karakter párra az automatát a csapda állapotba viszi át. A csapda állapotban bármilyen karakter beolvasására újra a csapba állapotba megyünk át. Minimálautomata, konstrukciója, unicitása (*) [Formális nyelvek – 39. oldal] Az előzőek értelmében minden automatából készíthetünk determinisztikus teljesen specifikált automatát. Ezek közül keressük a legegyszerűbbet azaz a legkevesebb állapottal rendelkezőt. Mivel az állapotok száma véges ezért szükségképpen van minimális állapotszámú. Ennek igazolására minden állapothoz rendeljünk egy nyelvet. Ezt a nyelvet az az automata fogadja el, amely megegyezik az eredeti automatával, pusztán a kezdőállapotot helyeztük át a szóban forgó állapotra. Ezután értelmezzünk egy R relációt az állapotok között, ami akkor igaz, ha két állapothoz rendelt két nyelv azonos. Ez egy reflexív, tranzitív, szimmetrikus ekvivalencia reláció. Azt jelenti, hogy olyan diszjunkt ekvivalenciaosztályokra osztja az automata állapotait, hogy amennyiben az A és B állapot ugyanabban az osztályban van, akkor nincsen olyan jelsorozat, amely különbséget tudna tenni a két állapot között. Ezért logikus megoldás a minimál automata konstrukciójára az, amely csak egyetlen állapotot alkalmaz a teljes ekvivalencia osztály helyett. Ez csak elvben működik, mert ahhoz hogy a definíció szerint ekvivalencia osztályokat tudjunk elkülöníteni, az összes lehetséges megszámlálhatóan végtelen jelsorozatot végig kéne próbálnunk az egyes állapotokra. Ezért bevezetjük az i ekvivalencia fogalmat ami szerint két állapot i ekvivalens, ha legfeljebb i hosszúságú jelsorozattal nem különböztethető meg. Így az eredeti ekvivalencia az i ekvivalenciából az i → ∞ átmenettel előállítható. A 0 ekvivalenciaosztályból kiindulva venni kell az i+1 ekvivalenciaosztályokat, amíg nem tudjuk már tovább osztani az állapotokat. Ez úgy derül ki, hogy ami nem volt i ekvivalens az nem lesz i+1 ekvivalens sem. Így tetszőleges automatához megszerkeszthetjük a hozzátartozó minimálautomatát. Az ily módon megszerkesztett automata lényegében – izomorfiától eltekintve – unikális, azaz ez az egyetlen ilyen kis állapotszámmal bíró, az adott nyelvet elfogadó és teljesen specifikált automata. Kétirányban mozgó véges automata, kapcsolata az egyirányban mozgó véges automatával (*) [Formális nyelvek – 45. oldal] A kétirányban mozgó automatánál nem mindig előre (jobbra) halad a fej a szalag felett hanem megengedett olyan átmenete is, amikor visszalép (balra). Itt is az az elfogadás feltétele, hogy végig legyen olvasva a szöveg. Az ilyen automaták ekvivalensek az egyirányba (csak jobbra haladva) mozgó automatákkal. Minden kétirányúhoz szerkeszthető egyirányú automata, ami nyomon követi, hogy amikor a kétirányú visszalépve elkezd kalandozni, akkor milyen állapotban tér vissza az eredeti betűhöz, ha egyáltalán visszatér és átlép-e rajta (a falon).
_____________________________________________________________________________________ 83
B13
Generatív nyelvtanok, Chomsky-nyelvosztályok. A generatív nyelvek számossága. Balés jobb-reguláris nyelvtanok, kapcsolatuk (*), reguláris nyelvek. Véges automaták és reguláris nyelvek kapcsolata.
Generatív nyelvtanok [Formális nyelvek – 13-16. oldal] Jelölje Σ a nyelv karakterkészletének véges halmazát (~alfabeta). Legyen Σ∗ a Σ alfabetájából alkotott véges, de nem korlátos hosszúságú jelsorozatok halmaza. Σi a pontosan i hosszúságú jelsorozat. Ha i=0, akkor üres jelsorozat, jele: ε . Egy adott alfabeta felett értelmezett L nyelv a Σ∗ halmaz tetszőleges részhalmaza, tehát L ⊂ Σ∗ . Az L0 -val jelölt üres nyelvnek egyetlen mondata sincs. Az Lε nyelv egyetlen mondata az üres jelsorozat. A generatív nyelveket grammatikák segítségével jellemezhetjük. Formálisan a grammatikát egy négyes határozza meg G = ( N , Σ, P, S ) , ahol • N a grammatikai szimbólumok véges halmaza • Σ az alfabeta, a nyelv karakterkészletének véges halmaza • P az úgynevezett levezetési szabályok összességének véges halmaza • S a mondatszimbólum A terminális és nemterminális szimbólumok közötti különbségtétel nagyon fontos. Éppen ezért a két halmaznak – az N és a Σ halmaznak – diszjunktnak kell lennie, tehát N ∩ ∑ = 0 . A nyelvtanok, grammatikák azért alkalmasak egy nyelv definiálására, mert segítségükkel egy nyelv mondatai levezethetőek, generálhatóak. Egy levezetés mondatszerű formáknak nevezett jelsorozatok egymásutánja. A levezetések sorozatában az egyik mondatszerű formából a következőt a levezetési szabályok segítségével származtathatjuk. A levezetési szabályok a következő alakúak: α →β, ahol a nyíl a szabály bal-, illetve jobboldalát elválasztó szimbólum. A szabály baloldala legalább egy grammatikai szimbólumot kell, hogy tartalmazzon, a jobboldali tetszőleges jelsorozat. A levezetés akkor ért véget, ha terminalizálódott, azaz csak nyelvi szimbólumokat tartalmaz. A nemterminális szimbólumokat a latin ábécé elejéről vett nagybetűk jelölik: A,B, C, stb. A terminális szimbólumokra a latin ábécé elejéről vett kisbetűket használjuk: a,b,c, stb. A terminális szimbólumokból álló jelsorozatokat az ábécé végéről vett latin kisbetűk: x,y,z, stb... Az olyan jelsorozatokat, amelyek tartalmazhatnak mind terminális, mind nemterminális szimbólumokat is görög kisbetűk jelölik: α , β , γ , stb... A mondatszimbólumot az angol sentence (mondat) szó kezdőbetűje S jelöli. A levezetési szabályok formálisan a következőképpen írhatók le: α → β ahol α ∈ ( N ∪ ∑)∗ N ( N ∪ ∑)∗ és β ∈ ( N ∪ ∑)∗ vagyis az α jelsorozat mindenképpen tartalmaz legalább egy nemterminális szimbólumot, amelyet tetszőleges, akár N akár Σ halmazbeli szimbólum előzhet meg, illetve követhet. Egy G grammatika által definiált nyelv jelölése L(G), és ez a nyelv a Σ∗ azon elemit tartalmazza, amely jelsorozatok a G grammatika segítségével tetszőleges számú lépésben generálhatóak: L(G ) = w ∈ ∑∗ | S ⇒∗G w} .
{
A véges nyelvtannal megadott nyelveket generatív nyelveknek nevezzük.
_____________________________________________________________________________________ 84
Chomsky-nyelvosztályok [Formális Nyelvek – 18-20. oldal] A grammatikákat meghatározó helyettesítési szabályokra bonyolultsága alapján Chomsky a nyelveket osztályokba sorolta. Chomsky négy nyelvosztályt definiált. Ezeket számokkal jelölte, így van 0-ás, 1-es, 2-es és 3-as nyelvosztály. A 3-as nyelvosztály nyelvtanaiban csak kétféle szabálytípus engedélyezett. Ezek: A → a illetve A → aB . ahol A, B nemterminálisok, a terminális szimbólum, amely lehet ε is. Az ilyen alakú grammatikákat reguláris, pontosabban jobbreguláris nyelvtanoknak nevezzük. Ezek a nyelvtanok generálják a reguláris nyelveket. A 2-es nyelvosztály helyettesítési szabályainak alakja: A→α , ahol α tetszőleges, mind terminális mind nemterminális szimbólumokat tartalmazható jelsorozat. Az A nemterminális mindig helyettesíthető az α jelsorozattal, függetlenül attól, hogy mi a nemterminális környezete. Ennek a nyelvosztálynak a nyelveit környezetfüggetlen, vagy CF nyelveknek nevezzük. Az 1-es nyelvosztály helyettesítési szabályainak korlátait kétféle módon is jellemezhetjük. Az első megadási mód szerint a levezetési szabályok alakja: β Aγ → βαγ . Az 1-es másik lehetséges meghatározási módja szerint a szabályok alakja: α → β ahol α ≤ β . Az első meghatározást úgy interpretálhatunk, hogy az A → α szabály csakis a β − γ környezetében alkalmazható. Ez az értelmezés magyarázza a nyelvosztály elnevezését, ezek a nyelvek a környezetfüggő, vagy CS nyelvek. A 0-ás nyelvosztályban alkalmazható szabályokra nézve nincs megkötés. A generatív nyelvek számossága Megszámlálhatóan sok generatív nyelv van. Van legalább ennyi generatív nyelv, hiszen az egy szóból álló nyelvek mind generatívak (triviális módon), ezekből viszont megszámlálhatóan végtelen sok van. Megmutatjuk, hogy nincsen több, mint megszámlálhatóan végtelen sok generatív nyelv. Ezt úgy tesszük, hogy felsoroljuk a generatív nyelveket nyelvtanaik szerint. Ha egy nyelv generatív, akkor van hozzá egy nyelvtan. Ezt a nyelvtant alakítsuk át úgy, hogy ha k darab nemterminális van benne, akkor azokat nevezzük N1 ,… , N k -nak. Ezek után soroljuk fel az nyelvtanokat úgy, hogy először felsoroljuk valamilyen sorrendben azon nyelvtanokat, melyek leírása 1 hosszúságú, majd azokat, melyek hossza 2, aztán 3, 4, 5, stb. A nyelvtan hosszúsága a szabályok leírásához szükséges karakterek száma, például az N1 → aN1b | ab nyelvtan hossza 8. (Nem kell megadni, hogy ki terminális és ki nem az, mert a terminális ábécé adott és azt sem kell megadni, hogy ki az S, mert az az S, aki elöl áll.) Világos, hogy egy adott l hosszúságra csak véges sok nyelvtan van, melynek hossza l (hiszen csak véges sok karakter fordulhat elő: a terminálisok, maximum l darab nemterminális meg még pár jel), ezért a fenti felsorolás lehetséges. Így minden generatív nyelvet felsorolunk legalább egyszer (persze, lehet, hogy többször is, ha több nyelvtan is előállítja), vagyis legfeljebb csak megszámlálható sok ilyen nyelv van. http://www.cs.bme.hu/~csima/fony00/szamossag/index.html
_____________________________________________________________________________________ 85
Bal- és jobb-reguláris nyelvtanok és kapcsolatuk (*) Jobbreguláris nyelvtannak hívjuk azokat a reguláris nyelvtanokat, amelyben a levezetési szabály jobb oldalán lévő nemterminális szimbólum a terminális szimbólumtól jobbra helyezkedik el, míg balreguláris esetben attól balra. • jobbreguláris levezetési szabályok alakja: A → aB, A → a • balreguláris levezetési szabályok alakja: A → Ba, A → a A jobb és balreguláris nyelvtanok ugyanazt a nyelvosztályt generálják [Formális nyelvek – 30-33. oldal] Reguláris nyelvek [Formális nyelvek – 25. oldal] A reguláris nyelveket a 3-as nyelvosztályba tartozó grammatikák generálják. Az ilyen nyelveket elfogadó, a tartalmazás kérdésére választ adó automataosztály a véges automaták osztálya. A véges automatát, mint matematikai objektumot egy ötös jellemzi: M ( Q, Σ, δ , q0 , F ) ahol • Q az automata állapotainak véges halmaza, • Σ az elemzendő jelsorozat alfabetája, • δ az automata mozgási szabályainak halmaza, amely szintén véges, • q0 az induló állapot, • F az elfogadó állapotok halmaza. A véges automaták azokat a nyelveket fogadják el, amelyeket a reguláris nyelvtanok generálnak. Legyen adott egy véges automata, a hozzá rendelt nyelvtan karakterkészlete egyenlő kell hogy legyen az elemzendő nyelv karakterkészletével. Feleltessünk meg minden állapotnak egy-egy nemterminális szimbólumot. A kezdőállapotnak feleljen meg a mondatszimbólum. Az automata minden mozgási szabályához rendeljünk egy helyettesítési szabályt az alábbiak szerint: δ ( A, a ) = B A → aB . Az automata elfogadó állapotainak megfeleltetett nemterminálisokhoz rendeljünk egy ún. ε -szabályt: A→ε . Az egységes tárgyalás kedvéért alakítsuk át kissé a nyelvtant. Vezessünk be egy új elenyésző nemterminálist, legyen ennek jele E. Minthogy ez a nemterminális elenyészhet, lesz egy ε -szabálya: E →ε . Ezután egészítsük ki a második típusú szabályokat az imént bevezetett nemterminálissal: A→a helyett A → aE . Tehát minden nemterminálisnak megfeleltettünk egy automataállapotot, a mondatszimbólum állapota legyen a kezdőállapot. A helyettesítési szabályok átírása az automata mozgási szabályaivá az alábbi módon történik: A → aB δ ( A, a ) = B . Az automata állapotok között azok lesznek az elfogadó állapotok, amelyek ε -szabállyal bíró nemterminálisnak felelnek meg. Amennyiben a nyelvtan segítségével levezethető a wA mondatszerű forma, akkor létezik az automatának olyan mozgássorozata, amely a w bemenet hatására az automatát az A állapotba viszi át. Ennek az állításnak a megfordítása is igaz, vagyis ha az automata a w jelsorozat elolvasása után az I állapotba kerül, akkor a mondatszimbólumból a nyelvtan segítségével levezethető a wA mondatszerű forma. Ezt a következőképpen írhatjuk le formális módon: _____________________________________________________________________________________ 86
S ⇒∗G wA ⇔ (q0 , w) ∗G ( A, ε ) . Állításunkat teljes indukcióval bizonyítjuk. Tételezzük fel, hogy a fenti összefüggés az n hosszúságú jelsorozatokra igaz. Legyen n+1 hosszúságú jelsorozat alakja w=va, ahol |v|=n, és a a jelsorozat utolsó karaktere. Minthogy feltételezésünk szerint az n hosszúságú v jelsorozatra állításunk igaz, így ha ennek hatására az automata a B állapotba mehet át, akkor a nyelvtan képes a vB mondatszerű forma generálására. Ha most a következő karakter olvasásakor az automata az A állapotba kerül, vagyis létezik δ ( B, a) = A alakú mozgási szabálya, akkor a δ ( A, a ) = B A → aB megfeleltetés miatt a nyelvtan képes a B → aA helyettesítésre és így generálhatja a vaA mondatszerű formát. Fordítva, ha a nyelvtan alkalmas a vB mondatszerű formából a vaA mondatszerű forma származtatására, akkor a A → aB δ ( A, a ) = B megfeleltetés miatt az automata a va jelsorozat után felveheti az A állapotot. Az, hogy ez a feltételezés igaz n=1 esetére, triviális. Amennyiben az automata állapota elfogadó, azaz a beolvasott jelsorozat az automata nyelvének egy mondata, akkor ennek az állapotnak megfelelő nemterminális elemészthető, és így a nyelvtan ugyanazt a mondatot képes generálni. Ez az okfejtés visszafelé is helytálló, így a két nyelv, a reguláris nyelvtan által generált és a véges automata által elfogadott azonos.
_____________________________________________________________________________________ 87
B14
Reguláris nyelvek zártsági tulajdonságai: metszet, unió (*), komplementer, konkatenált, tranzitív lezárt (*). Pumpálási lemma reguláris nyelvekre (*). Reguláris halmazok, kapcsolatuk a reguláris nyelvekkel (*).
Reguláris nyelvek zártsági tulajdonságai [Formális nyelvek 52.] A nyelvek matematikai objektumok amikre szokás szerint műveleteket értelmezhetünk. A nyelvek jelsorozatok halmazai így vannak olyan műveletek, amelyek forrása a halmazelmélet (komplemens képzés, unió, metszet), és vannak olyanok, amelyeket a jelsorozat jelleg (konkatenáció, tranzitív lezárás) határoz meg. Alapvető kérdés, hogy mennyiben zártak az egyes nyelvosztályok a különböző műveletekre. Mivel a reguláris nyelvtanok generálta és a véges automaták által elfogadott nyelvek halmaza megegyezik, ezért a kérdésre választ adó bizonyításokat végezhetjük akár a nyelvtanok akár a véges automaták segítségével. Metszet, unió (*) [Formális nyelvek 59.] Mivel a komplementer képzés és az unióképzés zárt, ezért a de Morgan szabályra hivatkozva lehet(ne) azt mondani, hogy a két másik művelettel kifejezhető metszetképzés is az. Konstruktív bizonyítás: legyen adott két nyelv az automatájával. A metszet elfogadására olyan automatát kell szerkeszteni, amely egyidejűen figyelemmel kíséri, mi történik a két eredeti automatában és a jelsorozatot csak akkor fogadja el, ha mindkét eredeti automata elfogadja azt. Ehhez olyan automatát kell készíteni, amelynek állapothalmaza a két eredeti automata állapotterének direkt szorzata, pontosabban ennek alkalmas részhalmaza. Kezdőállapot a két kezdőállapot szorzata lesz míg az elfogadó állapotok azok az állapotpárok lesznek, amelyek két elfogadó állapotból származnak. Ha a két eredeti automata determinisztikus volt, akkor az új is az lesz. Komplementer [Formális nyelvek 54.] Az automata elfogadó és elutasító állapotainak jellegét fel kell cserélni. Előtte determinisztikussá és teljesen specifikálttá kell tenni az automatát különben előfordulhat, hogy van két olyan mozgássorozat amelyikből az egyik visszautasító a másik elfogadó állapotba vezet (ekkor definíció szerint az utóbbit kell alapul venni) vagy az automata nem tudja végigolvasni a szöveget (ez definíció szerint visszautasítást jelent). Konkatenált L1 és L2 nyelv ebben a sorrendben (nem kommutatív a művelet) vett L1 • L2 konkatenáltján azon jelsorozatok halmazát értjük, amelyeket (nem feltétlenül egyértelműen) ketté lehet vágni úgy, hogy a sorozat eleje az L1 , másik fele az L2 nyelv mondata. Az L önmagával vett konkatenáltja L2 , és akárhányszoros hatványt is értelmezhetünk. A nulladik hatvány az a nyelv amelynek egyetlen eleme az üres jelsorozat. A konkatenáltképzéshez először el kell érni, hogy a két nyelvtan nemterminális szimbólumaiból alkotott két halmaz diszjunkt legyen. Ezután az első nyelvtan második típusú szabályait, vagyis azokat ahol a jobboldalon nincsen nemterminális szimbólum átírjuk úgy, hogy a terminális szimbólum után odaírjuk a második nyelvtan mondatszimbólumait. Ha az első nyelvtan tartalmaz A → ε alakú szabályokat, akkor ezekből A → S2 alakú lesz, amit a Chomsky-féle előírás nem ismer, ezért a jobboldal helyére kell írni azoknak a szabályoknak a jobboldalát, ahol a baloldalon S2 szerepel. Tranzitív lezárt (*) L nyelv L* tranzitív lezártja a nyelv valamennyi hatványának uniója. Az unióképzés a nulladik hatványnál kezdődik, tehát a nyelv tranzitív lezártjának mindig eleme ε . Zárt. _____________________________________________________________________________________ 88
Pumpálási lemma reguláris nyelvekre (*) [Formális nyelvek 64.] Egy reguláris nyelv minden kellő hosszúságú w mondata felbontható három jelsorozat xyz egymásutánjára úgy, hogy y-t tetszőlegesen sokszor megismételve megint a nyelv mondatát kapjuk. Reguláris halmazok, kapcsolatuk a reguláris nyelvekkel (*) [Formális nyelvek 66.] Legyen Σ egy adott alfabeta. Σ felett értelmezett reguláris halmaz az üres halmaz, az egyedül az üres jelsorozatot tartalmazó halmaz és egy Σ halmazbeli karakter, mint egy egyetlen jelsorozatot tartalmazó halmaz. Legyen P és Q két reguláris halmaz. Ekkor P+Q, PQ és P* is reguláris halmaz. Precedenciaszabály ugyanolyan mint az aritmetikában: hatványozás (tranzitív lezárt), szorzás(konkatenáció), unióképzés. Zárójelezés itt is alkalmazható. Az üres halmaz a nulla, az üres jelsorozatot tartalmazó halmaz pedig az egységelem ∞
∞
i =0
i =1
szerepét játssza. Az A* = ∪ Ai tranzitív lezárt mintájára bevezetjük a A+ = ∪ Ai jelölést, azaz
A = A + ε . A reguláris halmazokra bevezetett jelölések segítségével ugyanúgy lehet halmazegyenleteket illetve egyenletrendszereket felírni (és utána Gauss-eliminálni) mint a számokkal az aritmetikában. *
+
A reguláris nyelvtanok éppen a reguláris halmazokat generálják.
_____________________________________________________________________________________ 89
B15
Környezetfüggetlen nyelvek. Környezetfüggetlen nyelvtanok jólfésült alakra hozása. Chomsky-normálformára hozás. Greibach-normálforma (*). Rekurzió és balrekurzió kiküszöbölhetősége.
Környezetfüggetlen nyelvek [Formális nyelvek – 75. oldal] Azokat a nyelveket nevezzük környezetfüggetlen nyelveknek, amelyeket a 2-es nyelvosztályba tartozó nyelvtanok generálnak. Az ilyen nyelvtanoknak csak A → α alakú levezetési szabályai lehetnek. A környezetfüggetlen jelző arra utal, hogy egy mondatszerű formában a fenti helyettesítési szabály az A nemterminális környezetétől függetlenül, bárhol alkalmazható. Példa: E → E +T |T T →T ∗F | F F → (E) | a A nemterminális szimbólum itt nem S, ahogy azt megszokhattuk. A nemterminális szimbólumok jele ugyanis szintén jelentést hordoz, adott esetben a számítástechnikában használt angol nyelven (E expression, T - term, F - factor). A fenti nyelvtan az additív + és egy multiplikatív * operátort tartalmazó, és a zárójelezést megengedő aritmetikai kifejezéseket generálja. A nyelvnek nyilvánvalóan eleme az a+a*a. Ezt az alábbi levezetés igazolja: E ⇒ E +T ⇒ T +T ⇒ F +T ⇒ a +T ⇒ ⇒ a +T ∗F ⇒ a + F ∗F ⇒ a + a∗ F ⇒ a + a∗a Azonban a mondatot másképp is le lehet vezetni: E ⇒ E +T ⇒ E +T ∗ F ⇒ E +T ∗a ⇒ E + F ∗a ⇒ ⇒ E + a∗a ⇒ T + a∗a ⇒ F + a∗a ⇒ a + a∗a Ábrázoljuk a levezetést egy rendezett, irányított gráffal, fával (~levezetési fa). A rendezettség itt annyit jelent, hogy az egy csomópontból kiinduló élek sorrendje kötött. Minden csomópontból annyi él és abban a sorrendben fut ki, amennyi a szabály jobboldalán található szimbólumok száma és a kifutó élek végén sorban a jobboldal megfelelő szimbólumai helyezkednek el. Minden levezetésnek egy és csakis egy levezetési fa felel meg, ugyanakkor egy levezetési fához több levezetés is tartozhat. Az a+a*a mondathoz tartozó levezetési fa: E E
T
+
T
T
F
F
a
a
*
F
a
A fában az egyes csomópontokhoz tartozó részfákat szintaktikai egységeknek nevezzük. Ilyen minden terminális szimbólum (levél) önmagában is. Azokat a levezetéseket, amelyek levezetési fája azonos, tehát
_____________________________________________________________________________________ 90
ahol a jelsorozat felbontása szintaktikai egységekre megegyező, nem tekintjük lényegesen különböző levezetéseknek. Az olyan nyelvtanokat, ahol minden mondathoz egy és csakis egy levezetési fa tartozik, egyértelmű nyelvtanoknak mondjuk. Természetesen ez nem zárja ki, hogy egy mondatnak több levezetése legyen, azonban azok nem lehetnek lényegesen különbözőek. A levezetések között vannak nevezetesek. Amikor a levezetés során mindig a mondatszerű forma legbaloldalibb nemterminális szimbólumát helyettesítjük, baloldali levezetésről beszélünk. Ugyanígy jobboldali levezetés esetében mindig a mondatszerű forma legjobboldalibb nemterminális szimbólumát bontjuk fel a következő lépésben. Környezetfüggetlen nyelvtanok jólfésült alakra hozása [Formális nyelvek – 82-90. oldal] Célszerűségi szempontból támaszthatunk igényeket a nyelvtan külalakjával, helyettesítési szabályok külalakjával kapcsolatban. A felesleges szimbólumok kiküszöbölése: Egy nemterminális szimbólum akkor felesleges, ha nincs a nyelvnek olyan mondata, amelynek a levezetésében található mondatszerű formák legalább egyikében az illető nemterminális előfordulna. Legyenek valamely nyelvtanban érvényesek a következő levezetések: S ⇒∗ w = xay S ⇒∗ α Aβ ⇒∗ w Amennyiben a fenti levezetések lehetségesek, akkor sem az a terminális, sem az A nemterminális szimbólum nem felesleges. Legyen adott egy G grammatika. Képezzünk egy halmazsorozatot az alábbi szabályszerűség szerint: Bi +1 = Bi ∪ { A | A → α , α ∈ Bi∗ } .
Ezek szerint a következő halmazt úgy kapjuk, hogy az előző halmazhoz hozzávesszük azokat a nemterminális szimbólumokat, amelyeknek létezik olyan levezetési szabálya, ahol a jobboldalon minden szimbólum az előző halmaz eleme. Jelölje B az ilymódon kapott legnagyobb számosságú halmazt. Amennyiben kiindulásul a terminális szimbólumok halmazát választjuk, akkor a B halmaz a terminális szimbólumokon kívül azokat és csakis azokat a nemterminálisokat fogja tartalmazni, amelyekből kiindulva a helyettesítési szabályok alkalmazásával egy pusztán terminális szimbólumokból álló jelsorozat állítható elő. Ez egy alulról felfelé bottom up fésülés. Vegyünk ismét egy halmazsorozatot és válasszunk a következő képzési szabályt: Ti +i = Ti ∪ { X | A → α X β , A ∈ Ti } . Az új képzésekor tehát az eredeti halmazhoz hozzá kell venni azon helyettesítési szabályok jobboldalán található terminális és nemterminális szimbólumokat, amely szabályok baloldala az eredeti halmazhoz tartozó nemterminális szimbólum. Ha a kiindulásként választott halmaz egyedül a mondatszimbólumot tartalmazza, akkor a T halmaz azokat és csakis azokat a terminális és nemterminális szimbólumokat tartalmazza majd, amelyek egy, a mondatszimbólumból kiinduló levezetés mondatszerű formáiban szerepelnek. Ezzel az algoritmussal felülről lefelé top down fésüljük meg a grammatika szabályait. Példa: S → a, S → B, B → Bb, C → b A nyelvtant alulról felfelé megfésülve a következő halmazsorozatot kapjuk: B0 = {a, b}
B1 = B = {a, b, S , C} A B nemterminális szimbólum feleslegesnek bizonyult, ebből következően az ekvivalens nyelvtan: S → a, C → b Ezt a nyelvtant felülről lefelé fésülve a következő halmazsorozatot kapjuk:
_____________________________________________________________________________________ 91
T0 = {S } T1 = T = {S , a} A következő algoritmus az A → ε alakú ún. epszilon szabályok kiküszöbölését valósítja meg. Fésüljük meg az eredeti nyelvtant, válasszuk induló halmaznak az üres jelsorozatot: B0 = {ε } . Abban az esetben, amikor a nyelv tartalmazza az üres jelsorozatot (ha a mondatszimbólum elenyészhet), állítsuk elő a nyelvet két nyelv uniójaként. Az első komponensnek egyetlen eleme lesz, az üres jelsorozat, míg a másodiknak mondatai az üres jelsorozat kivételével megegyeznek az eredeti nyelv mondataival. Jelölje Le azt a nyelvet, amelynek egyetlen mondata az üres jelsorozat. Az L nyelv, amely tartalmazza az üres jelsorozatot is tehát: L = ( L − Le ) ∪ Le . Az Le nyelvtana csak egyetlen szabályt tartalmaz: Q →ε . Az L = ( L − Le ) ∪ Le nyelv mondatszimbólumát jelöljük P-vel, ekkor az eredeti nyelv szabályait a következő szabályokkal kell kiegészítenünk: P → Q, Q → ε , P → S . Ezek után hagyjuk el az összes epszilon szabályt, de ugyanakkor az olyan levezetési szabályokat, ahol a jobboldalon szerepelnek elenyésző nemterminálisok, az összes lehetséges konfigurációban hagyjuk el ezeket a nemterminálisokat. Példa: S → SaSb | ε B0 = {ε } , B1 = B = {ε , S } S → ε,S → S S → SaSb, S → aSb, S → Sab, S → Ab S → ε , S → S , S → SaSb, S → aSb, S → Sab, S → Ab Az egyszeres szabályok kiküszöbölése: Mint már említettük egyszereseknek nevezzük az A→ B alakú szabályokat. Az egyszeres szabályok megléte zavaró lehet, ha ciklicitás van bennük, mint például az A → B, B → C , C → A szabályok esetén. Emeljük ki a nyelvtanból az egyszeres szabályokat, és a továbbiakban azt a nyelvtant vizsgáljuk, amely csak ezekből az egyszeres szabályokból áll. Megnézzük, hogy ebben a nyelvtanban hány nemterminális szimbólum van. Ezután alkalmazzuk a felülről lefelé való fésülést oly módon, hogy kiinduló halmazként rendre egy-egy ilyen nemterminálist választunk. Az egyes fésülések eredményeként kapott záróhalmaz nyilván azokat a nemterminálisokat tartalmazza, amelyek a kiindulásul választott nemterminális szimbólumból az egyszeres szabályok útján elérhetőek. Az egyszeres szabályok elhagyáskor ennek megfelelően a nyelvtant új szabályokkal kell kiegészíteni. Ezen szabályok baloldala a kiindulásul választott nemterminális szimbólum lesz, jobboldala pedig megegyezik azon szabályok jobboldalával, amelyeknek baloldala a záróhalmazban található valamelyik nemterminális. Chomsky-normálformára hozás Ebben a normálalakban csak kétféle alakú helyettesítési szabály engedélyezett: A → AB A→a.
_____________________________________________________________________________________ 92
A fenti formát nem teljesítő szabályokat alakítsuk át a következő elvek alapján: a terminális szimbólumok helyett vezessünk be (ál)nemterminálisokat a := A , és egészítsük ki a szabályainkat A → a -val. Ezzel a Chomsky megkötéseknek eleget nem tévő helyettesítési szabályok alakja csakis a következő lehet (legalább két nemterminális tartalmaznak a jobboldalon, ugyanis az eredeti jólfésült nyelvtanban nincsenek egyszeres szabályok): C → C1C2 … Cn , ezeket alakítsuk át a következő módszer segítségével: C → C1 C1 C1 → C2C3 … Cn . Ezt ismételve a jobboldalt is kettőre tudjuk redukálni. A CNF nem egyedi ugyanis tetszőleges sorrendben vezethetjük be nemterminálisokat.
Ci -k helyett az új
Greibach-normálforma (*). Rekurzió és balrekurzió kiküszöbölhetősége A Greibach normálalakban a helyettesítési szabályok alakja: A → aW , ahol W tetszőleges, csak nemterminálisokból álló sorozat. A GNF jelentősége, hogy az így felírt nyelvtanok nem balrekurzívak, ami azért lényeges, mert bizonyos egyszerű szintaktikus elemző módszerek nem alkalmazhatóak, ha a nyelvtan balrekurzív. Egy nemterminális szimbólumot rekurzívnak mondunk, ha származtatható belőle olyan jelsorozat, amely az eredeti szimbólumot tartalmazza. A ⇒∗ α Aβ Egy nyelvtan akkor rekurzív, ha tartalmaz rekurzív nemterminálist. Balrekurzívnak mondunk egy nyelvtant akkor, ha van olyan a rekurzivitásért felelős nemterminális szimbólum, amelyből kiinduló levezetés során a szóban forgó nemterminális a legbaloldalibb pozícióban jelenik meg újból: A ⇒∗ Aα . Közvetlen balrekurzió: A → Aα . Legyen A egy közvetlen balrekurziót okozó nemterminális. Soroljuk az A levezetési szabályait két halmazba aszerint, hogy közvetlen balrekurziót okoznak-e vagy sem. A → Aα1 | Aα 2 | … | Aα n A → β1 | β 2 | … | β n Vezessük be a reguláris halmazoknál már alkalmazott jelöléseket, és legyen α = α1 + α 2 + ... + α n
β = β1 + β 2 + ... + β m Ekkor: ⇒ A = Aα + β A ⇒∗ βα ∗ Alakítsuk át a nyelvtant a következők szerint: A=β +βA A = α +α A.
_____________________________________________________________________________________ 93
Veremautomaták. Állapottal és üres veremmel elfogadó veremautomaták, ezek kapcsolata. Mélységbe látó veremautomata, kapcsolata a nem mélységbe látó veremautomatával (*). Környezetfüggetlen nyelvtanok és veremautomaták kapcsolata (*), környezetfüggetlen nyelvtanból veremautomata konstruálása.
B16
Veremautomaták [Formális nyelvek – 97. oldal] A 2-es nyelvosztály helyettesítési szabályainak alakja: A →α Itt α tetszőleges, mind terminális mind nemterminális szimbólumokat tartalmazható jelsorozat. Minthogy a szabályok alkalmazása a környezettől független ezért az osztály nyelveit környezetfüggetlen (CF) nyelveknek nevezzük. [Formális nyelvek 19.] A környezetfüggetlen nyelvek felismerésére a veremautomaták szolgálnak, melyek a véges automata LIFO szervezésű memóriával ellátott változatai. Definíció szerint a veremből olvasás egyben a veremből való kivételt is jelenti. A veremautomata formális leírására egy hetes szolgál: P ( Q, Σ, Γ, δ , q0 , Z 0 , F ) ahol • • • • • • •
Q az automata állapotainak halmaza, Σ az elemzendő jelsorozat alfabetája, Γ a verem alfabetája, vagyis azon szimbólumok halmaza, amelyek a veremben lehetnek, δ az automata mozgási szabályainak halmaza, q0 az induló állapot, Z 0 a memória kezdeti tartalma. F az elfogadó állapotok halmaza.
A P jelölés a push-down automaton angol elnevezésre utal. Az összes említett halmaz véges. Az automata csak akkor mozgásképes, ha a verem nem üres, ezért szerepel benne induláskor Z 0 . A veremautomata mozgását az automata állapota, az olvasott karakter és a verem tetején található szimbólum határozza meg. A mozgás hatására az automata új, esetleg az eredetivel megegyező állapotot vesz fel, és a verem tetejére egy véges jelsorozatot ír be. Ha egy mozgásnál a verembe beírt jelsorozat hossza 0, akkor azt mondjuk, hogy az ε karaktert írtuk a verembe. Léteznek ún. epszilon mozgások is, amiket csak az automata állapota és a veremtető határoz meg. Az olvasófej alatti karakter itt nem játszik szerepet, el sem olvassuk és így a szalag sem továbbítódik. Epszilon mozgás akkor is lehetséges, ha az olvasófej alatt már nincs is karakter. A veremautomata akkor fogadja el a bemeneti jelsorozatot, ha az elolvasás után elfogadó állapotba kerül. Megengedett, hogy az automata az elolvasás után epszilon mozgásokkal kísérelje meg az elfogadó állapot elérését. A mozgási szabályok leírásánál a sorrend: automata állapot, olvasott szimbólum és a verem teteje illetve az új állapot és a verembe beírt jelsorozat. Amennyiben epszilon mozgásról van szó az olvasott karakter helyén epszilon áll. Amennyiben egynél több szimbólumot írunk be a verembe, akkor a sorozat legbaloldalibb eleme kerül a verem legeslegtetejére. A mozgási szabály alakja: δ (qi ∈ Q, a ∈ Σ, z ∈ Γ) . A veremautomata egy konfigurációja: ahol •
K = ( w, q, χ )
w a még el nem olvasott jelsorozat,
_____________________________________________________________________________________ 94
• •
q az automata állapota χ a verem tartalma.
A konvenció szerint a még elolvasásra váró jelsorozat legbaloldalibb eleme van az olvasófej alatt és a verem tartalmának legbaloldalibb eleme a verem teteje. A veremautomata akkor determinisztikus, ha minden szituációhoz legfeljebb egy mozgás tartozik. Ezen felül kikötjük, hogy ha valamely automata állapot és veremtető pár esetében lehetséges epszilon mozgás, akkor csakis ez a mozgás legyen lehetséges. Nemdeterminisztikus automatával lehetséges pl. a ww−1 nyelv felismerése. Állapottal és üres veremmel elfogadó veremautomaták, ezek kapcsolata [Formális nyelvek – 105. oldal] A veremautomata elfogadási feltételét köthetjük a verem üres voltához is. Az elfogadó-állapotok hiánya még azzal az előnnyel is jár, hogy a már ismert konvenciókat alkalmazva, pusztán a mozgási szabályok megadása teljesen specifikálja az automatát. Az állapottal illetve üres veremmel elfogadó automaták osztálya egyenértékű. Az állapottal elfogadó automatában bevezetünk egy új veremürítő állapotot és kiegészítjük az eredeti szabályokat két szabályhalmazzal: • δ (qi , ε , X ) = (qe , X ) szabályt valamennyi elfogadó állapotra és valamennyi veremszimbólumra felírjuk, illetve a • δ (qe , ε , X ) = (qe , ε ) mozgási szabály minden veremszimbólumra lesz érvényes. Az üres veremmel elfogadó automatából állapottal elfogadót pedig úgy készíthetünk, hogy az elemzés előtt a verem legaljára teszünk egy új szimbólumot és csak akkor visszük elfogadó állapotba az automatát ha az elemzés végén ez az egyetlen szimbólum maradt bent a veremben. Mélységbe látó veremautomata, kapcsolata a nem mélységbe látó veremautomatával (*) [Formális nyelvek – 106. oldal] Megkísérelhetjük az automata erejét növelni azzal, hogy a veremből nyerhető információt nem korlátozzuk csupán a verem legfelső szimbólumára hanem megengedjük, hogy a mozgás eldöntésénél bizonyos mélységig belelásson a verembe. Mivel azonban a mozgási szabályok száma véges – ami azt jelenti, hogy a belelátási mélység korlátos –, minden mélységbe látó automatához konstruálható olyan veremautomata ami vele ekvivalens és csak a legfelső veremszimbólumot veszi figyelembe. Környezetfüggetlen nyelvtanok és veremautomaták kapcsolata (*) CF nyelvtanok pont azokat a nyelveket generálják amiket a veremautomaták elfogadnak. Környezetfüggetlen nyelvtanból veremautomata konstruálása. [Formális nyelvek – 110. oldal] Legyen adott egy környezetfüggetlen nyelvtan levezetési szabályaival és definiáljunk egy üres veremmel elfogadó automatát úgy, hogy a verem alfabetája a nyelvtan terminális és nemterminális szimbólumainak uniója legyen, a verem kiinduló tartalma pedig a mondatszimbólum. Az állapothalmaz egyetlen elemet tartalmaz, jelölje ezt q. A mozgási szabályok kétfélék: egyik fajta független a nyelvtan szabályaitól a másik nem. Alakok a következők: • δ (q, a, a) = (q, ε ) , tehát, ha a verem tetején terminális elem van, akkor az a verem tetejéről leemelhető. Arra az esetre, amikor a verem tetején lévő terminális nem azonos a beolvasott karakterrel nincs kádencia, az elemzés ezen az úton zsákutcába jutott. • δ (q, ε , A) = (q, α ) , ezek a szabályok a nyelvtant és így a nyelvet tükrözik. Minden levezetési szabálynak megfelel egy ilyen mozgási szabály. Tehát valahányszor egy nemterminális kerül a verem tetejére, azt egy olyan szabály jobboldalával helyettesítjük, amelynek baloldala éppen a szóban forgó nemterminális. Ez az automata a baloldali elemzést valósítja meg, de nem ez az egyetlen ami a nyelvtani szabályok által generált mondatokat elfogadja. Konstruálható pl. olyan automata is, ami jobboldali elemzést hajt végre: a _____________________________________________________________________________________ 95
generált mondatból indul ki és a levezetési szabályok jobboldalát megkeresve, azokat a baloldallal helyettesítve halad mondatszerű formáról mondatszerű formára visszafelé, mindaddig, míg a végén az eredeti mondatot a mondatszimbólumra nem redukálta.
_____________________________________________________________________________________ 96
Pumpálási lemma környezetfüggetlen nyelvekre (*). A környezetfüggetlen nyelvek zártsági tulajdonságai: metszet, unió, komplementer, konkatenált (*), tranzitív lezárt (*). Determinisztikus környezetfüggetlen nyelvek. A determinisztikus környezetfüggetlen nyelvek zártsági tulajdonságai: metszet, unió, komplementer (*).
B17
Pumpálási lemma környezetfüggetlen nyelvekre (*) [Formális nyelvek – 121. oldal] A környezetfüggetlen nyelvek egy fontos tulajdonsága a kettős pumpálás, amely a reguláris nyelvek pumpálásához hasonló jelenség, a szakirodalom vwxyz tételnek nevezi. Legyen adott egy környezetfüggetlen nyelvtan. Amennyiben sikerül ezen nyelvtan segítségével egy kellő hosszúságú q mondatot generálni, akkor ez a mondat felbontható öt részsorozatra q=vwxyz oly módon, hogy az alábbi jelsorozat vwi xy i z is mondata a nyelvnek. A környezetfüggetlen nyelvek zártsági tulajdonságai: metszet, unió, komplementer, konkatenált (*), tranzitív lezárt (*) [Formális nyelvek – 123. oldal] Metszet: Definiáljunk két nyelvet. Az első mondatainak alakja: a i bi c k . aibk c k Mindkét nyelv (determinisztikus) környezetfüggetlen nyelv. Könnyű belátni, hogy a két nyelv metszete a i bi c i , amiről tudjuk, hogy nem környezetfüggetlen nyelv, hiszen nem tud kettősen pumpálni. Ezek szerint a környezetfüggetlen (és ezen belül a determinisztikus környezetfüggetlen) nyelvek nem zártak a metszet műveletére. Azonban találhatók olyan környezetfüggetlen nyelvek, amelyek metszete nem lép ki a környezetfüggetlen nyelvek halmazából. Például egy környezetfüggetlen nyelvet önmagával metszünk el, akkor az eredmény nyilván az eredeti nyelv lesz. Egy másik triviális példa, hogy ha két környezetfüggetlen nyelv diszjunkt, akkor metszetük az üres nyelv. Unió: Legyen adott két környezetfüggetlen nyelv nyelvtanával. Amennyiben a két nyelvtan nemterminális szimbólumai nem alkotnak diszjunkt halmazokat, akkor ezt a nemterminálisok átnevezésével érjük el. Legyenek S1 és S2 a két nyelvtan mondatszimbólumai. A két nyelvtan valamennyi levezetési szabályából alkossunk egy új nyelvtant, fosszuk meg az eredeti mondatszimbólumokat ettől a rangjuktól, végül vezessünk be egy új S mondatszimbólumot, és két új levezetési szabályt: S → S1 S → S2 . Triviális, hogy az így konstruált új környezetfüggetlen nyelvtan a két nyelv unióját generálja. A környezetfüggetlen nyelvek tehát zártak az unióképzésre. Komplementer: A környezetfüggetlen nyelvek nem zártak a komplementer műveletre (de Morgan szabályok alapján, tudva hogy a metszet képzésre nem zártak). Konkatenált: Legyen a két nyelv nyelvtanával adott. Gondoskodjunk arról, hogy a két nyelvtan nemterminálisai diszjunkt halmazt alkossanak. Fosszuk meg mondatszimbólum címétől a két nyelv S1 és S2 eredeti mondatszimbólumait, vezessünk be egy új S mondatszimbólumot, egyesítsük a két nyelvtan levezetési szabályait, végül adjuk hozzá az S → S1S2 levezetési szabályt. A nyelvtan valóban a konkatenált nyelvet generálja. Ezek szerint a környezetfüggetlen nyelvek zártak a konkatenáció műveletre. _____________________________________________________________________________________ 97
Tranzitív lezárt: Legyen a környezetfüggetlen nyelv nyelvtanával adott, és mondatszimbóluma legye S. Egészítsük ki a nyelvtan levezetési szabályait két új szabállyal: S →ε S → SS Az első szabály gondoskodik arról, hogy az üres jelsorozat eleme legyen a nyelvnek, a második szabály segítségével viszont olyan hosszú, csak a mondatszimbólumból álló mondatszerű formát generálhatunk, amilyen hosszút csak szeretnénk. Ezek mindegyikéből pedig generálható az eredeti nyelvnek egy mondata. El kell érnünk, hogy a mondatszimbólum ne szerepeljen levezetési szabály jobb oldalán. A módszer – új mondatszimbólum bevezetése, és a régihez tartozó szabályok multiplikálása – betűre megegyezik a reguláris nyelvtanoknál követettel. Determinisztikus környezetfüggetlen nyelvek Determinisztikusak azokat a környezetfüggetlen nyelvek, amelyekre determinisztikus veremautomatát lehet szerkeszteni. Egy veremautomata akkor determinisztikus, éspedig mind a valódi, mind az epszilon mozgásokra nézve, ha minden esethez, tehát állapothoz, beolvasott karakter, veremtető hármashoz, illetve epszilon mozgások esetében állapot-veremtető párhoz legfeljebb egy mozgási szabály tartozik. A valódi és epszilon mozgások között sem lehet átfedés. A determinisztikus környezetfüggetlen nyelvek zártsági tulajdonságai: metszet, unió, komplementer (*). Komplementer: Nagy nehezen lehet determinisztikus veremautomatából olyan determinisztikus automatát építeni, ami épp az eredeti automata nyelvének komplemensét fogadja el. Tehát erre a műveletre igaz a zártság. Metszet: előzőekben bizonyítottuk, hogy nem zártak rá. Unió: Ha zártak lennének rá, akkor felhasználva, hogy a komplementerképzésre zártak, azok volnának a metszetre is, ami viszont nem helytálló. Ebből következik, hogy a csak nemdeterminisztikus veremautomatával elfogadható környezetfüggetlen nyelvek halmaza nem üres, hiszen kell, hogy legyen két olyan determinisztikus környezetfüggetlen nyelv, amelynek az uniója nemdeterminisztikus. A determinisztikus környezetfüggetlen nyelvek halmaza a környezetfüggetlen nyelvek halmazának valódi részhalmaza.
_____________________________________________________________________________________ 98
B18
A fordítás fogalma. Véges fordító. Reguláris (*) és környezetfüggetlen nyelvek zártsági tulajdonságai a véges fordítás esetén. Veremfordító, szintaxis vezérelt fordítási séma, kapcsolatuk (*).
A fordítás fogalma [Formális nyelvek – 132. oldal] Legyen adott két véges alfabeta ( Σ és ∆ ) illetve az ezekből képzett véges, de nem korlátos jelsorozatok halmazai. A fordítás ennek a két megszámlálhatóan végtelen számosságú halmaz keresztszorzatának egy T részhalmaza. A részhalmaz elemei jelsorozatpárok lesznek, ahol az első jelsorozat a Σ* a második pedig a ∆* halmaz eleme. Ha T (α ,η ) akkor az η jelsorozat α egy fordítása. Összhangban a fordítási köznapi értelmezésével sem az egyértelműségre sem a teljességre nincs semmiféle kikötés. A fordítás egyszerűsége/bonyolultsága nem ad semmilyen felvilágosítást a fordítandó nyelv bonyolultságáról. Pl. egy görög betűkkel leírt szöveget átírni latin betűkre az egyik legegyszerűbb fordítás (izomorfizmus) annak ellenére, hogy a görög 0-ás nyelvosztályú nyelv. Véges fordító Annyiban tér el a véges automatától, hogy nem csak bemeneti, hanem kimeneti berendezése is van. Ha egy véges fordító egy mozgás során kiírt jelsorozatainak maximális hossza k, akkor a mozgások az alábbi leképezést adják: Q × Σ ⇒ Q × ∆k ahol • Q az állapotok halmaza, • Σ és ∆ a bemenő illetve kimenő alfabetát jelenti. Nem a fordító feladata eldönteni, hogy az inputján értelmes szöveg van-e, ezért nincsenek megkülönböztetett állapotok. Reguláris (*) és környezetfüggetlen nyelvek zártsági tulajdonságai a véges fordítás esetén. [Formális nyelvek – 137. oldal] A fordító automatákkal végzett műveletet felfoghatjuk olyan nyelvi műveletként, amely egy nyelvhez egy másikat rendel. Amennyiben a fordító automata egy véges fordító, akkor az automatával végrehajtott transzformációra mind a reguláris, mind a környezetfüggetlen nyelvek zártak. Utóbbi állítás bizonyításához a bemenő nyelvből és a véges fordítóból megszerkesztjük a kimenet nyelvét elfogadó automatát. Annyi kikötést/átalakítást teszünk, hogy a fordító a mozgás során vagy csak egyetlen szimbólumot olvas vagy csak egyetlen szimbólumot ír ki illetve a bemenő nyelv veremautomatája egyetlen állapottal bír és üres veremmel fogad el. A veremben most is a fordítandó szöveget generáljuk de ezt nem a bemenettel vetjük össze, hanem követjük, milyen állapotváltozásokon megy át ezt olvasva a véges fordító, hiszen veremautomatánk állapottere azonos a véges fordítóéval. Amikor a fordító a fordított mondat valamilyen szimbólumát készülne kiírni, akkor ezt összevetjük a bemeneten található szimbólummal. Ha a bemeneten levő jelsorozat megegyezik a fordításként kiadni szándékolt jelsorozattal, akkor az automata elfogadja azt. Veremfordító Ugyanúgy ahogy a véges automatának van fordító változata, a veremautomatának is van fordító változata, kiegészítve egy output egységgel és a következő mozgási szabályokkal: Q × ( Σ ∪ ε ) × Γ ⇒ Q × Γk × ∆i
ahol • • •
Q az állapothalmaz Σ, Γ, ∆ a bemenet, a verem és a kimenet alfabetája k és i a mozgások során a verembe beírt illetve a kimeneten megjelenő jelsorozat legnagyobb hossza. _____________________________________________________________________________________ 99
Szintaxis vezérelt fordítási séma, kapcsolat a veremfordítókkal (*) A fordításoknak a véges fordítónál lényegesen nagyobb osztálya jellemezhető szintaxis vezérelt fordítási sémákkal. Itt nem a kész szöveg alapján készül el a fordítás, hanem a két mondat, a fordítandó és a fordított egyidejűen generálódik. A levezetés során párhuzamosan lépünk mondatszerű formapárról mondatszerű formapárra. A szintaxis vezérelt fordítási sémák elemei a helyettesítési szabályoknak megfelelő konstrukciók. A szabályok környezetfüggetlen jellegűek. Alakjuk: A → α1 , α 2 . A pár első tagja a fordítandó szöveget generálja, a második pedig a fordítottat. A sémaelemeknek ugyanolyanoknak kell lenniük, aminek a feltétele, hogy a két mondatszerű formában ugyanazok a nemterminálisok és ugyanannyiszor szerepeljenek. Ez csak úgy biztosítható, ha a sémák elemeihez tartozó két jobboldalban a nemterminálisok nemben és számban megegyeznek. A párt alkotó formulában minden nemterminálisnak egy és csakis egy párja lehet a másik mondatszerű formában. Ha nem csak nemben és számban egyeznek meg a nemterminálisok hanem sorrendben is, akkor a séma neve egyszerű szintaxis vezérelt fordítási séma. Utóbbiakat veremfordítóval lehet realizálni.
_____________________________________________________________________________________ 100
B19
Levezetési fa környezetfüggetlen nyelvtanok esetén. Környezetfüggetlen nyelvtanok és nyelvek egyértelműsége. A környezetfüggetlen nyelvtanok elemzésének célja. CockeYounger-Kasami algoritmusa. Az Earley-algoritmus.
Levezetési fa környezetfüggetlen nyelvtanok esetén [Formális nyelvek – 75. oldal] Környezetfüggetlen nyelvtanok esetén ábrázolhatjuk a levezetést egy rendezett, irányított gráffal, fával (~levezetési fa). A rendezettség itt annyit jelent, hogy az egy csomópontból kiinduló élek sorrendje kötött. Minden csomópontból annyi él és abban a sorrendben fut ki , amennyi a szabály jobboldalán található szimbólumok száma és a kifutó élek végén sorban a jobboldal megfelelő szimbólumai helyezkednek el. Minden levezetésnek egy és csakis egy levezetési fa felel meg, ugyanakkor egy levezetési fához több levezetés is tartozhat. Példa: Legyen a
E → E +T |T T →T ∗F | F
F → (E) | a nyelvtan. Az a+a*a mondathoz tartozó levezetési fa: E E
T
+
T
T
F
F
a
a
*
F
a
Azokat a levezetéseket, amelyek levezetési fája azonos, tehát ahol a jelsorozat felbontása szintaktikai egységekre megegyező, nem tekintjük lényegesen különböző levezetéseknek. Az olyan nyelvtanokat, ahol minden mondathoz egy és csakis egy levezetési fa tartozik, egyértelmű nyelvtanoknak mondjuk. Természetesen ez nem zárja ki, hogy egy mondatnak több levezetése legyen, azonban azok nem lehetnek lényegesen különbözőek. A levezetések között vannak nevezetesek. Amikor a levezetés során mindig a mondatszerű forma legbaloldalibb nemterminális szimbólumát helyettesítjük, baloldali levezetésről beszélünk. Ugyanígy jobboldali levezetés esetében mindig a mondatszerű forma legjobboldalibb nemterminális szimbólumát bontjuk fel a következő lépésben. Példa: Legyen a nyelvtanunk a következő: E → E + E | E ∗ F | (E) | a Ezzel a nyelvtannal is lehet generálni az a+a*a mondatot. Ehhez a mondathoz tartozó jobboldali levezetés: E ⇒ E ∗E ⇒ E ∗a ⇒ E + E∗a ⇒ E + a∗a ⇒ a + a∗a A baloldali levezetés: E ⇒ E∗E ⇒ E + E∗E ⇒ a + E∗E ⇒ a + a∗E ⇒ a + a∗a . És a levezetési fák: _____________________________________________________________________________________ 101
E E a
E E
+ E a
*
E E
E
a
a
a
* E
E a
a
Környezetfüggetlen nyelvtanok és nyelvek egyértelműsége Léteznek olyan nyelvek, amelyről bizonyítható, hogy nem lehet egyértelmű nyelvtannal generálni. Ez esetben tehát a többértelműség nyelvi tulajdonság. Más szóval nincsen minden környezetfüggetlen nyelvnek egyértelmű nyelvtana. Példa: Nem egyértelmű nyelv: S → aAbX | YbCc A → aAb | ab C → bCc | bc . X → cX | c Y → aY | a Ez a nyelvtan az L = a i bi c j ∪ a j bi c i nyelvet generálja. Az triviális, hogy az adott nyelvtan az a i bi c i alakú mondatot két lényegesen különböző levezetéssel állítja elő.
A környezetfüggetlen nyelvtanok elemzésének célja [Formális nyelvek – 80. oldal] Nincs olyan módszer, amelynek a segítségével általánosan, minden esetben alkalmazhatóan meg lehetne állapítani egy nyelv vagy egy nyelvtan egyértelmű voltát. Ez azonban nem jelenti azt, hogy egyes konkrét esetekben ne lehetne erre az algoritmikusan eldönthetetlen kérdésre választ kapni. Például az [ E → E + T | T T → T * F | F F → ( E ) | a ] nyelv mondatait alkotó jelsorozatokat elkezdhetjük felbontani egyre kisebb egységekre, majd ezeket újabb egységekre mindaddig, amíg a szintaktikai egységek egyetlen terminális szimbólumból nem állnak és be tudjuk látni, hogy ez a felbontás mindig egyértelmű lesz. Az [ E → E + E | E * E | ( E ) | a ] nyelv esetében pedig nem nehéz pl. az a+a*a kifejezéshez két eltérő felbontást mutatni, ami a többértelműség bizonyítéka. A gyakorlatban nem mindig sikerül a nyelvtan egyedi tulajdonságait vagy egy szerencsés ötletet felhasználva a nyelvtan egy- vagy többértelműségét bizonyítanunk. Ilyenkor a kérdés megválaszolatlan marad. A szintaktikus elemzés célja egy olyan automata készítése és felhasználása, amelynek feladat minden mondatnak vélt jelsorozat levelezési fájának előállítása. Az elemzés igénye majdnem mindig egyértelmű nyelvtanok esetén lép fel de vannak olyan elemzők amelyek általánosan használhatók. Ilyenek a CYK és az Earley-algoritmusok. Cocke-Younger-Kasami algoritmusa [Formális nyelvek – 155. oldal] Az eljárás megköveteli, hogy a nyelvtan Chomsky normálalakban legyen felírva. Az eredeti nyelvtan helyettesítési szabályainak alkalmazását egy sorozat Chomsky szabály végrehajtásával modellezzük. A Chomsky normálalak felírásánál úgy járunk el, hogy a helyettesítési szabályoknak sorszámot adunk, mind az eredeti, mind a Chomsky normálforma esetén. Ha most az eredeti nyelvtan szabályának sorszámát adjuk az őt modellező Chomsky sorozat egyik szabályának, a sorozat többi szabályának pedig nagyobb, az eredeti nyelvtanban nem szereplő sorszámokat adunk, akkor lehetőség van arra, hogy a normálforma _____________________________________________________________________________________ 102
szabályaival felírt levezetésből megkapjuk az eredeti nyelvtan levezetését. Ezt úgy kapjuk, hogy a „túlzottan” magas sorszámokat egyszerűen kihagyjuk a leírásból. Ha ezt a balelemzés illetve a jobbelemzés leírásánál el tudjuk érni, akkor azt mondjuk, hogy a normálalak, pontosabban a sorszámozott normálalak balról illetve jobbról fedi az eredeti nyelvtant. Amennyiben az eredeti levezetési szabályt leképező Chomsky szabálysorozat első tagjának adjuk az eredeti nyelvtan szóban forgó szabályának sorszámát, akkor balról, ha az utolsónak, akkor jobbról fedtük le a normálalakkal az eredeti nyelvtant. Az elemzés alulról felfelé halad. Az elemzés során kapott eredmények egy alsó háromszögként rajzolt mátrix mezőit töltik ki. A mezőkbe a Chomsky normálforma nemterminális szimbólumai kerülnek. A mátrix t jk mezejébe akkor kerül egy nemterminális, ha a szóban forgó nemterminális képes a vizsgált mondat j számú konszekutív karakterének generálására., mégpedig éppen a k sorszámú szimbólummal kezdve. A mátrixot alulról felfelé kell kitölteni, vagyis a legalsó, tehát a fenti konvenció értelmében az első sorral kell kezdenünk. Ide olyan nemterminálisok kerülnek, amelyek egyetlen karakterből álló jelsorozatokat képesek generálni. Itt tehát a Chomsky normálalakban engedélyezett A → a alakú szabályokat kell alkalmaznunk. Elképzelhető, hogy egy mezőbe egynél több nemterminális kerül, sőt előfordulhat, hogy egy nemterminális több okból írható be ugyanabba a mezőbe. A második és az azt követő sorok megszerkesztésekor már a második szabálytípus szerinti levezetési szabályokat kell figyelembe venni. A második sor kitöltésekor azt vizsgáljuk, hogy van-e olyan levezetési szabály, amelynek jobboldala két, az első sorban szomszédos szimbólumból áll. Ha igen, akkor annak a baloldalát kell beírnunk a második sor megfelelő mezejébe. A generált részsorozat hosszának növekedésével az eljárás bonyolódik, hiszen egy hosszabb részsorozat már többféleképpen osztható fel. Így például ha a t43 mezőt kívánjuk kitölteni, ahová definíciónk szerint azok a nemterminálisok kerülnek, amelyek a 3 pozícióval kezdődő, és a 6 pozícióval végződő sorozat négy szimbólumát generálják, akkor a t13 − t34 , a t23 − t25 és a t33 − t16 mezőpárokat kell megvizsgálnunk, ami megfelel a négy szimbólumból álló jelsorozat 1-3, 2-2 illetve 1-3 arányban történő felosztásának. Az Earley-algoritmus [Formális nyelvek – 150. oldal] Az algoritmus felülről lefelé fésül. Alapgondolata a következő. Induljunk ki a mondatszimbólumból, és valamennyi lehetséges levezetést tegyük vizsgálat tárgyává. Amennyiben a levezetés során a mondatszerű forma elejére egy terminális szimbólum generálódik, akkor ellenőrizzük, hogy ez a terminális szimbólum megegyezik-e az elemzett mondatjelölt első terminális szimbólumával. Eltérés esetén nyilvánvaló, hogy ezen az úton a szóban forgó jelsorozatot nem lehet levezetni, éppen ezért ezeket a levezetési próbálkozásokat abbahagyjuk. Csak abban az esetben érdemes továbbvinni az elemzést, ha a generált terminális megegyezik a mondatjelölt megfelelő helyén álló terminálisával. Ekkor viszont a levezetéseket minden lehetséges módon tovább kell folytatnunk. Az algoritmus gyakorlati megvalósításakor úgynevezett elemekből csoportokat alakítunk ki. A csoportok számozottak, és sorszámuk azt fejezi ki, hogy a mondatjelöltből már hány szimbólumot vettünk figyelembe. Amennyiben a jelsorozat n karakterből áll, akkor a csoportok számozása 0 és n között változik. A 0 sorszámú csoport azt az állapotot tükrözi amikor még egyetlen karakter sem vettünk figyelembe. Egy k sorszámú csoportban levő elem alakja legyen a következő: { A → α1 • α 2 , i} . Az elem alakjából következik, hogy a nyelvtanban kell lennie egy A → α1α 2 alakú levezetési szabálynak. Ez a szabály felhasználható a jelsorozat levezetésekor, mégpedig oly módon, hogy a jelsorozatnak az i sorszámú szimbólumától a k sorszámúig terjedő fragmense – nem beleértve az i, de beleértve a k sorszámút – a levezetési szabály α1 részéből levezethető. Új elemeket háromféle módon származtathatunk. Tekintsük a k-1 sorszámú csoportot, és vizsgáljuk azokat az elemeket, amelyekben a pont után álló terminális megegyezik a jelsorozat következő, tehát k _____________________________________________________________________________________ 103
sorszámú karakterével, akkor ezt a szimbólumot a pont elé helyezve a születendő k sorszámú csoport elemét kapjuk. Formálisan,ha a {B → β1 • bβ 2 , i} elem a k-1 sorszámú csoport tagja, és a mondatjelölt k sorszámú karaktere b, akkor a {B → β1b • β 2 , i} tagja az alapító tagja az új k sorszámú csoportnak. A k-1 sorszámú csoportnak azok az elemei tehát, amelyekben a pont után a mondatjelölt k sorszámú terminálisa áll, alkotják az előbbi kismértékű átalakítással az új csoport alapító tagjait, elemeit. Amennyiben a pont mögött „rossz” terminális áll, úgy azok a levezetések, amelyeket ezek az elemek képviselnek a további elemzésben nem vesznek részt. Az így kapott alapító tagok sorsa más és más, aszerint, hogy most a pont után terminális, nemterminális vagy semmi sem áll. Amennyiben az alapító elemekben a pont után terminális található, akkor pillanatnyilag ezen elemek szerepe befejeződött. Rájuk majd akkor kerül újra sor, ha a következő k+1 sorszámú csoport alapító tagjait keressük. Tételezzük fel, hogy a k sorszámú csoport alapító tagjai között szerepel a következő elem: {C → γ 1 • Dγ 1 , i} és a nyelvtannak van egy
D →η alakú helyettesítési szabálya. Ekkor az alábbi elemeket is be kell vennünk ebbe a csoportba: {D → •η , k} .
Amennyiben az új csoportba így bevezetett új elemekben a pont után megint csak nemterminális áll, akkor a fenti származtatást rekurzív módon mindaddig folytatni kell, amíg új, eddig nem szerepelt elemeket fűzhetünk hozzá a csoporthoz. Vegyük végül azt az esetet, amikor a pont után már nem áll semmi, vagyis egy levezetési szabály jobboldalát teljesen felhasználtuk. Legyen például az újonnan kapott k csoportbeli elem { A → α •, j} . Ekkor vissza kell mennünk ahhoz a csoporthoz, ahol a szóban forgó helyettesítési szabály bekapcsolódott a mondat levezetésébe. Ez nyilván a j sorszámú csoport lesz, hiszen az említett sorszámú szimbólumtól kezdve generálja a mondat egy fragmensét. Könnyű belátni, hogy a j sorszámú csoportban kell legyen legalább egy olyan elem amely a fenti összefüggésben szereplő helyettesítési szabályt inicializálta, vagyis ahol a pont után A nemterminális szerepel. Legyen a j sorszámú csoport egy elemének alakja: {B → β1 • Aβ1 , i} Ennek alapján az új, k sorszámú csoportba a következő elemet kell felvennünk: {B → β1 A • β1 , i} . Az első, sorszám szerint 0 csoport alapító elemeit azok a levezetési szabályok alkotják, amelyek baloldala a mondatszimbólum, hiszen minden levezetésnek ebből kell kiindulnia. Így az összes S → σ alakú helyettesítési szabály a {S → •σ , 0} formában jelenik meg a legelső csoport elemi között. Az alapító elemek birtokában aztán meg kell kezdeni a csoport felépítését az ismertetett módon. Egy jelsorozatot akkor fogadunk el, ha az a mondatszimbólumból teljes egészében generálható. Ezt úgy ismerhetjük fel, hogy az utolsó csoportban kell legyen egy {S → σ •, 0} alakú elem. Példa: [Formális nyelvek – 153. oldal] _____________________________________________________________________________________ 104
B20
Balelemzés. Az LL(k)-elemzés algoritmusa (erős és gyenge). LL(k) nyelvtanok (*) és nyelvek (*).
Balelemzés [Formális nyelvek – 160. oldal] Szintaktikus elemző tágabb értelemben minden olyan automata, amelynek feladata a mondat, pontosabban minden mondatnak vélt jelsorozat levezetési fájának előállítása. Így szintaktikus elemzők azok a veremfordítók, amelyek a mondatra mint bemenetre a levezetési fa leírását adják meg mint fordítást. Szűkebb értelemben csak azokat az automatákat tekintjük szintaktikus elemzőknek, amelyeknek működése determinisztikus. Legtöbbször a szintaktikus elemző szerkesztésekor feltételezzük, és megköveteljük, hogy a nyelvtan egyértelmű legyen. [Formális nyelvek – 150. oldal] Baloldali elemzésnél mindig a mondatszimbólumból indulunk ki, és mindig a mondatszerű forma legbaloldalibb nemterminálisát bontjuk fel a következő lépésben. Azaz a mondatot az elemzés során addig olvastuk el, ameddig az élen álló terminálisokat generálni tudtuk. A következő lépésben a legbaloldalibb nemterminálist úgy kell felbontanunk, hogy a mondat további terminálisai kiadódjanak. Általában a felbontandó nemterminális szimbólum több levezetési szabály baloldalán állhat, vagyis a felbontásnak több alternatívája van. Ezek közül kell a megfelelőt kiválasztani, hiszen egyértelmű nyelvről lévén szó, csak egyetlen felbontás vezethet eredményre. Ennek érdekében az LL(k) elemző k szimbólumot előre néz és ezekből a terminálisokból igyekszik eldönteni, melyik alternatívát kell választania a helyes folytatáshoz. LL(k) az jelenti, hogy balról jobbra történik az olvasás és az elemzés baloldali, miközben k szimbólumot nézünk előre. Az LL(k)-elemzés algoritmusa (erős és gyenge) [Formális nyelvek – 162. oldal] Az elemző lényegi része az elemzési tábla, amely a nyelvtan alapján írható fel. A vízszintes fejléc az előretekintés során kapható jelsorozatokat tünteti fel, a függőleges fejléc a verem tetejére kerülő szimbólumokat adja, a tábla mezői a szükséges intézkedésekre tartalmaznak utasításokat. A verem kiinduló tartalma mindig a mondatszimbólum. Ha a veremtetőn nemterminális van, akkor az elemzési táblából az inputon látottak alapján kinézzük, hogy melyik szabályt kell alkalmazni a megfelelő helyettesítéshez. Ha nincs ilyen szabály akkor hibával leállunk. Ha van, akkor megtörténik a helyettesítés és az outputra íródik a szabály száma. Ha a veremtetőn terminális van, akkor összehasonlításra kerül az olvasófej alatti terminálissal. Ha megegyeznek, akkor az input elejéről és a verem tetejéről is törlődik a karakter. Ha nem egyeznek meg, akkor az elemzendő sztring nem eleme a nyelvtannak. Ha épp akkor ürül ki a verem amikor a sztring végére értünk, akkor sikeres volt az elemzés. Legyen adott egy G grammatika és legyen adott egy tetszőleges α jelsorozat. Jelölje FIRSTkG (α ) azt a terminálisokból álló és legfeljebb k hosszúságú jelsorozatokat tartalmazó véges nyelvet, amelyet úgy kapunk, hogy vesszük az α jelsorozatból a G grammatika segítségével nyerhető összes jelsorozatot, illetve ha azok hosszabbak, mint k, akkor azok első k szimbólumát. Valamely nyelvtan egyik A nemterminálisának összes lehetséges levezetési szabálya legyen A → α1 α 2 … α n . A nyelvtan csakis akkor lehet LL(k) nyelvtan, ha a FIRSTkG (α i ) véges nyelvek
diszjunktak. Ez a megkötés nem csak szükséges hanem elégséges is abban az esetben, ha A utódai mindenkor legalább k szimbólumot generálnak. Legyen A a nyelvtan egyik nemterminálisa. Ekkor FOLLOWkG ( A) jelentse azon, legfeljebb k hosszúságú jelsorozatok halmazát, amelyet az adott nyelvtan az A utódait követve generálhat. Ezt a nyelvet nevezzük az A nemterminális követő nyelvének. _____________________________________________________________________________________ 105
Ezzel a definícióval az elemző által vizsgált jelsorozatok az alábbi összefüggéssel írhatóak le: FIRSTk ( FIRSTk (α i ) • FOLLOWk ( A)) . Itt • a konkatenálás operátora. Amennyiben ezek a kifejezések a különböző alternatívákra diszjunktak az elegendő feltétel arra, hogy ennek alapján a helyes felbontás egyértelműen eldönthető legyen. A nyelvtan tehát LL(k) nyelvtan, mégpedig erősen LL(k) nyelvtan. A feltétel nem szükséges (pl. a S → aAbaS | bAabS | S → ε ; A → a | b | ε nyelv esetén az első két szabályban az A-kat különböző nemterminálisoknak tekintve LL(2) elemző készíthető) Amennyiben a produkciós szabályok jobboldalai nem képesek minden esetben generálni a szükséges k karkert, akkor figyelembe kell venni, milyen terminális sorozat származhat a mondatszerű formának az A nemterminálist követő részéből. Erre szolgál a FOLLOW függvény. Így viszont nem vesszük figyelembe azt az információt amelyet a már elolvasott szövegből nyerhetünk. Egy adott levezetésnél ugyanis az A nemterminális előtt álló szöveg olyan kontextust jelenthet, amely bekorlátozhatja az A nemterminális derivátumai után álló jelsorozatokat. Ezt figyelembe véve pontosabb disztinkciót biztosíthatunk. Erről van szó az előző megjegyzésben szereplő LL(2) elemezhető nyelvtan esetében. Felismertük ugyanis, hogy ha megkülönböztetjük az első két szabály generálta A nemterminálist, akkor a két úton nyert kontextus a kettéhasítással született két nemterminálishoz két különböző úgynevezett lokális követő nyelvet rendel. Amennyiben az eredeti nyelvtan valamely nemterminális szimbólumát fel tudjuk bontani olymódon több nemterminálisra, hogy a születésükkor meghatározott követő nyelvek eltérőek legyenek és ennek segítségével a FIRSTk ( FIRSTk ( Ai ) • FOLLOWk ( Ai )) ∩ FIRSTk ( FIRSTk ( Aj ) • FOLLOWk ( Aj )) = ∅ kifejezéseket diszjunkttá tudjuk tenni, akkor gyengén LL(k) nyelvtanról beszélünk. Itt Ai , Aj az eredeti nyelvtan A nemterminálisának különböző lokális FOLLOW függvénnyel bíró példányai. Ezt a felbontást célszerű már az induláskor megtenni. Ez bonyolultabb elemző táblához vezet. A nagy tábla minden rovatát egy kisebb tábla alapján szerkesztjük meg, amelynek három oszlopa van, megadva az adott szituációban az előretekintéssel kapható jelsorozatokat, az egyes esetekben szükséges intézkedéseket és ha a verembe új nemterminális(oka)t írunk be, akkor annak(/azoknak) a követő nyelvét. Ha a nagy táblában az indexszel megkülönböztetett újként bevezetett nemterminálisokhoz tartozó sorok között nincsenek ellentétes utasításokat tartalmazók, akkor azok összevonhatók és kiderülhet, hogy erős LL(k) elemzés is elegendő. Viszont mégis értelmes lehet a megkülönböztetés, mert a finomabb felosztású elemző hamarabb jelzi a hibát egy rossz mondatban. Két elemző erősen ekvivalens, ha bármely jelsorozatnál az esetleges hibát ugyanannál az elemzési lépésnél fedezik fel. Két elemző gyengén ekvivalens, ha a jelsorozatnak ugyanannál a szimbólumánál állnak meg, de ebben a helyzetben különböző számú elemzési lépést tesznek meg. Két elemző nem ekvivalens, ha van olyan – szükségképpen hibás – jelsorozat, ahol a két elemző a hibát más-más karakternél detektálja. (Megjegyzés: A balrekurzív nyelvek nem balelemezhetők ezért a következők szerint kell átírni őket: A → Aα β helyett A → β  és  → α  ε ) LL(k) nyelvtanok (*) és nyelvek (*). [Formális nyelvek – 172. oldal] Egy nyelvtanról nem lehet megállapítani, hogy balelemezhető-e, csak azt, hogy egy nyelvtan egy rögzített k esetében LL(k) nyelvtan-e. Vannak olyan nyelvek amelynek egyik nyelvtana nem balelemezhető, de van olyan nyelvtana ami igen. Általánosságban igaz, hogy a balelemezhetőség a nyelvtanhoz kötött tulajdonság. Vannak viszont balelemezhető nyelvek is. Ezeknek nincs balelemezhető nyelvtanuk. Egy nyelvet akkor nevezünk LL(k) nyelvnek, ha van LL(k) elemezhető nyelvtana, de nincs k-1 előretekintéssel elemezhető nyelvtana. _____________________________________________________________________________________ 106
B21
Jobbelemzés. Az LR(k)-elemzés algoritmusa. LR(k) nyelvtanok (*) és nyelvek (*). Prefix tulajdonságú nyelvek, kapcsolatuk az LR(k)-elemzéssel (*).
Jobbelemzés [Formális nyelvek – 174. oldal] A jobbelemzés során a mondatjelölt szimbólumait olvasva azokat rendre a veremben helyezzük el. Közben minden alkalommal megvizsgáljuk, hogy nem alakult-e ki a veremben egy olyan fragmens, amely egy levezetési szabály jobboldala, és így egy potenciális nyél. Amennyiben ez a fragmens valóban nyélnek bizonyul, akkor ezt letörjük, vagyis helyébe a szabály baloldalán álló nemterminálist írjuk. Az alulról felfelé történő elemzésnek tulajdonképpen ez a lényege. A következő szimbólumot átcsúsztatjuk a verembe, megvizsgáljuk, hogy keletkezett-e nyél, ha igen letörjük, redukáljuk, ha nem, akkor áttérünk a következő szimbólumra. Az LR(k)-elemzés algoritmusa Az algoritmus angol elnevezése shift-reduce. Az egész algoritmus kritikus pontja a nyél létének megállapítása, hiszen a jobboldallal való azonosság még nem feltétlenül jelenti azt, hogy a karaktersorozat nyél. Ezen kívül, ha több levezetési szabálynak azonos a jobboldala, vagy jobboldaluk azonosan végződik, akkor azt is el kell döntenünk, hogy melyik szabály szerint végezzük el a letörést. Ezen kérdések eldöntésében segít, ha kissé előre lapozunk, előretekintünk, és ezt az információt felhasználjuk. Az LR(k) nyelvtanok esetében k szimbólummal előretekintve döntünk a nyéljelölt ügyében. A jobboldali elemzés fordított irányban halad végig a jobboldali levezetésen. Adott esetben azt, hogy a A → α levezetési szabály jobboldalával azonos α fragmenst nyélnek tekintsünk-e vagy sem, és azt az A nemterminálissá törjük-e le, a FIRSTk (k ) alapján döntjük el. LR(k) nyelvtanok (*) és nyelvek (*) Egy nyelvtan akkor LR(k), ha a vélelmezett nyél után álló k terminális szimbólum alapján egyértelműen eldönthető valódi nyélről van-e szó, és ha igen, melyik szabályt alkalmazva kell azt letörni. Legyen egy nyelvtan két levezetési szabálya A → α és B → β Legyen továbbá két lehetséges jobboldali levezetés: S ⇒∗ γ Ax ⇒ γα x S ⇒∗ δ Ay ⇒ δβ y
ekkor LR(k) nyelvtan esetén a FIRSTk ( x) = FIRSTk ( y ) azonosságból következik, hogy
α = β és az A = B . Az elemzés során egy adott szituációban a követendő eljárás a prefixumtól és az előretekintéssel nyert jelsorozattól függ. Ennek megfelelően az elemező tábla vízszintes fejlécében az előretekintéssel kapott jelsorozatok állnak. Az egyes rovatok, vagyis a függőleges fejléc az életképes prefixumoknak felelnek meg. Lehetnek olyan prefixumok, amelyek esetében az elemzés során követendő eljárás azonos. Tekintsük ezeket az életképes prefixumokat ekvivalensnek. Ennek megfelelően az életképes prefixumokat ekvivalencia osztályokba sorolhatjuk, és ekvivalencia osztályonként csak egy rovatot alkalmazunk. Minden életképes prefixumhoz, pontosabban ekvivalencia osztályhoz elemeket fogunk rendelni. Valamely életképes prefixumhoz, illetve ekvivalencia osztályhoz tartozó elem alakja: { A → α1 • α 2 , L} Ahol az A → α1α 2 a nyelvtan egy produkciós szabálya, L pedig egy legfeljebb k hosszúságú jelsorozatokból álló véges nyelv. _____________________________________________________________________________________ 107
Az adott prefixum néhány utolsó, közelebbről meg nem határozott számú szimbólumát az α1 jelsorozat generálhatja, és a mondatban az A → α1α 2 szabály által generált fragmens követő első k terminális az L nyelv valamelyik szava. Tételezzük fel, hogy egy adott életképes prefixumhoz valamilyen módon sikerült megszerkesztenünk az összes hozzátartozó elemet. Ekkor két kérdés merül fel: Hogyan állapíthatjuk meg, hogy milyen életképes prefixumokat kell még figyelembe vennünk? Illetve hogyan következtethetünk az elemekből az elemzés során követendő lépésekre. A prefixum csakis olyan szimbólummal folytatódhat – terminális vagy nemterminális -–, amely a prefixumhoz tartozó elemekben közvetlenül a pont után áll. Ez megadja milyen új prefixumot kell számításba vennünk. Az új prefixumokhoz rendelt csoportoknak éppen ezek az elemek lesznek alapító tagjai, természetesen azzal az eltéréssel, hogy a pont itt eggyel tovább kerül, vagyis átugorja az őt követő szimbólumot. Amennyiben az így származtatott elemekben a pont után nemterminális áll, akkor ezen nemterminálisok valamennyi levezetési szabályából új elemet kell képeznünk, a pontot a jobboldal elé helyezve, és megállapítva a követő nyelvet. Egy prefixumot követően azokat a terminálisokat csúsztathatjuk, amely a prefixumhoz tartozó csoport elmeiben a pont után áll. Ez annyit jelent, hogy csak akkor csúsztathatunk, ha az ily módon kialakuló prefixum továbbra is életképes marad. Amennyiben a pontot sikerült átvinni a teljes jobboldalon, és így most már a levezetési szabály után áll, akkor ez annyit jelent, hogy a prefixum nyélben végződik, ami letörhető, feltéve, hogy az előretekintéssel nyert jelsorozat eleme az L követő nyelvnek. A fentiek alapján haladhatunk prefixumról prefixumra. Az eljárás garantálja, hogy a prefixumok mindig életképesek lesznek. Amennyiben két különböző prefixum csoportja megegyezik, akkor ez annak a jele, hogy a két prefixum azonos ekvivalencia osztályba tartozik, és nem kell az elemző táblában új rovatot nyitnunk. A csoport elemei azt is megmondják milyen terminálisokat van jogunk a verembe átcsúsztatni, és mikor és milyen szabály alapján lehet az adott nyelet letörni. Az indulás és az elfogadás megkönnyítése érdekében vezessünk be egy új mondatszimbólumot, és egy új 0 sorszámú produkciós szabályt: 0 S →S Ahol S az eredeti, míg S az új mondatszimbólum. Minthogy ez a szabály áll minden levezetés elején, ha a jobboldali felvezetés során eljutunk ehhez a szabályhoz és letörjük, akkor ez annyit jelent, hogy a jelsorozatot el kell fogadnunk. Ezen szabály szerinti letörés lesz tehát az akceptálás jele. Az első, vagyis a 0 sorszámhoz tartozó csoport első, alapító eleme az új mondatszimbólum egyetlen produkciós szabálya lesz, végül az L követő nyelv nyilván szintén az üres jelsorozat, hiszen induláskor semmi sem áll a mondatszimbólum után. A világ kezdete minden nyelvtannál:
{S → • S , ε }
Építsünk LR(1) elemzőt a posztfix lengyel jelülést generáló nyelvtanhoz (ez azt is demonstrálja, hogy balrekurzív nyelvtanok is jobbelemezhetőek): E → EE + | EE∗ | a Az életképes prefixumokat az irodalom a T betűvel és megkülönböztető indexszel jelölik. Ezek szerint első prefixumunk: ε ⇒ T0 . A többi prefixum, pontosabban prefixum osztály esetében azt a jelölést alkalmazzuk, hogy a származtató prefixumhoz hozzáfűzzük az új szimbólumot. A T0 prefixumhoz tartozó csoport alapító eleme:
{E → •E , ε }
_____________________________________________________________________________________ 108
Minthogy az E nemterminálist előtt pont áll, ehhez hozzá kell fűzzük az alábbi elemeket: {E → • EE +, ε } {E → • EE∗, ε } { E → •a, ε } . Minthogy ezek az elemek az első, alapító elem utolsó szimbóluma az E nemterminális helyére kerülnek, így követő nyelveik megegyeznek. Ezekben az új elemekben az E nemterminális előtt ismét pontot találunk, így további elemeket fűzhetünk hozzá a csoporthoz. Persze ezekben az új elemekben is ugyanazok a levezetési szabályok szerepelnek majd, más lesz azonban a követő nyelv. Itt ugyanis a felbontható nemterminális, vagyis az első E után egy második E áll, amely végső soron az a terminális szimbólumot generálja. {E → • EE +, a} {E → • EE∗, a} {E → •a, a} Ezekben az elemekben megint találhatunk a pont után nemterminális szimbólumot. Természetesen rekurzívan ismét új elemeket vezethetünk, illetve csak vezethetnénk be, hiszen kiderül, hogy a bevezetendő elemek már benne vannak a csoportban. Egyszerűsítve a jelölést, ha azokat az elemeket, amelyek ugyanabból a levezetési szabályból származnak, és ráadásul a pont helyzete is azonos, akkor összevonjuk. Az összevont elemben a követő nyelv a két nyelv uniója lesz. Ennek szellemében megszerkeszthetjük a prefixum osztályokhoz tartozó csoportokat, és majd ennek alapján az elemző táblát.
ε ⇒ T0
{E → •E , ε }
{E → • EE +, ε | a} {E → • EE∗, ε | a} {E → •a, ε | a} T0 a ⇒ T2 {E → a•, ε | a} T3 E ⇒ T5
{E → EE • +, + | ∗ | a} {E → EE • ∗, + | ∗ | a} {E → E • E +, + | ∗ | a} {E → E • E∗, + | ∗ | a} {E → • EE +, + | ∗ | a} {E → • EE∗, + | ∗ | a} {E → •a, + | ∗ | a}
T0 E ⇒ T1 E → E •, ε {E → E • E +, ε | a} {E → E • E∗, ε | a} {E → a•, ε | a} {E → • EE +, + | ∗ | a} {E → • EE∗, + | ∗ | a} {E → •a, + | ∗ | a}
{E → EE • +, ε | a} {E → EE • ∗, ε | a} {E → E • E +, + | ∗ | a} {E → E • E∗, + | ∗ | a} {E → • EE +, + | ∗ | a} {E → • EE∗, + | ∗ | a} {E → •a, + | ∗ | a}
T1a ⇒ T4 {E → a•, + | ∗ | a}
T3 a ⇒ T4
{
}
T1a ⇒ T4 {E → a•, + | ∗ | a} T5 a ⇒ T4 T + a ⇒ T8 {E → EE + •, + | ∗ | a}
T1 E ⇒ T3
T3 ∗ ⇒ T7 {E → EE ∗•, ε | a} T5 E ⇒ T5 T ∗ a ⇒ T9 {E → EE ∗•, + | ∗ | a}
Az életképes prefixumokhoz tartozó elemek alapján az elemző megszerkeszthető. Ez két részből áll. Az első az úgynevezett tevékenységi tábla – action table – mondja meg, hogy egy adott szituációban, adott életképes prefixum és adott előretekintés mellet mi a teendő. Négyféle tevékenység lehetséges, csúsztatás, letörés, akceptálás és hibajelzés. A csúsztatást és az elfogadást az S és A – shift, accept – a letörést a levezetési szabály sorszáma, míg a hibajelzést az üres mező jelenti. A tábla második fele az úgynevezett ugró tábla – go to table. Ez megmondja, hogy az érvényes életképes prefixumhoz egy újabb szimbólumot fűzve, milyen sorszámú prefixumot kapunk. Az elemzés következő lépését aztán ezen prefixum sora alapján kell megállapítanunk.
_____________________________________________________________________________________ 109
Mindezek után az adott nyelvtan jobboldali elemző táblája a következő: +
*
ε
E T1
a T2
T3
T4
T5 T5
T0
a S
T1
S
A
T2
3
3
T3
S
S
S
T4
3
3
3
T5
S
S
S
T6
1
1
T7
2
2
T8
1
1
1
T9
2
2
2
+
*
T4
T6
T7
T4
T8
T9
Prefix tulajdonságú nyelvek, kapcsolatuk az LR(k)-elemzéssel (*) Minden determinisztikus CF nyelvhez szerkeszthető LR(1) elemző. A prefix tulajdonságú determinisztikus környezetfüggetlen nyelvekhez készíthető LR(0) elemző. Ez annyit jelent, hogy az elemző előretekintés nélkül el tudja dönteni a helyes folytatást.
_____________________________________________________________________________________ 110
B22
A precedenciaelemzés algoritmusa. Erős és gyenge precedencia-nyelvtanok, erősen és gyengén precedencia-elemezhető nyelvek kapcsolata (*). Az operátor precedencia elemzés.
A precedenciaelemzés algoritmusa [Formális nyelvek – 181. oldal] Az LR(k) elemzők előnye, hogy az esetleges hibát azonnal észreveszik, viszont nagyon terjedelmesek. A hely- és időigény csökkentésére sok módszer született. A precedencia elemzés lényege, hogy a következő karakterre lépés illetve a letörés között csak a prefixum néhány utolsó karaktere alapján dönt. Ha csak egyetlen karaktert veszünk figyelembe a prefixumból miközben az előretekintés is egyetlen karakter, akkor egyszerű precedencia elemzőről beszélünk. Ilyen elemző készítéséhez vizsgáljuk meg a prefixum utolsó és az el nem olvasott szöveg első karakteréből álló szimbólum párokat. Ezek a csúsztatás/letörés tekintetében a következő ún. Wirth-Weber relációkban lehetnek: 1. az első szimbólummal záródik egy nyél (jele: < • ), •
2. a két szimbólum egy nyél két szomszédos eleme ( = ), 3. a második szimbólum egy nyél kezdő karaktere ( • > ), illetve 4. nincs olyan mondatszerű forma amelyben a két szimbólum egymás mellett állhatna (nil). E relációkat egy mátrixban szokás ábrázolni. A sor- és oszlopfejlécekben a nyelvtani szimbólumok vannak. Az egyes mezőkbe a megfelelő sorhoz és oszlophoz tartozó szimbólumok egymásutánjaiból képzett párok közötti Wirth-Weber relációk jele kerül (nil helye üresen marad). Mindkét fejlécben szerepel az ε. Az ε-ε pár jelenti az elfogadást. A jelsorozat olvasásakor állandóan figyeljük a szimbólumpároknak megfelelő mezőket. Ha a reláció nyél eleje vagy nyél közepe, akkor csúsztatunk. A nyél vége reláció esetében letörünk. Ha a potenciális nyél mégsem nyél (egyik levezetési szabály jobboldalával sem egyezik), akkor hibát jelzünk. Ha pedig két levezetési szabály jobboldalán is ugyanez a nyél van, akkor azt mondjuk, hogy a nyelvtan nem egyértelműen invertálható. Ekkor precedencia módszerrel nem elemezhető. Erős és gyenge precedencia-nyelvtanok [Formális nyelvek – 186. oldal] A visszatekintés és az előretekintés hossza alapján (m,n) precedencia nyelvtanokról illetve elemzőkről beszélünk. Az (m,n) precedencia nyelvtanok az LR(n) nyelvtanok általában valódi részhalmazait alkotják – mivel LR(n)-nél a visszatekintés potenciálisan végtelen, míg (m,n) precedencia elemzésnél épp mkorlátos. A prefix lengyel jelölés nyelvtana ( E → + EE | *EE | a ) nem egyszerű precedencia nyelvtan, mert ha (1,1) precedencia mátrixot akarunk felírni, akkor az E-a szimbólumpárnál konfliktus helyzet adódik – nem lehet ugyanis tudni, hogy a szóban forgó E az operátor utáni első szimbólum (nyél eleje van), vagy a második (nyél vége van). (2,1) elemző készítésekor a függőleges fejléc legfeljebb két szimbólumból álló jelsorozatokat tartalmaz. A elemzés során akár nyél eleje akár nyél belseje relációt találunk mindkét esetben csúsztatnunk kell. Ha diszjunktak a precedencia relációk, akkor a nyél eleje és a nyél vége között csak nyél belseje relációk lehetnek. Amennyiben megengedjük a nyél eleje és nyél belseje relációk egyidejű jelenlétét, a letöréskor találkozhatunk olyan szimbólumpárokkal, amelynél nem tudjuk eldönteni, hogy innen számítsuk-e a nyél elejét vagy menjünk tovább új nyél elejét keresni. Ha a két reláció nem diszjunkt volta miatt kiadódó potenciális nyelek közül legfeljebb egy egyezik meg egy jobboldallal akkor ez nem jelent gondot az elemzésben. Ilyen esetekben gyenge precedencia nyelvtanokról beszélünk. Tehát: A gyenge precedencia nyelvtanok esetében a három reláció közül a nyél eleje és nyél belseje esetében bizonyos feltételek mellett nem követeljük meg a két halmaz diszjunkt voltát. _____________________________________________________________________________________ 111
Tovább bővíthetők az engedmények. Ha feltesszük, hogy A és B között mind a nyél eleje mind a nyél belseje relációk érvényesek, akkor a verem tartalmazhat egy olyan α ABβ fragmenst, hogy az α előtt a nyél eleje, a β jelsorozat után a nyél vége reláció áll. Ha még van a nyelvtannak C → α ABβ és D → Bβ alakú levezetési szabálya is, akkor nem teljesül az a megkötés, hogy a potenciálos nyelek közül legfeljebb egy jelent valóságos alternatívát. Viszont ha az A és D szimbólumok között semmilyen reláció nem érvényes, akkor a rövidebb nyél letörésével olyan sorozat alakulna ki, amely nem lehet része egyetlen jobboldali levezetéssel előálló mondatszerű formának sem, és így szükségképpen zsákutca. Ha egy nyelvtan esetében a fenti feltételek teljesülnek és mindig csak a hosszabb nyéljelölt letörése vezethet eredményre, akkor ezt a nyelvtant is gyenge precedencia nyelvtannak tekintjük. Gyenge precedencia nyelvtan pl. az infix aritmetikai kifejezéseket generáló nyelvtan. Erősen és gyengén precedencia-elemezhető nyelvek kapcsolata (*) A gyenge precedencia nyelvtanokhoz mindig szerkeszthető olyan erős precedencia nyelvtan amely ugyanazt a nyelvet generálja. Az operátor precedencia elemzés. [Formális nyelvek – 192. oldal] Az operátor precedencia elemzés a precedencia elemzőnél is gyorsabb és kisebb hely- és időigényű. Egy nyelvtan akkor operátor nyelvtan, ha a levezetési szabályok jobboldalán sehol nem áll két nemterminális szimbólum egymás mellett. Pl. az infix nyelvtan. Az elemzés lényege, hogy a precedencia relációkat csak a terminális szimbólumok között értelmezzük (a precedenciamátrix fejléceiben csak terminálisok vannak). A terminálisok közé beékelődő esetleges egyetlen nemterminális szimbólumot nem vesszük tudomásul és a bal- illetve jobboldalán álló terminálisokat mint szomszédokat kezeljük. A továbbiakban szabályszerű precedencia elemzést végzünk, csak az igényel néha megfontolást, hogy letörés esetén a szélső nemterminálist beleértsük-e a nyélbe vagy sem. Ezzel a stratégiával elegendő egyetlen nemterminális szimbólumot használni a nyelvtanban ugyanis minden precedenciára vonatkozó információ közvetlenül kiolvasható a precedencia mátrixból.
_____________________________________________________________________________________ 112
X-Y
2004-es tételpárok
A01 A02 A03 A04 A05 A06 A07 A08 A09 A10 A11 A12 A13 A14 A15 A16 A17 A18 A19 A20
-
B16 B11 B11, B20 B01 B03 B05, B03 B21 B13 B19 B22 B12 B06, B17 B14 B15 B18 B07 B09 B10 B04 B02
_____________________________________________________________________________________ 113