Algoritmuselmélet - ZH, 2013.04.03.

A lap korábbi változatát látod, amilyen Arklur (vitalap | szerkesztései) 2013. június 13., 16:35-kor történt szerkesztése után volt. (2. Feladat)

2013.04.03. ZH megoldásai

1. Feladat

TODO

Megoldás
TODO

2. Feladat (Van megoldás)

Egy A[i,j] n x n-es táblázat minden mezőjében egy egész szám van írva (nem feltétlenül csak pozitívak). Adjon O(n2) lépésszámú algoritmust, ami eldönti, hogy melyik az a téglalap alakú része a táblázatnak, melynek bal felső sarka egybe esik a nagy táblázat bal felső sarkával és benne az elemek összege az egyik legnagyobb.

(Vagyis olyan k,l-t keresünk, amire ik,jlA[i,j] maximális.)

Megoldás
Megjegyzések a feladathoz
  • Ahogy az többször is segít, úgy most is, hogy felrajzolunk magunknak egy 3x3, vagy 4x4-es táblázatot, és nézegetjük, hogyan kéne dolgozni...
  • A feladatban 1-1 lépésnek vettem:
    • 1 művelet (+,) elvégzését (vagyis a B[i,j]=B[i1,j]+B[i,j1]+A[i,j]B[i1,j1] 3 lépés).
    • 1 értéke beírása a cellába.
    • 1 összehasonlítás (és esetleges cserék).
  • Adott az A mátrix.
  • Létrehozunk egy B mátrixot (szintén n x n-es).(ez O(n2) lépés)
  • B[1,1]:=A[1,1]. (ez 1 lépés)
  • k=l=1 és aktmax=B[1,1].
  • Először kitöltjük az 1. sort B[i,1]:=B[i1,1]+A[i,1],i=2n. (ez 2(n1)=O(n) lépés)
  • Majd kitöltjük az 1. oszlopot B[1,i]:=B[1,i1]+A[1,i],i=2n. (ez 2(n1)=O(n) lépés)
  • Minden további cellában pedig B[i,j]=B[i1,j]+B[i,j1]+A[i,j]B[i1,j1]. (ez 4(n1)(n1)=O(n2) lépés)
  • A keresett k,l párost pedig folyamat nyilván tartjuk: ha B[i,j]aktmaxk=i,l=j és aktmax=B[i,j]. (ez n21=O(n2) lépés)
  • 1+2O(n)+3O(n2)=O(n2) lépésszámú algoritmusunk van, tehát jók vagyunk.
  • Fájl:A B matrix.PNG

    3. Feladat (Van megoldás)

    Kaphatjuk-e az 1,7,3,6,11,15,22,17,14,12,9 számsorozatot úgy, hogy egy (a szokásos rendezést használó) bináris keresőfában tárolt elemeket posztorder sorrendben kiolvasunk?

    Megoldás
    Megjegyzés a feladathoz
    • Szokásos rendezést használó bináris keresőfa: bal(x)<x<jobb(x)
    • Postorder:
      • Rekurzívan bal(x)jobb(x)x. Magyarul előbb meglátogatja a gyökérnél kisebbeket, utána a nagyobbakat, és ezután jön csak a gyökér.
      • Egyik fontos tulajdonsága, hogy a gyökér az mindig a (figyelt) lista végén van.
  • Első lépésnek írjuk fel egy táblázatba a számokat (az oszlopszámot tudjuk, ez esetben 11, sorok száma meg majd alakul...).
  • A továbbiakban az i. sorban jelöljük, hogy melyik elem a gyökér (=), és hogy melyek a nála kisebbek (<), avagy nagyobbak (>) (a képen keretezéssel jelzem, hogy melyik az éppen figyelt lista). Ez azért hasznos, mert a posztorder bejárás során, ezzel a technikával mindig olyan sorrendet kell kapjunk, hogy <<<...<<>>...>>=, vagyis nem állhat fel olyan helyzet, hogy ...<><...= vagy ...><>...=.
    • Az 1. sorban a 9 lesz a gyökér. Felrajzoljuk a 9-t gyökérnek. (Bal oldalt lesz a hiba, de gyakorlásképp nézzük inkább a jobb oldalt.)
    • A 2. sorban a 12 lesz a gyökér, így a 12-est felrajzoljuk a 9-es jobb fiának. Nála csak a 11 a kisebb (a vizsgált listában), így a 11-t berajzoljuk a 12 bal fiának.
    • A 3. sorban 14 lesz a gyökér, így a 14-est felrajzoljuk a 12-es jobb fiának.
    • A 4. sorban a 17 lesz a gyökér, így ez a 14-es jobb fia lesz. A 15 és 22 pedig értelemszerűen a bal, és jobb fia lesz 17-nek.
    • Az 5. sorban a gyökér a 6 lesz, így azt berajzoljuk a 9-es bal fiának. És itt látszik is, hogy hiba van, hiszen <>< sorrend van, ebből következik, hogy ilyen fa nem létezhet.
  • Fájl:Post tabla.png Fájl:Graf.png

    4. Feladat

    TODO

    Megoldás
    TODO

    5. Feladat

    TODO

    Megoldás
    TODO

    6. Feladat

    TODO

    Megoldás
    TODO

    7. Feladat

    TODO

    Megoldás
    TODO

    8. Feladat

    TODO

    Megoldás
    TODO