Tato tematika je zpracována v Záznamy přednášek: str

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

Download "Tato tematika je zpracována v Záznamy přednášek: str"

Transkript

1 Obsah 9. přednášky: Fáze programování Řešení problémů, dekompozice a program Dekompozice objektový přístup* Efektivita algoritmů Složitost úvod Výpočet časové složitosti Odhad složitosti - příklady Posuzování složitosti Asymptotická složitost odhad* Přehled technik návrhů algoritmů* Tato tematika je zpracována v Záznamy přednášek: str Úlohy (řešení na konci přednášky) Problém 1: Napište program pro výpočet funkce g(x) s přesností ε. g(x)= 1 + x/1! + x 2 /2! + x 3 /3! + x 4 /4! +... Problém 2: Je možno najít takovou cestu, abychom prošli všemi mosty, ale každým z nich pouze jednou? (Euler: úloha o sedmi mostech města Královce) Problém 3: Nalezněte všechny způsoby, kterými může šachová figurka jezdce proskákat všechna políčka šachovnice, přičemž může na každé políčko skočit pouze jedenkrát. Přednášky KIV/PPA1, A. Netrvalová, přednáška

2 Fáze programování Formulace úlohy - podklady pro řešení, cíle řešení, požadavky na přesnost Analýza úlohy - výchozí informace, řešitelnost Návrh řešení - rozklad na podproblémy, metody řešení Sestavení algoritmu řešení - návrh datových struktur, zápis algoritmu, volba jazyka Kódování programu - zápis zdrojového kódu Odladění - sada testů, porovnání výsledků Optimalizace - zrychlení výpočtu, snížení nároků na paměť Řešení problémů, dekompozice a program - Dekompozice - najít ve složitém problému hierarchické uspořádání pro zápis složité akce pomocí akcí jednodušších, další redukce na akce jednodušší (metoda shora dolů) - Abstrakce - koncepční zjednodušení složitého problému ignorováním detailů na akce řešící problém po částech, tj. oddělení jádra problému od detailů (metoda zdola nahoru) Strana 2 (celkem 34)

3 Metoda návrhu algoritmu shora dolů - založena na analýze problému a jeho postupném rozkladu na dílčí problémy (podproblémy), které lze podle potřeby dále rozkládat, kde dekompozici odpovídá i návrh algoritmu - začíná jen osnovou - abstraktní příkazy (výrazy přirozeného jazyka) pro dosud nerozpracované dílčí algoritmy Metoda návrhu algoritmu zdola nahoru - zpravidla vázána na konkrétní programovací jazyk (výrazové prostředky), postup od jednoduchých příkazů (řídicích struktur), přes složitější až po celkové řešení, na počátku nutný hrubý návrh řešení Použití dané metody závisí na složitosti a povaze problému, charakteru výrazových prostředků, ale i na schopnostech programátora. První metoda je vhodná pro řešení problémů přesně definovaných, druhá se uplatní při řešení příbuzných problémů a problémů s neúplným zadáním. Příklad: rozklad problému na podproblémy hra NIM Základní akce: vstup dat a začátek hry, průběh hry, výpis výsledku hry Pravidla hry: dán náhodný počet zápalek; odebrat lze 1 až 3 zápalky hráč se střídá v odebírání se strojem (PC) prohraje ten, kdo odebere poslední zápalku Strana 3 (celkem 34)

4 Dílčí podproblémy: automatické zadání počtu zápalek (např. v rozmezí 15 až 35) odebrání zápalek hráčem (+ řešení chyby či podvodu) odebrání zápalek strojem ukončení a výsledek hry Hrubé schéma: int pocetzapalek; boolean stroj = false; //zadani_poctu_zapalek do { if (stroj){ //odebrani_zapalek_strojem else { //odebrani_zapalek_hracem stroj =!stroj; while (pocet>0); if (stroj){ // stroj je na tahu, ale nema co odebrat // vyhral_stroj else { // hrac je na tahu, ale nema co odebrat // vyhral_hrac Fakta: počet zápalek a kdy hraje hráč a kdy stroj, tj. hodnoty pocetzapalek a stroj budou realizovat proměnné Podproblémy: výsledek hry, vyřešeno již v hrubém schématu zadani_poctu_zapalek, odebrani_zapalek_strojem, odebrani_zapalek_hracem budou realizovat metody Strana 4 (celkem 34)

5 public class Nim { static private Scanner sc = new Scanner(System.in); static private Random r = new Random(); static int zadanipoctuzapalek() { static int berehrac(int pocetzapalek) { static int berestroj(int pocetzapalek) { public static void main(string[] args) { int pocetzapalek = zadanipoctuzapalek(); boolean stroj = false; // false = zacina hrac do { if(stroj) { pocetzapalek = berestroj(pocetzapalek); else { pocetzapalek = berehrac(pocetzapalek); stroj =!stroj; while (pocetzapalek > 0); if(stroj) { System.out.println("Vyhral stroj!"); else { System.out.println("Vyhral jste, gratuluji!"); Stroj - pravidla pro odebírání - tj. vítězná strategie (je-li možná): počet zápalek nevýhodných pro protihráče je 1, 5, 9, atd., obecně: 4n+1, kde n >0 stroj musí z počtu p zápalek odebrat x zápalek tak, aby platilo p x = 4n + 1, po úpravě: x = (p 1) mod 4 vyjde-li x = 0, znamená to, že okamžitý počet zápalek je pro stroj nevýhodný a bude-li protihráč postupovat správně, stroj prohraje Strana 5 (celkem 34)

6 static int zadanipoctuzapalek() { // nahodne generovani poctu zapalek (15-35) return r.nextint(21) + 15; static int berehrac(int pocetzapalek) { int x; boolean chyba; do { chyba = false; System.out.println("Pocet zapalek: " + pocetzapalek ); System.out.println("Kolik odeberete? "); x = sc.nextint(); if (x<1) { System.out.println("Prilis malo!"); chyba = true; else { if(x>3 x>pocetzapalek) { System.out.println("Prilis mnoho!"); chyba = true; while (chyba); return pocetzapalek -= x; static int berestroj(int pocetzapalek) { System.out.println("Pocet zapalek: " + pocetzapalek); int x = (pocetzapalek - 1) % 4; if (x==0) { x = 1; System.out.println("Odebiram: " + x); return pocetzapalek -= x; Otázka: Doplníte-li program o náhodné vygenerování začínajícího (tj. stroj či hráč), jaký bude dopad na hru, bude-li začínat stroj? Strana 6 (celkem 34)

7 Dekompozice objektový přístup* rozdělení na logicky ucelené části, každé části odpovídá samostatná metoda (objektový přístup). Návrh rozhraní jména metod, způsob jejich komunikace s okolím (tj., jaké mají parametry, návratové hodnoty tzv. signatury metody). Deklarace rozhraní je podobná deklaraci třídy: interface jmeno { // hlavičky metod Programujeme bez znalosti (resp. bez využívání znalosti) implementace. Přístup k rozhraní shora: voláme metody, o nichž víme, jak se volají a co dělají, ale nevíme, jak to dělají a pokud to náhodou víme, tak tuto znalost nevyužíváme (v budoucnu je možná změna implementace těchto metod) Přístup k rozhraní zdola: píšeme metody, o nichž víme, jak se budou volat a co mají dělat, ale nevíme, kdo a v jakém kontextu je bude používat a pokud to náhodou víme, tak tuto znalost nevyužíváme (v budoucnu je možná bude chtít volat také někdo další) (více v PPA2) Strana 7 (celkem 34)

8 Příklad: PASÁČEK KOZ (viz přednáška č. 7) Dekomponujeme na třídy: Vlk Koza Lov a aplikační třídu PomocPasackovi. /** * Trida Vlk */ public class Vlk { private int rychlostvlka; public Vlk(){ rychlostvlka = 50; public Vlk(int rycklostvlka){ setrychlostvlka(rychlostvlka); void setrychlostvlka(int rychlostvlka){ this.rychlostvlka = rychlostvlka; int getrychlostvlka(){ return rychlostvlka; public String tostring(){ return " rychlost vlka = " + rychlostvlka; Strana 8 (celkem 34)

9 /** * Trida Koza */ public class Koza { private int rychlostkozy; private int hmotnostkozy; public Koza(int hmotnostkozy, int rychlostkozy){ sethmotnostkozy(hmotnostkozy); setrychlostkozy(rychlostkozy); public Koza(){ rychlostkozy = 50; hmotnostkozy = 40; void setrychlostkozy(int rychlostkozy){ this.rychlostkozy = rychlostkozy; void sethmotnostkozy(int hmotnostkozy){ this.hmotnostkozy = hmotnostkozy; int getrychlostkozy(){ return rychlostkozy; int gethmotnostkozy(){ return hmotnostkozy; public String tostring(){ return " hmotnost/rychlost kozy: " + hmotnostkozy +"/" + rychlostkozy; Strana 9 (celkem 34)

10 /** * Trida Lov */ public class Lov { Koza [] kozy; Vlk vlk; private final int MAX_HODIN = 10; private final String NEUSPECH = "Vlk se nenazere, stado muze zustat!"; private final String USPECH_POZDEJI = "Vlk by sezral kozu! \npasacek musi stado odehnat do: "; private final String USPECH_NAPOPRVE = "Pasacek prijde o kozu!"; private String vysledeklovu = ""; public Lov(Vlk vlk, Koza [] kozy){ this.vlk = vlk; this.kozy = kozy; int najdirychlostnejvypasenejsi(koza[] kozy){ int nejvypasenejsi = kozy[0].gethmotnostkozy(); int indexnejvypas = 0; for(int i=0; i<kozy.length; i++){ if(kozy[i].gethmotnostkozy() > nejvypasenejsi) { nejvypasenejsi = kozy[i].gethmotnostkozy(); indexnejvypas = i; if(kozy[indexnejvypas].gethmotnostkozy() > 0){ kozy[indexnejvypas].sethmotnostkozy(-1); return kozy[indexnejvypas].getrychlostkozy(); else { return -1; //-kozy[indexnejvypas][1]; Strana 10 (celkem 34)

11 String vlklovi(vlk v, Koza kozy[]){ vysledeklovu = NEUSPECH; for(int pocethodin = 0; pocethodin<=max_hodin; pocethodin += 2){ int rnejvypas = najdirychlostnejvypasenejsi(kozy); if(rnejvypas > 0){ // dalsi nelovena koza nalezena if(rnejvypas > v.getrychlostvlka()){//vlk pomalejsi continue; // hledej dalsi kozu else { // uz neni dalsi dosud nelovena koza vysledeklovu = NEUSPECH; // vlk nebude uspesny break; if(pocethodin > 0){ // vlk bude uspesny, pokud stado zustane vysledeklovu = USPECH_POZDEJI + pocethodin + " hodin."; break; else { // vlk sezere uz prvni lovenou kozu vysledeklovu = USPECH_NAPOPRVE; break; return vysledeklovu; public String tostring(){ return "VysledekLovu: " + vysledeklovu; Strana 11 (celkem 34)

12 import java.io.bufferedwriter; import java.io.file; import java.io.filewriter; import java.io.ioexception; import java.io.printwriter; import java.util.scanner; /** * Pasacek objektove * Ovladani: * vstup ze souboru: je-li v argumentu zadan nazev vstupniho * souboru a ten existuje * vstup z klavesnice: neexistuje-li vstupni soubor * vystup do souboru: byl-li vstup ze souboru * vystup na obrazovku: byl-li vstup z klavesnice */ public class PomocPasackovi { private static Scanner sc; static String JMENO_VSTUPU = ""; static final String JMENO_VYSTUPU = "vysledeklovu.txt"; static boolean nastavzdrojvstupu () { boolean klavesnice = true; try { File f = new File(JMENO_VSTUPU); if (f.exists()){ sc = new Scanner(f); // ze souboru klavesnice = false; else { sc = new Scanner(System.in); // z klavesnice catch (Exception e){ e.printstacktrace(); return klavesnice; Strana 12 (celkem 34)

13 /** je-li vstup ze souboru, je i vystup do souboru args pole argumentu vysledek textovy retezec */ static void vypisvysledek(string vysledek){ File f = new File(JMENO_VSTUPU); File ff = new File(JMENO_VYSTUPU); if (f.exists()){ // existuje-li vstupni soubor try { PrintWriter pw = new PrintWriter( new BufferedWriter( new FileWriter(ff))); pw.println(vysledek); pw.close(); catch (IOException e){ e.printstacktrace(); System.exit(1); else { if(ff.exists()){ // smaze vyst. soubor, existuje-li ff.delete(); System.out.println(vysledek); /** * Vytvori a naplni jednu instanci tridy Koza */ public static Koza vytvoranactikozu() { int hmotnost = sc.nextint(); int rychlost = sc.nextint(); Koza k = new Koza(hmotnost, rychlost); return k; Strana 13 (celkem 34)

14 /** Vytvori a naplni instanci tridy Vlk */ public static Vlk vytvorvlka(){ int rychlostvlka = sc.nextint(); Vlk v = new Vlk(rychlostVlka); return v; /** * Spousteni programu - metoda main() args - nazev vstupniho souboru */ public static void main(string[] args) { if(args.length!= 0){ //nazev soub. zadan v argumentu String jmeno = args[0]; JMENO_VSTUPU = "src/ /" + jmeno; //path + jmeno boolean klavesnice = nastavzdrojvstupu(); if(klavesnice){ System.out.print("Zadej rychlost vlka: "); Vlk vlk = vytvorvlka(); if(klavesnice){ System.out.print("Zadej pocet koz: "); int pocetkoz = sc.nextint(); if(klavesnice){ System.out.println("Zadej hmotnosti a rychlosti koz: "); Koza[] kozy = new Koza[pocetKoz]; for (int i = 0; i < kozy.length; i++) { kozy[i] = vytvoranactikozu(); Lov lov = new Lov(vlk, kozy); vypisvysledek(lov.vlklovi(vlk,kozy)); System.out.println(lov); Strana 14 (celkem 34)

15 Efektivita algoritmů Řešitelnost problému* - zúžení na tzv. rozhodovací problém (Ano/Ne). Algoritmicky rozhodnutelný problém* - algoritmus řeší rozhodovací problém, tj. pro vstup poskytne správný výstup v konečném čase Problémy - P, NP, převoditelnost, SAT (v PPA2) Efektivní algoritmus - řeší problém s minimálními nároky na hardware v co nejrychlejším čase, cílem je optimální využití existujících prostředků Nejjednodušší vs. nejrychlejší Nejjednodušší řešení - jednoduchá implementace - delší čas běhu Nejrychlejší řešení - náročná implementaci (časově kritické aplikace) Reálné aplikace kompromis Analýza efektivity - empiricky (porovnáním náhodná, nevhodná a reálná data) - exaktně (využití matematické analýzy) Cíl analýzy - porovnání algoritmů řešících stejný problém - odhad výkonnosti (pro jaký typ vstupu?) Strana 15 (celkem 34)

16 Složitost úvod (další informace - v PPA2) Složitost vztah algoritmu k prostředkům (čas a velikost paměti) Časová složitost - množina vstupních dat počet operací výpočtu - čas je dán počtem provedených operací (doba provedení operace nezáleží na rozsahu vstupních dat) Paměťová složitost - závislost paměťových nároků na vstupních datech Časová složitost časté potíže a omyly - podcenění nezkušenost, řešení triviálních úloh - použití rychlejšího PC problém vyřeší (NE) - zrychlení dílčími úpravami (NE) Řešení - použít rychlejší algoritmus (existuje-li) Výpočet časové složitosti stanovujeme v závislosti na: - konkrétních datech - na základě rozsahu dat - analýzou algoritmu obvykle složité Příklad: výpočet u triviálního algoritmu Operace: p přiřazení, c porovnání, s součet Strana 16 (celkem 34)

17 static int soucetprvku(int [] pole){ int suma = 0; // p1 for(int i=0; i<pole.length; i++) { // p2+c1+s1+p3 suma += pole[i]; // s2+p4 return suma; C(n) = p1+p2+(n+1)c1+n(s1+p3)+n(s2+p4) pokud a = (p=c=s) C(n) = a+a+(n+1)a+n(a+a)+n(a+a)= 3a+5an a trvá jednotku času C(n) = 3+5n C(n) = n - lineární složitost (náročné nedělá se takto) int n = 100; int sum = 0; for (int i = 0; i < n; i++){ for (int j = 0; j < i; j++){ sum += i+j; n = 100; sum = 0; for (int i = 0; i < n; i++){ for (int j = 0; j < n; j++){ sum += i+j; PŘÍKLAD: Která programová sekvence proběhne rychleji? Strana 17 (celkem 34)

18 První kód: vnější cyklus 100x, vnitřní 1, 2,...,99, celkem n(n-1)/2=100/2*99=4950x Druhý kód: vnější cyklus 100x, vnitřní cyklus 100, celkem 100*100= První cyklus je rychlejší. Odhad složitosti - příklady Hrubý odhad orientace podle cyklů Př. 1: Určete řádovou složitost následujícího algoritmu. Sledovanou operací je sčítání.... for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { c[i][j] = a[i][j] + b[i][j]; Složitost algoritmu O(m *n) Př. 2: Sledovanou operací je násobení ve výrazu j = j * 2 int n = 8; for(int i = 0; i < n; i++) { int j = 1; do { j = j * 2; while (j < n); Složitost algoritmu je O(n log 2 (n)) Strana 18 (celkem 34)

19 Př. 3: Určete řádovou složitost následující programové sekvence.... min = a[0]; for(int i = 0; i < n; i++) { if (min < a[i]) { min = a[i]; max = a[0]; for(int i = 0; i < n; i++){ if (max > a [i]) { max = a [i];... Složitost algoritmu: O(2*n) Př. 4: Určete řádovou složitost následujícího algoritmu. Sledovanou operací je: a = a / 3 final int n = 15; for(int i = 1; i < n ; i++) { float a = n; do { a = a / 3; while (a > 1); Složitost? Strana 19 (celkem 34)

20 Složitost algoritmu je: O((n-1)*log 3 (n)). Př. 5: Určete řádový odhad O následující funkce, pokud při zvětšení dat na n+1 dojde ke zvětšení počtu operací o 2 n. C1 2, Cn 2 n Cn 1 pro n 1 C1 2 C C1 2 2 C C C n C n 2 n 2 ( n - 1) n n n i 2 n i n Složitost algoritmu je O(n 2 ). Posuzování složitosti - nejhorší případ: max(t1(n),t2(n),...,tn(n)) - průměrný případ: ~t(t1(n),t2(n),...,tn(n)) - nejlepší případ: min(t1(n),t2(n),...,tn(n)) Strana 20 (celkem 34)

21 Malý rozdíl mezi nejlepším a nejhorším případem - dobře navržený algoritmus Optimalizace algoritmu - zmenšení rozdílu Když nejlepší = nejhorší případ, nelze optimalizovat Asymptotická složitost odhad* Složitější algoritmy - přesné (algebraické) vyjádření složitosti algoritmu matematicky náročné Ve většině případů postačí vhodný odhad Strana 21 (celkem 34)

22 Asymptotická složitost (pro n ) se limitně blíží k algebraické hodnotě složitosti Odhady - asymptotický horní odhad: O(g(N)) - asymptotický dolní odhad: Ω (g(n)) - asymptotický oboustranný odhad: Θ(g(N)) k, k1, k2 - konstanty, f(n) - fce, g(n) - odhad Strana 22 (celkem 34)

23 Strana 23 (celkem 34)

24 Př. 6: Problém s dobou řešení k n 2 je řešen na starém PC pro n = Jak je možné zvětšit vstup, aby byla úloha vyřešena na 10x rychlejším PC v tomtéž čase? Staré PC: k ;nové PC 10 k k = k n 2 n = = 31622,7766. Poměr se zvětší 31623/10000 ~ 3 Př. 7: Algoritmus A1 - pro řešení úlohy použije 10000n operací Algoritmus A2 - použije 12n operací Pro jakou množinu dat je výhodnější použít A2? 12n n n n < 0, n 1 = -4; n 2 = 837 Pro n < 837 je vhodnější algoritmus A2. Ukázka časové složitosti Složitost n = 10 n = 100 n = 1000 logaritmická lineární kvadratická kubická exponenciální faktoriálová Strana 24 (celkem 34)

25 P - polynomiální algoritmy. - výpočetně zvládnutelné problémy V praxi - nejčastěji O(n), O(n log(n),o(n 2 ),O(n 3 ) Problémy - aritmetické operace, řazení, vyhledávání, některé grafové algoritmy, NP - nedeterministicky polynomiální algoritmy (bude v PPA2) Přehled technik návrhů algoritmů* - metoda hrubé síly (Brute Force Algorithm) - rozděl a panuj (Divide and Conquer) - heuristické algoritmy (Heuristic Algorithm) - aproximační algoritmy - pravděpodobnostní algoritmy Metoda hrubé síly Vyzkoušení všech variant řešení problému, vybráno je nejlepší z nich. Počet operací nutných k nalezení řešení neroste polynomiálně (exponenciálně: n c, s faktoriálem: n!). Výhodou je jednoduchost implementace. Lze aplikovat pouze na malé soubory dat, pro rozsáhlé soubory nelze vyzkoušet všechny metody, nalezené řešení nemusí být nejlepší. Rozděl a panuj Založena na opakovaném rozdělování problému na menší a jednodušší podproblémy. Dělení se provádí tak dlouho, až se nalezne triviální řešení podproblému. Strana 25 (celkem 34)

26 Takovéto řešení umíme zpravidla nalézt bez složitých výpočtů. Podproblémy jsou řešeny nezávisle na sobě a poté jsou jejich řešení spojena v celek, čímž získáme řešení původního problému. Odhad složitosti: Θ(n log n) Heuristické algoritmy Charakteristika heuristiky: - vygenerováno velké množství potenciálních řešení, v nich se hledá nejlepší možné řešení. Vygenerovaná množina nemusí obsahovat nejlepší možné řešení. Řešení nemusí být nalezeno rychle, některé heuristiky pracují poměrně dlouho. Není zaručeno, že takové řešení bude vždy nalezeno. Aproximační algoritmy - pro úlohy, pro které neznáme polynomiální algoritmus Cílem je nalezení přípustného řešení, hodnocení kvality aproximace, snaha o co nejrychlejší konvergenci. Pravděpodobnostní algoritmy - zavádí se do procesu řešení nedeterministický prvek, tj. prvek náhodnosti. Opakovaný běh algoritmu nad stejnou vstupní množinou může poskytovat různé výsledky, proto se algoritmy spouštějí opakovaně. Genetické algoritmy - princip evoluční biologie a techniky napodobující biologické procesy (křížení, mutace, dědičnost, atd.) pro postupné zlepšování dosaženého výsledku. (techniky návrhů algoritmů - součást ZEP, PT, ADE, PRO, ) Strana 26 (celkem 34)

27 Příklad: Hanojské věže (ještě jednou) Příběh: V jednom indickém chrámu prý mají tři věže Věž zrození, Věž života a Věž zkázy. Uvnitř každé z nich je kůl, na kterém je navlečeno několik zlatých disků. Každý disk je jinak široký. Disky smí být na kůlu navlečeny pouze tak, že menší a užší disk leží na širším. Počet všech disků je 64. Při stvoření chrámu byly všechny disky navlečeny na jeden kůl ve Věži stvoření. Kněží přenášejí každý den jeden disk tak, aby umístili všechny disky na kůl ve Věži zkázy. Stará legenda říká, že až se jim to podaří, tak nastane konec světa. Má smysl se obávat konce světa? Řešení: Pokusíme se problém rozložit na podproblémy, k jejichž vyřešení použijeme rekurzi (viz minulá přednáška). static void presundisky(int n, char zveze, char navez, char presvez) { if (n>=1) { presundisky(n-1, zveze, presvez, navez); System.out.println("presun disk "+n+" z "+ zveze+" na "+navez); presundisky(n-1, presvez, navez, zveze); Jaká je časová složitost? - jistě úměrná počtu přenesení disků. Označme tedy celkový počet přenesení disků pomocí T (n). Z uvedeného algoritmu plyne: T(n) = 2T(n 1) + 1 Postupným rozepisováním dostaneme: T(n) = 2T(n 1) + 1 = 2(2(T(n 2) + 1) + 1 = =2(2(2 (2T(1)+1) +1)+1)+1=2 n +2 n = 2 n+1 Časová složitost algoritmu je tedy exponenciální. NE! 2 65 = Strana 27 (celkem 34)

28 Úlohy Problém 1 (existuje více algoritmů) Napište program pro výpočet funkce g(x) s přesností ε. g(x)= 1 + x/1! + x 2 /2! + x 3 /3! + x 4 /4! první nápad - napsání metody pro faktoriál, pak spočtení mocniny a postupné sčítání členů Řešení zcela nevhodné! public class EnaX { static private Scanner sc = new Scanner(System.in); static final double EPS = 1e-5; static long fak(int n){ long vysledek = 1; for (int i=2; i<=n; i++){ vysledek *= i; return vysledek; CHYBNĚ static double spoctienax(int x){ double soucet = 1; double clen = 1; int i = 1; do { clen = Math.pow(x,i)/ fak(i); i++; soucet += clen; while(clen > EPS); return soucet; Zadej x:15 Vypocteny vysledek = Spravny vysledek = Strana 28 (celkem 34)

29 Řešení správné - použití iteračního výpočtu (nikoliv opakovaný výpočet mocniny a faktoriálu), využití již jednou spočtených členů: a 0 =1, a 1 = a 0 *x/1, a 2 = a 1 *x/2, a 3 = a 2 *x/3,... import java.util.*; public class EnaX { static private Scanner sc = new Scanner(System.in); static final double EPS = 1e-5; static double spoctienax(int x){ double soucet = 1; double clen = 1; // clen je scitanec int i = 1; // i-ty scitanec do { clen *= (double)x / i++ ; // spocti clen soucet += clen; // a pricti ho k součtu while( clen > EPS); // je-li mensi nez eps, hotovo return soucet; public static void main(string[] args) { System.out.print("Zadej x:"); int x = sc.nextint(); SPRÁVNĚ System.out.println("Vypocteno = " + spoctienax(x)); System.out.println("Spravny vysledek = " + Math.exp(x)); Zadej x:15 Vypocteny vysledek = Spravny vysledek = Strana 29 (celkem 34)

30 Problém 2 [Zdroj: Wikipedia] Úloha o sedmi mostech města Královce: Je možno najít takovou cestu, abychom prošli všemi mosty, ale každým z nich pouze jednou? Řešení neexistuje, tj. takovou cestu najít nelze Euler Leonhard ( ),1741: Solutio problematis ad geometriam situs pertinentis v publikaci: Commentarii academiae scientiarum Petropolitanae Eulerův tah (path) lze tehdy a jen tehdy, není-li žádný či jsou-li právě 2 vrcholy grafu lichého stupně (začátek a konec cesty) Příklad na Eulerův tah: (psaníčko jedním tahem) Alternativní úloha Eulerův uzavřený tah, tj. smyčka (circuit) - začátek a konec cesty v tomtéž vrcholu (nesmí být vrchol lichého stupně) - více v PPA2 Strana 30 (celkem 34)

31 Problém 3 Nalezněte všechny způsoby, kterými může šachová figurka jezdce proskákat všechna políčka šachovnice, přičemž může na každé políčko skočit pouze jedenkrát. [Zdroj: Wikipedia] Jednoduchá varianta: Úloha: Nalezněte nejkratší cestu šachovým koněm z jednoho pole (třeba d3) na všechna ostatní pole. Postup: 0. Na startovní pole zapiš číslo 0 1. Všechna dosud neoznačená pole dostupná jedním tahem z pole označeného 0 označ 1 2. Všechna dosud neoznačená pole dostupná jedním tahem z pole označeného 1 označ atd. Nalezení cesty pak proveď odzadu (backtracking): Je-li cílové políčko označené N, hledáme políčko dostupné z něj jedním tahem a označené N-1 - až k políčku 0. d 3 Strana 31 (celkem 34)

32 Naše úloha [Zdroj: doc. P. Herout] 1. Prověříme všechny možnosti, tj. řešení hrubou silou - exponenciální složitost, neboť v ideálním případu můžeme skočit až na 8 polí O(8 n*n ) = 8 64 ~ možností Pokud by ověření 1 možnosti trvalo jen 1ns, celý výpočet let! 2. Zjednodušení - počet tahů je 63, ale skončíme neúspěchem mnohem dříve (po 4, 6, 8 tazích): Strana 32 (celkem 34)

33 - z krajního políčka lze pokračovat 2, 3, 4 a 6 skoky - na 8 políček lze skočit pouze z 1. tahu (počet možností skoku z políčka je n-1, neboť skok musí být z přípustné pozice) - poslední tah má pouze jednu možnost, předposlední dvě možnosti, - řada tahů budou tzv. vynucené zbude pouze jedna možnost pro celý řetězec tahů Zpřesněný horní odhad: 1 4 *2 8 *3 20 *5 16 *7 15 = možností, tj let! Pro šachovnici 8x8 polí není úloha zcela řešitelná. V současné době (s použitím PC) je úloha kompletně řešitelná pro šachovnici 6x6 polí. Zpřesněný odhad: 1 4 *2 8 *3 12 *5 8 *7 3 = možností, tj. 34 let. Skutečný výpočet (6x6): možností sec. Java Pentium Centrino 1,5 GHz Kvalifikovaný odhad pro 8x8: skutečné možnosti 10-5 z horního odhadu = možností, tj let. [Výpočet: doc. P. Herout] Strana 33 (celkem 34)

34 Úloha pro zájemce* (prezentace řešení na další přednášce) Je dána posloupnost celých čísel a 1, a 2,..., a n. Nalezněte celistvý úsek posloupnosti a i až a j, takový, aby součet hodnot těchto prvků byl maximální. Nezapomeňte, že indexy i, j představují pořadí prvků, tj. i, j > 0. Ilustrační příklady: {-2, 11, -4, 13, -5, 2 i = 2, j = 4, s = 20 {1, -3, 4, -2, -1, 6 i = 3, j = 6, s = 7 {-1, -3, -5, -7, -2 i = 0, j = 0, s = 0 Pro řešení tohoto problému lze napsat odlišné, více či méně efektivní algoritmy. Strana 34 (celkem 34)

Tato tematika je zpracována v Záznamy přednášek: str

Tato tematika je zpracována v Záznamy přednášek: str Obsah 10. přednášky: Souvislosti Složitost - úvod Výpočet časové složitosti Odhad složitosti - příklady Posuzování složitosti Asymptotická složitost - odhad Přehled technik návrhů algoritmů Tato tematika

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

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

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

Časová složitost / Time complexity

Časová složitost / Time complexity Časová složitost / Time complexity Jan Kybic http://cmp.felk.cvut.cz/~kybic kybic@fel.cvut.cz 2016 2018 1 / 24 Složitost algoritmů Algorithm complexity Časová a paměťová složitost Trvání výpočtu v závislosti

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

Ú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

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti 3. přednáška nalezení největšího prvku, druhého nejvyššího prvku, algoritmus shozeného praporku. Algoritmizace

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

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

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

1. Téma 12 - Textové soubory a výjimky

1. Téma 12 - Textové soubory a výjimky 1. Téma 12 - Textové soubory a výjimky Cíl látky Procvičit práci se soubory s využitím výjimek. 1.1. Úvod Program, aby byl programem, my mít nějaké výstupy a vstupy. Velmi častým případem je to, že se

Více

Řídicí struktury. alg3 1

Řídicí struktury. alg3 1 Řídicí struktury Řídicí struktura je programová konstrukce, která se skládá z dílčích příkazů a předepisuje pro ně způsob provedení Tři druhy řídicích struktur: posloupnost, předepisující postupné provedení

Více

Algoritmy I, složitost

Algoritmy I, složitost A0B36PRI - PROGRAMOVÁNÍ Algoritmy I, složitost České vysoké učení technické Fakulta elektrotechnická v 1.01 Rychlost... Jeden algoritmus (program, postup, metoda ) je rychlejší než druhý. Co ta věta znamená??

Více

10. Složitost a výkon

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

Více

Obsah přednášky. Analýza algoritmu Algoritmická složitost Návrhy algoritmů Urychlování algoritmů 1/41

Obsah přednášky. Analýza algoritmu Algoritmická složitost Návrhy algoritmů Urychlování algoritmů 1/41 Obsah přednášky Analýza algoritmu Algoritmická složitost Návrhy algoritmů Urychlování algoritmů 1/41 Analýza algoritmu Proč vůbec dělat analýzu? pro většinu problémů existuje několik různých přístupů aby

Více

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod. Základy programování (IZAPR) Přednáška 7 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 229, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky 7 Parametry metod, předávání

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

Algoritmizace. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Algoritmizace. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010 Jiří Vyskočil, Marko Genyg-Berezovskyj 2010 Úvod stránky předmětu: https://cw.felk.cvut.cz/doku.php/courses/a4b33alg/start cíle předmětu Cílem je schopnost samostatné implementace různých variant základních

Více

Obsah 7. přednášky: Tato tematika je zpracována v Záznamy přednášek: str

Obsah 7. přednášky: Tato tematika je zpracována v Záznamy přednášek: str Obsah 7. přednášky: Soubory - terminologie Adresáře a soubory - třída File Výjimky - úvod Druhy výjimek Způsoby reakce na výjimku Kompletní ošetření výjimky Nejhorší reakce na výjimku Seskupování a selekce

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Struktura programu Vytvoření nové aplikace Struktura programu Základní syntaktické elementy První aplikace Verze pro akademický rok 2012/2013 1 Nová aplikace NetBeans Ve vývojovém

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

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

Výčtový typ strana 67

Výčtový typ strana 67 Výčtový typ strana 67 8. Výčtový typ V této kapitole si ukážeme, jak implementovat v Javě statické seznamy konstant (hodnot). Příkladem mohou být dny v týdnu, měsíce v roce, planety obíhající kolem slunce

Více

Lekce 01 Úvod do algoritmizace

Lekce 01 Úvod do algoritmizace Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů Lekce 01 Úvod do algoritmizace Tento projekt CZ.1.07/1.3.12/04.0006 je spolufinancován Evropským sociálním

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

11 VYPOČITATELNOST A VÝPOČTOVÁ SLOŽITOST

11 VYPOČITATELNOST A VÝPOČTOVÁ SLOŽITOST 11 VYPOČITATELNOST A VÝPOČTOVÁ SLOŽITOST Na první přednášce jsme si neformálně zavedli pojmy problém a algoritmus pro jeho řešení, které jsme na počítači vykonávali pomocí programů. Jako příklad uveďme

Více

1. Téma 03 - Rozhodování

1. Téma 03 - Rozhodování 1. Téma 03 - Rozhodování Cíl látky Seznámit se a prakticky si vyzkoušet zápis rozhodování v jazyce Java 1.1. Úvod Jednou z nejčastěji používanou konstrukcí při programování je rozhodování. Právě této problematice

Více

KTE / ZPE Informační technologie

KTE / ZPE Informační technologie 7 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ň - ternární

Více

Paměť počítače. alg2 1

Paměť počítače. alg2 1 Paměť počítače Výpočetní proces je posloupnost akcí nad daty uloženými v paměti počítače Data jsou v paměti reprezentována posloupnostmi bitů (bit = 0 nebo 1) Připomeňme: paměť je tvořena řadou 8-mi bitových

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

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd 7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd Algoritmizace (Y36ALG), Šumperk - 7. přednáška 1 Třída jako zdroj funkcionality Třída v jazyku Java je programová jednotka tvořená

Více

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy Ú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 Procesor Procesorem je objekt, který vykonává algoritmem popisovanou

Více

Dekompozice problému, rekurze

Dekompozice problému, rekurze 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é

Více

Soubor jako posloupnost bytů

Soubor jako posloupnost bytů Soubory Soubor je množina údajů uložená ve vnější paměti počítače, obvykle na disku Pro soubor jsou typické tyto operace. otevření souboru čtení údaje zápis údaje uzavření souboru Přístup k údajům (čtení

Více

7. Datové typy v Javě

7. Datové typy v Javě 7. Datové typy v Javě Primitivní vs. objektové typy Kategorie primitivních typů: integrální, boolean, čísla s pohyblivou řádovou čárkou Pole: deklarace, vytvoření, naplnění, přístup k prvkům, rozsah indexů

Více

Iterační výpočty Projekt č. 2

Iterační výpočty Projekt č. 2 Dokumentace k projektu pro předměty IUS & IZP Iterační výpočty Projekt č. 2 Autor: Jan Kaláb (xkalab00@stud.fit.vutbr.cz) Úvod Úkolem bylo napsat v jazyce C program sloužící k výpočtům matematických funkcí

Více

Datové struktury. alg12 1

Datové struktury. alg12 1 Datové struktury Jedna z klasických knih o programování (autor prof. Wirth) má název Algorithms + Data structures = Programs Datová struktura je množina dat (prvků, složek, datových objektů), pro kterou

Více

6. Příkazy a řídící struktury v Javě

6. Příkazy a řídící struktury v Javě 6. Příkazy a řídící struktury v Javě Příkazy v Javě Příkazy v Javě Řídicí příkazy (větvení, cykly) Přiřazovací příkaz = Řízení toku programu (větvení, cykly) Volání metody Návrat z metody - příkaz return

Více

Abstraktní datové typy: zásobník

Abstraktní datové typy: zásobník Abstraktní datové typy: zásobník doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Abstraktní datové typy omezené rozhraní

Více

Složitost 1.1 Opera ní a pam ová složitost 1.2 Opera ní složitost v pr rném, nejhorším a nejlepším p ípad 1.3 Asymptotická složitost

Složitost 1.1 Opera ní a pam ová složitost 1.2 Opera ní složitost v pr rném, nejhorším a nejlepším p ípad 1.3 Asymptotická složitost 1 Složitost 1.1 Operační a paměťová složitost Nezávislé určení na konkrétní implementaci Několik typů operací = sčítání T+, logické T L, přiřazení T A(assign), porovnání T C(compare), výpočet adresy pole

Více

Databáze, sítě a techniky programování X33DSP

Databáze, sítě a techniky programování X33DSP Databáze, sítě a techniky programování X33DSP Anotace: Náplní předmětu jsou některé techniky a metody používané ve výpočetních systémech zaměřených na biomedicínské inženýrství. Cílem je položit jednotný

Více

1. Programování proti rozhraní

1. Programování proti rozhraní 1. Programování proti rozhraní Cíl látky Cílem tohoto bloku je seznámení se s jednou z nejdůležitější programátorskou technikou v objektově orientovaném programování. Tou technikou je využívaní rozhraní

Více

3 KTE / ZPE Informační technologie

3 KTE / ZPE Informační technologie 3 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ň Komentáře

Více

Složitost algoritmů. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

Složitost algoritmů. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Složitost algoritmů doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 27. prosince 2015 Jiří Dvorský (VŠB TUO) Složitost algoritmů

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

Různé algoritmy mají různou složitost

Různé algoritmy mají různou složitost / 1 Různé algoritmy mají různou složitost 1/ 1 Rychlost... Jeden algoritmus (program, postup, metoda ) je rychlejší než druhý. Co ta věta znamená?? 2/ 1 Asymptotická složitost y y x x Každému algoritmu

Více

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

Doba běhu daného algoritmu/programu. 1. Který fragment programu z následujících dvou proběhne rychleji?

Doba běhu daného algoritmu/programu. 1. Který fragment programu z následujících dvou proběhne rychleji? 1 Doba běhu daného algoritmu/programu 1. Který fragment programu z následujících dvou proběhne rychleji? int n = 100; int sum = 0; for (i = 0; i < n; i++) for (j = 0; j < i; j++) sum += i+j; int n = 75;

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

Algoritmizace a programování. Terminálový vstup a výstup

Algoritmizace a programování. Terminálový vstup a výstup Algoritmizace a programování Terminálový vstup a výstup Verze pro akademický rok 2012/2013 1 Výpis hodnot Terminálový vstup a výstup budeme používat jako základní způsob interakce programu s uživatelem

Více

Generické programování

Generické programování Generické programování Od C# verze 2.0 = vytváření kódu s obecným datovým typem Příklad generická metoda, zamění dva parametry: static void Swap(ref T p1, ref T p2) T temp; temp = p1; p1 = p2; p2 =

Více

8. přednáška: Soubory a proudy

8. přednáška: Soubory a proudy 8. přednáška: Soubory a proudy Soubor jako posloupnost bytů Ukládání/čtení primitivních typů Ukládání/čtení primitivních typů a objektů (řetězců) Ukládání/čtení objektů do souboru - serializace Obsah Algoritmizace

Více

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty. Proměnná Pojmenované místo v paměti sloužící pro uložení hodnoty. K pojmenování můžeme použít kombinace alfanumerických znaků, včetně diakritiky a podtržítka Rozlišují se velká malá písmena Název proměnné

Více

Asymptotická složitost algoritmů

Asymptotická složitost algoritmů Semestrální projekt 1 Y14TED Asymptotická složitost algoritmů Autor: Antonín DANĚK Osnova Slide 2 Co je to složitost algoritmu? Jak se počítá složitost algoritmu? Smysl přesného výpočtu složitosti algoritmu

Více

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12. Obsah přednášky: Definice pojmů o datový typ, o abstraktní datový typ Datové struktury Abstraktní datové typy a jejich implementace o Fronta (Queue) o Zásobník (Stack) o Množina (Set) Algoritmizace (Y36ALG),

Více

Digitální učební materiál

Digitální učební materiál Digitální učební materiál Číslo projektu: CZ.1.07/1.5.00/34.0548 Název školy: Gymnázium, Trutnov, Jiráskovo náměstí 325 Název materiálu: VY_32_INOVACE_145_IVT Autor: Ing. Pavel Bezděk Tematický okruh:

Více

8 Třídy, objekty, metody, předávání argumentů metod

8 Třídy, objekty, metody, předávání argumentů metod 8 Třídy, objekty, metody, předávání argumentů metod 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 třídám a objektům, instančním

Více

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5 Obsah Obsah 1 Řídicí struktury 1 2 Podmínka 1 2.1 Podmínka typu case......................... 2 3 Příkaz skoku 3 4 Cykly 4 4.1 Cyklus s podmínkou na začátku................... 4 4.2 Cyklus s podmínkou

Více

C# konzole Podíl dvou čísel, podmínka IF

C# konzole Podíl dvou čísel, podmínka IF C# konzole Podíl dvou čísel, podmínka IF Tematická oblast Datum vytvoření 2013 Ročník 3 Stručný obsah Způsob využití Autor Kód Internetové technologie, programování Výpočet podílu v konzolové aplikaci

Více

Obsah 10. přednášky: Jak bude probíhat zkouška?! Podrobné informace:

Obsah 10. přednášky: Jak bude probíhat zkouška?! Podrobné informace: Obsah 10. přednášky: Kódování dat - terminologie Rozdělení kódů Kódování čísel Kódování znaků Dynamické programování* Příklad řešení úlohy ACM* Úloha pro zájemce* efektivita algoritmu Tato tematika je

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

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

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Typy Základní (primitivní) datové typy Deklarace Verze pro akademický rok 2012/2013 1 Typy v jazyce Java Základní datové typy (primitivní datové typy) Celočíselné byte, short,

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

5 Přehled operátorů, příkazy, přetypování

5 Přehled operátorů, příkazy, přetypování 5 Přehled operátorů, příkazy, přetypování Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně budou uvedeny detaily týkající se operátorů. Doba nutná k nastudování

Více

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11 333LP - lgoritmy a programování - Zkouška z předmětu 333LP Jméno Příjmení Už. jméno Marek oháč bohacm11 Zkouškový test Otázka 1 Jaká je hodnota proměnné count po vykonání následujícího kódu: data=[4,4,5,5,6,6,6,7,7,7,7,8,8]

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

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C Hanojské věže - 3 kolíky A, B, C - na A je N disků různé velikosti, seřazené od největšího (dole) k nejmenšímu (nahoře) - kolíky B a C jsou prázdné - úkol: přenést všechny disky z A na B, mohou se odkládat

Více

1 2 3 4 5 6 součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

1 2 3 4 5 6 součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů: Úloha č.: max. bodů: skut. bodů: 1 2 3 4 5 6 součet cvičení celkem 20 12 20 20 14 14 100 známka UPOZORNĚNÍ : a) Písemná zkouška obsahuje 6 úloh, jejichž řešení musí být vepsáno do připraveného formuláře.

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

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

Teoretické minimum z PJV

Teoretické minimum z PJV Teoretické minimum z PJV Pozn.: následující text popisuje vlastnosti jazyka Java zjednodušeně pouze pro potřeby výuky. Třída Zavádí se v programu deklarací třídy což je část programu od klíčových slov

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

Časová složitost algoritmů

Časová složitost algoritmů Časová složitost algoritmů Důležitou vlastností algoritmu je časová náročnost výpočtů provedené podle daného algoritmu Ta se nezískává měřením doby výpočtu pro různá data, ale analýzou algoritmu, jejímž

Více

3. úloha - problém batohu metodami branch & bound, dynamické programování, heuristika s testem

3. úloha - problém batohu metodami branch & bound, dynamické programování, heuristika s testem ČVUT FEL X36PAA - Problémy a algoritmy 3. úloha - problém batohu metodami branch & bound, dynamické programování, heuristika s testem Jméno: Marek Handl Datum: 1. 1. 2009 Cvičení: Pondělí 9:00 Zadání Naprogramujte

Více

Java - výjimky. private void vstup() throws IOException {... }

Java - výjimky. private void vstup() throws IOException {... } Java - výjimky Tato kapitola ukazuje na několika příkladech práci s výjimkami v Javě. Klíčové pojmy: Výjimka, hierarchie výjimek, zachytávání výjimek, blok try-catch, tvorba vlastních výjimek, propagace

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

Java a XML. 10/26/09 1/7 Java a XML

Java a XML. 10/26/09 1/7 Java a XML Java a XML Java i XML jsou přenositelné V javě existuje podpora pro práci s XML, nejčastější akce prováděné při zpracování XML: načítání XML elementů generování nových elementů nebo úprava starého zápis

Více

Digitální učební materiál

Digitální učební materiál Digitální učební materiál Číslo projektu: CZ.1.07/1.5.00/34.0548 Název školy: Gymnázium, Trutnov, Jiráskovo náměstí 325 Název materiálu: VY_32_INOVACE_148_IVT Autor: Ing. Pavel Bezděk Tematický okruh:

Více

11.5.2012. Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

11.5.2012. Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9 Obsah přednášky 9 Základy programování (IZAPR, IZKPR) Přednáška 9 Základy dědičnosti, přístupová práva Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 03 022, Náměstí Čs. legií

Více

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová Programové konvence, dokumentace a ladění 2. přednáška Alena Buchalcevová Proč dodržovat programové konvence? velkou část životního cyklu softwaru tvoří údržba údržbu provádí většinou někdo jiný než autor

Více

Algoritmizace prostorových úloh

Algoritmizace prostorových úloh INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Datové struktury Daniela Szturcová

Více

Poslední nenulová číslice faktoriálu

Poslední nenulová číslice faktoriálu Poslední nenulová číslice faktoriálu Kateřina Bambušková BAM015, I206 Abstrakt V tomto článku je popsán a vyřešen problém s určením poslední nenulové číslice faktoriálu přirozeného čísla N. Celý princip

Více

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11 Jméno Příjmení Už. jméno Marek oháč bohacm11 Zkouškový test Otázka 1 Jaká je hodnota proměnné count po vykonání následujícího kódu: data=[4,4,5,5,6,6,6,7,7,7,7,8,8] count=0 for i in range(1,len(data)):

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

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13 Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13 KAPITOLA 1 Na úvod o Javě 15 Počítačový program 15 Vysokoúrovňový programovací

Více

ABSTRAKTNÍ DATOVÉ TYPY (ADT)

ABSTRAKTNÍ DATOVÉ TYPY (ADT) ABSTRAKTNÍ DATOVÉ TYPY (ADT) hierarchie abstrakcí: nejvyšší úroveň ZOO DruhZvirat celá čísla, řetězce nejnižší úroveň bity Abstrahujeme od - reprezentace (implementace) dat - realizace (implementace) operací

Více

Zápis programu v jazyce C#

Zápis programu v jazyce C# Zápis programu v jazyce C# Základní syntaktická pravidla C# = case sensitive jazyk rozlišuje velikost písmen Tzv. bílé znaky (Enter, mezera, tab ) ve ZK překladač ignoruje každý příkaz končí ; oddělovač

Více

9. přednáška - třídy, objekty

9. přednáška - třídy, objekty třída String a její použití kolekce, typované kolekce 9. přednáška - třídy, objekty Algoritmizace (Y36ALG), Šumperk - 9. přednáška 1 Třída String Objekty knihovní třídy String jsou řetězy znaků Od ostatních

Více

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: 28.11.2009 Předmět: ZAP

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: 28.11.2009 Předmět: ZAP Základy programování Úloha: Eratosthenovo síto Autor: Josef Hrabal Číslo: HRA0031 Datum: 28.11.2009 Předmět: ZAP Obsah 1 Zadání úkolu: 3 1.1 Zadání:............................... 3 1.2 Neformální zápis:.........................

Více

Regulární výrazy. Vzory

Regulární výrazy. Vzory Regulární výrazy Regulární výrazy jsou určeny pro práci s textovými řetězci, jsou součástí J2SDK až od verze 1.4, v předchozích verzích je potřeba použít některou z externích knihoven, např. knihovnu ORO

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

14.4.1. Typický prvek kolekce pro české řazení

14.4.1. Typický prvek kolekce pro české řazení 14.4. Co všechno by měl mít typický prvek kolekce 177 Poznámka: Třídy BigInteger, BigDecimal a Date budou vysvětleny v částech [15./183, [16./185 a [18.1./204. 14.4.1. Typický prvek kolekce pro české řazení

Více

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik; Vícerozměrné pole type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik; M[2,3] := 3145; - počet indexů není omezen (v praxi obvykle nejvýše tři) - více indexů pomalejší přístup k prvku (počítá

Více

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky Vyučovací hodina 1vyučovací hodina: Opakování z minulé hodiny Nová látka Procvičení nové látky Shrnutí 5 min 20 min 15 min 5 min 2vyučovací hodiny: Opakování z minulé hodiny Nová látka Procvičení nové

Více

typová konverze typová inference

typová konverze typová inference Seminář Java Programování v Javě II Radek Kočí Fakulta informačních technologií VUT Únor 2008 Radek Kočí Seminář Java Programování v Javě (2) 1/ 36 Téma přednášky Rozhraní: použití, dědičnost Hierarchie

Více

Z. Kotala, P. Toman: Java ( Obsah )

Z. Kotala, P. Toman: Java ( Obsah ) Z. Kotala, P. Toman: Java ( Obsah ) 13. Výjimky Výjimka (exception) je definována jako událost, která nastane během provádění programu a která naruší normální běh instrukcí. Výjimka je vyvolána například

Více

Složitost algoritmů. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

Složitost algoritmů. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol. Složitost algoritmů Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol., 2017 Datové struktury a algoritmy, B6B36DSA 02/2017, Lekce 3

Více