Bevezetés a programozásba. 12. Előadás: 8 királynő



Hasonló dokumentumok
Bevezetés a programozásba 2

Kriptográfiai algoritmus implementációk időalapú támadása Endrődi Csilla, Csorba Kristóf BME MIT

3. Gyakorlat Ismerkedés a Java nyelvvel

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

Bevezetés a játékelméletbe Kétszemélyes zérusösszegű mátrixjáték, optimális stratégia

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

INFORMATIKAI ALAPISMERETEK

KETTŐS KÖNYVELÉS PROGRAM CIVIL SZERVEZETEK RÉSZÉRE

Mátrixaritmetika. Tartalom:

INFORMATIKAI ALAPISMERETEK

Bináris keres fák kiegyensúlyozásai. Egyed Boglárka

Mesterséges intelligencia 1 előadások

Országzászlók (2015. május 27., Sz14)

Valószín ségelmélet házi feladatok

Algoritmuselmélet. Király Zoltán ELTE Matematikai Intézet február 18. Legfrissebb, on-line verzió:


NeoSzámla Használati Útmutató. Verziószám: 2014/Q2 Kelt: neoszamla.hu

4. LECKE: DÖNTÉSI FÁK - OSZTÁLYOZÁS II. -- Előadás Döntési fák [Concepts Chapter 11]

A.26. Hagyományos és korszerű tervezési eljárások

Ködös határ (Félreértés, hiba)

Az euklideszi algoritmusról

Matematikai alapok. Dr. Iványi Péter

Programozás I. Metódusok C#-ban Egyszerű programozási tételek. Sergyán Szabolcs

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

23. Fa adatszerkezetek, piros-fekete fa adatszerkezet (forgatások, új elem felvétele, törlés)(shagreen)

GAZDASÁGMATEMATIKA KÖZÉPHALADÓ SZINTEN

GAZDASÁGMATEMATIKA KÖZÉPHALADÓ SZINTEN

4. előadás. Vektorok

Alkalmazott modul: Programozás

Logaritmikus egyenletek Szakközépiskola, 11. osztály. 2. feladat. Oldjuk meg a következ logaritmikus egyenletet!

Programozás 5. Dr. Iványi Péter

Klasszikus alkalmazások

Halmazok. Halmazelméleti lapfogalmak, hatványhalmaz, halmazm veletek, halmazm veletek azonosságai.

Programozás I gyakorlat. 5. Struktúrák

Tervezett erdőgazdálkodási tevékenységek bejelentése

Aronic Főkönyv kettős könyvviteli programrendszer

5.10. Exponenciális egyenletek A logaritmus függvény Logaritmusos egyenletek A szinusz függvény

3. Strukturált programok

4. A GYÁRTÁS ÉS GYÁRTÓRENDSZER TERVEZÉSÉNEK ÁLTALÁNOS MODELLJE (Dudás Illés)

Matematika. Specializáció évfolyam

Matematikai programozás gyakorlatok

Bakos Csanád Tervezési csoportvezető Villamos Kapcsolóberendezések. Szabó László Műszaki igazgató Villamos Kapcsolóberendezések

Szeretettel köszöntöm a Dekorációs Ötlettár olvasóját. Gratulálok Önnek, mert abba a táborba tartozik, akinek számít a végeredmény, aki nem bízza a

Adatszerkezetek és algoritmusok Geda, Gábor

5. modul - Adatbázis-kezelés

Kupacrendezés. Az s sorban lévő elemeket rendezzük a k kupac segítségével! k.empty. not s.isempty. e:=s.out k.insert(e) not k.

INFORMATIKAI ALAPISMERETEK

INFORMATIKAI ALAPISMERETEK

konfidencia-intervallum Logikai vektorok az R-ben március 14.

SZERVER OLDALI JAVASCRIPT. 3. hét Javascript nyelvi elemek

Soros állványok. A soros állványok különböző raktártípusokban használhatók:

21. szám 124. évfolyam július 3. TARTALOM. Utasítások 48/2009. (VII. 3. MÁV Ért. 21.) VIG számú

Gyakorló feladatok ZH-ra

TÁMOP VIR alprojekt VIR felhasználói kézikönyv

A raktártechnológia ismérvei. Tervezési elsődlegesség Elsőbbség a technikával szemben A raktártechnológia egyedi jellege

C# feladatok gyűjteménye

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

MATEMATIKA JAVÍTÁSI-ÉRTÉKELÉSI ÚTMUTATÓ

Matematikai logika. Nagy Károly 2009

Objektumorientált programozás C# nyelven

A HunPLUS-os AutoCAD Architecture 2010 teljesítményfokozása

1. Adatok közelítése. Bevezetés. 1-1 A közelítő függvény

2.3. A C nyelv utasításai

10. CSI. A molekuláris biológiai technikák alkalmazásai

Az egyszer keres felületen sz kíthetjük a keresést adott mez re a legördül lista segítségével.

INFORMATIKAI ALAPISMERETEK

Kisfeszültségű energiaelosztás

Pásztor Attila. Algoritmizálás és programozás tankönyv az emeltszintű érettségihez

Erdélyi Magyar TudományEgyetem (EMTE

I. A légfékrendszer időszakos vizsgálatához alkalmazható mérő-adatgyűjtő berendezés műszaki

Halmazelmélet. 2. fejezet 2-1

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

5. Előadás. Megyesi László: Lineáris algebra, oldal. 5. előadás Lineáris függetlenség

Poszeidon (EKEIDR) Irat és Dokumentumkezelő rendszer webes felület

Emlékeztető: a fordítás lépései. Szimbólumtábla-kezelés. Információáramlás. Információáramlás. Információáramlás.

2015, Diszkrét matematika

PILÓTA NÉLKÜLI REPÜLŐGÉPEK ÚTVONALTERVEZÉSE DIGITÁLIS DOMBORZAT MODELL ALKALMAZÁSÁVAL

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


Operációs rendszerek. 3. előadás Ütemezés

Tevékenység: Gyűjtse ki és tanulja meg a lemezkarosszéria alakítástechnológia tervezés-előkészítésének technológiai lépéseit!

Válasz Páles Zsolt opponensi véleményére

TARTALOM. Ismétlő tesztek ÚTMUTATÁSOK ÉS EREDMÉNYEK...255

Vass Balázs. Online algoritmusok árverési feladatokban

Adatszerkezetek 7a. Dr. IványiPéter

ÖNJAVÍTÓ AGGREGÁLÁS SZENZORHÁLÓZATOKBAN ÉS AGGREGÁTOR NODE VÁLASZTÁS. Schaffer Péter. Tézisfüzet. Konzulens: Buttyán Levente, Ph.D.

Az általam használt (normál 5mm-es DIP) LED maximális teljesítménye 50mW körül van. Így a maximálisan alkalmazható üzemi árama:

Sztojka Miroszláv LINEÁRIS ALGEBRA Egyetemi jegyzet Ungvár 2013

Találatgaranciás Lottóvariációk gy jteménye

Az Összetett hálózatok vizsgálata elektronikus tantárgy részletes követeleményrendszere

Kari Adminisztrátor. Funkcionális leírás

Elektromágneses hullámok - Hullámoptika

117. AA Megoldó Alfréd AA 117.

Ferenczi Dóra. Sorbanállási problémák

I. BEVEZETÉS

matematikai statisztika október 24.

HOMLOKRAKODÓ TELJES ERŐ A PROFIKNAK!

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

Rekurzió. Horváth Gyula.

A logisztika megjelenése

Átírás:

Bevezetés a programozásba 12. Előadás: 8 királynő

A 8 királynő feladat Egy sakktáblára tennénk 8 királynőt, úgy, hogy ne álljon egyik sem ütésben Ez nem triviális feladat, a lehetséges 64*63*62*61*60*59*58*57/8!=4'426'165'368 esetből csak 92 jó Először tehát gondolkodni kell, hogyan lehetne elkerülni a felesleges számolást, és felesleges memóriahasználatot

A 8 királynő feladat Első lépés: helyes reprezentáció választása Emlékeztető: a jó reprezentáció minden lehetséges esetet (most sakktábla-állást) lehetővé tesz, de többet lehetőleg nem A naiv reprezentáció: egy 8x8 mátrix, ahol 0 jelenti, hogy nincs királynő, és 1 jelenti, hogy van Ennél van jobb reprezentáció

A 8 királynő feladat Használjuk ki, hogy tudjuk, hogy ha két királynő van egy oszlopban, az biztosan rossz Tehát egy oszlopban csak egy királynőt kell tudni reprezentálni! Ez pedig könnyű: egy számmal, hogy hányadik sorban áll Az állás reprezentálása tehát egészek vektora Mellesleg 4'426'165'368 16'777'216!

Királynő ütésszabály Két egész koordinátával megadott királynő pozícióról eldönthető, hogy egymást ütik-e: bool bool kiralyno(int x1, x1, int int y1, y1, int int x2, x2, int int y2) y2) { return return x1==x2 x1==x2 y1==y2 y1==y2 x1+y2==x2+y1 x1+y1==x2+y2; }

Sakktábla ütésszabály Két egymásba ágyazott lineáris keresést alkalmazunk (elhanyagolva a hol -t) bool bool utesben(vector<int>& v) v) { int int s=v.size(); bool bool res=false; for for (int (int i=0;i<s i=0;i<s && &&!res;i++) { for for (int (int j=i+1;j<s && &&!res;j++) { res res = kiralyno(i,v[i],j,v[j]); } } return return res; res; }

A brute force algoritmus Keresési feladatoknál Az elv: nézd meg az összes lehetséges megoldást Előnye: nem kell gondolkodni Hátránya: lassú. Legtöbbször használhatatlanul when in doubt use brute force Ken Thompson Összefoglalva: érdemes ezzel kezdeni Az optimalizált programot legyen mivel hasonlítani Ha kell egyáltalán optimalizálni

Brute force int int main() main() { vector<int> v(8); v(8); for for (int (int i1=0;i1<8;i1++) { for for (int (int i2=0;i2<8;i2++) { for for (int (int i8=0;i8<8;i8++) { v[0]=i1;v[1]=i2;v[2]=i3;v[3]=i4; v[4]=i5;v[5]=i6;v[6]=i7;v[7]=i8; if if (!utesben(v)) { talalat(v); } } } } }

Brute force eredmények 1299852 1299852 lepesbol: 0 4 7 5 2 6 1 3 1551565 1551565 lepesbol: 0 5 7 2 6 3 1 4 1695331 1695331 lepesbol: 0 6 3 5 7 1 4 2 15081886 15081886 lepesbol: 7 1 4 2 0 6 3 5 15225652 15225652 lepesbol: 7 2 0 5 1 4 6 3 15477365 15477365 lepesbol: 7 3 0 2 5 1 6 4 Nincs kecmec, a lehetséges 16 millió esetből kiválogattuk a megfelelőket Kicsit lassú

Hogyan lehet gyorsabb algoritmust csinálni? Főtétel : Nincs ingyen leves Az általánosság és a hatékonyság ellentétes: Ha egy algoritmus semmit sem használ ki a feladatból, a hatékonysága megegyezik a véletlen találgatással Ilyenkor gondolkodni kell keresni a problémának olyan vonását, amely kihasználható

8 királynő Mit nem használtunk ki eddig? A brute force megoldás egy olyan esetben, ahol i1 és i2 már ütik egymást, feleslegesen néz meg 8 6 esetet Más szavakkal: abból, hogy két bábu az első n bábu közül már ütésben van, tudható, hogy tetszőleges n-en túli elrendezés sem lesz jó Hogyan használjuk ezt ki?

Rekurzióval kereső(állás, mélység, mélység, méret) méret) { HA HA állás állás ütésben ütésben van, van, return return //eddig //eddig jó jó HA HA mélység mélység = méret, méret, találat(állás) } //Még //Még nem nem elég elég hosszú, hosszú, de de eddig eddig jó jó bővítsük bővítsük az az állást állást CIKLUS CIKLUS i a helyekre helyekre a mélység-edik oszlopban állás[mélység]=i; kereső(állás,mélység+1,méret); }

8 királynő

8 királynő

8 királynő

8 királynő

8 királynő

8 királynő

8 királynő

8 királynő

8 királynő

8 királynő

8 királynő

8 királynő

8 királynő

8 királynő : az első megoldás

8 királynő: visszalépéses keresés void void keres(vector<int> v, v, int int a, a, int int kir) kir) { if if (utesben(v)) return; return; if if (v.size()==kir) { talalat(v); } //Még //Még nem nem elég elég hosszú, hosszú, de de eddig eddig jó jó v.push_back(0); for for (int (int i=0;i<kir;i++) { v[a]=i; v[a]=i; keres(v,a+1,kir); } } Érték szerinti paraméterátadás: nincs pop_back()

Hatékonyság 1299852 1299852 lepesbol: 0 4 7 5 2 6 1 3 1551565 1551565 lepesbol: 0 5 7 2 6 3 1 4 1695331 1695331 lepesbol: 0 6 3 5 7 1 4 2 15081886 15081886 lepesbol: 7 1 4 2 0 6 3 5 15225652 15225652 lepesbol: 7 2 0 5 1 4 6 3 15477365 15477365 lepesbol: 877 877 lepesbol: 7 3 0 2 50 14 67 45 2 6 1 3 1149 1149 lepesbol: 0 5 7 2 6 3 1 4 1357 1357 lepesbol: 0 6 3 5 7 1 4 2.................. 15101 15101 lepesbol: 7 1 4 2 0 6 3 5 15309 15309 lepesbol: 7 2 0 5 1 4 6 3 15581 15581 lepesbol: 7 3 0 2 5 1 6 4

Hatékonyság Láttuk, hogy van különbség a brute force és a visszalépéses keresés között Az előny körülbelül ezerszeres volt ebben a példában Ez sok? Sok, de nem valódi előny: 8x8 tábla helyett n x n táblán a futás ideje mindkét algoritmusnak körülbelül exponenciális

Bináris keresés A feladat ugyanaz, mint a lineáris keresésben: adott elemet keresünk sok elem között De előfeltétel: az elemek vektorban vannak, és rendezett állapotban Így az intervallum felezésével minden lépésben felezzük a maradék megnézendő elemeket, tehát log 2 (n) lépésben végzünk Ez általános értelemben is gyorsabb, mint a lineáris keresés

24 elem, 5 lépés 2 5 = 32 log 2 (n) felfelé kerekítve Bináris keresés

Hatékonyság elemzés Eszköz: Ordo Definíció: az algoritmus, aminek a bemenete p 1, p 2,..., p n paraméterektől függ, O(f(p 1, p 2,.., p n ) ) akkor és csak akkor, ha létezik F, hogy futásidő < F*f(p 1, p 2,..., p n ) bármely elegendően nagy p 1, p 2,..., p n -re Példa: n elemű sorozat összegzése O(n) n elemű sorozat buborékrendezése O(n2 ) Legfeljebb konstansszorosa

Hatékonyság Jellegzetes O(x) kategóriák O(1) : konstans idejű művelet. Ilyen az értékadás, vektor egy elemének kiválasztása, fix hosszú vektoron végzett tetszőleges művelet O(log(n)) : logaritmikus idejű művelet, például a bináris keresés O(n): lineáris idejű művelet, az összes tétel ilyen a bemeneten kapott sorozat szerint O(n*log(n)): a gyors rendezőalgoritmusok ilyenek O(n 2 ) : lassú rendezőalgoritmusok O(2 n ) : exponenciális idejű műveletek

Kitekintés brute force a biztonságtechnikában Párhuzamos architektúrákon érdemes megkülönböztetni azokat az eseteket, ha n egy nagyságrendbe esik a feldolgozóegységek számával O(n) -> O(1), ha van n processzor, és függetlenül kezelhetőek A valóság ennél sajnos bonyolultabb A jó algoritmushoz jó adatszerkezetre is szükség lesz