Rakov(34125)=34152. Rakov(12543)=13245. Rakov(14532)=15234. Rakov(54321)=-



Hasonló dokumentumok
Rakov(34125)= Rakov(12543)= Rakov(14532)= Rakov(54321)=-

Amortizációs költségelemzés

A Verem absztrakt adattípus

Korlátozás és szétválasztás elve. ADAGOLO adattípus

end function Az A vektorban elõforduló legnagyobb és legkisebb értékek indexeinek különbségét.. (1.5 pont) Ha üres a vektor, akkor 0-t..

Adatszerkezetek I. 7. előadás. (Horváth Gyula anyagai felhasználásával)

Kupac adatszerkezet. A[i] bal fia A[2i] A[i] jobb fia A[2i + 1]

angolul: greedy algorithms, románul: algoritmi greedy

2. Milyen értéket határoz meg az alábbi algoritmus, ha A egy vektor?. (2 pont)

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

Számláló rendezés. Példa

Programozási segédlet

Programozás alapjai II. (7. ea) C++

Általános algoritmustervezési módszerek

Permutáció n = 3 esetében: Eredmény: permutációk száma: P n = n! romámul: permutări, angolul: permutation

Kupac adatszerkezet. 1. ábra.

Adatszerkezetek 7a. Dr. IványiPéter

Gyakorlatok. P (n) = P (n 1) + 2P (n 2) + P (n 3) ha n 4, (utolsó lépésként l, hl, u, hu-t léphetünk).

Algoritmusok és adatszerkezetek gyakorlat 07

BACKTRACKING Visszalépéses keresés

A számítástudomány alapjai. Katona Gyula Y. Számítástudományi és Információelméleti Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem

1. ábra. Egy rekurzív preorder bejárás. Egy másik rekurzív preorder bejárás

Programozási módszertan. Mohó algoritmusok

1. Feladat: beolvas két számot úgy, hogy a-ba kerüljön a nagyobb

Partíció probléma rekurzíómemorizálással

2018, Diszkrét matematika

2. Visszalépéses keresés

Gráfelméleti feladatok. c f

2018, Diszkrét matematika

p j p l = m ( p j ) 1

Struktúra nélküli adatszerkezetek

Adatszerkezetek 2. Dr. Iványi Péter

Algoritmusok bonyolultsága

Dinamikus programozás vagy Oszd meg, és uralkodj!

Edényrendezés. Futási idő: Tegyük fel, hogy m = n, ekkor: legjobb eset Θ(n), legrosszabb eset Θ(n 2 ), átlagos eset Θ(n).

Algoritmizálás. Horváth Gyula Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Adatszerkezetek 1. előadás

III. Gráfok. 1. Irányítatlan gráfok:

Rendezettminta-fa [2] [2]

Visszalépéses keresés

Bánsághi Anna 2014 Bánsághi Anna 1 of 68

Adatszerkezetek II. 10. előadás

Egyszerű programozási tételek

A programozás alapjai előadás. [<struktúra változó azonosítók>] ; Dinamikus adatszerkezetek:

Mátrixjátékok tiszta nyeregponttal

8. Mohó algoritmusok Egy esemény-kiválasztási probléma. Az esemény-kiválasztási probléma optimális részproblémák szerkezete

1. ábra. Számláló rendezés

Minimális feszítőfák Legyen G = (V,E,c), c : E R + egy súlyozott irányítatlan gráf. Terjesszük ki a súlyfüggvényt a T E élhalmazokra:

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Algoritmuselmélet 2. előadás

Kétszemélyes játékok Gregorics Tibor Mesterséges intelligencia

A 2010/2011 tanévi Országos Középiskolai Tanulmányi Verseny második fordulójának megoldása. II. (programozás) kategória

Mohó algoritmusok. Példa:

Mesterséges intelligencia 1 előadások

Számjegyes vagy radix rendezés

Összetett programozási tételek Rendezések Keresések PT egymásra építése. 10. előadás. Programozás-elmélet. Programozás-elmélet 10.

Kombinatorika. Permutáció

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

Műveletek mátrixokkal. Kalkulus. 2018/2019 ősz

A továbbiakban Y = {0, 1}, azaz minden szóhoz egy bináris sorozatot rendelünk

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Fibonacci számok. Dinamikus programozással

Érdekes informatika feladatok

A 2007/2008 tanévi Országos Középiskolai Tanulmányi Verseny első forduló feladatainak megoldása. II. (programozás) kategória

Felvételi tematika INFORMATIKA

Mesterséges intelligencia 3. laborgyakorlat

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda IRT- 4. kurzus. 3. Előadás: A mohó algoritmus

7 7, ,22 13,22 13, ,28

Algoritmizálás, adatmodellezés tanítása 8. előadás

15. tétel. Adatszerkezetek és algoritmusok vizsga Frissült: január 30.

10. tétel. Adatszerkezetek és algoritmusok vizsga Frissült: január 28.

Algoritmusok bonyolultsága

Algoritmusok és adatszerkezetek 2.

Programozás alapjai 9. előadás. Wagner György Általános Informatikai Tanszék

Adatszerkezetek II. 6. előadás

V. Kétszemélyes játékok

Elmaradó óra. Az F = (V,T) gráf minimális feszitőfája G-nek, ha. F feszitőfája G-nek, és. C(T) minimális

A MAXIMUM-KUPACOL eljárás helyreállítja az A[i] elemre a kupactulajdonságot. Az elemet süllyeszti cserékkel mindaddig, amíg a tulajdonság sérül.

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny döntő forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Korlátozás és szétválasztás módszere Holló Csaba 2

Gyakorló feladatok ZH-ra

INFORMATIKA javítókulcs 2016

2. Visszalépéses stratégia

Informatika feladatmegoldó verseny. Kiss Elemér Szakkollégium február 19. Dr. Kovács Lehel István

Programozás I. Egyszerű programozási tételek. Sergyán Szabolcs

Algoritmusok és adatszerkezetek I. 1. előadás

Kombinatorikai algoritmusok. (Horváth Gyula és Szlávi Péter előadásai felhasználásával)

Kombinatorikai algoritmusok

Adatszerkezetek. Nevezetes algoritmusok (Keresések, rendezések)

KOMBINATORIKA ELŐADÁS osztatlan matematika tanár hallgatók számára. Szita formula

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

Egyirányban láncolt lista

Feladatok és megoldások az 1. sorozat Építőkari Matematika A3

Adatbázis rendszerek Gy: Algoritmusok C-ben

9. előadás. Programozás-elmélet. Programozási tételek Elemi prog. Sorozatszámítás Eldöntés Kiválasztás Lin. keresés Megszámolás Maximum.

Információk. Ismétlés II. Ismétlés. Ismétlés III. A PROGRAMOZÁS ALAPJAI 2. Készítette: Vénné Meskó Katalin. Algoritmus. Algoritmus ábrázolása

Számítógépes döntéstámogatás. Genetikus algoritmusok

Sorozatok határértéke SOROZAT FOGALMA, MEGADÁSA, ÁBRÁZOLÁSA; KORLÁTOS ÉS MONOTON SOROZATOK

Átírás:

Kombinatorikus feladatok Ládák: Egy vállalat udvarán egyetlen sorban vannak az elszállításra várakozó üres ládák. Három különböző típusú láda van, jelölje ezeket A, B és C. Minden láda a felső oldalán nyitott kocka alakú. Az A-típusú láda a legnagyobb és a C-típusú a legkisebb. Tehát minden C-típusú láda belerakható A-típusú és B-típusú ládába, minden B-típusú belerakható A-típusúba és A-típusúba belerakható B-típusú, majd ebbe egy C-típusú. Az a cél, hogy a ládákat úgy pakoljuk össze, hogy a lehető legkevesebb összepakolt láda legyen. A pakolást olyan robot végzi, amely a ládasor felett tud mozogni mindkét irányban, de ládát csak balról jobbra mozogva tud szállítani. Írjon programot, amely megadja, hogy legkevesebb hány ládába lehet összepakolni a ládasort! Ha csak kétféle betű fordul elő a sorozatban, A és B, akkor a megoldás egyszerű. Legyen x az aktuálisan különálló B ládák száma, y az A ládáké. Balról-jobbra haladva, ha A betű esetén maradt el B (x>0), amit nem raktunk bele A-ba, akkor azt rakjuk bele az aktuális A-ba. Azaz x := x 1, és y := y + 1. Ha az aktuális betű B, akkor növeljük az y számláló értékét, y := y + 1. A megoldás x + y. Ha három féle láda van. Legyen x,y,z,w az aktuálisan C-t, B-t, B-ben C-t, és tetszőleges tartalmú A ládák száma. Ekkor balról jobbra haladva. Ha az aktuális láda A, akkor növeljük w-t. Utána x és y pozitív, akkor mindkettőt csökkentjük 1-el (pl B,C,A sorrend). Egyébként ha z > 0 csökkentjük 1-el. Egyébként az x és y közül azt csökkentjük, amelyik pozitív. Ha az aktuális láda B, akkor ha x > 0, akkor x-et csökkentjük 1-el, z-t növeljük 1-el. Egyébként y-ot növeljük 1-el. Ha az aktuális láda C, akkor x-et növeljük 1-el. Permutációk Az első n számból képezhető permutációkat a lexikografikus sorrend szerint sorba rendezzük. Egy adott permutációra adjuk meg a rákövetkezőt. Példa: Rakov(34125)=34152 Rakov(12543)=13245 Rakov(14532)=15234 Rakov(54321)=- 1. Meg kell találnunk azt a legutolsó elemet, amit megnövelhetünk. Ez az utolsó olyan elem lesz, ami mögött van nála nagyobb. 2. Az elem helyére a mögötte levő elemek közül a legkisebb nála magyobbat írjuk. 3. A maradék elemekből a lehető legkisebb számot képezzük, és ezzel zárjuk a permutációt. A processzorgyártó cégek megállapodtak abban, hogy milyen rendszert alkalmaznak az általuk gyártott processzorok egyedi azonosítására. Minden cég kap egy betűkészletet, és ezekből kell az azonosító kódot képeznie, úgy, hogy minden betű meghatározott számszor szerepeljen az azonosítóban. Például egy cég azt kapta, hogy minden azonosítója pontosan 3 db a betűt, 2 db b betűt és 1 db c betűt tartalmazhat. Készítsen olyan programot, amely adott kódra meghatározza a lexikografikus (ábécé szerinti) sorrendben rákövetkező szabályos kódot, ha van rákövetkező! Példa: Rakov(aaabbc)=aaabcb Rakov(bbacaa)=bbcaaa Rakov(acbbaa)=baaabc Rakov(cbbaaa)=- 1

A megoldás ugyanazokból a lépésekből áll. Interaktív feladatok Bináris keresés: Anna gondolt egy számot 1 és 2 n 1 között, és Beának ki kell találni. Minden tippjére megkapja a választ, eltalálta -e a számot, és amennyiben nem talált, megtudja, hogy a gondolt szám nagyobb vagy kisebb a tippjénél. Kezdetben a = 0, f = 2 n a tipp pedig g = 2 n 1. Utána amíg nem talált: Ha a gondolt szám nagyobb, akkor a := g, f := f, g := (a + f )/2 Ha a gondolt szám kisebb, akkor a := a, f := g, g := (a + f )/2 Medián keresése Adott n tárgy, melyeket 1-től n-ig számozunk, ahol n páratlan. Minden tárgy különböző súlyú (természetes számok), de magukat a súlyokat nem ismerjük. Minden y súlyra igaz, hogy 1 y n. Mediánnak nevezzük azt a tárgyat, amelyiknél ugyanannyi könnyebb, mint nehezebb tárgy van. Írjunk programot, amely meghatározza a mediánt! A tárgyak súlyát egy olyan eszközzel hasonlíthatjuk össze, amely három tárgy közül megadja a mediánt. Hagymahámozó algoritmus: Határozzuk meg a legnagyobb és legkisebb elemeket, hagyjuk el őket a maradék halmaz mediánja ugyanaz, mint az eredeti halmazé. Egy elem akkor és csak akkor szélső elem, ha nem mediánja egyetlen hármasnak sem. Így minden lekérdezéssel ki tudunk zárni egy elemet, tehát n 2 kérdéssel meghatározhatjuk a szélső elemeket. Következésképpen a halmaz mediánja (n 2) + (n 4) + (n 6) + + 1 = O(n 2 ) kérdéssel meghatározható a hagymahámozó algoritmussal. Számjáték: Egy játéktábla pozitív egész számok sorozata, ami 2n számot tartalmaz. Két játékos felváltva lép, egy lépésnem a játékos a számsorozat bal vagy jobb végéről elvesz egy számot. A játék akkor ér véget, ha a számok elfogytak. Az a játékos nyer, akinél az elvett számok összege több. Adjunk egy eljárást, amivel az első játékos legalább döntetlen elér. A második játékos lépéseit egy már adott számítógépes program szolgáltatja. Megoldás Az első játékos kényszerítheti a másodikat, hogy csak a páratlan vagy csak a páros indexű számokat vegye el, így könnyen elérheti, hoyg ne veszítsen. Maxszámjáték A játék csak a céljaiban különbözik az előző játéktól. Most a játékos célja a lehető legnagyobb érték összegyűjtése. Az optimális stratégia dinamikus programozással meghatározható. Legyen minden i j-re OPT (i, j) az a i,...,a j számsorozatból az első játékos által összegyűjthető összeg. Ha i = j, akkor ez az érték 0 mivel az utolsó elemet a második játékos veszi el. Ha i + j páratlan, akkor az első játékos jön, és a két szélső elem közül a neki jobbat választja, tehát ekkor OPT (i, j) = max{a i + OPT (i + 1, j),a j + OPT (i, j 1)}. Ha i + j páros, akkor a második játékos jön, ő azt választja, ami az elsőnek rosszabb, azaz ekkor az érték OPT (i, j) = min{opt (i + 1, j),opt (i, j 1)}. Ezen összefüggésekkel dinamikus programozással minden állásra kiszámítható a maximálisan nyerhető összeg és az ehhez szükséges lépés. Visszalépéses algoritmus 8 királynő problémahelyezzünk el az n n-es sakktáblán n királynőt, hogy egyik se üsse a másikat! Megoldástér: n darab mező, amiket a koordinátákkal adhatunk meg: {(x 1,y 1 ),...,(x n,y n )}, 1 x i,y i n. A királynők akkor és csak akkor nem ütik egymást, ha 2

x i x j, ha i j y i y j, ha i j x i + y i x j + y j, ha i j x i y i x j y j, ha i j Az első feltétel alapján feltehetjük, hogy y i = i, így a királynők elhelyezését egy (x 1,...,x n ) 1 x i n vektorral írjuk le, ami annak az elhelyezkedésnek felel meg, hogy az i-edik sorban a királynő az x j oszlopban van. x i x j, ha i j x i + i x j + j, ha i j x i i x j j, ha i j Megoldástér ábrázolás Ekkor a bejárandó megoldáskezdemények (x 1,...,x k ) vektorok 1 x i n, k n. A megoldáskezdemények egy fában ábrázolhatóak, a fát leíró, a bejárásához használható függvények: EFiu(x 1,...,x k ) = (x 1,...,x k,1), ha k<n és Nil ha k=n. Testver(x 1,...,x k ) = (x 1,...,x k 1,x k + 1), ha x k < n és Nil egyébként. APA(x 1,...,x k ) = (x 1,...,x k 1 ), ha k 1 és Nil egyébként. Kimerítő keresés A kimerítő keresés vagy nyers erő algoritmusa során az egész megoldástért bejárjuk, megvalósítható egy fabejárással. Megoldás keresése visszalépéses algoritmussal (backtracking) Az alapötlet az, hogy ha a fabejárás során, az olyan részfákat, amelyekben nincs lehetséges megoldás nem járjuk be, ha ilyen fához jutunk visszalépünk. Ennek megvalósításához szükség van egy függvényre, amely megadja, ha nem tartalmaz lehetséges megoldást a részfa. A LehetMego függvénytől ezt várjuk el, ha a függvény hamis értéket ad, a részfa nem tartalmaz lehetséges megoldást, igaz válasz esetén nem feltétlenül kell, hogy tartalmazzon megoldást a részfa. A LehetMego függvény megadja, ha nem kiterjeszthető a megoldáskezdemény, mert két királynő már üti egymást. Tehát LehetMego(x 1,...,x k ) = True, akkor és csak akkor ha minden i j esetén teljesül, hogy x i x j, x i + i x j + j, x i i x j j Használunk még egy Megoldas függvényt, amely akkor és csak akkor ad igaz értéket, ha az adott pont lehetséges megoldás. Esetünkben Megoldas(x 1,...,x k ) = True, akkor és csak akkor teljesül, ha LehetMego(x 1,...,x k ) és k = n. A keretalgoritmus A fenti függvények alapján az alábbi általános keretalgoritmust építjük fel. Egy adott probléma esetén meg kell adni a megoldástér fáját és a problémához tartozó függvényeket. 3

Visszalep(F) If F=Nil Then return //Üres fa If Megoldas(F) Then Print "F" // Megoldas kiiratasa return Else p:=f.elsofiu While (p!=nil) // a gyerekeken sorbamenve If LehetMego(p) Then Visszalep(p) p:=p.testver A fenti változat egyetlen megoldást keres meg, de a harmadik negyedik sor változtatásával könnyen átírható az összes megoldás megkeresésére. A kiiratás helyett a megoldást bele kell tenni egy halmazba, a negyedik "return" sort törölni. Az összes megoldás megkeresése felhasználható optimalizálási feladatok megoldására is. Pénzváltási probléma Az pénzváltási problémában adottak p 1,..., p n pénzérmék és egy E összeg, a feladat kiválasztani az érmék egy S halmazát, amelyre teljesül, hogy i S p i = E. A megoldástér a pénzérmék összes lehetséges részhalmaza. Egy lehetséges reprezentáció egy n szintből álló teljes bináris fa, amely a halmaz bitvektorát tárolja. A részhalmazoknak a levelek felelnek meg. A levélhez tartozó halmazt a levélig a gyökérből vezető út alapján kapjuk meg. Ha az i-dik szinten balra lépünk az i-dik elemet nem választjuk be, ha jobbra, akkor az i-dik elemet beválasztjuk a halmazba. Egy másik reprezentációval a megoldástér pontjait (a pénzek részhalmazát) a pénzek indexeinek az S {1,...,n} halmazának X = (i 1,...,i k ) növekvő felsorolásáként reprezentáljuk. Ekkor a bejáráshoz használt függvények EFiu(i 1,...,i k ) = (i 1,...,i k,i k + 1), ha i k < n és Nil ha i k = n. Testver(i 1,...,i k 1,i k ) = (i 1,...,i k 1,i k + 1), ha i k < n és Nil ha i k = n. Apa(i 1,...,i k 1,i k ) = (i 1,...,i k 1 ), ha k 1 és Nil egyébként. A LehetMego és Megoldás függvényeket a következőképpen kaphatjuk meg. A LehetMego függvény megadja, ha az eddig meghozott döntéseket nem lehet kiegészíteni egy felbontássá, vagy azért mert már nagyobb összeget választottunk, vagy azért mert minden további elemet kiválasztva sem érhetjük el E-t. Tehát LehetMego(i 1,...,i k ) = True akkor és csak akkor, ha k p i j E j=1 k p i j + j=1 n p j E. j=i k +1 Továbbá Megoldas(i 1,...,i k ) = True akkor és csak akkor, ha k j=1 p i j = E Adatszerkezet meghatározása Adott egy adatszerkezet, amelyről nem tudjuk, hogy lista vagy nyalóka (egy lista végére illesztve egy körlánc). Van két bélyeg. Az adatszerkezettel a következő lépéseket tehetjük. - egy bélyeget a helyéről felvehetünk -egy bélyeget a helyéről a rákövetkező helyre továbbmozdíthatunk -egy bélyeg helyére mellé a másikat is odatehetjük -a legelső elemre bélyeget tehetünk. Határozzuk meg a méretben lineáris időben, melyik adatszerkezetről van szó! 4

Megoldás A nyalóka adatszerkezetet úgy ismerhetjük fel, ha találunk kört. Kört pedig úgy találhatunk, hogy egy bélyeg helyétől elindulva a másik bélyeggel mindig továbblépve újra megtaláljuk a bélyeget. Két módszer lehetséges: Probálgatós Minden k-ra megnézzük, hogy van -e a kiindulási ponttól 2 k lépésre levő pontot tartalmazó legfeljebb 2 k hosszú kör. Ezt úgy tehetjük meg, hogy a 2 k lépésnyire levő bélyeg helyéről elindulunk a másik bélyeggel, teszünk 2 k lépést. Ha újra látjuk az első bélyeget van kör, ha nem, akkor áthelyezzük az első bélyeget is a második mellé, és rátérünk a 2 k+1 hosszú kör ellenőrzésére. Ötletes Elinditjuk a két bélyegzőt, az egyiket kétszer olyan gyorsan. (Időegységenként 2-t lép, mig a lassabb csak egyet). Ha nyalóka adatszerkezet van, lineáris időben lekörözi a gyors a lassút, és megtaláljuk, hogy van kör, egyébként pedig nyilvánvalóan lineáris időben eljutunk a lista végére. 5