„Algoritmuselmélet - ZH, 2013.04.03.” változatai közötti eltérés

A VIK Wikiből
67. sor: 67. sor:
}}
}}


===4. Feladat===
===4. Feladat (Van megoldás)===
TODO
Adjacencia-mátrixával adott <math>n</math> csúcsú, irányított gráfként ismerjük egy város úthálózatát. El szeretnék jutni <math>A</math> pontból <math>B</math> pontba, de sajnos minden csomóponthoz várnunk kell a nagy hóesés miatt, a várakozás hossza minden csomópontra ismert és független attól, hogy merre akarunk továbbmenni. Adjon algoritmust, ami <math>O(n^2)</math> lépésben eldönti, hogy merre menjünk, hogy a lehető legkevesebbet kelljen várni összességében. ''(A csomópontok közötti utak hosszának megtétele a várakozáshoz képest elhanyagolható időbe telik, tekintsük 0-nak. <math>A</math>-ban és <math>B</math>-ben nem kell várakozni.)''
{{Rejtett
{{Rejtett
|mutatott=<big>'''Megoldás'''</big>
|mutatott=<big>'''Megoldás'''</big>
|szöveg=
|szöveg=


TODO
*A "probléma", hogy a csúcsoknak van súlya (ill. az éleknek is van, de az 0), amivel nem igen tudunk mit kezdeni. De nem hiába volt BSZ1 (vagy BSZ2?), ahol megtanultuk, hogy könnyedén csinálhatunk a csúcssúlyból élsúlyt.
*Az adott pontot (X) lecseréljük 2 pontra (X1, X2). Ami eddig X-be ment, az menjen X1-be, és ami X-ből ment, az menjen X2-ből. ''(Vagyis X1-ből csak X2-be megy él, és X2-be csak az X1 megy.)''
*A 2 pontot összekötjük, a köztük menő élsúly pedig az X pont súlya lesz.
*Csináljuk hát ezt ezzel a gráffal:
**Az eredeti <math> n </math> csúcsú G gráfból csinálunk így egy F gráfot, melyben <math> 2n </math> csúcs lesz ''(és az élszám is n-nel nő, de ez most minket annyira nem izgat)''.
**Ebben az F gráfban kell megtalálni a legrövidebb utat egy "X2"-ből egy "Y1"-be.
**A Dijkstra-algoritmus <math> O(n^2) </math> lépésben keres legrövidebb utat, ebben az esetben <math> O((2n)^2)=4O(n^2)=O(n^2)</math>.
*Így a feladat ezzel meg is oldva.
::::::::::[[File:csucs_suly.png|300px|G gráf]][[File:el_suly.png|400px|F gráf]]
 
 
}}
}}



A lap 2013. június 13., 21:03-kori változata

2013.04.03. ZH megoldásai

1. Feladat

TODO

Megoldás
TODO

2. Feladat (Van megoldás)

Egy x -es táblázat minden mezőjében egy egész szám van írva (nem feltétlenül csak pozitívak). Adjon 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 -t keresünk, amire 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 3 lépés).
    • 1 értéke beírása a cellába.
    • 1 összehasonlítás (és esetleges cserék).
  • Adott az mátrix.
  • Létrehozunk egy mátrixot (szintén x -es).(ez lépés)
  • . (ez lépés)
  • és .
  • Először kitöltjük az 1. sort . (ez lépés)
  • Majd kitöltjük az 1. oszlopot . (ez lépés)
  • Minden további cellában pedig . (ez lépés)
  • A keresett párost pedig folyamat nyilván tartjuk: ha . (ez lépés)
  • 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ések a feladathoz
    • Szokásos rendezést használó bináris keresőfa:
    • Postorder:
      • Rekurzívan . 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 (Van megoldás)

    Adjacencia-mátrixával adott csúcsú, irányított gráfként ismerjük egy város úthálózatát. El szeretnék jutni pontból pontba, de sajnos minden csomóponthoz várnunk kell a nagy hóesés miatt, a várakozás hossza minden csomópontra ismert és független attól, hogy merre akarunk továbbmenni. Adjon algoritmust, ami lépésben eldönti, hogy merre menjünk, hogy a lehető legkevesebbet kelljen várni összességében. (A csomópontok közötti utak hosszának megtétele a várakozáshoz képest elhanyagolható időbe telik, tekintsük 0-nak. -ban és -ben nem kell várakozni.)

    Megoldás
    • A "probléma", hogy a csúcsoknak van súlya (ill. az éleknek is van, de az 0), amivel nem igen tudunk mit kezdeni. De nem hiába volt BSZ1 (vagy BSZ2?), ahol megtanultuk, hogy könnyedén csinálhatunk a csúcssúlyból élsúlyt.
    • Az adott pontot (X) lecseréljük 2 pontra (X1, X2). Ami eddig X-be ment, az menjen X1-be, és ami X-ből ment, az menjen X2-ből. (Vagyis X1-ből csak X2-be megy él, és X2-be csak az X1 megy.)
    • A 2 pontot összekötjük, a köztük menő élsúly pedig az X pont súlya lesz.
    • Csináljuk hát ezt ezzel a gráffal:
      • Az eredeti csúcsú G gráfból csinálunk így egy F gráfot, melyben csúcs lesz (és az élszám is n-nel nő, de ez most minket annyira nem izgat).
      • Ebben az F gráfban kell megtalálni a legrövidebb utat egy "X2"-ből egy "Y1"-be.
      • A Dijkstra-algoritmus lépésben keres legrövidebb utat, ebben az esetben .
    • Így a feladat ezzel meg is oldva.
    G gráfF gráf

    5. Feladat

    TODO

    Megoldás
    TODO

    6. Feladat

    TODO

    Megoldás
    TODO

    7. Feladat

    TODO

    Megoldás
    TODO

    8. Feladat

    TODO

    Megoldás
    TODO