23
Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András 1 Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések 2013/2014-es tanév 2. félév 1.) a. Adott a háromjegyű bináris számok következő sorozata: 010, 101, 011, 110, 000, 001, 100. Rendezzük a számokat az egy tömbben dolgozó „RADIX előre” edényrendezéssel! Adjuk meg a tömb tartalmát az egyes pozíciók feldolgozása után! Elv: Felírjuk az inputot egymás alá. Majd bitenként elölről hátrafelé haladunk. Minden lépésben alulról felfelé, illetve fentről lefelé indulunk. Fentről lefelé ha 1-est találunk, megállunk. Alulról felfelé ha 0-t találunk megállunk. Ha mind két irányban megálltunk, cserélünk, majd haladunk tovább. Amikor a két haladás átlépi egymást, akkor vége az adott iterációnak. Ekkor a 0-k felül, a 1-esek alul helyezkednek el. Ezek alapján 2 blokkra osztjuk az elemeket, majd a következő iterációban a blokkokon külön megyünk végig. b. Adott a háromjegyű bináris számok következő sorozata: 110, 011, 010, 101, 000, 100, 001. Rendezzük a számokat a felváltva két tömbben dolgozó „RADIX vissza” edényrendezéssel! Adjuk meg rendre az 1., 2. és 3. pozíció szerinti hasítás eredményét tartalmazó megfelelő (A vagy B) tömböt, végül pedig a rendezettséget mutató A tömböt! Elv: Vegyünk fel két tömböt (A,B). Felírjuk az inputot egymás alá, az A tömbbe. Majd bitenként haladjunk hátulról előrefelé. Minden lépésben a tömb két részre van osztva. (A legelső lépés kicsit rendhagyó, tekintsük ekkor a második részt üresnek). Az első részen felülről lefelé, majd a második részben alulról felfelé haladjunk. Az egyeseket a másik tömb aljára (végére) helyezzük, a 0-kat a tetejére (elejére). Addig menjünk, míg el nem érjük a határvonalat. Ekkor húzzuk meg a határvonalat a második (B) tömbben Folytassuk az eljárást a másik tömbbön (B), írjunk az iménti tömbbe (A) A végén tegyünk egy utolsó lépést, melyben a megszokott haladási sorrendben olvassuk ki az adatokat

Algoritmusok és adatszerkezetek II. kidolgozott ... · Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András 1 Algoritmusok és

  • Upload
    others

  • View
    15

  • Download
    1

Embed Size (px)

Citation preview

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    1

    Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések 2013/2014-es tanév 2. félév

    1.) a. Adott a háromjegyű bináris számok következő sorozata: 010, 101, 011, 110, 000, 001,

    100. Rendezzük a számokat az egy tömbben dolgozó „RADIX előre” edényrendezéssel! Adjuk meg a tömb tartalmát az egyes pozíciók feldolgozása után! Elv: • Felírjuk az inputot egymás alá. Majd bitenként elölről hátrafelé haladunk. • Minden lépésben alulról felfelé, illetve fentről lefelé indulunk. Fentről lefelé ha 1-est

    találunk, megállunk. Alulról felfelé ha 0-t találunk megállunk. • Ha mind két irányban megálltunk, cserélünk, majd haladunk tovább. • Amikor a két haladás átlépi egymást, akkor vége az adott iterációnak. Ekkor a 0-k

    felül, a 1-esek alul helyezkednek el. Ezek alapján 2 blokkra osztjuk az elemeket, majd a következő iterációban a blokkokon külön megyünk végig.

    b. Adott a háromjegyű bináris számok következő sorozata: 110, 011, 010, 101, 000, 100,

    001. Rendezzük a számokat a felváltva két tömbben dolgozó „RADIX vissza” edényrendezéssel! Adjuk meg rendre az 1., 2. és 3. pozíció szerinti hasítás eredményét tartalmazó megfelelő (A vagy B) tömböt, végül pedig a rendezettséget mutató A tömböt! Elv:

    • Vegyünk fel két tömböt (A,B). Felírjuk az inputot egymás alá, az A tömbbe. Majd bitenként haladjunk hátulról előrefelé.

    • Minden lépésben a tömb két részre van osztva. (A legelső lépés kicsit rendhagyó, tekintsük ekkor a második részt üresnek). Az első részen felülről lefelé, majd a második részben alulról felfelé haladjunk. Az egyeseket a másik tömb aljára (végére) helyezzük, a 0-kat a tetejére (elejére). Addig menjünk, míg el nem érjük a határvonalat.

    • Ekkor húzzuk meg a határvonalat a második (B) tömbben • Folytassuk az eljárást a másik tömbbön (B), írjunk az iménti tömbbe (A) • A végén tegyünk egy utolsó lépést, melyben a megszokott haladási sorrendben

    olvassuk ki az adatokat

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    2

    c. Adott a három karakteres értékek következő sorozata: bcb, cba, aac, bbb, cab, acc, caa. Rendezzük a számokat a visszafelé haladó edényrendezés listás változatával! Adjuk meg a listák (absztrakt szinten sorozatok) tartalmát a szét-, ill. összefűzések után! Elv:

    • Vegyünk fel egy listát, melyben az inputot tároljuk. • Karakterenként hátulról előre vizsgálódunk. • Minden lépésben szétfűzzük a listát a karakterek alapján, majd sorendben

    visszafűzzük őket. • Végezzük a műveletet addig, míg el nem érjük az első karaktereket

    bcb, cba, aac, bbb, cab, acc, caa

    a → cba, caa b → bcb, bbb, cab c → aac, acc

    cba, caa, bcb, bbb, cab, aac, acc

    a → caa, cab, aac b → cba, bbb c → bcb, acc

    caa, cab, aac, cba, bbb, bcb, acc

    a → aac, acc b → bbb, bcb c → caa, cab, cba

    aac, acc, bbb, bcb, caa, cab, cba

    2.) Írja meg a lineáris hasítás algoritmusát, vagyis azt a h: K → H [0..m-1] függvényt, amely O(M) műveletigénnyel beszúr egy kulcsot a H [0..m-1] vektorral ábrázolt hash-táblába! A hasító-táblában megengedett az azonos kulcsok többszöri előfordulása. Két extremális kulcsértéket használunk az üres ill. a törölt pozíció jelzésére (ÜRES, TÖRÖLT). A kulcsütközések feloldására (balra lépő) lineáris próbálást alkalmazzon. A függvény visszatérési értéke legyen a beszúrt kulcs vektorbeli pozíciója, ha sikerült a kulcsot beszúrni a táblába, különben pedig –1.

    ahol:

    H = (t[0..M-1], n): hasítótábla

    q: beszúrandó elem

    n: táblában lévő elemek száma

    M: tábla kapacitása (vektor mérete)

    h(x) = x mod M

    hi(x) = -i

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    3

    3.) Nyílt címzéssel, a h(k) = k (mod 11) hasítófüggvénnyel helyezzük az A [0..10] tömbben a 29, 61, 49, 50, 13, 39, 60, 76 sorozatot. Adjuk meg a keletkezett táblát az alábbi esetekben:

    a. lineáris próbálás (balra lép) b. négyzetes próbálás (felváltva jobbra-balra lép) c. kettős hash-elés, ahol h’(k) = k (mod 7) + 1 (balra lép)

    Vektorbeli pozíció kiszámítása: h(x) + hi(x) mod M

    Lineáris próba:

    hi(x) = -i

    0 1 2 3 4 5 6 7 8 9 10 60 13 39 50 49 61 29 76

    Négyzetes próba:

    hi(x) = (−1)i ∙ ��i2��

    2

    0 1 2 3 4 5 6 7 8 9 10 13 50 60 49 61 29 76 39

    Kettős hash-elés, ahol h’(k) = k (mod 7) + 1 (balra lép):

    hi(x) = -i * h’(k)

    0 1 2 3 4 5 6 7 8 9 10 60 39 13 50 49 61 29 76

    4.) Éllistás ábrázolással adott egy egyszerű, irányított, élsúlyozott gráf. Adjon algoritmust, amely az Adj[1..n] tömb elemeihez fűzött (csúcs, élsúly, pointer) mezőket tartalmazó elemekből álló listák feldolgozásával előállítja a gráf csúcsmátrixos ábrázolását a G [1..n, 1..n] szomszédsági mátrixban, annak tanult, szokásos kitöltési konvenciója szerint!

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    4

    5.) Adjon olyan algoritmust, amely meghatározza egy irányított gráf éllistás ábrázolása esetén a gráf csúcsainak kimeneti fokát és bemeneti fokát. A program a kifok és befok értékeket a kifok [1..n] és befok [1..n] tömbökbe írja be, amelyek a csúcsok sorszámával (címkéjével) vannak indexelve!

    6.) Adott egy egyszerű irányított G gráf éllistás ábrázolása az Adj [1..n] tömbbel. Írjunk

    olyan algoritmust, lineáris időben eldönti, hogy a G gráf speciálisan fa struktúrájú-e! (Az ellenőrzéshez új adatszerkezetet fel lehet venni, ha szükséges.)

    Irányított Fa: Egy olyan irányított körmentes irányított gráf, aminek van egy db csúcsa, melynek a befoka 0 és a többi csúcsnak a befoka 1 Tehát, ha vizsgáljuk a befokokat, megkapjuk, hogy fa-e az irányított gráf. Az algoritmus műveletigénye: n+e+n = O(e)

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    5

    7.) Szemléltesse a Dijkstra algoritmus működését az alábbi gráfon! Adja meg menetenként a d és P tömbök tartalmát! A kiinduló csúcs legyen az 1-es címkéjű csúcs.

    d Π k

    1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7 0. 0 ∞ ∞ ∞ ∞ ∞ ∞ 0 0 0 0 0 0 0 1. 5 8 10 6 4 1 0 1 1 1 1 1 1 ↑ 2. 3 7 ↑ ↑ 3. 4 6 ↑ ↑ ↑ 4. 5 9 5 ↑ ↑ ↑ ↑ 5. 7 2 ↑ ↑ ↑ ↑ ↑ 6. 8 3 ↑ ↑ ↑ ↑ ↑ ↑ 7. ↑ ↑ ↑ ↑ ↑ ↑ ↑

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    6

    8.) Szemléltesse a Prim algoritmus működését az alábbi gráfon! A startcsúcs legyen az 1-es címkéjű csúcs. Írja fel a minQ és a π tömb tartalmát menetenként (minden minimum kivételnél), rajzolja le a kialakult feszítőfát!

    minQ d π 1 2 3 4 5 6 1 2 3 4 5 6

    1. (0,1), (∞,2), (∞,3), (∞,4), (∞,5), (∞,6) 0 ∞ ∞ ∞ ∞ ∞ 0 0 0 0 0 0

    2. (2,2), (3,3), (4,4), (∞,5), (∞,6) 2 3 4 1 1 1

    3. (1,3), (4,5), (4,4), (∞,6) 1 4 2 2 4. (1,5), (3,6), (4,4) 1 3 3 3 5. (2,6), (4,4) 2 5 6. (2,4) 2 6 7. - 0 2 1 2 1 2 0 1 2 6 3 5

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    7

    9.) Szemléltesse a Bellman-Ford algoritmus működését az alábbi gráfon. Startcsúcs az 5-ös címkéjű csúcs! A gráfban nincs „negatív kör”, ezt már nem kell ellenőrizni. Adja meg menetenként a d és Pi tömbök tartalmát, és rajzolja le minden menet után a gráfot, egyértelműen jelölve az addig talált „legjobb” utakat az 5-ös csúcsból a többihez! Az éleket minden menetben a csúcsok címkéi szerinti alfabetikus sorrendben dolgozzuk fel: (1,2), (1,3), …, (5,2).

    d π Rajz 1 2 3 4 5 1 2 3 4 5 ∞ ∞ ∞ ∞ 0 0 0 0 0 0

    1.1

    1.2 1.3 1.4 1.5 6 7 5 5

    6 ∞ 7 ∞ 0 5 0 5 0 0 2.1 11 2 1 1

    2.2 2.3 4 3 2.4 2.5

    6 4 7 2 0 5 3 5 1 0 3.1

    3.2 2 2 3.3 3.4 3.5

    2 4 7 2 0 2 3 5 1 0 4.1 -2 1

    4.1 4.1 4.1 4.1

    2 4 7 -2 0 2 3 5 1 0 5.1

    5.1 5.1 5.1 5.1

    2 4 7 -2 0 2 3 5 1 0

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    8

    10.) Az alábbi gráfon az 1-es címkéjű csúcsból indulva lefuttatunk egy mélységi bejárást. A csúcsok szomszédjainak a feldolgozási sorrendje legyen a szomszéd csúcsok címkéi szerint növekvően rendezett. Jelölje a gráfon, a bejárás során kapott mélységi és befejezési számokat, illetve az éltípusokat!

    Élek meghatározása (u→v):

    Faél: msz[v] =0

    Visszaél: msz[v] > 0 és bsz[v]=0

    Keresztél: msz[v] > 0 és bsz[v] >0 és msz[u] > msz[v]

    Előreél: msz[v] > 0 és bsz[v] >0 és msz[u] < msz[v]

    11.) Adja meg az alábbi gráf egy topologikus rendezését (ha létezik) a tanult eljárással,

    annak követhető leírásával!

    A gráf mélységi bejárása során helyezzük egy verembe azon csúcsokat, melyekből visszalépünk. 5 7 9 1 3 2 4 6 8

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    9

    12.) A „MATEKFELELETEMKETTESLETT” szöveget szeretnénk tömöríteni Huffman-

    kódolással. Írja le a kódfa építés elvét, adja meg a kódfát, a szöveg betűinek a kódját, valamint azt is, hogy minimálisan hány bittel tudjuk kódolni az eredeti, illetve a tömörített szöveget!

    • Szimbólumok gyakoriságának megállapítása (M, 2), (A,1), (T, 6), (E, 8), (K, 2), (F, 1), (L, 3) (S,1)

    • Gyakoriság szerinti rendezés (A, 1), (F,1), (S,1), (M, 2), (K, 2), (L, 3), (T, 6), (E, 8)

    • Huffman-fa építése Gyakoriságok szerint megyünk, és alulról kezdjük építeni a fát. Kiválasztunk 2 csúcsot, berakjuk a fa aljára. Összevonjuk a két csúcsot, és visszarakjuk a rendezett sorba.

    (A, 1), (F,1), (S,1), (M, 2), (K, 2), (L, 3), (T, 6), (E, 8)

    (AF,2), (S,1), (M, 2), (K, 2), (L, 3), (T, 6), (E, 8)

    (M, 2), (K, 2), (AFS,3), (L, 3), (T, 6), (E, 8)

    (AFS,3), (L, 3), (KM, 4), (T, 6), (E, 8)

    (KM, 4), (AFSL,6), (T, 6), (E, 8)

    (T, 6), (E, 8), (AFSLKM,10)

    (AFSLKM,10), (TE, 14)

    (AFSLKMTE,24)

    A fa elkészültével az egyik irányba mutató éleket 0-val, míg a másik irányba mutatókat 1-el címkézzük fel. A gyökérből a levelekig leolvasva az élek címkéit, megkapjuk az adott betű kódját. A - 00000 F - 00001 S - 0001 L - 001

    K - 010 M - 011 T - 10 E- 11

    Output: 011000001011010000011100111001111011011010111010110001001111010 Eredeti szöveg kódolásának mérete: 8 különböző karakter van. Így egy karaktert 3 biten tudunk ábrázolni. Az eredeti szöveg 24 karakter hosszú, így a szöveg kódolása 24*3=72 bit lett volna. Huffman-kód mérete: A: 5 bit, F: 5 bit, S: 4 bit, L: 3 bit, K: 3 bit, M: 3 bit, M: 3 bit, T: 2 bit, E: 2 bit. Így a huffman kód mérete: 5+5+4+3*3+2*3+2*3+6*2+8*2 = 63

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    10

    13.) Lempel-Ziv-Welch tömörítő eljárással kódoltunk egy szöveget. A szöveg ’A’, ’B’ és ’C’ betűket tartalmazott, melyeket rendre az 1, 2 és 3-as számokkal kódoltunk. A szótár felépítése során, a szótárba kerülő új szó kódjának a legkisebb még nem használt pozitív egész számot választottuk. Így a következő kódolt szöveget kaptuk: 1 2 4 3 5 6 9 7 1. Adja meg az eredeti szöveget és a felépített szótárat!

    In X Tábla Out 1 A 4: A♥ A 2 B 4: A♥ = AB 5: B♥ B 4 AB 5: B♥ = BA 6: AB♥ AB 3 C 6: AB♥ = ABC 7: C♥ C 5 BA 7: C♥ = CB 8: BA♥ BA 6 ABC 8: BA♥ = BAA 9: ABC♥ ABC 9 ABC♥ 9: ABC♥ = ABCA 10: ABCA♥ ABCA 7 CB 10: ABCA♥ = ABCAC 11: CB♥ CB 1 A 11: CB♥ = CBA 12: A♥ A

    A szöveg: ABABCBAABCABCACBA A kódtábla: 1: A, 2: B, 3: C, 4: AB, 5: BA, 6: ABC, 7: CB, 8: BAA, 9: ABCA, 10: ABCAC, 11: CBA, 12: A♥

    14.) Adott az alábbi S szöveg és M minta. Szemléltesse a Knuth-Morris-Pratt algoritmus működését! Adja meg a next vektor értékét! Rajzolja le a szöveg alá a minta eltolásait és adja meg, hogy pontosan hány összehasonlítást végez az algoritmus! Összehasonlításnak tekintse a minta és szöveg egy-egy karakterének az összehasonlítását. S=” BABALABABATIBABABAKI” és M=” ABABAKI ” A next vektor kiszámítása az InitNext() eljárással:

    i j minta esemény Akció

    1 0 A B A B A K I Nincs egyezés, j = 0 i = 2, next[2] = 0 A B A B A K

    2 0 A B A B A K I Egyezés i = 3, j = 1, next[3] = 1 A B A B A

    3 1 A B A B A K I Egyezés i = 4, j = 2, next[4] = 2 A B A B A

    4 2 A B A B A K I Egyezés i = 5, j = 3, next[5] = 3 A B A B A

    5 3 A B A B A K I Nincs egyezés, j ≠ 0 j = next[3] A B A B A

    5 1 A B A B A K I Nincs egyezés, j ≠ 0 j = next[1] A B A

    5 0 A B A B A K I Nincs egyezés, j = 0 i = 6, next[6] = 0 A B Tehát az Next tömb:

    1 2 3 4 5 6 0 0 1 2 3 0

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    11

    A KMP algoritmus: I j Szöveg és minta esemény Akció

    0 0 B A B A L A B A B A T I B A B A B A K I Х, j = 0 i++ A B A B A K I

    1 0 B A B A L A B A B A T I B A B A B A K I ✓ i++ j++ A B A B A K I

    2 1 B A B A L A B A B A T I B A B A B A K I ✓ i++ j++ A B A B A K I

    3 2 B A B A L A B A B A T I B A B A B A K I ✓ i++ j++ A B A B A K I

    4 3 B A B A L A B A B A T I B A B A B A K I Х, j ≠ 0 j = next[3] A B A B A K I

    4 1 B A B A L A B A B A T I B A B A B A K I Х, j ≠ 0 j = next[1] A B A B A K I

    4 0 B A B A L A B A B A T I B A B A B A K I Х, j = 0 i++ A B A B A K I

    5 0 B A B A L A B A B A T I B A B A B A K I ✓ i++ j++ A B A B A K I

    6 1 B A B A L A B A B A T I B A B A B A K I ✓ i++ j++ A B A B A K I

    7 2 B A B A L A B A B A T I B A B A B A K I ✓ i++ j++ A B A B A K I

    8 3 B A B A L A B A B A T I B A B A B A K I ✓ i++ j++ A B A B A K I

    9 4 B A B A L A B A B A T I B A B A B A K I ✓ i++ j++ A B A B A K I

    10 5 B A B A L A B A B A T I B A B A B A K I Х, j ≠ 0 j = next[5] A B A B A K I

    10 3 B A B A L A B A B A T I B A B A B A K I Х, j ≠ 0 j = next[3] A B A B A K I

    10 1 B A B A L A B A B A T I B A B A B A K I Х, j ≠ 0 j = next[1] A B A B A K I

    10 0 B A B A L A B A B A T I B A B A B A K I Х, j = 0 i++ A B A B A K I

    11 0 B A B A L A B A B A T I B A B A B A K I Х, j = 0 i++ A B A B A K I

    12 0 B A B A L A B A B A T I B A B A B A K I Х, j = 0 i++ A B A B A K I

    13 0 B A B A L A B A B A T I B A B A B A K I ✓ i++ j++ A B A B A K I

    14 1 B A B A L A B A B A T I B A B A B A K I ✓ i++ j++ A B A B A K I

    15 2 B A B A L A B A B A T I B A B A B A K I ✓ i++ j++ A B A B A K I

    16 3 B A B A L A B A B A T I B A B A B A K I ✓ i++ j++ A B A B A K I

    17 4 B A B A L A B A B A T I B A B A B A K I ✓ i++ j++ A B A B A K I

    18 5 B A B A L A B A B A T I B A B A B A K I ✓ i++ j++ A B A B A K I

    19 6 B A B A L A B A B A T I B A B A B A K I ✓ i++ j++ A B A B A K I Összehasonlítások száma: 25

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    12

    15.) Gráfok szélességi bejárása

    • G gráf (ir. vagy ir. nélküli)

    • Élsúlyok nem szerepelnek

    • s startcsúcsból érjük el a gráf csúcsait, az s-től való távolságuk sorrendjében.

    • Legrövidebb utak feszítőfáját adja meg (d - távolságok, π - szülők)

    • Algoritmus: nem determinisztikus, mohó

    • Sor adatszerkezetet használunk

    Pl:

    Q d π 1 2 3 4 5 6 1 2 3 4 5 6 0 1 0 ∞ ∞ ∞ ∞ ∞ 0 0 0 0 0 0 1 1,2,3 1 1 1 1 2 2,3,4,5 2 2 2 2 3 3,4,5 4 4,5 5 5,6 3 5 6 6 - 0 1 1 2 2 3 0 1 1 2 2 5

    16.) Minimális költségű utak keresése I. (Dijkstra algoritmus)

    • G gráf (ir.)

    • Élsúlyozott (nincs negatív él)

    • s startcsúcsból keressünk minden csúcsba minimális költségű utat.

    • Minimális költségű utakat keres.

    • Algoritmus a SZB átváltoztatása. (Csúcsoknak 3 állapotuk van: nemelért, elért, kész)

    • Algoritmus mohó, de a d és π tömbök értékei változhatnak az eljárás során

    • Prioritási sor adatszerkezetet, vagy folyamatos MinKer-t alkalmazunk a még nem kész csúcsokon.

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    13

    Pl:

    d π 1 2 3 4 5 6 1 2 3 4 5 6 0 0 ∞ ∞ ∞ ∞ ∞ 0 0 0 0 0 0 1 2 3 1 1 2 6 4 3 2 2 3 5 4 9 5 5 4 5 5 9 0 2 5 4 3 9 0 1 5 2 1 5

    17.) Minimális költségű utak keresése II. (Bellman-Ford algoritmus)

    • G gráf (ir.)

    • Élsúlyozott (összefüggő, negatív élek)

    • s startcsúcsból keressünk minimális költségű utakat

    • Minimális költségű utakat keres.

    • Algoritmus nem mohó. n-1 iterációval, minden iterációban az összes csúcs összes szomszédját vizsgálja. (Ha n. iterációban van módosítás, akkor van negatív kör)

    18.) Minimális költségű utak minden csúcspárra (Floyd algoritmusa)

    • G gráf (ir.)

    • Élsúlyozott (összefüggő, negatív élek)

    • Minimális költségű út keresése minden csúcspárra

    • Algoritmus nem mohó, n iterációval, minden iterációban +1 csúcs hozzá vételével keres kedvezőbb utakat. Minden k. iterációban egy i↝j utak mátrixát állítja elő, ahol i↝j = < i, v1, v2, ... vm, j> (v1...vm ≤ k) (Ha a végén az átlókban nem 0-k vannak, akkor van negatív kör.)

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    14

    Pl:

    D0 = �

    0 3 ∞ ∞∞ 0 4 2−2 ∞ 0 −54 ∞ ∞ 0

    � D1 = �

    0 3 ∞ ∞∞ 0 4 2−2 1 0 −54 7 ∞ 0

    � D2 = �0 3 7 5∞ 0 4 2−2 1 0 −54 7 11 0

    D3 = �

    0 3 7 22 0 4 −1−2 1 0 −54 7 11 0

    � D4 = �

    0 3 7 22 0 4 −1−2 1 0 −54 7 11 0

    19.) Minimális költségű feszítőfa keresés (Prim algoritmus)

    • G gráf (ir nélküli)

    • Élsúlyozott (összefüggő, negatívat engedélyez)

    • s startcsúcsból keressük meg a minimális költségű élekből alkotott feszítőfát

    • Minimális költségű feszítőfát adja meg (d - élköltségek, π - szülők)

    • Prioritásos sor adatszerkezet használ

    Pl:

    minQ d π 1 2 3 4 5 6 1 2 3 4 5 6 0 (0, 1), (∞, 2) ... 0 ∞ ∞ ∞ ∞ ∞ 0 0 0 0 0 0 1 (1, 2), (5, 4) ... 1 5 1 1 2 (2, 3), (2, 4), (2, 5) ... 2 2 2 2 2 2 3 (1, 5), (2, 4), (5, 6) 1 5 3 3 4 (2, 4), (5, 6) 2 5 5 (5, 6) 6 - 0 1 2 2 1 2 0 1 2 2 3 5

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    15

    20.) Gráfok mélységi bejárása

    • G gráf (ir.)

    • Élsúlyok nem szerepelnek (nem öf. is)

    • Nincs startcsúcs, a csúcsokat mohón választjuk. Addig haladunk előre míg tudunk, majd visszalépünk.

    • Mélységi fát (erdőt) adja meg.

    • A csúcsokat színezés helyett most "mélységi szám", ill. "befejezési szám"-okal jellemezzük

    Pl:

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    16

    Összefoglalva

    Irányított Irányítatlan Nem öf Élsúlyos Élsúly nélküli Negatív élek Kiszűri a negatív

    kört Startcsúcs Mit ad

    SZB ✓ ✓

    ✓ ✓ Legrövidebb

    utak feszítőfája

    Dijkstra ✓ ✓ ✓ Minimális költségű

    utak

    BF ✓

    ✓ ✓ ✓ ✓ Minimális költségű

    utak

    Floyd ✓

    ✓ ✓ ✓ Minimális k. út minden csúcspárra

    Prim ✓

    ✓ ✓ ✓ Minimális költségű feszítőfa

    MB ✓ ✓ ✓ Mélységi fa (erdő)

    21.) DAG topologikus rendezése

    • DAG (directed acyclic graph): Írányított körmentes gráf

    • Felhasználás: Munkafolyamatok ill., függősége (ételrecept, autógyártás)

    • pl:

    • Elmélet:

    1. Ha G gráfra a MB talál visszaélt → G nem DAG 2. HA G nem DAG (van benne kör) → bármely MB talál benne visszaélt 3. Ha G-nek van topologikus rendezése → D DAG 4. Egy DAG mindig topologikusan rendezhető

    Topologikus rendezés: Egy G(V, E) gráf topologikus rendezése a csúcsok olyan sorrendje, hogy ∀ U→V ∊ E élre U előbb van, mint V. Topologikus rendezés algoritmusa: G gráf MB-a során helyezzük verembe azon csúcsokat, melyekből visszalépünk. A verem tartalmát kiírva megkapjuk a gráf topologikus rendezését.

    Egy topologikus rendezése:ACBEDF

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    17

    22.) Mintaillesztés: Knuth-Morris-Pratt algoritmus A Knuth-Morris-Pratt eljárásnak a Brute-Force (hasonlítsuk össze, toljunk egyet, stb..) módszerrel szemben az az előnye, hogy egyes esetekben, ha a mintában vannak ismétlődő elemek, akkor egy tolásnál akár több karakternyit is ugorhatunk. Az ugrás megállapítását a következőképp tesszük: Az eddig megvizsgált egyező mintarész elején (prefix) és végén (sufix) olyan kartersorozatot keresünk, melyek megegyeznek. Ha találunk ilyet, akkor a mintát annyival tolhatjuk, hogy az elején lévő része ráilleszkedjen a végén levőre.

    A B A B A B A C A B A B A C A B A B A C

    Azt, hogy ez egyes esetekben mekkorát tolhatunk nem kell minden elromlás alkalmával vizsgálni. Ha a mintára önmagával lefuttatjuk az algoritmus egy módosított változatát, kitölthetünk egy tömböt, mely alapján a tolásokat végezni fogjuk.

    Ezután a tömb tartalma:

    1 2 3 4 5 0 0 1 2 3

    Ami a következőt jelenti:

    Elromlás Tolás után

    Next[1] = 0 ... i ... ... i ... A B A B A C A B A B A

    Next[2] = 0 ... i ... ... i ... A B A B A C A B A B

    Next[3] = 1 ... i ... ... i ... A B A B A C A B A B

    Next[4] = 2 ... i ... ... i ... A B A B A C A B A B

    Next[5] = 3 ... i ... i A B A B A C A B A B

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    18

    Ezek után a KMP algoritmus a következőképp néz ki:

    Tehát:

    • Addig megyünk, míg a minta vagy a szöveg végére nem érünk.

    • Ha egyezik a két (köv.) karakter akkor lépünk mind a kettővel tovább

    • Ha nem egyeznek, akkor vagy tolunk annyit, amennyit szabad, vagy ha a minta első betűjét vizsgáltuk, akkor egyet tolunk a mintán

    23.) Mintaillesztés: Boyer-Moore algoritmus egy változata: Quick search

    Míg a KMP algoritmus az elromlás helye előtti rész alapján döntött a tolásról, addig a QS a minta utáni karakter alapján. Eltolás:

    • Ha a minta utáni karakter benne van a mintában, akkor jobbról az első előfordulására illesztjük:

    A B A A C B C D A A C B C D A A C B C D

    • Ha a minta utáni karakter nincs benne a mintában, akkor a mintát ezen karakter után illesztjük

    A B A A C B X D A A C B C D A A C B C D

    Az eltolás kiszámítását megint elő lehet segíteni egy tömbbel, most azonban, mivel nem a minta az érdekes, és nem tudjuk pontosan mely karakterek szerepelnek a szövegben, így a tömbbe az egész abc-t fel kell vennünk Az eltolást elősegítő tömb konstruálása (Shift['a'...'z'], ahol 'a'...'z' H elemei):

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    19

    És a QS struktogramja:

    24.) Mintaillesztés: Rabin-Karp algoritmus

    A Rabin-Karp algoritmus lényege, hogy minden betűhöz az abc-ből egy számjegyet rendelünk, és a keresést számok összehasonlításával végezzük. Világos, hogy ehhez egy abc méretnek megfelelő számrendszerre lesz szükségünk. A szöveget a minta hosszúságával egyező részenként vesszük és úgy végezzük az összehasonlítást. Pl: M = BBAC → 1102 S = DACABBAC → 30201102, amiből a következő számokat állítjuk elő: 3020, 0201, 2011, 0110, 1102 Ezek lesznek az si-k Ehhez azonban számos apró ötletet kell alkalmaznunk

    1. Horner módszer A mintát számmá Horner módszerrel alakítjuk át

    az ord() a karakter abc-ben elfoglalt helyét adja meg. (d a számrendszer alapszáma)

    2. Szöveg számokká alakítása s0-t kiszámolhatjuk Horner módszerrel. Ezek után si+1 a következőképp számítható: 𝑠𝑠𝑖𝑖+1 = (𝑠𝑠𝑖𝑖 − 𝑜𝑜𝑜𝑜𝑜𝑜(𝑠𝑠[𝑖𝑖]) ∙ 𝑜𝑜𝑚𝑚−1) ∙ 𝑜𝑜 + 𝑜𝑜𝑜𝑜𝑜𝑜(𝑠𝑠[𝑖𝑖 + 𝑚𝑚])

    Azaz, ha s0= 3020, akkor 𝑠𝑠0+1 = (3020 − 𝑜𝑜𝑜𝑜𝑜𝑜(𝐷𝐷) ∙ 103) ∙ 10 + 𝑜𝑜𝑜𝑜𝑜𝑜(𝐵𝐵) = (3020− 3000) ∙ 10 + 1 = 201

    (Ha a minta 4 hosszú, és az abc 10 elemű) 3. Túlcsordulás

    Felmerülhet a kérdés, hogy az ilyen magas alapszámú számrendszerek nem okoznak-e gondot az ábrázolásnál? A kérdés jogos.

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    20

    Vegyük a következő életszerű példát: 4 bájton ábrázoljuk a számainkat ez ≈232 Az abc legyen 32 elemű, a minta 8 hosszú. Ekkor a dm-1 kiszámítása: (25)7 = 235, ami már nem ábrázolható 4 bájton. A Rabin-Karp algoritmus ehhez vesz egy p nagy prímet. Melyre még d*p még ábrázolható. És mod p számolja a műveleteket. Ettől azonban lesz olyan, hogy a számítás egyezést talál, de a minta mégsem egyezik a szöveggel. Ez nem baj, mert ekkor karakterszinten ezt lehet ellenőrizni. Viszont, ha nincs egyezés akkor karakteres szinten sincs. (Ha p nagy, akkor ez a jelenség azonban ritka)

    4. "óvatos számolás" Mivel mod p számolunk így előfordulhat, hogy a kivonás után negatív számot kapunk. Például, ha p=7 és és ord(s[i]) = 9, akkor si =2..., ekkor ha kivonjuk a 9000-et, akkor negatív számot kapunk. (Ez a probléma valószínűleg csak gyakorlatban jön elő) Megoldásként si+1-t két lépésben számoljuk:

    𝑠𝑠 ≔ (𝑠𝑠𝑖𝑖 + 𝑜𝑜 ∙ 𝑝𝑝 − 𝑜𝑜𝑜𝑜𝑜𝑜(𝑠𝑠[𝑖𝑖]) ∙ 𝑜𝑜𝑚𝑚−1) (𝑚𝑚𝑜𝑜𝑜𝑜 𝑝𝑝)

    𝑠𝑠𝑖𝑖+1 ≔ �𝑠𝑠 ∙ 𝑜𝑜 + 𝑜𝑜𝑜𝑜𝑜𝑜(𝑠𝑠[𝑖𝑖 + 𝑚𝑚])� (𝑚𝑚𝑜𝑜𝑜𝑜 𝑝𝑝)

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    21

    25.) Rendezések alsó korlát elemzése, legrosszabb eset (a matematikai számítás nélkül) Algoritmusok hatékonyságát a műveletigény kiszámításával fejezzük ki. A műveletigény a lépésszámban nyilvánul meg. Ezek után a műveletigény kiszámításához elég a domináns műveleteket figyelembe venni. Minden algoritmusra alsó korlát elemzést adunk. Ezzel határozzuk meg a minimális műveletigényét. Ehhez ú.n. döntési fában ábrázoljuk az absztrakt elemzést. Például rendező algoritmusok összehasonlítás számát tudjuk így elemezni. Vegyünk n=3 db inputot. Ezeknek bármilyen permutációja előfordulhat, így 3! = 6 féle input lehetséges. Ezek sorrendjének megállapítását ábrázoljuk a döntési fában:

    Láthatjuk, hogy a fa magassága 2 és 3 között van. Ez azt jelenti, hogy 3 input ra, legalább 2, legfeljebb 3 összehasonlítással, meg lehet állapítani a sorrendet. Erre a famagasságra általánosan is tudunk alsó korlátot adni.

    Lemma: ℎ(𝑡𝑡𝑅𝑅(𝑛𝑛) ≥ 𝑙𝑙𝑜𝑜𝑙𝑙2(𝑛𝑛!) Bizonyítás:

    h(t) : famagasság, azaz a gyökértől legtávolabb lévő levél távolsága Ha teljes fa lenne, akkor ezen a szinten 2h levél helyezkedne el. A levelek az eredmények, tehát 2h ≥ n! ebből: h ≥ log2(n!)

    ♥ (Ez érvényes a fenti példára is: 8 = 23 ≥ 3! =6)

    Tétel: MÖR(n) = Ω(nlog(n)) Bizonyítás:

    Az előző lemma alapján: MÖR(n) = h(tR(n)) ≥ log2(n!)

    MÖR(n) = h�tR(n)� ≥ log2(n!) = log2(n!) = log2(n(n − 1)(n − 2) … 2 ∙ 1) =

    = log2(n) + log2(n− 1) + ⋯+ log22 + log21 = � log2(i)n

    i=1

    ≥ � lognxn

    1

    dx =1

    ln2� lnx

    n

    1

    dx

    =1

    ln2[xlnx − x]1n =

    1ln2

    [nln(n) − n − (ln1 − 1)] =1

    ln2(nln(n) − n + 1)

    = nlog2n−n

    ln2+

    1ln2

    ≈ nlogn − 1,44n + 1,44 = θ(nlogn)

    ⟹ MÖR(n) = Ω(nlogn) ♥

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    22

    26.) Rendezések alsókorlát elemzése, átlagos eset (a matematikai számítás nélkül) Átlagos esetben az összehasonlítások számának átlagát vesszük. Ez a következőképp alakul:

    AÖR(n) = 1n!

    � ÖR(p)p ∈perm

    Azaz, vesszük minden permutációhoz tartozó összehasonlítás számot, és azokat átlagoljuk (összegüket elosztjuk a számukkal) Pl:

    AÖR(3) = 13!

    (2 ∙ 2 + 4 ∙ 3) =166

    = 2, 6̇

    Lhsum() - levélmagasságok összege A döntési fa alapján látjuk, hogy:

    �ÖR(p)p

    = lhsum�tR(n)�

    tehát:

    AÖR(3) = 1n!

    lhsum�tR(n)�

    Lemma: Az n! levelet tartalmazó tökéletes fák közül azokra a legkiseb az lhsum(t(n)) érték, melyek majdnem teljesek Bizonyítás:

    h(A) − h(D) ≥ 2 ⇔ h(C) − h(D) ≥ 1

    lhsum(t)− lhsum(t′) = 17 − 16 = 1

    Általában ≥ 1, ill véges áthelyezéssel majdnem teljes fát kapunk

    ♥ Tétel: AÖR(n) = Ω(nlogn) Bizonyítás:

    AÖR(n) = 1n!

    lhsum�tR(n)� ≥ 1n!

    lhsum�topt (n)� ≥1n!

    n! (h�topt (n) − 1�

    = h �topt (n)� − 1 ≥ log2(n!)− 1 = Ω(nlogn)

  • Algoritmusok és adatszerkezetek II. kidolgozott vizsgakérdések (2013/2014 2. félév) Dobreff András

    23

    Remélem sokat segít ez a kidolgozott anyag a felkészülésben. Használjátok egészséggel, de tartsátok észben, hogy ez nem egy hivatalos jegyzet, az esetleges hibákért nem áll módomban felelősséget vállalni. Ellenben az észrevételeket szívesen fogadom, és igyekszem javítani. A frissítések ezen a címen találhatóak majd meg: http://people.inf.elte.hu/doauaai/algo2

    Ha lenne bármilyen kérdés, óhaj-sóhaj, akkor keressetek meg e-mailben vagy facebookon: [email protected] https://www.facebook.com/andras.dobreff

    Jó tanulást!

    http://people.inf.elte.hu/doauaai/algo2mailto:[email protected]://www.facebook.com/andras.dobreff