• Nem Talált Eredményt

Információs bonyolultság

In document Algoritmusok bonyolultsága (Pldal 119-124)

5. Randomizált algoritmusok 99

6.1. Információs bonyolultság

Rögzítsünk egyΣábécét, és legyen, mint korábban,Σ0= Σ−{∗}. Kényelmes leszΣ0-t a{0,1, . . . , m−1} halmazzal azonosítani. Tekintsünk egyΣfeletti kétszalagos univerzálisT Turing-gépet. Azt mondjuk, hogy egyΣ0 felettiq

111

szó (program) aT gépenkinyomtatjaaz xszót, ha a T gép második szalag-jára q-t írva, az elsőt üresen hagyva, a gép véges sok lépésben megáll úgy, hogy az első szalagján azxszó áll. Mindjárt jegyezzük meg, hogy minden x szó kinyomtatható T-n. Ugyanis van olyan egyszalagos (eléggé triviális)Sx

Turing-gép, mely üres szalaggal indulva nem csinál mást, mint erre azxszót írja. Ez a Turing-gép szimulálhatóT-n egyqxprogrammal, mely ezek szerint x-et nyomatja ki.

Egyx∈Σ0 szó (T-re vonatkozó)bonyolultságán a legrövidebb olyan szó (program) hosszát értjük, mely T-n az x szót nyomatja ki. Az x szó T-re vonatkozó bonyolultságátKT(x)-szel jelöljük.

Az x-et kinyomtató programot úgy is tekinthetjük, mint az x szó egy

„kódját”, ahol maga aT Turing-gép a dekódolást végzi. Egy ilyen programot azxszóKolmogorov-kódjának nevezzük. Egyelőre nem teszünk feltevést arra vonatkozóan, hogy ez a dekódolás (vagy a kódolás, azaz a megfelelő program megtalálása) mennyi ideig tarthat.

Azt szeretnénk, ha ez a bonyolultság azx szó egy jellemző tulajdonsága lenne, és minél kevésbé függne a T géptől. Sajnos könnyű olyan univerzális T gépet csinálni, ami nyilvánvalóan „ügyetlen”. Például minden programnak csak minden második jelét használja fel, a közbülső betűkön „átsiklik” : ekkor kétszer olyan bonyolultnak definiál mindenxszót, mint ha ezeket a betűket le se kellene írni.

Megmutatjuk azonban, hogy ha bizonyos – eléggé egyszerű – feltevéseket teszünk a T gépre, akkor már nem lesz lényeges, hogy melyik univerzális Turing-gépet használjuk a bonyolultság definiálására. Durván szólva elég azt feltennünk, hogy mindenT-n végrehajtható számítás bemenetét beadhatjuk a program részeként is. Ennek pontosításaként feltesszük, hogy a & betű eleme az ábécének (pl. & =m−1; itt a jelentése az lesz, hogy innentől az adatok következnek), melyre az áll, hogy

a) minden egyszalagos S Turing-gép szimulálható a T gépen egy olyan programmal, mely az&betűt nem tartalmazza, és

b) ha aT gép első szalagjára semmit, a második szalagjára pedig egy olyan szót írunk, mely az&betűt tartalmazza, tehát ami így írható:x&y, ahol az xszó már nem tartalmazza az&betűt, akkor a gép akkor és csak akkor áll meg, mint hay-t az első szalagra ésx-et a második szalagra írva indítottuk volna el, és megálláskor az első szalagon ugyanaz áll.

Könnyű látni, hogy minden univerzális Turing-gép módosítható úgy, hogy az a) és b) feltevéseknek eleget tegyen. A továbbiakban mindig feltesszük, hogy univerzális Turing-gépünk ilyen tulajdonságú.

6.1.1. Lemma. Létezik olyan (csakT-től függő)cT konstans, hogyKT(x)≤

≤ |x|+cT.

Bizonyítás. T univerzális, tehát az a (triviális) egyszalagos Turing-gép, mely semmit sem csinál (azonnal megáll), szimulálható rajta egyp0 programmal.

Ekkor viszont bármelyx∈Σ0szóra, ap0&xprogram azxszót fogja kinyom-tatni aT gépen. ÍgycT =|p0|+ 1megfelel a feltételeknek.

Megjegyzés. Kissé vigyázni kellett, mert nem akartuk megszorítani, hogy milyen jelek fordulhatnak elő azxszóban. Pl. a legtöbb programozási nyel-ven aPRINT "x"utasítás nem jó az olyanxszavak kinyomtatására, melyek tartalmazzák az idézőjelet. Az érdekel bennünket, hogy az x szót az adott ábécébenmennyire lehet tömören kódolni, és így nem engedjük meg az ábécé bővítését. A fentiekben az&betűt csak a programban tiltottuk meg, azaz a T második szalagján az&betű első előfordulása határolja el az adatrészt.

Most bebizonyítunk egy alapvető lemmát, mely azt mutatja, hogy a bo-nyolultság (a fenti feltételek mellett) nem függ nagyon az alapul vett géptől.

6.1.2. Tétel(Invariancia tétel). LegyenT ésS aza)ésb)feltételeknek eleget tevő univerzális Turing-gép. Ekkor van olyancT S konstans, hogy bármely x szóra|KT(x)−KS(x)| ≤cT S.

Bizonyítás. AzS kétszalagos Turing-gép működését szimulálhatjuk egy egy-szalagosS1 Turing-géppel úgy, hogy haS-en valamelyqprogram egyxszót nyomtat ki, akkor S1 szalagjára q-t írva, az is megáll véges sok lépésben, éspedig úgy, hogy a szalagjárax van írva. Továbbmenve, azS1 Turing-gép működését szimulálhatjukT-n egy olyan pS1 programmal, mely az &betűt nem tartalmazza.

Legyen mármost x tetszőleges Σ0-beli szó, és legyen qx egy legrövidebb olyan program, melyS-enx-et kinyomtatja. TekintsükT-n apS1&qx progra-mot: ez nyilvánx-et nyomatja ki, és hossza csak|qx|+cT S, aholcT S=|pS1|+1.

Így tehát

KT(x)≤KS(x) +cT S. Az ellenkező irányú egyenlőtlenség hasonlóan adódik.

Ennek a lemmának az alapján most márT-t rögzítettnek tekintjük, és a továbbiakban nem írjuk ki aT indexet. (Igaz, hogy ígyK(x)csak egy additív konstans erejéig van meghatározva, de ez a továbbiakban nem lesz zavaró, állításaink tetszőleges lerögzítettT univerzális gép esetén igazak lesznek).

A következő tétel mutatja, hogy az optimális kód algoritmikusan nem ke-reshető meg.

6.1.3. Tétel. AK(x)függvény nem kiszámítható.

Bizonyítás. A bizonyítás lényege egy klasszikus logikai paradoxon, az ún.

írógép-paradoxon. Ez egyszerűen így fogalmazható: „legyenna legkisebb 100-nál kevesebb jellel nem definiálható szám”. Ezzel éppen most definiáltukn-et 100-nál kevesebb jellel!

Tegyük fel mármost, hogyK(x)kiszámítható. Legyencalkalmasan megvá-lasztandó természetes szám. RendezzükΣ0elemeit növekvő sorrendbe. Jelölje x(k) a k-adik szót e szerint a rendezés szerint, és legyenx0 a legelső olyan szó, melyreK(x0)≥c. Feltéve, hogy gépünk Pascal nyelven programozható, tekintsük az alábbi egyszerű programot:

var k: integer;

function x(k: integer) : integer;

...

function Kolm(k: integer) : integer;

... begin

k:=0;

while Kolm(k)<c do k:=k+1;

print x(k);

end.

Ez a program nyilvánx0-t nyomatja ki. A program hosszának a meghatározá-sánál hozzá kell venni azx(k)és Kolm(k)=K(x(k))függvények kiszámítását;

ez azonban összesen is csaklogc+konstans számú jel. Ha c-t elég nagynak vesszük, ez a program c-nél kevesebb jelből áll, és x0-t nyomtatja ki, ami ellentmondás.

A tétel egyszerű alkalmazásaként új bizonyítást nyerünk a megállási prob-léma eldönthetetlenségére. Miért is nem lehet ugyanis K(x)-et a követke-zőképpen kiszámítani? Vegyük sorban a szavakat, és nézzük meg, hogy T második szalagjára ezeket írva, úgy áll-e le, hogy az első szalagraxvan írva.

Tegyük fel, hogy van olyan program, mely egy adott programról eldönti, hogy azt írva a második szalagra,T véges sok lépésben megáll-e. Ekkor azokat a szavakat, melyekkelT „elszáll”, eleve ki tudjuk szűrni, ezekkel nem is próbál-kozunk. A maradék szavak közül a legelsőnek a hossza, mellyelT az xszót kinyomtatja, leszK(x).

Az előző tétel szerint ez az „algoritmus” nem működhet; csak az lehet azonban a baja, hogy nem tudjuk kiszűrni a végtelen ideig futó programokat, vagyis a megállási probléma nem dönthető el.

6.1.1. Feladat. Mutassuk meg, hogy aK(x)függvényt még megközelítőleg sem tudjuk kiszámítani a következő értelemben: Tetszőlegesf kiszámítható függvényre, nem létezhet olyan algoritmus, mely minden xszóhoz egyγ(x) természetes számot számol ki úgy, hogy mindenx-re

K(x)≤γ(x)≤f(K(x)).

6.1.2. Feladat. Bizonyítsuk be, hogy nincs olyan algoritmus, mely minden adottnszámhoz olyannhosszúságúx0-1 sorozatot konstruál, melyreK(x)>

>2 logn.

6.1.3. Feladat. Ha egyf : Σ0→Z+ kiszámítható függvényref≤K, akkor f korlátos.

A 6.1.3. tétellel és a 6.1.1. feladattal szembeállíthatóan megmutatjuk, hogy a K(x) bonyolultság majdnem minden x-re igen jól megközelíthető. Ehhez először is pontosítanunk kell, hogy mit értünk „majdnem minden” x-en. Te-gyük fel, hogy a bemenő szavakat véletlenszerűen kapjuk; más szóval, minden x∈Σ0 szónak van egyp(x)valószínűsége. Erről tehát annyit tudunk, hogy

p(x)≥0, X

x∈Σ0

p(x) = 1.

Ezen felül csak annyit kell feltennünk, hogyp(x) algoritmikusan kiszámítha-tó.Egy ilyen tulajdonságúpfüggvénytkiszámítható valószínűségeloszlásnak nevezünk. Egyszerű példát ad ilyen valószínűségeloszlásra ap(xk) = 2−k, ahol xk a növekvő rendezés szerintik-adik szó; vagy ap(x) = (m+ 1)−|x|−1. 6.1.4. Tétel. Minden kiszámíthatópvalószínűségeloszláshoz van olyan algo-ritmus, amely mindenxszóhoz kiszámítja azxegy f(x)Kolmogorov-kódját, és erre a kódra|f(x)|−K(x)várható értéke véges.

Bizonyítás. Legyenx1, x2, . . . ,aΣ0-beli szavaknak az a sorbarendezése, mely-rep(x1)≥p(x2)≥. . ., és az azonos valószínűségű szavak mondjuk lexikogra-fikusan növekvő sorrendben vannak.

6.1.5. Állítás. Azi indexhez azxi szó algoritmikusan kiszámítható.

Az állítás bizonyítása. Legyeneky1, y2, . . . a szavak lexikografikusan növek-vően rendezve. Rögzített i mellett legyen k rendrei, i+ 1, . . .; adott k-hoz számítsuk ki a p(y1), . . . , p(yk) számokat és legyenπk ezek közül az i-edik legnagyobb. Nyilvánπi≤πi+1≤. . .≤p(xi). Továbbá, ha

(∗) p(y1) +. . .+p(yk)≥1−πk,

akkor a további szavak közöttπk-nál nagyobb valószínűségű már nem lehet, ígyπk=p(xi)ésxi az első olyanyj szó(1≤j≤k), melyrep(yj) =πk.

Így sorra véve a k=i, i+ 1, . . . értékeket, megállhatunk, ha (∗) teljesül.

Mivel (∗) bal oldala 1-hez tart, a jobb oldal pedig monoton nemnövekvő, ez előbb-utóbb bekövetkezik. Ezzel az állítást bebizonyítottuk.

Visszatérve a tétel bizonyítására, az állításban szereplő algoritmus prog-ramja azi számmal együtt az xi szó egy f(xi) Kolmogorov-kódját szolgál-tatja. Megmutatjuk, hogy ez a kód kielégíti a tétel követelményeit.

Nyilván|f(x)| ≥K(x). Továbbá|f(x)|−K(x)várható értéke hiszenf(xi)egy speciális Kolmogorov-kód, tehát a várható érték nem negatív.

Tekintsük a fenti összeg első tagját:

X

A második tagban az összeget növeljük, ha aK(xi) számokat növekvő sor-rendbe rendezzük át (mivel a p(xi) együtthatók csökkennek). Legyen zi a szavak egy ilyen rendezése, tehát aholK(z1)≤K(z2)≤. . .. Ekkor a

A Kolmogorov-kód, ha szigorúan vesszük, kihasznál aΣ0ábécén kívül is egy jelet: a programszalag olvasásakor a program végét arról ismeri fel, hogy a

„∗” jelet olvassa. Módosíthatjuk a fogalmat úgy, hogy ez ne legyen lehetséges:

a programot olvasó fejnek nem szabad túlszaladnia a programon.

Egy olyan szót, melyet a kétszalagos univerzálisTTuring-gépünk program-szalagjára írva, a fej soha nem is próbál a programon kívüli mezőt olvasni, ön-korlátozónak nevezünk. A legrövidebbx-et kinyomtató önkorlátozó program hosszátHT(x)-szel jelöljük. Ezt a módosított információs bonyolultságfogal-matLevinésChaitinvezették be. Könnyű belátni, hogy az Invariancia-tétel most is érvényes, és ezért ismét elég az index nélküliH(x)jelölést használni.

A K ésH függvények nem térnek el nagyon, ahogy azt a következő lemma mutatja. Emlékezzünk rá, hogym=|Σ0|.

In document Algoritmusok bonyolultsága (Pldal 119-124)