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

Hasonló dokumentumok
Dinamikus programozás vagy Oszd meg, és uralkodj!

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

BACKTRACKING Visszalépéses keresés

angolul: greedy algorithms, románul: algoritmi greedy

BABEŞ BOLYAI TUDOMÁNYEGYETEM MATEMATIKA ÉS INFORMATIKA KAR BBTE Matek-Infó verseny 1. tételsor INFORMATIKA írásbeli. A versenyzők figyelmébe:

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

INFORMATIKA javítókulcs 2016

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

Felvételi tematika INFORMATIKA

2. Visszalépéses keresés

BBTE Matek-Infó verseny mintatételsor Informatika írásbeli vizsga

Táblázatok fontosabb műveletei 1

Informatikai tehetséggondozás:

Gráfelméleti feladatok. c f

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

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

Tartalomjegyzék Algoritmusok - pszeudókód

Bevezetés a matematikába (2009. ősz) 1. röpdolgozat

Adatszerkezetek II. 10. előadás

Algoritmusok bonyolultsága

I. ALAPALGORITMUSOK. I. Pszeudokódban beolvas n prim igaz minden i 2,gyök(n) végezd el ha n % i = 0 akkor prim hamis

2018, Diszkre t matematika. 10. elo ada s

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

Kombinatorikai algoritmusok

értékel függvény: rátermettségi függvény (tness function)

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

Rakov(34125)= Rakov(12543)= Rakov(14532)= Rakov(54321)=-

1. Egészítsük ki az alábbi Python függvényt úgy, hogy a függvény meghatározza, egy listába, az első n szám faktoriális értékét:

Algoritmusok pszeudókód... 1

2018, Diszkrét matematika

Megoldott feladatok. Informatika

Visszalépéses kiválogatás

Algoritmusok - pszeudókód... 1

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

/* Az iter függvény meghívása és a visszatérő érték átadása a gyok változóba */ gyok = iter( n, a, e ) ;

SZAMOKKAL Egy algoritmus generálja növekvő sorrendben, kizárólag a 3, 5 és 7 számjegyeket használva, az összes n számjegyű számot.

Tartalomjegyzék Algoritmusok - pszeudókód

<... < s n. Írjuk le a megoldási módszert, és adjunk meg egy megjegyzésekkel ellátott Pascal-programot. A bemeneti adatokat helyesnek tekintjük.

A félév során előkerülő témakörök

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

Visszalépéses keresés

Algoritmusok vektorokkal keresések 1

Egyszerű programok készítése Kifejezések Bitszintű műveletek Relációs műveletek... 58

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

1. Alapok. #!/bin/bash

2015, Diszkrét matematika

2. Visszalépéses stratégia

1. ábra ábra

INFORMATIKA tétel 2019

A 2017/2018 tanévi Országos Középiskolai Tanulmányi Verseny első fordulójának feladatai. INFORMATIKA II. (programozás) kategória

Specifikáció. B logikai formula, a bemeneti feltétel, K logikai formula, a kimeneti feltétel, A az algoritmus, amelyre az állítás vonatkozik.

29. Visszalépéses keresés 1.

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

Algoritmusok helyességének bizonyítása. A Floyd-módszer

értékel függvény: rátermettségi függvény (tness function)

Programozási módszertan. Mohó algoritmusok

Fibonacci számok. Dinamikus programozással

Algoritmusok bonyolultsága

Rakov(34125)= Rakov(12543)= Rakov(14532)= Rakov(54321)=-

Specifikáció. B logikai formula, a bemeneti feltétel, K logikai formula, a kimeneti feltétel, A az algoritmus, amelyre az állítás vonatkozik.

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

Megoldás: Mindkét állítás hamis! Indoklás: a) Azonos alapú hatványokat úgy szorzunk, hogy a kitevőket összeadjuk. Tehát: a 3 * a 4 = a 3+4 = a 7

HHF0CX. k darab halmaz sorbarendezésének a lehetősége k! Így adódik az alábbi képlet:

Algoritmusok pszeudókód... 1

BABEŞ-BOLYAI TUDOMÁNYEGYETEM MATEMATIKA-INFORMATIKA KAR Felvételi verseny - minta Informatika írásbeli

Algoritmuselmélet. Legrövidebb utak, Bellmann-Ford, Dijkstra. Katona Gyula Y.

Dinamikus programozás - Szerelőszalag ütemezése

Érdekes informatika feladatok

Érdekes informatika feladatok

8. feladatsor. Kisérettségi feladatsorok matematikából. 8. feladatsor. I. rész

2017, Diszkrét matematika

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

S z á m í t ó g é p e s a l a p i s m e r e t e k

2. Logika gyakorlat Függvények és a teljes indukció

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

Adatbányászati szemelvények MapReduce környezetben

Megjegyzés: A programnak tartalmaznia kell legalább egy felhasználói alprogramot. Példa:

10. gyakorlat Tömb, mint függvény argumentum

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

Kronecker-modulusok kombinatorikája és alkalmazások

Mesterséges intelligencia 1 előadások

Ajánlott elemi feladatok az AAO tárgyhoz 41 feladat

Knuth-Morris-Pratt algoritmus

RSA algoritmus. P(M) = M e mod n. S(C) = C d mod n. A helyesség igazoláshoz szükséges számelméleti háttér. a φ(n) = 1 mod n, a (a 1,a 2,...

Válogatott fejezetek a logikai programozásból ASP. Answer Set Programming Kelemen Attila

BASH SCRIPT SHELL JEGYZETEK

Rekurzív algoritmusok

Programozási módszertan. Dinamikus programozás: szerelőszalag ütemezése Mátrixok véges sorozatainak szorzása

Biomatematika 2 Orvosi biometria

Adatszerkezetek II. 1. előadás

Dr. Schuster György február / 32

Operációs Rendszerek II. labor. 2. alkalom

Bevezetés az algebrába az egész számok

Programozás alapjai 9.Gy: Struktúra 2.

14. Mediánok és rendezett minták

... fi. ... fk. 6. Fabejáró algoritmusok Rekurzív preorder bejárás (elsőfiú-testvér ábrázolásra)

I. VEKTOROK, MÁTRIXOK

Programozási módszertan. Dinamikus programozás: A leghosszabb közös részsorozat

Kongruenciák. Waldhauser Tamás

Flex tutorial. Dévai Gergely

Átírás:

Visszalépéses módszer (Backtracking) folytatás Permutáció n = 3 esetében: 1 2 3 2 3 1 3 1 2 Eredmény: 3 2 3 1 2 1 123 132 213 231 312 321 permutációk száma: P n = n! romámul: permutări, angolul: permutation n elem permutációja, M = {1, 2,..., n} Megoldás: (x 1, x 2,..., x n ) M M... M } {{ } n szer (belső) feltétel: az elemek különbözzenek 1

PERMUTÁCIÓ(k) 1. for i := 1 to n 2. do X k := i 3. if MEGFELEL(k) 4. then if k < n 5. then PERMUTÁCIÓ(k + 1) 6. else kiír X MEGFELEL(k) 1. OK := igaz 2. i := 1 3. while (i k 1) és OK 4. do if (X k = X i ) 5. then OK := hamis 6. else i := i + 1 7. return OK eljárás hívása: PERMUTÁCIÓ(1), adott n-re 2

Variáció n elem m-ed osztályú variációja (n m) n = 4, m = 2 esetében: 12 13 14 21 23 24 31 32 34 41 42 43 variációk száma: Vn m = n(n 1)... (n m + 1) románul: aranjamente, angolul: permutation (!) VARIÁCIÓ(k) 1. for i := 1 to n 2. do X k := i 3. if MEGFELEL(k) 4. then if k < m 5. then VARIÁCIÓ(k + 1) 6. else kiír X MEGFELEL(k) ugyanaz, mint a permutációnál eljárás hívása: VARIÁCIÓ(1), adott n-re és m-re 3

Kombináció n elem m-ed osztályú kombinációja (n m) n = 4, m = 2 esetében: 12 13 14 21 23 24 31 32 34 41 42 43 kombinációk száma: C m n = Más jelölés: C m n = ( n m ) n(n 1)... (n m + 1) m! = n! m!(n m)! rom.: combinări, ang.: combination KOMBINÁCIÓ(k) ugyanaz, mint a variációnál MEGFELEL(k) 1. OK := igaz 2. i := 1 3. while (i k 1) és OK 4. do if (X k X i ) 5. then OK := hamis 6. else i := i + 1 7. return OK eljárás hívása: KOMBINÁCIÓ(1), adott n-re és m-re 4

Visszalépéses módszer iteratív változat jelölés: m k az M k következő vizsgálandó eleme Királynős feladat nem rekurzívan: KIRÁLYNŐ_ITERATÍVAN 1. for i := 1 to n 2. do m i := 1 3. k := 1 4. while k > 0 5. do OK := hamis 6. i := m k 7. while (i n) és nem OK 8. X k := i 9. m k := i + 1 10. OK := MEGFELEL(k) 11. i := i + 1 12. if OK 13. then if k = n 14. then KIÍR(X) 15. else k := k + 1 16. else m k := 1 17. k := k 1 5

ITERATÍV_BACKTRACKING 1. for i := 1 to n 2. do m i := 1 kezdőértékek beállítása 3. k := 1 4. while k > 0 5. do OK := hamis 6. i := m k 7. while (i n) és nem OK létezik köv. elem M k -ban 8. X k := i következő elem M k -ból 9. m k := i + 1 köv. érték beállítása M k -ban 10. OK := MEGFELEL(k) 11. i := i + 1 12. if OK megfelelő elem 13. then if k = n 14. then KIÍR(X) eredmény kiírása 15. else k := k + 1 nincs vége, továbblépés 16. else m k := 1 új kezdőérték beállítása M k -ban 17. k := k 1 visszalépés az előző X elemre 6

Egyéb példák Labirintus A köv. labirintusban az 1-esek jelzik a folyosót, ahol haladni lehet vízszintesen és függőlegesen. A feladat: egy adott pozícióból indulva kijutni a labirintusból, ha ez lehetséges. 0 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 1 1 1 0 0 1 0 1 0 Egy adott helyről 4 irányba indulhatunk: 1 4 2 3 Hasonlóképpen járunk el, mint a lóugrás feladatnál. A lépéseket a köv. vektorokkal oldjuk meg: a = ( 1, 0, 1, 0) b = ( 0, 1, 0, 1) Az labirintust a X mátrix tartalmazza. A megoldás lépéseit az E vektorban őrizzük meg (1-estől számozva). 7

LABIRINTUS(i, j, s) 1. for k := 1 to 4 2. do p := i + a k 3. r := j + b k 4. if MEGFELEL(p, r) 5. then E pr := s 6. if (p = 1) vagy (p = n) vagy (r = 1) vagy (r = n) 7. then KIÍR(E) 8. E pr := 0 9. else LABIRINTUS(p, r, s + 1) 10. E pr := 0 MEGFELEL(p, r) 1. if (1 p n) és (1 r n) és (X pr = 1) és (E pr = 0) 2. then OK := igaz 3. else OK := hamis 4. return OK Az eljárás hívása, adott i és j értékre: E i, j := 1 Feltételezzük, hogy X i j = 1. s := 2 LABIRINTUS(i, j, s); 8

Labirintus másképpen LABIRINTUS (i, j, s) 1. if MEGFELEL(i, j) 2. then E i j := s 3. if (i = 1) vagy (i = n) vagy ( j = 1) vagy ( j = n) 4. then KIÍR(E) 5. E i j := 0 6. else LABIRINTUS (i 1, j, s + 1) 7. LABIRINTUS (i, j + 1, s + 1) 8. LABIRINTUS (i + 1, j, s + 1) 9. LABIRINTUS (i, j 1, s + 1) 10. E i j := 0 A MEGFELEL(i, j) ugyanaz, mint az előző megoldásnál. Az eljárás meghívása: LABIRINTUS (i, j, 1); 9

Példák: A labirintus: 0 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 1 1 1 0 0 1 0 1 0 i = 4, j = 4 pozícióból indulva, a megoldások: 0 6 0 0 0 0 5 4 0 0 0 0 3 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 0 0 5 4 1 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 2 0 0 6 0 0 0 0 5 4 0 0 0 0 3 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 1 0 0 4 0 0 0 10

Legrövidebb utak labirintusban Az előbbi feladat kibővítése azzal, hogy még találja meg a labirintusból kivezető legrövidebb út hosszát is. LABIRINTUS (i, j, s) 1. if MEGFELEL(i, j) 2. then E i j := s 3. if (i = 1) vagy (i = n) vagy ( j = 1) vagy ( j = n) 4. then KIÍR(E) 5. E i j := 0 6. return 0 7. else min :=MINIMUM(LABIRINTUS (i 1, j, s + 1), 8. LABIRINTUS (i, j + 1, s + 1)) 9. min :=MINIMUM(min, LABIRINTUS (i + 1, j, s + 1)) 10. min :=MINIMUM(min, LABIRINTUS (i, j 1, s + 1)) 11. E i j := 0 12. return min + 1 13. else return MINIMUM(a, b) 1. if a > b 2. then return b 3. else return a 11

A MEGFELEL(i, j) ugyanaz, mint az előző esetben. Az eljárás hívása: m := LABIRINTUS (i, j, 1), megfelelő i és j értékekre, és m lesz a legrövidebb út hossza. 12

Természetes szám felbontása prímszámok összegére Feladat: Írjunk fel egy adott n természetes számot prímszámok összegére, az összes lehetséges módon. Egy P 1, P 2,... sorozatban őrizzük a prímszámokat. Feltételezzük, hogy elegendőek a megadott természetes szám felbontására. PRÍMEK(k) 1. i := 1 2. repeat 3. X k := P i 4. if MEGFELEL(k) itt s is értéket kap 5. then if s < n 6. then PRÍMEK(k + 1) 7. s := 0 8. else if s = n 9. then KIÍR(X) 10. i := i + 1 11. until s > n 13

MEGFELEL(k) 1. OK := hamis 2. if k = 1 3. then OK := igaz 4. s := X 1 5. else if X k X k 1 6. then s := 0 7. for i := 1 to k 8. do s := s + X i 9. if s n 10. then OK := igaz 11 return OK Hívás: PRÍMEK(1). Példák: n = 10 felbontásai: 2 2 2 2 2 2 2 3 3 2 3 5 3 7 5 5 14

n = 15 felbontásai: 2 2 2 2 2 2 3 2 2 2 2 2 5 2 2 2 2 7 2 2 2 3 3 3 2 2 3 3 5 2 2 11 2 3 3 7 2 3 5 5 2 13 3 3 3 3 3 3 5 7 5 5 5 15

Legrövidebb lefedő szavak Az A ábécé a 1, a 2,..., a m betűivel képezzük az összes k hosszúságú szót. Melyek azok a legrövidebb szavak, amelyek tartalmazzák mindezeket részszóként. Be lehet látni, hogy a lehető legrövidebb ilyen szó nem lehet rövidebb (m k + k 1)-nél. Például, ha m = 2 és k = 3, akkor a 0001011100 és 0001110100 szavak mindegyike legrövidebb lefedő szó, mivel tartalmazzák a 000, 001, 010, 011, 100, 101, 110, 111 szavakat. Az M k halmazok mindegyike egyenlő A-val. A (belső) feltétel: az utoljára képzett k hosszúságú szó először szerepeljen a lefedő szóban. Megállási feltétel: ha a lefedő szó hossza (m k + k 1). 16

LEFEDŐ_SZÓ(i) 1. for j := 1, 2,..., m 2. do if S i k+1 S i k+2... S i 1 a j nem része S 1 S 2... S i 1 -nek 3. then S i := a j 4. LEFEDŐ_SZÓ(i + 1) 8. else if hossz[s 1... S i 1 ] = m k + k 1 9. then írd S 1... S i 1 10. exit for Az eljárás hívása, adott m és k értékekre: for i = 1, 2,..., k do S i := a 1 LEFEDŐ_SZÓ (k + 1). 17

Más megoldás: Betűk helyett vegyük az a i = i 1 (i = 1, 2,..., m) értékeket, amelyek egy m-alapú számrendszer számjegyei. Az algoritmusban az S = (S 1, S 2,...) vektor a lefedő szó betűit tartalmazza. A B = (B 1, B 2,...) vektor komponensei jelzik, hogy egy adott részszó szerepel már (a komponens 1), vagy még nem (a komponens 0) a lefedő szóban. Az aktuális betűnek a szóhoz való illesztése után kiszámítjuk az utolsó k betűből képzett S i k+1 S i k+2... S i részszónak megfelelő számot: val(s i k+1 S i k+2... S i ), ha ezt r-rel jelöljük, akkor B r -t 1-re állítjuk, amennyiben 0 volt. Kezdetben: S i := 0, i = 1, 2,..., k, B 0 := 1, és minden más i-re B i := 0. 18

LEFEDŐ_SZÓ (i) 1. for j := 1, 2,..., m 2. do S i := j 1 3. r := val(s i k+1 S i k+2... S i ) if MEGFELEL helyett 4. if B r = 0 if MEGFELEL helyett 5. then B r := 1 6. LEFEDŐ_SZÓ (i + 1) 7. B r := 0 8. else if hossz[s 1... S i 1 ] = m k + k 1 9. then írd S 1... S i 1 10. exit for Az eljárás hívása, adott m és k értékekre: for i = 1, 2,..., k do S i := 0 B 0 := 1 for i = 1, 2,..., m k 1 do B i := 0 LEFEDŐ_SZÓ (k + 1). 19

m = 3, k = 2 esetében az algoritmus eredménye: 0010211220 0010221120 0011021220 0011022120 0011202210 0011210220 0011220210 0011221020 0012022110 0012110220 0012202110 0012211020 0020112210 0020122110 0021011220 0021101220 0021122010 0021220110 0022011210 0022012110 0022101120 0022110120 0022112010 0022120110 20

Feladatok: 1. Írjunk ki minden helyesen nyitó és csukó n zárójelet tartalmazó karakterláncot! 2. Ismert egy n n-es sakktáblán egy ló és egy király pozíciója. A tábla egyes helyei égnek, ide nem lehet lépni. Állítsuk elő az összes lehetőséget, ahogy a ló a királyért mehet, majd onnan visszatér hátán a királlyal eredeti helyére. Ahova lép, az a négyzet felgyúl. Természetesen, a ló és a király eredeti pozíciója nem ég. 3. Adott egy n m méretű mátrix, amelynek elemei egész számok. Írjuk ki azt a legkisebb összeget, amelynek elemeit kölönböző sorokból és oszlopokból vettük! 4. Állítsuk elő az összes f : A B szürjektív függvényt, ha A = {1, 2,..., n} és B = {1, 2,..., m}! 5. Legyen n tárgy 1-től n-ig számozva és n doboz. Ha egy dobozba legfennebb m tárgy fér bele, állítsuk elő az összes lehetőséget, ahogy a tárgyak elhelyezhetők a dobozokban! 21