AlgElmeletiKerdesekKidolgozas

A VIK Wikiből
A lap korábbi változatát látod, amilyen (vitalap) 2012. október 21., 20:52-kor történt szerkesztése után volt. (Új oldal, tartalma: „{{GlobalTemplate|Infoalap|AlgElmeletiKerdesekKidolgozas}} * Lehet, hogy rossz. * Lehet, hogy nem ezt akarják válasznak. __TOC__ Cs. Cs. D., cc699 kukac hszk.bme.hu…”)
(eltér) ← Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)
Ugrás a navigációhoz Ugrás a kereséshez

Ez az oldal a korábbi SCH wiki-ről lett áthozva. Az eredeti változata itt érhető el.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor kérlek javíts rajta egy rövid szerkesztéssel.

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót


  • Lehet, hogy rossz.
  • Lehet, hogy nem ezt akarják válasznak.

Tartalomjegyzék

Cs. Cs. D., cc699 kukac hszk.bme.hu, 2009. január, v0.2

Írja le a piros-kék algoritmust a piros és kék szabályokkal együtt!

Az algoritmust minimális súlyú feszítőfák keresésére használják. A [math]G[/math] gráf éleit kiszínezzük pirosra, vagy kékre, úgy hogy közben a gráf végig takaros legyen. Végül, ha már minden élet kiszíneztünk, a kék élek összessége adja a keresett eredményt. f Takaros színezés: [math]G[/math] gráf éleinek színezésére az algoritmus minden szakaszában igaz, hogy van olyan minimális költségű feszítőfája, ami az összes kék élet tartalmazza, és egyetlen piros élet sem tartalmaz.

Az alábbi két szabályt tetszőlegesen alkalmazzuk addig, míg van színezetlen él a gráfban:

  • Kék szabály: Kiválasztunk egy olyan nem üres [math]X \subset V[/math] csúcshalmazt, amiből nem vezet ki kék él. Ezután egy legkisebb súlyú [math]X[/math]-ből kimenő (színtelen) élet fessünk kékre.
  • Piros szabály: Válasszunk [math]G[/math]-ben egy egyszerű kört, amiben nincs piros él. Ezután a legnagyobb súlyú színtelen élet fessük pirosra.

A szabályok alkalmazása után mindig takaros színezést kapunk, és mindig tudjuk folytatni az algoritmust addig, míg minden élet ki nem színezünk.

Tk. 153. oldal

Definiálja, hogy mikor nevezünk egy nyelvet NP-teljesnek, és adjon meg két ismerten NP-teljes nyelvet a definíciójukkal együtt!

Az [math]L \subseteq I^*[/math] nyelv NP-teljes, ha [math]L \in NP[/math], és minden [math]L' \in NP[/math] nyelv esetén létezik [math]L' \prec L[/math] Karp-redukció.

3-SZÍN nyelv: A három színnel kiszínezhető gráfokból álló nyelv. NP-teljes, mert 3-SAT [math]\prec[/math] 3-SZIN, és 3-SAT NP-teljes.

H nyelv: A H Hamilton-kört tartalmazó gráfokból álló nyelv. NP-teljes, mert IH [math]\prec[/math] H és IH NP-terljes.

Tk. 271. oldal

Definiálja a közelítő algoritmus fogalmát maximalizálási problémákra! Írja le az általános gráfban maximális méretű párosítás keresésének problémájára adott 2-közelítő algoritmust, és bizonyítsa is be, hogy az adott algoritmus 2-közelítő!

TODO

Definiálja a 2-3 fákat. Írja le a BESZÚR művelet megvalósítását, és adja meg a lépésszámát is. Indoklás nem szükséges.

A 2-3 fa egy olyan keresőfa, amelyben a tárolni kívánt rekordok a fa leveleiben vannak, balról jobbra növekvő sorrendben. Egy belső csúcs kétféle lehet: 2 kulcsból és 3 mutatóból áll, vagy 1 kucsból és két mutatóból áll:

[math]m_1[/math] [math]s_1[/math] [math]m_2[/math] [math]s_2[/math] [math]m_3[/math]
[math]m_1[/math] [math]s_1[/math] [math]m_2[/math]

A kulcsokra fennáll, hogy [math]s_1 \lt s_2[/math], valamint [math]m_1[/math] minden kulcsa kisebb, mint [math]s_1[/math], [math]m_2[/math]-ben [math]s_1[/math] a legkisebb kulcs, [math]m_3[/math]-ban [math]s_2[/math] a legkisebb kulcs.

A fa levelei a györkértől egyforma távolságra vannak.

BESZÚR: Először KERES(s,S)-t csinálunk, ha megtaláljuk [math]s[/math]-t, akkor végeztünk, ha nem akkor, ha a legalsó belső csúcs a kereső út mentén:

  • 1 kulcsú: A megfelelő helyre beszúrjuk az [math]s[/math]-t attól függően, hogy a másik két levélnél kisebb, nagyobb, vagy köztük van. A kulcsokat is eszerint módosítjuk.
  • 2 kulcsú: A csúcsvágás módszerét alkalmazzuk. A kétkulcsú rekordot szétbontjuk két darab egykulcsúra, kiegészítve [math]s[/math]-el. A keletkező új csúcsot be kell jegyeznünk a régi (szétvágott) csúcs apjába ugyanezzel a módszerrel. Ha esetleg ez a folyamat felgyűrűzik a gyökérig, akkor egy új gyökeret veszünk fel és a mutatókat a két szétvágott részfára állítjuk.

Tk. 67. oldal

Definiálja a Karp-redukciót, és bizonyítsa be, hogy ha [math]L_1 \in P[/math] és [math]L_2 \prec L_1[/math], akkor [math]L_2 \in P[/math].

Az [math]f : I^* \rightarrow I^*[/math] leképezés az [math]L_1 \subseteq I^*[/math] nyelv Karp-redukciója az [math]L_2 \subseteq I^*[/math] nyelvre, ha

  • Tetszőleges [math]x \in I^*[/math] szóra [math]x \in L_1[/math] akkor és csak akkor, ha [math]f(x) \in L_2[/math].
  • [math]f \in FP[/math], azaz [math]f[/math] (leképezés) polinom időben számolható.

[math]L_1 \prec L_2 \circeq [/math] [math]L_1[/math]-nek van Karp-redukciója [math]L_2[/math]-re.

A kérdésben gonoszul meg vannak cserélve az indexek :-)

A definíciót használva célunk az, hogy polinom időben felismerjük [math]L_2[/math]-t. Először kiszámoljuk [math]f(x)[/math]-et. Definíció b pontja szerint, ennek időigénye max. [math]c_1n^k[/math]. Ezután el kell döntenünk, hogy [math]f(x) \in L_1[/math] igaz-e? Mivel [math]L_1 \in P[/math], ezért ez polinom idejű, vagyis összességében [math]c_2(c_1n^k)^l[/math] ideig tart. A definíció a pontja szerint annak az eldöntése, hogy [math]x \in L_2[/math] azonos annak az eldöntésével, hogy [math]f(x) \in L_1[/math], ezt pedig [math]O(n^{kl})[/math] idő alatt eldöntöttük, vagyis [math]L_2 \in P[/math].

Tk. 270. oldal

Definiálja az euklideszi utazóügynok problémát, és vázlatosan írja le a megoldására szolgáló közelítő algoritmust. Adja meg az algoritmus approximációs tényezőjét is. Indoklás nem szükséges.

Probléma: Adott egy [math]n[/math] pontú [math]K_n[/math] teljes gráf, és egy éleihez rendelt nem negatív [math]d[/math] súlyfüggvény. A súlyfüggvényre teljesül a háromszög-egyenlőtlenség, vagyis [math]\forall u,v,w[/math]-re [math]d(u,w) \lt d(u,v) + d(v,w)[/math]. Keressünk minimális összsúlyú Hamilton-kört! (Az ebből származó eldöntési probléma egyébként NP-teljes.)

Közelítő algoritmus:

  • Vegyük [math]K_n[/math] gráf minimális összsúlyú feszítőfáját\footnote{Kruskal vagy Prim módszerrel könnyen megy.}([math]T[/math]), legyen az összsúlya [math]s[/math].
  • Tegyük irányítottá a [math]T[/math]-t: [math]u-v[/math] élből [math]u\rightarrow v,v\rightarrow u[/math] élek lesznek. ([math]T'[/math])
  • Mivel [math]T'[/math]-ben minden pontnak a ki-foka megegyezik a be-fokával, így van benne Euler-séta(kör).
  • Az Euler-séta pontjai legyenek: [math]u = v_1,v_2,\dots,v_{2n-2},v_{2n-1} = u[/math]. Ennek összsúlya [math]2s[/math].
  • Ezután a Hamilton-kör-t az [math]u[/math]-tól kezdjük és felveszünk hozzá pontokat úgy, hogy olyan pontokat vegyünk fel, amik az Euler-sétában legelőrébb vannak ([math]v_k[/math], ahol [math]k[/math] min.), de nem szerepelnek még a Hamilton-körben. Ha már nincs ilyen pont, akkor az [math]u[/math]-t mégegyszer hozzávéve zárjuk a kört.
  • A Hamilton-kör súlya legfeljebb annyi, mint az Euler-séta súlya (felhasználva a háromszög-egyenlőtlenséget), tehát [math]2s[/math]. Bármely Hamilton-körből egy élet elhagyva Euler-sétát kapnánk, aminek a súlya min. [math]s[/math], tehát 2-szeres szorzó erejéig közelíti az algoritmus az optimálist.

Tk. 308. oldal

Definiálja a piros-fekete fákat. Mi a kapcsolat egy csúcs magassága és fekete magassága között? Állításait bizonyítsa is be!

A piros-fekete fa egy bináris fa, amelyre igazak az alábbi szabályok:

  • [math]\forall[/math] levél csúcsnak két fia van
  • elemeket a belső csúcsokban tárolunk, nem a levelekben
  • keresőfa tulajdonság érvényesül
  • [math]\forall[/math] csúcs piros vagy fekete
  • a gyökér és a levelek feketék
  • egy piros csúcs mindkét gyereke fekete
  • [math]\forall v[/math] csúcsra, az összes [math]v[/math]-ből levélbe vezető úton ugyanannyi fekete csúcs van.

Legyen [math]m(v)[/math] a [math]v[/math] csúcs magassága, vagyis, hogy hány élből áll a [math]v[/math]-ből levélbe vezető leghosszabb út (lefelé), ha [math]v[/math] levél, akkor [math]m(v) = 0[/math].

Legyen [math]m_f(v)[/math] a [math]v[/math] csúcs fekete magassága, vagyis, hogy [math]v[/math]-ből levélbe vezető utakon hány fekete csúcsot látunk ([math]v[/math]-t kivéve).

Ekkor [math]\forall v[/math] csúcsra teljesül, hogy [math]\frac{m(v)}{2}\leq m_f(v)\leq m(v).[/math]

Bizonyítás: [math]m_f(v)\leq m(v)[/math] triv. igaz, valamint mivel piros csúcsok gyerekei feketék, és a levelek is feketék, a csúcsok legalább fele fekete.

Írja le a mélységi bejárás algoritmusát. (A pontok kétféle számozása és az élek osztályozása nem kell.) Mennyi az algoritmus lépésszáma mátrixos, illetve éllistás megadás esetén és miért?

Először addig megyünk előre az élek mentén, amíg olyan pontba nem érkezünk, ahonnan már nem tudunk még meg nem látogatott pontba menni. Ekkor visszalépünk az utolsó előtti pontra, és az ő szomszédait járjuk be, ha ott is végeztünk, akkor még egyet visszalépünk, s.í.t. Egy pontot akkor nevezünk befejezettnek, ha már minden szomszédját meglátogattuk. Ha a kezdőpontot is bejefeztük, akkor bejártuk a gráfot, vagy legalábbis egy komponensét.

Pszeudo kóddal:

procedure bejar
	begin
	for v:= 1 to n do
		bejarva[v] := false;
	for v:= 1 to n do
		if bejarva[v] = false then
			mb(v)
	end

procedure mb(v : node)
	var
		w: node;
	begin
	bejarva[v] = true;
	(*a szomszedok bejarasa*)
	for minden L[v]-beli w csucsra do 
		if bejarva[w] = hamis then
			mb(w)
	end

Éllistás bejárásnál a lépésszám [math]O(n + e)[/math], mert minden csúcsra egyszer hívjuk meg az mb()-t, és ott minden csúcs szomszédját egyszer vizsgáljuk meg. Szerintem a mátrixos reprezentációnál is lineáris idejű az algoritmus, de egyébként TODO.

Tk. 129. oldal


TODO

  • Definiálja az univerzális és a megállási nyelvet.
  • Mi a vizsonyuk az RE osztályhoz? (Indoklás nem kell.)
  • Az univerzális nyelv benne van-e az R osztályban? Válaszát indokolja is!

Írja le a legrövidebb utak keresésére szolgáló Dijkstra-algoritmust. Mi az algoritmus alkalmazásának feltétele? (Az algoritmus helyességét nem kell bizonyítani.) Mennyi az algoritmus lépésszáma?

Az élsúlyok nem negatív számok. A KÉSZ halmazba tesszük azokat a csúcsokat, amelyek legrövidebb távolságát már ismerjük. D tömbben a csúcsok eddigi legrövidebb távolsága van, [math]C[x,y][/math] az [math]x \rightarrow y[/math] él súlyát jelenti.

Pszeudo kód:

KESZ := {s}
for minden v in V csucsra do
	D[v] := C[s,v];
for i:= 1 to n-1 do begin
	x := az a csucs, V \ KESZ-bol, hogy D[x] min.;
	for minden w in V \ KESZ csucsra do
		D[w] := min(D[w], D[x] + C[x,w]);
end

Az első ciklus [math]O(n)[/math] időt emészt fel, a második ciklusban a minimum keresés és a belső ciklus is [math]O(n)[/math], és ezek [math]n-1[/math]-szer futnak le, tehát összességében [math]O(n^2)[/math] a lépésszám. Ezt éllistával, a D-tömb szerint kupacba rendezve a még nem kész csúcsúkat [math]O((n+e)\log n)[/math]-re vihető le, megfelelő [math]d[/math]-kupaccal pedig akár [math]O(e)[/math]-re is.

Definiálja az UNIÓ-HOLVAN adatszerkezetet. Mennyi az egyes műveletek lépésszáma tömbös illetve fás megvalósítás esetén? (Indoklás nem szükséges.)

Az UNIÓ-HOLVAN adatszerkezet egy véges [math]S[/math] halmaz partícióit (egymással diszjunkt, de összegezve [math]S[/math]-t kiadó halmazok) tárolja. Két műveletet értelmezünk ezzel kapcsolatban: az UNIÓ[math](U_i,U_j)[/math] egyesít két partíciót, a HOLVAN([math]v[/math]) visszadja, hogy [math]v[/math] melyik partícióban van.

Az elemeket egy fában és egy tömbben tároljuk. A fa csúcsaiban tároljuk az adott halmaz elemeit, a halmaz neve az őt ábrázoló fa gyökerében van. Két halmaz UNIÓ-jakor a nagyobbik fa gyökeréhez hozzácsapjuk gyerekként a kisebbik fa gyökerét. A tömböt az [math]S[/math] elemeivel indexeljük, ami tartalmaz egy pointert, ami a fában az adott indexű elemre mutat. A HOLVAN hívás során ez alapján a mutató alapján elindulva a szülő pointereket követve eljuthatunk a fa gyökeréig, és megtudhatjuk, hogy melyik halmazban van az adott elem. A HOLVAN költsége [math]O(\log n)[/math], az UNIÓ költsége [math]O(1)[/math].

Tk. 163. oldal

Definiálja a P és az NP nyelvosztályt; mi az egymáshoz való viszonyuk? Válaszát indokolja is meg.

P azon nyelvek halmazát jelöli, amelyekhez van olyan algoritmus, ami [math]\forall x[/math] bemenetre eldönti, hogy [math]x \stackrel{\text{\tiny ?}}{\in} P[/math], és az algoritmus lépésszáma [math]O(|x|^k)[/math], [math]k[/math] konstans pozitív számra.

NP azon L nyelvek halmaza, amelyre teljesül, hogy [math]\exists k \gt 0[/math] konstans és [math]L_p \in P[/math] nyelv, valamint

[math]x \in L \Leftrightarrow \exists y, |y| = O(|x|^k), (x,y) \in L_p.[/math]

Viszonyuk: [math]P \subseteq NP[/math]. Nyilvánvaló, hiszen tanú nélkül is eldönthető polinom időben, hogy [math]x \stackrel{\text{\tiny ?}}{\in} L[/math]. [math](L = L_p)[/math]


Átalakítás LaTeX forrásból: aldaris - 2009.01.27.

Összeállította: Csaba - 2009.01.26.