Dekompozice problému, rekurze

Rozměr: px
Začít zobrazení ze stránky:

Download "Dekompozice problému, rekurze"

Transkript

1 Dekompozice problému, rekurze BI-PA1 Programování a Algoritmizace 1 Ladislav Vagner, Josef Vogel Katedra teoretické informatiky a Katedra softwarového inženýrství Fakulta informačních technologíı České vysoké učení technické v Praze xvagner@fit.cvut.cz, vogeljos@fit.cvut.cz 5. prosince 2016 a 8. prosince 2016

2 Přehled Dekompozice problému. Rekurze. Rekurze a efektivita. Rekurze příklady. Algoritmus merge sort. L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 2/43

3 Dekompozice problému Návrh programu dekompozice problému: pokusíme se rozložit komplexní problém (výsledný program) na jednodušší problémy (podproblémy), užitím pseudokódu (abstraktní příkazy) vyřešíme podproblémy, užitím abstraktních příkazů vytvoříme obrys celého řešení, pro implementaci abstraktních příkazů použijeme funkce. Rozklad problému bude ukázán na variantě hry NIM: je dán celkový počet zápalek (kamenů,... ), např , hráč se střídá se strojem v odebírání, je možno odebrat 1, 2 nebo 3 zápalky, prohraje ten, kdo odebere poslední zápalku. L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 3/43

4 Dekompozice problému Návrh programu dekompozice problému: pokusíme se rozložit komplexní problém (výsledný program) na jednodušší problémy (podproblémy), užitím pseudokódu (abstraktní příkazy) vyřešíme podproblémy, užitím abstraktních příkazů vytvoříme obrys celého řešení, pro implementaci abstraktních příkazů použijeme funkce. Rozklad problému bude ukázán na variantě hry NIM: je dán celkový počet zápalek (kamenů,... ), např , hráč se střídá se strojem v odebírání, je možno odebrat 1, 2 nebo 3 zápalky, prohraje ten, kdo odebere poslední zápalku. Podproblémy: Inicializace zadání počtu zápalek, odebrání zápalek hráčem, odebrání zápalek strojem. L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 3/43

5 Hra NIM návrh int početzápalek; bool strojnatahu = false; /* zatím abstraktně */ zadání_počtu_zápalek do { if ( strojnatahu ) hraje_počítač else hraje_člověk strojnatahu =! strojnatahu; while ( početzápalek > 0 ); if ( strojnatahu ) stroj_vyhrál; else člověk_vyhrál L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 4/43

6 Hra NIM implementace (kostra programu) int totalmatches; bool computerturn = false; /* bool budeme definovat */ /*... */ int main ( void ) { gamesetup (); do { if ( computerturn ) computerplayer (); else humanplayer (); computerturn =! computerturn; while ( totalmatches > 0 ); if ( computerturn ) printf("vyhral jsem!\n"); else printf("tys vyhral, gratuluji\n" ); return 0; L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 5/43

7 Hra NIM implementace (zadání počtu zápalek) void gamesetup ( void ) { printf ( "Napis pocet zapalek:\n" ); do { scanf ( "%d", &totalmatches ); /* špatně zadaný počet zápalek neřešíme */ while ( totalmatches < 15 totalmatches > 35 ); L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 6/43

8 Hra NIM implementace (hraje člověk) void humanplayer ( void ) { int taken; bool error; printf ( "%d zapalek. Kolik odeberes?\n", totalmatches ); do { scanf ( "%d", &taken ); error = false; if ( taken < 1 ) { error = true; printf ( "nejmene jedna musi byt odebrana!\n" ); if ( taken > 3 taken > totalmatches ) { error = true; printf ( "prilis mnoho odebrano!\n" ); while ( error ); totalmatches -= taken; L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 7/43

9 Hra NIM implementace (hraje stroj) Počet zápalek nevýhodný pro protihráče je 1, 5, 9,..., obecně 4n + 1 zápalek: Když je počet zápalek 4n + 1 a hráč odebere a = 1, 2, 3 zápalky, tak inteligentní protihráč odebere b = 3, 2, 1 zápalek, po dvou kolech je počet zápalek zmenšen o 4 na 4(n 1) + 1, tudíž počet zápalek je zmenšen na 1 po 2n kolech a protihráč prohrává. Když zbývá p zápalek, stroj odebírá x zápalek aby platilo: p x = 4n + 1 x = (p 1) mod 4 Když z formule vyjde x = 0, tak je to stav pro stroj nevýhodný. Pak stroj prohraje, pokud člověk zná správnou strategii, Tak když x = 0, stroj odebere x = 1 zápalku doufaje, že lidský protihráč udělá chybu. L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 8/43

10 Hra NIM implementace (hraje stroj) void computerplayer ( void ) { int taken; taken = ( totalmatches - 1 ) % 4; if ( taken == 0 ) taken = 1; printf ( "%d zapalek. Stroj odebira %d.\n", totalmatches, taken ); totalmatches -= taken; L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 9/43

11 Hra NIM implementace (typ bool) V jazyce C neexistuje datový typ bool. Tento typ můžeme definovat takto: #define bool char #define true 1 #define false 0 po této definici všechny výskyty bool, true, a false jsou nahrazeny char, 1, a 0. Proto: bool computerturn = false; /* tato deklarace je zpracována preprocesorem kompilátoru na: */ char computerturn = 0; L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 10/43

12 Hra NIM implementační poznámka Implementace používá globální proměnnou totalmatches a computerturn. Použití globálních proměnných není dobrá technika: je příčinou problémů ve vícevláknových programech, je příčinou problémů s rekurzivními/reentrantními funkcemi, údržba a integrace software je složitější. Proměnná computerturn se používá jedině ve funkci main a dát ji sem jako lokální je triviální úprava. Proměnná totalmatches je použita pro předání informace mezi funkcemi. Místo globální proměnné lze užít vstupní parametr a návratovou hodnotu (nebo alternativně použít jako parametr referenci in/out parametr). Funkce gamesetup vrátí počet zápalek jako návratovou hodnotu, funkce computerplayer a humanplayer použijí počet zápalek jako in/out parametr. L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 11/43

13 Rekurze Rekurze: viz Rekurze. L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 12/43

14 Rekurze Rekurze: viz Rekurze. tato vtipná definice bývá dávána do knih o programování, ukazuje však spíše na nepochopení rekurze ze strany autora knihy. Rekurze: pokud neznáte význam tohoto pojmu, pokračujte pojmem Rekurze. L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 12/43

15 Rekurze Rekurze: viz Rekurze. tato vtipná definice bývá dávána do knih o programování, ukazuje však spíše na nepochopení rekurze ze strany autora knihy. Rekurze: pokud neznáte význam tohoto pojmu, pokračujte pojmem Rekurze. Nepřímá rekurze: pokud neznáte význam tohoto pojmu, pokračujte pojmem Rekurzivní volání. Rekurzivní volání: pokud neznáte význam tohoto pojmu, pokračujte pojmem Nepřímá rekurze. L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 12/43

16 Rekurze Rekurze je takový způsob programování, kde funkce k vyřešení problému volá sebe sama. Pro použití rekurze musí být splněny dvě obecné podmínky: rekurzivní volání řeší menší (jednodušší) instanci původního problému, existuje nějaká triviální (jednoduchá) instance problému, kde rekurze končí. Příklad rekurzivního algoritmu výpočet faktoriálu: 0! = 1 n! = 1 pro záporné n, n! = n (n 1)! pro kladné n. L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 13/43

17 Rekurze příklady Faktoriál iterativně: int factorialiter ( int n ) { int f = 1; while ( n > 1) { f *= n; n--; return f; Faktoriál rekurzivně: int factorialrec ( int n ) { if ( n <= 1 ) return 1; return n * factorialrec ( n - 1 ); L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 14/43

18 Rekurze příklady Iterativní algoritmus nalezení největšího společného dělitele: int gcd (int x, int y) { int remainder; while( y!= 0 ) { remainder = x % y; x = y; y = remainder; return x; Kolik iterací se provede? L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 15/43

19 Rekurze příklady Iterativní algoritmus nalezení největšího společného dělitele: int gcd (int x, int y) { int remainder; while( y!= 0 ) { remainder = x % y; x = y; y = remainder; return x; Kolik iterací se provede? Necht x y > 0. Pak x mod y < x 2. Důkaz: y x 2. Pak nerovnost platí z definice. y > x 2. Pak x mod y = x y < x 2. Proto je hodnota max(x, y) půlena každé dvě iterace, což vede na 2 log 2 (max(x, y)) iterací. L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 15/43

20 Rekurze příklady Rekurzivní algoritmus nalezení největšího společného dělitele: int gcd ( int x, int y ) { if ( x == y ) return x; if ( x > y ) return gcd ( x % y, y ); else return gcd ( x, y % x ); L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 16/43

21 Rekurze a dekompozice problému Problém: přečíst sekvenci celých čísel zakončenou 0, vypsat sekvenci v obráceném pořadí. Dekompozice: obrácení sekvence může být dekomponováno na zpracování prvního prvku a obrácení zbytku sekvence: obrat ( x <rest> ) = obrat ( <rest> ) x. my použijeme abstraktní příkaz obrat, ten obrátí zbytek sekvence ze vstupu, příkaz bude obsahovat tři kroky: 1 čtení čísla x sekvence ze vstupu, 2 obrácení zbytku sekvence reverse, 3 výpis x. L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 17/43

22 Rekurze a dekompozice problému Postup při výpisu sekvence v obráceném pořadí: stack: x=1 Input: Output: L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 18/43

23 Rekurze a dekompozice problému Postup při výpisu sekvence v obráceném pořadí: stack: x=1 x=7 Input: Output: L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 18/43

24 Rekurze a dekompozice problému Postup při výpisu sekvence v obráceném pořadí: stack: x=1 x=7 x=4 Input: Output: L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 18/43

25 Rekurze a dekompozice problému Postup při výpisu sekvence v obráceném pořadí: stack: x=1 x=7 x=4 x=9 Input: 9 0 Output: L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 18/43

26 Rekurze a dekompozice problému Postup při výpisu sekvence v obráceném pořadí: write x stack: x=1 x=7 x=4 x=9 x=0 Input: Output: 0 0 L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 18/43

27 Rekurze a dekompozice problému Postup při výpisu sekvence v obráceném pořadí: write x write x stack: x=1 x=7 x=4 x=9 x=0 Input: Output: 0 9 L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 18/43

28 Rekurze a dekompozice problému Postup při výpisu sekvence v obráceném pořadí: write x write x write x stack: x=1 x=7 x=4 x=9 x=0 Input: Output: L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 18/43

29 Rekurze a dekompozice problému Postup při výpisu sekvence v obráceném pořadí: write x write x write x stack: x=1 x=7 x=4 x=9 x=0 write x Input: Output: L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 18/43

30 Rekurze a dekompozice problému Postup při výpisu sekvence v obráceném pořadí: write x write x write x stack: x=1 x=7 x=4 x=9 x=0 write x write x Input: Output: L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 18/43

31 Rekurze a dekompozice problému #include <stdio.h> void reverse( void ) { int x; scanf ( "%d", &x ); if ( x!= 0 ) reverse (); printf ( "%d ", x ); int main( void ) { printf ( "Napis cisla zakoncena 0:\n" ); reverse (); printf ( "\n" ); return 0; L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 19/43

32 Rekurze a dekompozice problému Hanojské věže Zlaté disky jsou na koĺıku #1, Disky mohou být přesouvány jen po jednom. Disk může být přesunut na kterýkoli prázdný koĺık nebo na koĺık s větším diskem (disky). Disky nemohou být umístěny mimo koĺıky. Úlohou je přemístit věž z koĺıku #1 na koĺık #2. L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 20/43

33 Rekurze a dekompozice problému Hanojské věže Dekompozice definujeme abstraktní příkaz přesuň věž ( n, x, y, z ). Význam je tento: Přesun věže výšky n z koĺıku x na koĺık y s pomocí přechodného uložení na koĺıku z. Příkaz rozložíme na tři kroky: přesuň věž ( n-1, x, z, y ), přesun disku z koĺıku x na koĺık y přesuň věž ( n-1, z, y, x ). L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 21/43

34 Rekurze a dekompozice problému Hanojské věže #include <stdio.h> void movetower ( int h, int from, int to, int tmp ) { if ( h > 0 ) { movetower ( h-1, from, tmp, to ); printf ( "presun disku z %d na %d\n", from, to ); movetower ( h-1, tmp, to, from ); int main( void ) { int disks; printf ( "Napis pocet disku:\n" ); scanf ( "%d", &disks ); if ( disks > 0 ) movetower ( disks, 1, 2, 3 ); else /*... ošetření chyby... */ return 0; L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 22/43

35 Rekurze a efektivita Rekurzivní funkce jsou přímou implementací rekurzivních algoritmů: rekurzivní algoritmy pracují způsobem shora dolů, triviální instance problému je implementována přímo, rekurzivní volání se použije pro řešení obecné instance problému. Rekurzivní funkce jsou obvykle krátké, přímočaré a snadno srozumitelné. Rekurzivní funkce mají sklon k jisté neefektivnosti. Například stejné jednodušší problémy mohou být řešeny mnohokrát. Mnohé rekurzivní algoritmy mohou být nahrazeny iterativními (např. faktoriál, gcd,... ). Iterativní algoritmy obvykle pracují způsobem zdola nahoru, od instance jednoduchého problému ke komplexnější instanci problému. L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 23/43

36 Fibonacciho posloupnost Pingala (Chhandah-shastra, the Art of Prosody, 450 or 200 př.n.l.) Leonardo Pisano (Leonardo z Pisy), známý jako Fibonacci (cca ) kráĺıci. Henry E. Dudeney ( ) krávy. Když má kráva první tele ve věku 2 let a pak každý rok, kolik krav to bude ve 12 letech (žádní býci, žádná kráva nezemře)? počet krav = počet krav vloni + nově narozené (tj. počet krav předloni) f n = f n 1 + f n 2, f 1 = 1, f 2 = 1. n f n n f n n f n L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 24/43

37 Fibonacciho posloupnost int fibonacci ( int n ) { if ( n <= 2 ) return 1; return fibonacci ( n - 1 ) + fibonacci ( n - 2 ); Rekurzivní řešení je krátké a jednoduché. Kód přímo koresponduje s rekurentní definicí. Je také efektivní? L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 25/43

38 Fibonacciho posloupnost int fibonacci ( int n ) { int i, fn = 1, fn1 = 1, fn2 = 1; for ( i = 2; i <= n; i ++ ) { fn2 = fn1; fn1 = fn; fn = fn2 + fn1; return fn; Iterativní řešení je poněkud delší. Kód počítá Fibonacciho čísla zdola nahoru (od f 2, f 3,... ). Je efektivní? L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 26/43

39 Fibonacciho posloupnost int fibonacci ( int n ) { int i, fn = 1, fn1 = 1, fn2 = 1; for ( i = 2; i <= n; i ++ ) { fn2 = fn1; fn1 = fn; fn = fn2 + fn1; return fn; Iterativní řešení je poněkud delší. Kód počítá Fibonacciho čísla zdola nahoru (od f 2, f 3,... ). Je efektivní? Kód provádí n iterací, tj. 3 n sčítání/přiřazení. L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 26/43

40 Fibonacciho posloupnost Iterativní řešení: 3 n operací. Rekurzivní řešení: L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 27/43

41 Fibonacciho posloupnost Iterativní řešení: 3 n operací. Rekurzivní řešení: f (10) f (9) f (8) f (8) f (7) f (7) f (6) f (7) f (6) f (6) f (5) f (6) f (5) f (5) f (4) Rekurzivní řešení: exponenciální složitost L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 27/43

42 Fibonacciho posloupnost Iterativní řešení: 3 n operací. Rekurzivní řešení: přibližně 2 n operací. Přímý výpočet (J. Kepler): Zlatý řez ϕ: ϕ = Fibonacciho číslo: f n = ϕn (1 ϕ) n 5 L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 28/43

43 Rekurze násobení /* Iterativní celočíselné násobení, x >= 0 */ int muliter ( int x, int y ) { int res = 0, i; for ( i = 0; i < x; i ++ ) res += y; return res; /* Rekurzivní celočíselné násobení, x >= 0 */ int mulrec ( int x, int y ) { if ( x == 0 ) return 0; return y + mulrec ( x - 1, y ); L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 29/43

44 Rekurze faktorizace void factorizeiter ( int x ) { int d = 2; while ( d <= x ) { if ( x % d == 0 ) { printf ( "%d ", d ); x /= d; else d ++; L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 30/43

45 Rekurze faktorizace void factorizerec ( int x ) { int d = 2; while ( d <= x ) { if ( x % d == 0 ) { printf ( "%d ", d ); factorizerec ( x / d ); return; else d ++; L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 31/43

46 Rekurze faktorizace void factorizerec ( int x ) { int d = 2; while ( d <= x ) { if ( x % d == 0 ) { printf ( "%d ", d ); factorizerec ( x / d ); return; else d ++; /* každé volání začíná od d = 2 */ L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 31/43

47 Rekurze faktorizace void factorizerec2 ( int x, int d ) { if ( d <= x ) { while ( d < x && x % d!= 0 ) d++; printf ( "%d ",d ); factorizerec2 ( x / d, d ); L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 32/43

48 Merge sort Jednoduché řadicí algoritmy mají složitost T (n) O(n 2 ). Kvadratická časová složitost je zbytečně velká. Efektivní řadicí algoritmy řadí v čase T (n) O(n log n). Řazení slučováním je takový algoritmus. Algoritmus Merge sort je založen na operaci slučování. Může být popsán rekurzivně: pole o velikosti jednoho prvku je seřazené, když má pole více prvků, rozděĺı se na dvě části (poloviny). merge sort je užit rekurzivně pro seřazení obou částí, obě části se sloučí do většího pole. L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 33/43

49 Merge sort pole: rozdělení: řazení polovin: sloučení: L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 34/43

50 Slučování (merge) Problém: Necht a a b jsou seřazené sekvence. Máme vytvořit seřazenou sekvenci c takovou, že obsahuje všechny prvky z a i z b. Příklad: a: b: c: Když a a b jsou pole, můžeme připravit funkci, která je sloučí: void merge ( int *a, int la, int *b, int lb, int *c ); Jak sloučit sekvence? Zkopírovat a do c, přidat b do c a seřadit pole c. Ne to by bylo neefektivní. L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 35/43

51 Slučování efektivně přečíst první prvek obou sekvencí a a b, přidat menší (nebo stejnou) z prvků do c, přečíst další prvek sekvence, ze které bylo přidáno, předchozí kroky opakovat až do vyčerpání jedné ze sekvencí, přidat zbytek nevyčerpané sekvence na konec c. void merge( int *a, int na, int * b, int nb, int *c ) { int ia = 0, ib = 0, ic = 0; while ( ia < na && ib < nb ) if ( a[ia] <= b[ib] ) c[ic++] = a[ia++]; else c[ic++] = b[ib++]; while (ia < na) c[ic++] = a[ia++]; while (ib < nb) c[ic++] = b[ib++]; L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 36/43

52 Merge sort void merge ( int *src, int *dst, int l, int r, int rend ) { int lend = r - 1, i = l; while ( l <= lend && r <= rend ) dst[i++] = src[l] <= src[r]? src[l++] : src[r++]; while ( l <= lend) dst[i++] = src[l++]; while ( r <= rend) dst[i++] = src[r++]; src dst l r rend L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 37/43

53 Merge sort (rekurzivně) void mergesortrec( int *a, int *tmp, int l, int r ) { int i, mid; if ( l == r) return; /* 1 prvek -> seřazeno */ mid = ( l + r ) / 2; mergesortrec ( a, tmp, l, mid ); mergesortrec ( a, tmp, mid + 1, r ); merge ( a, tmp, l, mid+1, r ); for ( i = l; i <= r; i ++ ) a[i] = tmp[i]; /* Výsledná řadicí funkce */ void mergesort ( int *a, int n ) { int *tmp = (int*)malloc ( n * sizeof( *tmp ) ); mergesortrec( a, tmp, 0, n-1 ); free ( tmp ); L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 38/43

54 Merge sort (iterativně) Rekurzivní funkce merge sort volá sebe sama opakovaně, až je délka seřazeného pole 1. Z tohoto pohledu jsou krátké rozdělené sekvence slučovány do delších. Sekvence jsou sloučeny do pomocného pole, které musí být zkopírováno zpět do zdrojového pole. Iterativní merge sort pracuje zdola nahoru: pole a je rozděleno na sekvence délky 1, sekvence jsou sloučeny do pole tmp (seřazené sekvence 2 prvků), v další iteraci jsou sekvence délky 2 z pole tmp sloučeny do sekvencí v poli a (sekvence 4 seřazených prvků), a znova v další iteraci jsou sekvence délky 4 z a sloučeny do pole tmp (sekvence 8 seřazených prvků), to pokračuje, až je celé pole seřazeno, je-li počet sloučení lichý, je výsledek v poli tmp. V tomto případě je třeba ještě další krok data musí být zkopírována zpět do pole a. L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 39/43

55 Merge sort (iterativně) a tmp a tmp a tmp L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 40/43

56 Merge sort (iterativně) void mergesort ( int *a, int n ) { int *tmp = (int*)malloc ( n * sizeof(*tmp) ), *src = a, *dst = tmp, *x; int len = 1, last = n-1, i; while ( len < n ) { int l = 0, r = len; while (l <= last ) { merge ( src, dst, l, min(r, n), min(r+len-1, last) ); l += 2 * len; r += 2 * len; len *= 2; x = src; src = dst; dst = x; if ( src!= a ) for ( i = 0; i < n; i ++ ) a[i] = tmp[i]; free ( tmp ); L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 41/43

57 Merge sort Analýza složitosti algoritmu Merge sort: n Vnitřní cyklus proběhne 2 len krát. Ten volá funkci merge pro vytvoření sekvence délky (nejvíce) len + len. Tudíž, časová n složitost je 2 len 2 len = n, vnější cyklus iteruje, až do hodnoty len == n. Hodnota len se zdvojnásobí v každé iteraci, a tak je počet iterací k, kde 2 k = n, k je tedy k = log 2 (n), případný poslední kopírující krok trvá dobu úměrnou n, celkový čas: T (n) O(n log n + n) O(n log n) Nevýhodou tohoto algoritmu je potřeba pomocného pamět ového prostoru. Jiné řadicí algoritmy (např. Quick sort) toto omezení nemají. L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 42/43

58 Otázky a odpovědi Otázky... L. Vagner, J. Vogel, ČVUT FIT Rekurze, BI-PA1 43/43

Rozklad problému na podproblémy, rekurze

Rozklad problému na podproblémy, rekurze Příprava studijního programu Informatika je podporována projektem financovaným z Evropského sociálního fondu a rozpočtu hlavního města Prahy. Praha & EU: Investujeme do vaší budoucnosti Rozklad problému

Více

Rozklad problému na podproblémy, rekurze

Rozklad problému na podproblémy, rekurze Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Rozklad problému na podproblémy, rekurze BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky Miroslav Balík Fakulta informačních

Více

5. přednáška - Rozklad problému na podproblémy

5. přednáška - Rozklad problému na podproblémy 5. přednáška - Rozklad problému na podproblémy Obsah přednášky: Rozklad problému na podproblémy. Rekurze. Algoritmizace (Y36ALG), Šumperk - 5. přednáška 1 Rozklad problému na podproblémy Postupný návrh

Více

Rozklad problému na podproblémy

Rozklad problému na podproblémy Rozklad problému na podproblémy Postupný návrh programu rozkladem problému na podproblémy zadaný problém rozložíme na podproblémy pro řešení podproblémů zavedeme abstraktní příkazy s pomocí abstraktních

Více

8. Rekurze. doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

8. Rekurze. doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 1 Základy algoritmizace 8. Rekurze doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Jiří Vokřínek,

Více

4. Rekurze. BI-EP1 Efektivní programování Martin Kačer

4. Rekurze. BI-EP1 Efektivní programování Martin Kačer 4. Rekurze BI-EP1 Efektivní programování 1 ZS 2011/2012 Ing. Martin Kačer, Ph.D. 2010-11 Martin Kačer Katedra teoretické informatiky Fakulta informačních technologií České vysoké učení technické v Praze

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Procedurální programování Rekurze Jazyk C České vysoké učení technické Fakulta elektrotechnická Ver.1.10 J. Zděnek 2015 Procedurální programování - zásady Postupný návrh programu

Více

Rekurze. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Rekurze. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12. Rekurze doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 12. září 2016 Jiří Dvorský (VŠB TUO) Rekurze 161 / 344 Osnova přednášky

Více

Funkce, procedury, složitost

Funkce, procedury, složitost Funkce, procedury, složitost BI-PA1 Programování a Algoritmizace 1 Miroslav Baĺık, Ladislav Vagner a Josef Vogel Katedra teoretické informatiky a Katedra softwarového inženýrství Fakulta informačních technologíı

Více

Rekurzivní algoritmy

Rekurzivní algoritmy Rekurzivní algoritmy prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní algoritmy (BI-EFA) ZS

Více

Příkazy if, while, do-while, for, switch

Příkazy if, while, do-while, for, switch Příkazy if, while, do-while, for, switch BI-PA1 Programování a Algoritmizace 1 Ladislav Vagner, Josef Vogel Katedra teoretické informatiky a Katedra softwarového inženýrství Fakulta informačních technologíı

Více

Funkce, intuitivní chápání složitosti

Funkce, intuitivní chápání složitosti Příprava studijního programu Informatika je podporována projektem financovaným z Evropského sociálního fondu a rozpočtu hlavního města Prahy. Praha & EU: Investujeme do vaší budoucnosti Funkce, intuitivní

Více

5. Dynamické programování

5. Dynamické programování 5. Dynamické programování BI-EP1 Efektivní programování 1 ZS 2011/2012 Ing. Martin Kačer, Ph.D. 2010-11 Martin Kačer Katedra teoretické informatiky Fakulta informačních technologií České vysoké učení technické

Více

IB111 Úvod do programování skrze Python

IB111 Úvod do programování skrze Python Vyhledávání, řazení, složitost IB111 Úvod do programování skrze Python 2012 Otrávené studny 8 studen, jedna z nich je otrávená laboratorní rozbor dokáže rozpoznat přítomnost jedu ve vodě je drahý (je časově

Více

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr Funkce pokročilé možnosti Úvod do programování 2 Tomáš Kühr Funkce co už víme u Nebo alespoň máme vědět... J u Co je to funkce? u Co jsou to parametry funkce? u Co je to deklarace a definice funkce? K

Více

BI-PA1 Programování a Algoritmizace 1. Miroslav Baĺık, Ladislav Vagner a Josef Vogel. 7., 9. a 10. listopadu 2017

BI-PA1 Programování a Algoritmizace 1. Miroslav Baĺık, Ladislav Vagner a Josef Vogel. 7., 9. a 10. listopadu 2017 Pole, Řetězce BI-PA1 Programování a Algoritmizace 1 Miroslav Baĺık, Ladislav Vagner a Josef Vogel Katedra teoretické informatiky a Katedra softwarového inženýrství Fakulta informačních technologíı České

Více

Časová složitost algoritmů, řazení a vyhledávání

Časová složitost algoritmů, řazení a vyhledávání Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Časová složitost algoritmů, řazení a vyhledávání BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky Miroslav Balík Fakulta

Více

Algoritmy. BI-PA1 Programování a Algoritmizace I. Ladislav Vagner

Algoritmy. BI-PA1 Programování a Algoritmizace I. Ladislav Vagner Algoritmy BI-PA1 Programování a Algoritmizace I. Ladislav Vagner Katedra teoretické informatiky Fakulta informačních technologíı ČVUT v Praze xvagner@fit.cvut.cz 3. října 2016 a 4. října 2016 Kontakt místnost

Více

Základy algoritmizace 4. Problémy, algoritmy, data

Základy algoritmizace 4. Problémy, algoritmy, data Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 4 1 Základy algoritmizace 4. Problémy, algoritmy, data doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

Více

Mělká a hluboká kopie

Mělká a hluboká kopie Karel Müller, Josef Vogel (ČVUT FIT) Mělká a hluboká kopie BI-PA2, 2011, Přednáška 5 1/28 Mělká a hluboká kopie Ing. Josef Vogel, CSc Katedra softwarového inženýrství Katedra teoretické informatiky, Fakulta

Více

Abstraktní datové typy

Abstraktní datové typy Karel Müller, Josef Vogel (ČVUT FIT) Abstraktní datové typy BI-PA2, 2011, Přednáška 10 1/27 Abstraktní datové typy Ing. Josef Vogel, CSc Katedra softwarového inženýrství Katedra teoretické informatiky,

Více

Ukazatele #1, struktury

Ukazatele #1, struktury Ukazatele #1, struktury BI-PA1 Programování a Algoritmizace 1 Miroslav Baĺık, Ladislav Vagner a Josef Vogel Katedra teoretické informatiky a Katedra softwarového inženýrství Fakulta informačních technologíı

Více

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21. Vyhledávání doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 21. září 2018 Jiří Dvorský (VŠB TUO) Vyhledávání 242 / 433 Osnova přednášky

Více

Abstraktní datové typy, moduly

Abstraktní datové typy, moduly Abstraktní datové typy, moduly BI-PA1 Programování a Algoritmizace 1 Miroslav Baĺık, Ladislav Vagner a Josef Vogel Katedra teoretické informatiky a Katedra softwarového inženýrství Fakulta informačních

Více

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace Programování: základní konstrukce, příklady, aplikace IB111 Programování a algoritmizace 2011 Připomenutí z minule, ze cvičení proměnné, výrazy, operace řízení výpočtu: if, for, while funkce příklady:

Více

Jazyk C++, některá rozšíření oproti C

Jazyk C++, některá rozšíření oproti C Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 1/22 Jazyk C++, některá rozšíření oproti C Ing. Josef Vogel, CSc Katedra softwarového inženýrství Katedra

Více

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů Začínáme vážně programovat Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů Podmínky a cykly Dokončení stručného přehledu řídících struktur jazyka C. Složený příkaz, blok Pascalské

Více

V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto:

V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto: 20. Programovací techniky: Abstraktní datový typ, jeho specifikace a implementace. Datový typ zásobník, fronta, tabulka, strom, seznam. Základní algoritmy řazení a vyhledávání. Složitost algoritmů. Abstraktní

Více

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr Seminář z IVT Algoritmizace Slovanské gymnázium Olomouc Tomáš Kühr Algoritmizace - o čem to je? Zatím jsme se zabývali především tím, jak určitý postup zapsat v konkrétním programovacím jazyce (např. C#)

Více

VYŠŠÍ ODBORNÁ ŠKOLA a STŘEDNÍ PRŮMYSLOVÁ ŠKOLA Mariánská 1100, 407 47 Varnsdorf PROGRAMOVÁNÍ FUNKCE, REKURZE, CYKLY

VYŠŠÍ ODBORNÁ ŠKOLA a STŘEDNÍ PRŮMYSLOVÁ ŠKOLA Mariánská 1100, 407 47 Varnsdorf PROGRAMOVÁNÍ FUNKCE, REKURZE, CYKLY Jméno a příjmení: Školní rok: Třída: VYŠŠÍ ODBORNÁ ŠKOLA a STŘEDNÍ PRŮMYSLOVÁ ŠKOLA Mariánská 1100, 407 47 Varnsdorf 2007/2008 VI2 PROGRAMOVÁNÍ FUNKCE, REKURZE, CYKLY Petr VOPALECKÝ Číslo úlohy: Počet

Více

Rekurze a rychlé třídění

Rekurze a rychlé třídění Rekurze a rychlé třídění Jan Kybic http://cmp.felk.cvut.cz/~kybic kybic@fel.cvut.cz 2016 2017 1 / 54 Rekurze Rychlé třídění 2 / 54 Rekurze Recursion Rekurze = odkaz na sama sebe, definice za pomoci sebe

Více

Abstraktní třídy, polymorfní struktury

Abstraktní třídy, polymorfní struktury Karel Müller, Josef Vogel (ČVUT FIT) Abstraktní třídy, polymorfní struktury BI-PA2, 2011, Přednáška 9 1/32 Abstraktní třídy, polymorfní struktury Ing. Josef Vogel, CSc Katedra softwarového inženýrství

Více

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12. Vyhledávání doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 12. září 2016 Jiří Dvorský (VŠB TUO) Vyhledávání 201 / 344 Osnova přednášky

Více

Operační systémy. Cvičení 4: Programování v C pod Unixem

Operační systémy. Cvičení 4: Programování v C pod Unixem Operační systémy Cvičení 4: Programování v C pod Unixem 1 Obsah cvičení Řídící struktury Funkce Dynamická alokace paměti Ladění programu Kde najít další informace Poznámka: uvedené příklady jsou dostupné

Více

Dynamické datové struktury III.

Dynamické datové struktury III. Dynamické datové struktury III. Halda. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované

Více

Dynamické programování

Dynamické programování Dynamické programování prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní algoritmy (BI-EFA)

Více

IB111 Úvod do programování skrze Python

IB111 Úvod do programování skrze Python Vyhledávání, řazení, složitost IB111 Úvod do programování skrze Python 2014 1 / 48 Otrávené studny 8 studen, jedna z nich je otrávená laboratorní rozbor dokáže rozpoznat přítomnost jedu ve vodě je drahý

Více

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1 Rekurze V programování ve dvou hladinách: - rekurzivní algoritmus (řešení úlohy je definováno pomocí řešení podúloh stejného charakteru) - rekurzivní volání procedury nebo funkce (volá sama sebe přímo

Více

2 Strukturované datové typy 2 2.1 Pole... 2 2.2 Záznam... 3 2.3 Množina... 4

2 Strukturované datové typy 2 2.1 Pole... 2 2.2 Záznam... 3 2.3 Množina... 4 Obsah Obsah 1 Jednoduché datové typy 1 2 Strukturované datové typy 2 2.1 Pole.................................. 2 2.2 Záznam................................ 3 2.3 Množina................................

Více

Algoritmizace řazení Bubble Sort

Algoritmizace řazení Bubble Sort Algoritmizace řazení Bubble Sort Cílem této kapitoly je seznámit studenta s třídícím algoritmem Bubble Sort, popíšeme zde tuto metodu a porovnáme s jinými algoritmy. Klíčové pojmy: Třídění, Bubble Sort,

Více

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615) IB108 Sada 1, Příklad 1 ( ) Složitost třídícího algoritmu 1/-Sort je v O n log O (n.71 ). Necht n = j i (velikost pole, které je vstupním parametrem funkce 1/-Sort). Lehce spočítáme, že velikost pole předávaná

Více

5 Rekurze a zásobník. Rekurzivní volání metody

5 Rekurze a zásobník. Rekurzivní volání metody 5 Rekurze a zásobník Při volání metody z metody main() se do zásobníku uloží aktivační záznam obsahující - parametry - návratovou adresu, tedy adresu, kde bude program pokračovat v metodě main () po skončení

Více

Úvod do programování 10. hodina

Úvod do programování 10. hodina Úvod do programování 10. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015 Umíme z minulé hodiny Syntax Dvojrozměrné pole

Více

Funkce a procedury. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 5 A0B36PR1 Programování 1

Funkce a procedury. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 5 A0B36PR1 Programování 1 Funkce a procedury Jan Faigl Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Přednáška 5 A0B36PR1 Programování 1 Jan Faigl, 2015 A0B36PR1 Přednáška 5: Funkce a procedury

Více

Prohledávání do šířky = algoritmus vlny

Prohledávání do šířky = algoritmus vlny Prohledávání do šířky = algoritmus vlny - souběžně zkoušet všechny možné varianty pokračování výpočtu, dokud nenajdeme řešení úlohy průchod stromem všech možných cest výpočtu do šířky, po vrstvách (v každé

Více

Základní datové struktury

Základní datové struktury Základní datové struktury Martin Trnečka Katedra informatiky, Přírodovědecká fakulta Univerzita Palackého v Olomouci 4. listopadu 2013 Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013

Více

Programovani v Maplu Procedura

Programovani v Maplu Procedura Programovani v Maplu Procedura Priklad: procedura, ktera scita 2 cisla: a + 2*b soucet := proc (a, b) local c; # lokalni promenna - existuje a meni se jenom uvnitr procedury c:=a+b; # globalni promenna

Více

Část 1 Funkce, lokální proměnné a přidělování paměti. Funkce a procedury. Část 2 Cykly a řízení jejich průchodu. Část 3 Příklady

Část 1 Funkce, lokální proměnné a přidělování paměti. Funkce a procedury. Část 2 Cykly a řízení jejich průchodu. Část 3 Příklady Část 1 Funkce, lokální proměnné a přidělování paměti Funkce a procedury Jan Faigl Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Přednáška 5 A0B36PR1 Programování 1 Jména

Více

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2 Euklidův algoritmus Doprovodný materiál pro cvičení Programování I. NPRM044 Autor: Markéta Popelová Datum: 31.10.2010 Euklidův algoritmus verze 1.0 Zadání: Určete největšího společného dělitele dvou zadaných

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Řídicí struktury jazyka Java Struktura programu Příkazy jazyka Blok příkazů Logické příkazy Ternární logický operátor Verze pro akademický rok 2012/2013 1 Struktura programu

Více

ÚVODNÍ ZNALOSTI. datové struktury. správnost programů. analýza algoritmů

ÚVODNÍ ZNALOSTI. datové struktury. správnost programů. analýza algoritmů ÚVODNÍ ZNALOSTI datové struktury správnost programů analýza algoritmů Datové struktury základní, primitivní, jednoduché datové typy: int, char,... hodnoty: celá čísla, znaky, jednoduché proměnné: int i;

Více

Náplň. v.0.03 16.02.2014. - Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění

Náplň. v.0.03 16.02.2014. - Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění Náplň v.0.03 16.02.2014 - Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění Spojení dvou samostatně setříděných polí void Spoj(double apole1[], int adelka1, double

Více

Ukazatele #2, dynamická alokace paměti

Ukazatele #2, dynamická alokace paměti Ukazatele #2, dynamická alokace paměti BI-PA1 Programování a Algoritmizace 1 Miroslav Baĺık, Ladislav Vagner a Josef Vogel Katedra teoretické informatiky a Katedra softwarového inženýrství Fakulta informačních

Více

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++ C++ Akademie SH 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory Za áte níci C++ 20. b ezna 2011 Obsah 1 Prom nné - primitivní typy Celá ísla ƒísla s pohyblivou desetinnou árkou, typ bool 2 Podmínka

Více

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek 9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek 1/24 Editační prostření Kód programu lze editovat v jakémkoli textovém editoru. 2/24 Editační prostření Kód

Více

Základní datové struktury III: Stromy, haldy

Základní datové struktury III: Stromy, haldy Základní datové struktury III: Stromy, haldy prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní

Více

Úvod do programovacích jazyků (Java)

Úvod do programovacích jazyků (Java) Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích

Více

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole Příkaz switch Příkaz switch provede příslušnou skupinu příkazů na základě hodnoty proměnné (celočíselné

Více

Algoritmy. BI-PA1 Programování a Algoritmizace 1. Miroslav Baĺık, Ladislav Vagner a Josef Vogel

Algoritmy. BI-PA1 Programování a Algoritmizace 1. Miroslav Baĺık, Ladislav Vagner a Josef Vogel Algoritmy BI-PA1 Programování a Algoritmizace 1 Miroslav Baĺık, Ladislav Vagner a Josef Vogel Katedra teoretické informatiky a Katedra softwarového inženýrství Fakulta informačních technologíı České vysoké

Více

Mimo samotné správnosti výsledku vypočteného zapsaným algoritmem je ještě jedno

Mimo samotné správnosti výsledku vypočteného zapsaným algoritmem je ještě jedno 12 Délka výpočtu algoritmu Mimo samotné správnosti výsledku vypočteného zapsaným algoritmem je ještě jedno neméně důležité hledisko k posouzení vhodnosti algoritmu k řešení zadané úlohy. Jedná se o čas,

Více

Rekurze. Jan Hnilica Počítačové modelování 12

Rekurze. Jan Hnilica Počítačové modelování 12 Rekurze Jan Hnilica Počítačové modelování 12 1 Rekurzivní charakter úlohy Výpočet faktoriálu faktoriál : n! = n (n - 1) (n - 2)... 2 1 (0! je definován jako 1) můžeme si všimnout, že výpočet n! obsahuje

Více

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek 8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek 1/41 Základní příkazy Všechny příkazy se píšou malými písmeny! Za většinou příkazů musí být středník (;)! 2/41 Základní příkazy

Více

Martin Milata, <256615@mail.muni.cz> 27.11.2007. Pokud je alespoň jeden rozměr čokolády sudý (s výjimkou tabulky velikosti 1x2, která už je od

Martin Milata, <256615@mail.muni.cz> 27.11.2007. Pokud je alespoň jeden rozměr čokolády sudý (s výjimkou tabulky velikosti 1x2, která už je od IB000 Lámání čokolády Martin Milata, 27.11.2007 1 Čokoláda s alespoň jedním sudým rozměrem Pokud je alespoň jeden rozměr čokolády sudý (s výjimkou tabulky velikosti 1x2, která už

Více

Pole a kolekce. v C#, Javě a C++

Pole a kolekce. v C#, Javě a C++ Pole a kolekce v C#, Javě a C++ C# Deklarace pole typ_prvku_pole[] jmeno_pole; Vytvoření pole jmeno_pole = new typ_prvku_pole[pocet_prvku_pole]; Inicializace pole double[] poled = 4.8, 8.2, 7.3, 8.0; Java

Více

ALG 09. Radix sort (přihrádkové řazení) Counting sort. Přehled asymptotických rychlostí jednotlivých řazení. Ilustrační experiment řazení

ALG 09. Radix sort (přihrádkové řazení) Counting sort. Přehled asymptotických rychlostí jednotlivých řazení. Ilustrační experiment řazení ALG Radix sort (přihrádkové řazení) Counting sort Přehled asymptotických rychlostí jednotlivých řazení Ilustrační experiment řazení Radix sort Neseřazeno Řaď podle. znaku Cbb DaD adb DCa CCC add DDb adc

Více

Stromy, haldy, prioritní fronty

Stromy, haldy, prioritní fronty Stromy, haldy, prioritní fronty prof. Ing. Pavel Tvrdík CSc. Katedra počítačů FEL České vysoké učení technické DSA, ZS 2008/9, Přednáška 6 http://service.felk.cvut.cz/courses/x36dsa/ prof. Pavel Tvrdík

Více

Časová a prostorová složitost algoritmů

Časová a prostorová složitost algoritmů .. Časová a prostorová složitost algoritmů Programovací techniky doc. Ing. Jiří Rybička, Dr. ústav informatiky PEF MENDELU v Brně rybicka@mendelu.cz Hodnocení algoritmů Programovací techniky Časová a prostorová

Více

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Maturitní otázky z předmětu PROGRAMOVÁNÍ Wichterlovo gymnázium, Ostrava-Poruba, příspěvková organizace Maturitní otázky z předmětu PROGRAMOVÁNÍ 1. Algoritmus a jeho vlastnosti algoritmus a jeho vlastnosti, formy zápisu algoritmu ověřování správnosti

Více

Binární soubory (datové, typované)

Binární soubory (datové, typované) Binární soubory (datové, typované) - na rozdíl od textových souborů data uložena binárně (ve vnitřním tvaru jako v proměnných programu) není čitelné pro člověka - všechny záznamy téhož typu (může být i

Více

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ 1) PROGRAM, ZDROJOVÝ KÓD, PŘEKLAD PROGRAMU 3 2) HISTORIE TVORBY PROGRAMŮ 3 3) SYNTAXE A SÉMANTIKA 3 4) SPECIFIKACE

Více

BI-EP1 Efektivní programování 1

BI-EP1 Efektivní programování 1 BI-EP1 Efektivní programování 1 ZS 2011/2012 Ing. Martin Kačer, Ph.D. 2010-11 Martin Kačer Katedra teoretické informatiky Fakulta informačních technologií České vysoké učení technické v Praze Evropský

Více

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010 Dynamické programování Jiří Vyskočil, Marko Genyg-Berezovskyj 2010 Rozděl a panuj (divide-and-conquer) Rozděl (Divide): Rozděl problém na několik podproblémů tak, aby tyto podproblémy odpovídaly původnímu

Více

Rekurze. IB111 Úvod do programování skrze Python

Rekurze. IB111 Úvod do programování skrze Python Rekurze IB111 Úvod do programování skrze Python 2015 1 / 64 XKCD: Tabletop Roleplaying https://xkcd.com/244/ 2 / 64 To iterate is human, to recurse divine. (L. Peter Deutsch) 3 / 64 Rekurze použití funkce

Více

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3 DobSort Úvod do programování Michal Krátký 1,Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programování, 2004/2005 V roce 1980 navrhl Dobosiewicz variantu (tzv. DobSort),

Více

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu. Informatika 10. 9. 2013 Jméno a příjmení Rodné číslo 1) Napište algoritmus pro rychlé třídění (quicksort). 2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus

Více

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; } Pole Kdybychom v jazyce C++chtěli načíst větší počet čísel nebo znaků a všechny bylo by nutné všechny tyto hodnoty nadále uchovávat v paměti počítače, tak by bylo potřeba v paměti počítače alokovat stejný

Více

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007 Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více

Lineární datové struktury

Lineární datové struktury Lineární datové struktury doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 13. března 2017 Jiří Dvorský (VŠB TUO) Lineární datové

Více

KTE / ZPE Informační technologie

KTE / ZPE Informační technologie 4 KTE / ZPE Informační technologie Ing. Petr Kropík, Ph.D. email: pkropik@kte.zcu.cz tel.: +420 377 63 4639, +420 377 63 4606 (odd. informatiky) Katedra teoretické elektrotechniky FEL ZČU Plzeň Největší

Více

IB015 Neimperativní programování. Časová složitost, Typové třídy, Moduly. Jiří Barnat Libor Škarvada

IB015 Neimperativní programování. Časová složitost, Typové třídy, Moduly. Jiří Barnat Libor Škarvada IB015 Neimperativní programování Časová složitost, Typové třídy, Moduly Jiří Barnat Libor Škarvada Sekce IB015 Neimperativní programování 07 str. 2/37 Časová složitost Časová složitost algoritmu IB015

Více

Řídící struktury, if, while, switch

Řídící struktury, if, while, switch Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Řídící struktury, if, while, switch BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky Miroslav Balík Fakulta informačních

Více

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem Test prvočíselnosti Úkol: otestovat dané číslo N, zda je prvočíslem 1. zkusit všechny dělitele od 2 do N-1 časová složitost O(N) cca N testů 2. stačí zkoušet všechny dělitele od 2 do N/2 (větší dělitel

Více

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016 ZPRO cvičení 2 Martin Flusser Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague October 17, 2016 Outline I 1 Outline 2 Proměnné 3 Proměnné - cvičení 4 Funkce 5 Funkce

Více

Úvod do programování. Lekce 5

Úvod do programování. Lekce 5 I N V E S T I C E D O R O Z V O J E V Z D Ě L Á V Á N Í Inovace a zvýšení atraktivity studia optiky reg. č.: CZ.1.07/2.2.00/07.0289 Úvod do programování Lekce 5 Tento projekt je spolufinancován Evropským

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Strukturované proměnné Pole (array), ukazatele (pointer) Jazyk C České vysoké učení technické Fakulta elektrotechnická Ver.1.10 J. Zděnek 2015 Pole (array) (1) Pole je množina

Více

Úvod do programování - Java. Cvičení č.4

Úvod do programování - Java. Cvičení č.4 Úvod do programování - Java Cvičení č.4 1 Sekvence (posloupnost) Sekvence je tvořena posloupností jednoho nebo více příkazů, které se provádějí v pevně daném pořadí. Příkaz se začne provádět až po ukončení

Více

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií 1 Fakulta elektrotechniky a informatiky Katedra softwarových technologií 12. října 2009 Organizace výuky Přednášky Teoretické základy dle normy jazyka C Cvičení Praktické úlohy odpřednášené látky Prostřední

Více

Středoškolská technika 2017 PROGRAM NA GENEROVÁNÍ PRVOČÍSEL

Středoškolská technika 2017 PROGRAM NA GENEROVÁNÍ PRVOČÍSEL Středoškolská technika 2017 Setkání a prezentace prací středoškolských studentů na ČVUT PROGRAM NA GENEROVÁNÍ PRVOČÍSEL Vojtěch Pchálek Střední škola technická Kouřílkova 8, Přerov ANOTACE Bratr, který

Více

Funkce, podmíněný příkaz if-else, příkaz cyklu for

Funkce, podmíněný příkaz if-else, příkaz cyklu for Funkce, podmíněný příkaz if-else, příkaz cyklu for Definice funkce Funkce je pojmenovaná část programu, kterou lze dále zavolat v jiné části programu. V Pythonu je definována klíčovým slovem def. Za tímto

Více

Základy algoritmizace. Hašování

Základy algoritmizace. Hašování Základy algoritmizace Hašování Problematika hašování Hašování - nástroj na jednoduchý způsob "zakódování vstupních dat. Vstupní data jsou zpracována hašovací funkcí jsou jistým způsobem komprimována. Relativně

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Vyhledávání, vkládání, odstraňování Vyhledání hodnoty v nesetříděném poli Vyhledání hodnoty v setříděném poli Odstranění hodnoty z pole Vkládání hodnoty do pole Verze pro akademický

Více

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu } 5. Operátor čárka, - slouží k jistému určení pořadí vykonání dvou příkazů - oddělím-li čárkou dva příkazy, je jisté, že ten první bude vykonán dříve než příkaz druhý. Např.: i = 5; j = 8; - po překladu

Více

Základy programování (IZP)

Základy programování (IZP) Základy programování (IZP) Páté počítačové cvičení Brno University of Technology, Faculty of Information Technology Božetěchova 1/2, 612 66 Brno - Královo Pole Petr Veigend, iveigend@fit.vutbr.cz 5. týden

Více

ALG 14. Vícedimenzionální data. Řazení vícedimenzionálních dat. Experimentální porovnání řadících algoritmů na vícedimenzionálních datech

ALG 14. Vícedimenzionální data. Řazení vícedimenzionálních dat. Experimentální porovnání řadících algoritmů na vícedimenzionálních datech ABALG 5/ ALG Vícedimenzionální data Řazení vícedimenzionálních dat Experimentální porovnání řadících algoritmů na vícedimenzionálních datech ABALG 5/ Vícedimenzionální data..7.. -.. d = 6 5 6.....7.. -.....9

Více

Prioritní fronta, halda

Prioritní fronta, halda Prioritní fronta, halda Priority queue, heap Jan Kybic http://cmp.felk.cvut.cz/~kybic kybic@fel.cvut.cz 2016 2018 1 / 26 Prioritní fronta Halda Heap sort 2 / 26 Prioritní fronta (priority queue) Podporuje

Více

Struktura programu v době běhu

Struktura programu v době běhu Struktura programu v době běhu Miroslav Beneš Dušan Kolář Struktura programu v době běhu Vztah mezi zdrojovým programem a činností přeloženého programu reprezentace dat správa paměti aktivace podprogramů

Více

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44 Algoritmizace a programování Ak. rok 2012/2013 vbp 1. ze 44 Vladimír Beneš Petrovický K101 katedra matematiky, statistiky a informačních technologií vedoucí katedry E-mail: vbenes@bivs.cz Telefon: 251

Více

Přednáška 3. Rekurze 1

Přednáška 3. Rekurze 1 Paradigmata programování 1 Přednáška 3. Rekurze 1 Michal Krupka KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI Obsah 1 Příklady 2 Rekurzivní procedury a rekurzivní výpočetní proces 3 Další příklady

Více

6 Příkazy řízení toku

6 Příkazy řízení toku 6 Příkazy řízení toku Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost příkazům pro řízení toku programu. Pro všechny tyto základní

Více

Konstruktory a destruktory

Konstruktory a destruktory Konstruktory a destruktory Nedostatek atributy po vytvoření objektu nejsou automaticky inicializovány hodnota atributů je náhodná vytvoření metody pro inicializaci, kterou musí programátor explicitně zavolat,

Více