Algoritmusok és magvalósítások Dr. Schuster György OE-KVK-MAI schuster.gyorgy@kvk.uni-obuda.hu 2015. február 10. 2015. február 10. 1 / 32
Algoritmus Alapfogalmak Algoritmus Definíció Algoritmuson olyan megengedett végesszámú lépésekből álló módszert, utasítás sorozatot, részletes útmutatást, receptet értünk, amely valamely felmerült probléma megoldására alkalmas. 2015. február 10. 2 / 32
Algoritmus Alapfogalmak Algoritmus Tulajdonságai: 1 Az eljárás egyértelműen leírható véges szöveggel. 2 Az eljárás minden lépése ténylegesen kivitelezhető. 3 Az eljárás minden időpontban véges sok tárat használ. 4 Az eljárás véges sok lépésből áll. Következmény: 1 Az algoritmus ugyanarra a bemenetre mindig ugyanazt az eredményt adja. 2 Minden időpontban egyértelműen adott a következő lépés. 2015. február 10. 3 / 32
Adatstruktúra Alapfogalmak Algoritmus Algoritmus adatstruktúra Az algoritmus az elemi műveletek sorozata. Az algoritmus adatok alapján dolgozik. Az adatstruktúra Az elérhető adatok egy szisztematikusan összeállított szerkezete. 2015. február 10. 4 / 32
Jellemzők: Alapfogalmak Algoritmusok analízise Futási idő Elsődleges mérőszám. Az idő az egyik legfontosabb erőforrás. Természetes elvárás a lehető legkisebb időfelhasználás. Tárfelhasználás: Lényeges mérőszám. Hardver függő. Beleférünk-e a tárba, vagy nem. Manapság háttérbe szorul, mivel a memória egyre olcsóbb. Megjegyzés: A futási sebesség és a tárfelhasználás egymásnak ellentmondó követelmények. 2015. február 10. 5 / 32
Futási sebesség Alapfogalmak Algoritmusok analízise Mitől függ? a bementek számátol, a műveletek számától, a kimenetek számától. 2015. február 10. 6 / 32
Futási sebesség Alapfogalmak Algoritmusok analízise Tapasztalati mérések Hasznos, de korlátai vannak: limitált számú teszt bemenet használható, két algoritmus nehezen hasonlítható össze, hacsak nem azonos hardver és szoftver környezetben vizsgáljuk, az algoritmust implementálni és futtatni kell azért, hogy a mérést el lehessen végezni. 2015. február 10. 7 / 32
Futási sebesség Alapfogalmak Algoritmusok analízise Feladatok a tapasztalati méréshez: a lehetséges bemenetek felmérése, az algoritmus hatékonyságának eldöntése, illetőleg összehasonlítása hardver- és szoftver környezettől függetlenül, az algoritmus magas szintű leírása implementáció nélkül. 2015. február 10. 8 / 32
Futási sebesség Alapfogalmak Algoritmusok analízise Komponensek: az implementáció nyelve, a számítási modell, amelyben az algoritmus fut, a mérőszám, amelyben mérjük a futási sebességet, az a megközelítés, amely alapján a futási időt mgehatározzuk, a rekurzív algoritmusokat is. 2015. február 10. 9 / 32
Pszeudó kód Példa: Alapfogalmak Pszeudo kód Algorithm arraymax(a, n): Input: An array A storing n 1 integers. Output: The maximum element in A. currentmax <- A[0] for i <- 1 to n 1 do if currentmax < A[i] then currentmax <- A[i] return currentmax 2015. február 10. 10 / 32
Pszeudó kód Alapfogalmak Pszeudo kód Mi is ez? A pszeudó kód egyfajta keveréke a természetes nyelv(ek)nek és egy magasszintű szabványos programozási nyelvnek. 2015. február 10. 11 / 32
Pszeudó kód Alapfogalmak Pszeudo kód Elemei: Kifejezések: a logikai és matematikai kifejezésekre szabványos matematikai jelölések, Metódusok deklarációja: az algoritmus neve és paraméter lista, Döntési struktúrák: szabványos if, then és else kifejezések, While ciklus: while feltétel do művelet, Repeat ciklus: repeat művelet until feltétel, For ciklus: for változó - inkremens to feltétel do művelet, Tömb indexelés: A[i], Metódus hívás: metodus(argumentumok), Metódus visszatérés: return(változó). 2015. február 10. 12 / 32
Alapfogalmak Pszeudo kód RAM (Random Access Machine) Miért kell: A kisérleti analízis limitált pontosságú és hatékonyságú. Ezért két eljárást nehéz összehasonlítani - főleg futtatás nélkül. Műveleti primitívek: változónak értékadás, metódus hívás, aritmetikai művelet végrehajtása, két szám összehasonlítása, tömb indexelés, objektum referencia kezelése, metódusból visszatérés. 2015. február 10. 13 / 32
Alapfogalmak Pszeudo kód RAM (Random Access Machine) Definíció: feltételezi, hogy a CPU a RAM modellben bármelyik műveleti primitívet véges lépésben végre tudja hajtani. A műveletek nem függnek a bemeneti értékektől. 2015. február 10. 14 / 32
Alapfogalmak Pszeudo kód RAM (Random Access Machine) Számolás a műveleti primitívekkel A példa alapján: A[0]-t a CurrentMax értékkel inicializálja, azi-t ciklusszálálót 1-el inicializálja, mielőtt a ciklustörzsbe belép ellenőrzi, hogy i<n a ciklustörzset n-1-szer végrehajtja, ahol - inedxel, - összehasonlít CurrentMax-al, - A[i]-t esetleg cseréli CurrentMax-al (indexel és értéket ad), visszatér a CurrentMax értékkel. Legalább 2+1+n+ 4(n 1)+1 = 5n Legfeljebb 2+1+n+6(n 1)+1 = 7n 2 2015. február 10. 15 / 32
Alapfogalmak Pszeudo kód Átlagos eset vagy legrosszabb eset Átlagos eset Az átlagos futási sebesség egy adott nagyrészt véletlenszerű bemeneti halmazra vonatkozik és statisztikai vizsgálatokat, illetőleg valószínűség számítási módszereket igényel. A legrosszabb eset A legroszabb (leghosszabb) futási sebesség bemeneti halmaza gyakran egyértelműen megállapítható, így a kalkuláció pontosan elvégezhető. 2015. február 10. 16 / 32
Alapfogalmak Pszeudo kód Rekurzív algoritmusok analízise A példa rekurzív megoldása: Algorithm recursivemax(a,n) Input: An array A storing n 1 itegers. Output: The maximum element in A if n=1 then return A[0] return max{recursivemax(a,n-1),a[n-1]} A futási idő: { 3 ha n = 1. T(n) = T(n 1)+7 egyébként. 2015. február 10. 17 / 32
Alapfogalmak Miért? 1 a pontos meghatározás nagyon munkaigényes, 2 minden egyes magasszintű utasítás számos elemi utasítást tartalmaz, 3 az elemi utasítások száma nem mindig határozható meg (JIT compile), 4 sokszor elegendő egy közelítés is, főleg összehasonlítások esetén. 2015. február 10. 18 / 32
Alapfogalmak Nagy O definíció Legyenek f(n) és g(n) függvények, amelyek nem negatív egészek halmazáról a valós számok halmazára képeznek le. f(n) akkor O(g(n)), ha létezik egy olyan c R, hogy c > 0 és egy n n 0, ahol n, n 0 Z +, hogy n n 0 esetén f(n) c g(n). Ekkor mondjuk, hogy f(n) O(g(n)), vagy f(n) nagy ordo g(n). Példa: 7n 2 az O(n) Bizonyítás: Keressük c > 0 és n 0 1, hogy 7n 2 c n, ha n n 0 -ra. Célszerű választás a c = 7 és az n 0 = 1. 2015. február 10. 19 / 32
Alapfogalmak 20n 3 + 10n log n+5 az O(n 3 ) 20n 3 + 10n log n+5 35n 3 n 1 Megjegyzés: Minden a k n k + a k 1 n k 1 + +a 1 n+a 0 polinóm az O(n k ). 3 log n+ log log n az O(log n) 3 log n+ log log n 4 log n, ha n 2 2 100 az O(1) 2 100 2 100, ha n 1 5n log n+2n az O(n log n) 5n log n+2n 7n log n, ha n 2 2015. február 10. 20 / 32
Alapfogalmak Szabályok: 1 ha d(n) az O(f(n)), akkor ad(n) szintén O(f(n)) minden a > 0-ra, 2 ha d(n) az O(f(n)) és e(n) az O(g(n)), akkor d(n)+e(n) az O(f(n)+g(n)), 3 ha d(n) az O(f(n)) és e(n) az O(g(n)), akkor d(n) e(n) az O(f(n) g(n)), 4 ha d(n) az O(f(n)), akkor f(n) az O(g(n)), 5 ha a k n k + a k 1 n k 1 + +a 1 n+a 0, akkor f(n) az O(n k ), 6 ha f(n) = n x, akkor O(a n ), bármilyen rögzített x > 0 és a > 1-re, 7 ha log n x az O(log n) bármilyen rögzített x > 0-ra, 8 ha log x n az O(n y ) bármilyen rögzített x > 0 és y > 1-re. 2015. február 10. 21 / 32
Alapfogalmak Példa: 2n 3 + 4n 2 log n az O(n 3 ) log n az O(n), 8. szabály, 4n 2 log n az O(4n 3 ), 3. szabály, an 3 + 4n 2 log n az O(2n 3 + 4n 3 ), 2. szabály, 2n + 4n 3 az O(n 3 ), 5. és 1. szabály, 2n 3 + 4n 2 log n az O(n 3 ), 4. szabály. 2015. február 10. 22 / 32
Alapfogalmak Terminológia: O(log n) logaritmikus, O(n) lineáris, O(n 2 ) kvadratikus, O(n k ) polinomiális (k 1), O(a n ) exponenciális (a > 1) 2015. február 10. 23 / 32
Alapfogalmak Ω jelölés Legyenek f(n) és g(n) függvények, amelyek nem negatív egészek halmazáról a valós számok halmazára képeznek le. f(n) akkor Ω(g(n)), ha g(n) O(f(n)), amely szerint létezik olyan c > 0 valós konstans és egy n n 0 (n 0 1) egész küszöbszám, amelyre igaz az, hogy f(n) cg(n) n n 0. Ez a definíció lehetővé teszi, hogy két algoritmus egy adott c konstans erejéig aszomptotikusan egyenlőek, illetve összehasonlíthatóak. Θ jelölés Legyenek f(n) és g(n) függvények, amelyek nem negatív egészek halmazáról a valós számok halmazára képeznek le. f(n) akkor Ω(g(n)), ha g(n) O(f(n)), amely szerint léteznek olyan c > 0 és c > 0 valós konstansok és egy n n 0 (n 0 1) egész küszöbszám, amelyre igaz az, hogy c g(n) f(n) c g(n) n n 0. 2015. február 10. 24 / 32
Alapfogalmak Kis o definíció Legyenek f(n) és g(n) függvények, amelyek nem negatív egészek halmazáról a valós számok halmazára képeznek le. f(n) akkor o(g(n)), ha bármely olyan c R + és egy n n 0, ahol n, n 0 Z 0,+, hogy n n 0 esetén f(n) c g(n). Ekkor mondjuk, hogy f(n) az o(g(n)), vagy f(n) kis ordo g(n). ω definíció Akkor mondjuk, hogy f(n) az ω(g(n)), ha g(n) az o(f(n)), vagyis ha bármely olyan c R + és egy n n 0, ahol n, n 0 Z 0,+, hogy n n 0 esetén g(n) c f(n). Megjegyzés: o( ) analóg a kisebb egyenlő, az ω( ) analóg a nagyobb aszimptótikus közelítéssel. 2015. február 10. 25 / 32
Alapfogalmak f(n) = 12n 2 + 6n az o(n 3 ) és ω(n) 1 fn(n) az o(n 3 ) legyen c > 0 ebből n 0 = (12+6)/c = 18/c 18 < cn n n 0, ebből f(n) = 12n 2 + 6n 12n 2 + 6n 2 = 18n 2 cn 3. Tehát f(n) az o(n 3 ). 2 f(n) az ω(n) legyen c > 0 ebből n 0 = c/12 egy n n 0 12n c, így f(n) = 12n 2 + 6n 12n 2 cn. Tehát f(n) az ω(n). Megjegyzés: Vagis f(n) akkor és csak akkor o(g(n)), ha f(n) lim n g(n) = 0 2015. február 10. 26 / 32
Összegzés Alapfogalmak Matematikai áttekintés Definíció: b f(i) = f(a)+f(a+1)+f(a+2)+ +f(b) i=a Gyakori!! Ha ciklussal dolgozunk, akkor a futásidő lineárisan nő. Ezért jó tudni, hogy: n i=0 ai = 1+a+a 2 + +a n = 1+an+1, ha a > 0, 1 a n 1 i=0 = 1+2+4+8+ +2n 1 = 2 n 1, n n(n+1) i=1 = 1+2+3+4+ +n 1+n =, ha n 1, 2 2015. február 10. 27 / 32
Esettanulmány Alapfogalmak Matematikai áttekintés Egyszerű részösseg algoritmus s j,k = a j + a j+1 + +a k = Algorithm MaxsubSlow(A): Input: An n-element array A of numbers, indexed from 1 to n. Output: The maximum subarray sum of array A. m 0 // the maximum found so far for j 1 to n do for k j to n do s 0 // the next partial sum we are computing for i j to k do s s + A[i] if s > m then m s return m Ez O(n 3 ). k i=j a i 2015. február 10. 28 / 32
Esettanulmány Alapfogalmak Matematikai áttekintés Javított részösszeg algoritmus Input: An n-element array A of numbers, indexed from 1 to n. Output: The maximum subarray sum of array A. S 0 0 // the initial prefix sum for i 1 to n do S i S i1 + A[i] m 0 // the maximum found so far for j 1 to n do for k j to n do s = S k - S jx1 if s > m then m s return m Ez O(n 2 ). 2015. február 10. 29 / 32
Esettanulmány Alapfogalmak Matematikai áttekintés Lineáris idejű részösszeg algoritmis M t = max{0, M t 1 + A[t]} Algorithm MaxsubFastest(A): Input: An n-element array A of numbers, indexed from 1 to n. Output: The maximum subarray sum of array A. M0 0 // the initial prefix maximum for t 1 to n do M t max{0, M t1 + A[t]} m 0 // the maximum found so far for t 1 to n do m max{m, M t} return m Ez O(n) 2015. február 10. 30 / 32
Alapfogalmak Matematikai áttekintés 2015. február 10. 31 / 32
Alapfogalmak Matematikai áttekintés 2015. február 10. 32 / 32