Rakov(34125)= Rakov(12543)= Rakov(14532)= 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..

Kupac adatszerkezet. 1. ábra.

angolul: greedy algorithms, románul: algoritmi greedy

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

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

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

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

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

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

Programozási segédlet

Algoritmusok és adatszerkezetek gyakorlat 07

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

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

Adatszerkezetek 7a. Dr. IványiPéter

Általános algoritmustervezési módszerek

BACKTRACKING Visszalépéses keresés

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).

Programozási módszertan. Mohó algoritmusok

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

2. Visszalépéses keresés

Gráfelméleti feladatok. c f

2018, Diszkrét matematika

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

9. Megoldás keresése visszalépéssel (backtracking)

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

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

2018, Diszkrét matematika

Adatszerkezetek 2. Dr. Iványi Péter

Struktúra nélküli adatszerkezetek

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

Algoritmusok bonyolultsága

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

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

Adatszerkezetek 1. előadás

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

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

Rendezettminta-fa [2] [2]

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:

Visszalépéses keresés

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

Adatszerkezetek II. 10. előadás

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

Mátrixjátékok tiszta nyeregponttal

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

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

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

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Algoritmuselmélet 2. előadás

p j p l = m ( p j ) 1

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

Fibonacci számok. Dinamikus programozással

Mohó algoritmusok. Példa:

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ó

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

Algoritmusok bonyolultsága

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

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

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

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

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

É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

2. Visszalépéses stratégia

Mesterséges intelligencia 1 előadások

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

Gyakori elemhalmazok kinyerése

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

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.

Adatszerkezetek II. 6. előadás

Algoritmusok és adatszerkezetek 2.

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

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

Gyakorló feladatok ZH-ra

Megoldás meghatározása Ez a szakasz kitölti a c és S táblázatokat, a kiíratás S alapján egy rekurzív algoritmussal megtehető.

Felvételi tematika INFORMATIKA

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:

Algoritmuselmélet 1. előadás

INFORMATIKA javítókulcs 2016

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

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

bármely másikra el lehessen jutni. A vállalat tudja, hogy tetszőlegesen adott

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

Kombinatorikai algoritmusok

Egyszerű programozási tételek

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

7. BINÁRIS FÁK 7.1. A bináris fa absztrakt adattípus 7.2. A bináris fa absztrakt adatszerkezet

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

Algoritmuselmélet. Gráfok megadása, szélességi bejárás, összefüggőség, párosítás. Katona Gyula Y.

Ugrólisták. RSL Insert Example. insert(22) with 3 flips. Runtime?

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

Adatbázis rendszerek Gy: Algoritmusok C-ben

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

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

Á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 első 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. 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ó! 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. 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. 2

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 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. 3

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. 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. 4

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 Vizsga A vizsga egy négy feladatból álló dolgozat lesz. Ebből az egyik feladat egy gráfalgoritmus végrehajtása konkrét gráfon. Egy másik feladat pontosan meg fog egyezni az előadáson vett feladatok egyikével. A maradék két feladat az előadáson és a gyakorlatokon vett feladatokhoz hasonló lesz. 5