Michal Krátký. Úvod do programování. Cíl kurzu. Podmínky získání zápočtu III/III



Podobné dokumenty
Pojem algoritmus. 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

Algoritmizace prostorových úloh

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

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

Algoritmus. Přesné znění definice algoritmu zní: Algoritmus je procedura proveditelná Turingovým strojem.

Algoritmy I, složitost

Základy algoritmizace

Digitální učební materiál

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

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

3 Co je algoritmus? Trocha historie Definice algoritmu Vlastnosti algoritmu... 3

Složitosti základních operací B + stromu

Algoritmizace prostorových úloh

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

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

Datové struktury 2: Rozptylovací tabulky

NPRG030 Programování I 3/2 Z --- NPRG031 Programování II --- 2/2 Z, Zk

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

Algoritmizace prostorových úloh

Základy algoritmizace. Hašování

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

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

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

Stromy, haldy, prioritní fronty

Úvod do informatiky. Miroslav Kolařík

NMIN101 Programování 1 2/2 Z --- NMIN102 Programování /2 Z, Zk

Základy algoritmizace a programování

Název předmětu: Školní rok: Forma studia: Studijní obory: Ročník: Semestr: Typ předmětu: Rozsah a zakončení předmětu:

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

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

Základní informace o předmětu Otázka:

IB111 Úvod do programování skrze Python

5. Dynamické programování

Časová složitost / Time complexity

10. Složitost a výkon

Úvod do informatiky. Miroslav Kolařík

Maturitní témata. IKT, školní rok 2017/18. 1 Struktura osobního počítače. 2 Operační systém. 3 Uživatelský software.

Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012

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

Časová složitost algoritmů

Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39

ALGORITMY A DATOVÉ STRUKTURY

Algoritmizace. Obrázek 1: Přeložení programu překladačem

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

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

NMIN101 Programování 1 2/2 Z --- NMIN102 Programování /2 Z, Zk

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

Základní datové struktury

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

Algoritmizace. Cíle předmětu

Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy

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

Vlastnosti algoritmu. elementárnost. determinovanost. rezultativnost. konečnost. hromadnost. efektivnost

Adresní vyhledávání (přímý přístup, zřetězené a otevřené rozptylování, rozptylovací funkce)

Rekurzivní algoritmy

Cílem kapitoly je seznámit studenta se seznamem a stromem. Jejich konstrukci, užití a základní vlastnosti.

Pojem algoritmus. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

Úvod do informatiky. Miroslav Kolařík

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

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

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

Dynamické datové struktury III.

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 případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto:

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

Prioritní fronta, halda

Zadání semestrálního projektu Algoritmy II. letní semestr 2017/2018

Časová a prostorová složitost algoritmů

Algoritmizace a programování

Algoritmizace- úvod. Ing. Tomáš Otáhal

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

Algoritmy vyhledávání a řazení. Zatím nad lineární datovou strukturou (polem)

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Digitální učební materiál

Digitální učební materiál

RNDr. Eliška Ochodková. Základy algoritmizace

Základy algoritmizace a programování

Základy algoritmizace. Pattern matching

Anotace. Informace o praktiku z programování!!! Direktivy překladače Soubory (textové) Quicksort Metoda rozděl a panuj

Předměty. Algoritmizace a programování Seminář z programování. Verze pro akademický rok 2012/2013. Verze pro akademický rok 2012/2013

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

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) b)

IB111 Úvod do programování skrze Python

Algoritmy a algoritmizace

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

A4B33ALG 2010/05 ALG 07. Selection sort (Select sort) Insertion sort (Insert sort) Bubble sort deprecated. Quicksort.

Algoritmizace řazení Bubble Sort

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Třídění dat. Ing. Hodál Jaroslav, Ph.D. VY_32_INOVACE_26 04

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

Algoritmus. Cílem kapitoly je seznámit žáky se základy algoritmu, s jeho tvorbou a způsoby zápisu.

přirozený algoritmus seřadí prvky 1,3,2,8,9,7 a prvky 4,5,6 nechává Metody řazení se dělí:

Spojová implementace lineárních datových struktur

bin arn ı vyhled av an ı a bst Karel Hor ak, Petr Ryˇsav y 23. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

Základy algoritmizace, návrh algoritmu

Složitost. Teoretická informatika Tomáš Foltýnek

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

Texty k přednáškám z MMAN3: 4. Funkce a zobrazení v euklidovských prostorech

Struktura programu v době běhu

Transkript:

Michal Krátký Ú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 tel.: +420 596 993 239 místnost: A1004 mail: michal.kratky@vsb.cz web: http://www.cs.vsb.cz/kratky web udp: http://www.cs.vsb.cz/kratky/courses/2004-05/udp/ c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 1/37 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 2/37 Cíl kurzu Podmínky získání zápočtu I/III Cílem kurzu je seznámit studenty se základy algoritmizace. Kromě základních pojmů budou prezentovány algoritmy třídění a vyhledávání, lineární i nelineární datové struktury, vyhledávání v textu a komprimace dat. Na cvičení budou studenti algoritmy implementovat a své znalosti si prověří v rámci semestrálních projektů. V rámci kurzu Úvod do programování budou studenti vypracovávat dva semestrální projekty. První projekt bude sloužit pro ověření zda je student schopen implementovat a ladit jednoduchý algoritmus. Tento projekt je hodnocen maximálním počtem bodů 10. Zadání si studenti mohou vybrat od prvního cvičení, termín odevzdání je konec 5. týdne, tedy 27.3.2005 ve 24:00. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 3/37 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 4/37 Podmínky získání zápočtu II/III Podmínky získání zápočtu III/III Problémy implementované v rámci 2. projektu budou komplikovanější a od studentů se bude požadovat jejich implementační i algoritmické zvládnutí. Projekt bude umožňovat rozumné vstupy (např. stadartní vstup) a výstupy (např. standartní výstup). Tento projekt je hodnocen maximálním počtem bodů 30. Zadání si studenti mohou vybrat od 6. cvičení, termín odevzdání je předposlední týden v semestru, tedy 22.5.2005 ve 24:00. Podmínkou pro získání zápočtu je odevzdání obou projektů a zisku minimálního počtu bodů 21 (ze 40 možných). Případný zápočet bude udělen po ústní konzultaci 2. projektu, která bude probíhat v zápočtovém týdnu. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 5/37 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 6/37

Obsah kurzu I/II Obsah kurzu II/II 1. Pojem algoritmu., O(f ) notace. Dopad na efektivitu programů.. 2 Lineární datové struktury. Pole, zásobník, fronta, seznam. 3 Obecná definice třídícího problému. Adresní metody třídění. Třídění. Třídění přímým vkládáním, přímým výběrem. Bubble sort, Quick sort, Heap sort. 4 Vyhledávání. Sekvenční, binární vyhledávání. 5 Hashování, hashovací funkce, řešení kolizí. Separate chaining, Linear probing. 1 Binární stromy. Vyhledávání, vkládání, rušení uzlů. Průchody stromem. 2 Vyvážené stromy, Splay stromy. B-stromy. 3 Moderní stromové datové struktury. Indexování prostorových dat. 4 Vyhledávání v textu, pattern matching. 5 Komprimace dat. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 7/37 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 8/37 Literatura 1 D. Ďuráková, J. Dvorský, O. Ochodková: Základy algoritmizace, Ostrava, 2002, sylaby přednášek, http://www.cs.vsb.cz/ochodkova/courses/za/algor_dist.zip. 2 Alfred V. Aho: Data Structures and Algorithms. Addison-Wesley Series in Computer Science and Information, 1983. 3 N. Wirth: Algoritmy a štruktúry údajov, Alfa, Bratislava, 1989. 4 R. Szturc: Java technologie. http://www.cs.vsb.cz/java/index.html. 5 B. Eckel: Thinking in Java, http://www.mindview.net/books/tij. 6 B. Eckel: Thinking in C++, http://www.mindview.net/books/ticpp. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 9/37 Název algoritmus pochází ze začátku devátého století z Arábie. V letech 800 až 825 napsal arabský matematik Muhammad ibn Músá al Chwárizmí dvě knihy, z nichž jedna se v latinském překladu jmenovala Algoritmi dicit, česky Tak praví al Chwárizmí. Byla to kniha postupů pro počítání s čísly. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 10/37 - příklad Algoritmu můžeme rozumět jako předpisu pro řešení nějakého problému. Jako příklad vezměme třídění množiny celých čísel. Pokud rozebereme řešení takové úlohy do důsledku, musí obsahovat tři věci: 1 hodnoty vstupních dat (množina celých čísel), 2 předpis pro řešení, 3 požadovaný výsledek, tj. výstupní data (setříděná čísla). je předpis, který se skládá z kroků a který zabezpečí, že na základě vstupních dat jsou poskytnuta požadovaná data výstupní. Navíc každý algoritmus musí mít následující vlastnosti: Konečnost, Hromadnost, Jednoznačnost, Opakovatelnost, Rezultativnost. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 11/37 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 12/37

- Konečnost - Hromadnost Požadovaný výsledek musí být poskytnut v rozumném čase (pokud by výpočet trval na nejrychlejším počítači např. jeden milion let, těžko bychom mohli hovořit o algoritmu řešení, nemluvě o výpočtu, který by neskončil vůbec). Za rozumný lze považovat čas, kdy nám výsledek výpočtu k něčemu bude. Vstupní data nejsou v popisu algoritmu reprezentována konkrétními hodnotami, ale spíše množinami, ze kterých lze data vybrat (např. při řešení třídění celých čísel bude vstupem M Z). Při popisu algoritmu v programovacím jazyce se to projeví tím, že vstupy do algoritmu jsou označeny symbolickými jmény. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 13/37 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 14/37 - Jednoznačnost - Opakovatelnost, Rezultativnost Každý předpis je složen z kroků, které na sebe navazují. Každý krok můžeme charakterizovat jako přechod z jednoho stavu algoritmu do jiného, přičemž každý stav je určen zpracovávanými daty. Tím, jak data v jednotlivých stavech algoritmu vypadají, musí být jednoznačně určeno, který krok následuje. Opakovatelnost Při použití stejných vstupních údajů musí algoritmus dospět vždy k témuž výsledku. Rezultativnost vede ke správnému výsledku. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 15/37 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 16/37 - příklad Můžeme nějak měřit "kvalitu" algoritmu? Můžeme tedy říci, zda daný algoritmus je "lepší" než jiný? Má smysl vymýšlet "lepší" algoritmy pro řešení nějakého problému? Mějme databázi 10mil. záznamů o klientech bankovního ústavu. Našim úkolem je napsat algoritmus pro vyhledání nějakého klienta (např. František Novák). Porovnání jednoho záznamu trvá 1s. 1 O(n) - provedeme 10 7 porovnání. Vyhledání záznamu by trvalo necelé 4 měsíce. 2 O(log n) - provedeme log(10 7 )=7 porovnání. Vyhledání záznamu by tedy trvalo 7s. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 17/37 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 18/37

časová a pamět ová Při praktické realizaci každé výpočetní metody jsme omezeni prostředky, které máme k dispozici čas, pamět, počet registrů atd. Důležitým parametrem každé výpočetní metody je její složitost, kterou můžeme chápat jako vztah dané metody k daným prostředkům. Vezměme v úvahu třídění. Ačkoliv je zvolena adekvátní metoda třídění a metoda je odladěna na vzorových datech, pořád je ještě možné, že pro určitá konkrétní data se výpočet protáhne na hranici únosnosti nebo výpočet ztroskotá na přeplnění operační paměti počítače. časová časovou složitostí rozumíme funkci, která každé množině vstupních dat přiřazuje počet operací vykonaných při výpočtu podle daného algoritmu. pamět ová pamět ovou složitost definujeme jako závislost pamět ových nároků algoritmu na vstupních datech. Časová složitost výpočetních metod zpravidla vzbuzuje menší respekt než složitost prostorová. Příklad: O(n), n = 10 7.Přepsáním části kódu do assembleru jsme snížili čas operace na 0.25 s. Nalezení záznamu tedy bude trvat necelý měsíc. O(log n), n = 10 7, t = 7s. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 19/37 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 20/37 - příklad - příklad Předpokládejme nyní, že pět různých programů P 1, P 2, P 3, P 4, P 5 má časovou složitost danou funkcemi: t 1 (n) =n, t 2 (n) =n log n, t 3 (n) =n 2, t 4 (n) =n 3, t 5 (n) =2 n. Elementární operace vykonávané programy trvají 1ms, rozsah dat zpracovaných programy: program složitost 1s 1min 1hod t 1 (n) n 1000 6 10 3 3, 6 10 6 t 2 (n) n log n 140 4895 2, 0 10 5 t 3 (n) n 2 31 244 1897 t 4 (n) n 3 10 39 153 t 5 (n) 2 n 9 15 21 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 21/37 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 22/37 horní, dolní odhad ní míry Definice: Necht f je libovolná funkce v oboru přirozených čísel. Říkáme, že problém T má časovou složitost nejvýše f, jestliže existuje algoritmus A pro T takový, že složitost všech ostatních algoritmů je menší nebo rovna složitosti algoritmu A. Funkce f se nazývá horním odhadem časové složitosti problému T. Definice: Říkáme, že problém T má časovou složitost alespoň f, jestliže existuje program P pro T takový, že t P (n) f (n) pro všechna n. V tomto případě jef dolním odhadem časové složitosti. Podaří-li se vyjádřit časovou či pamět ovou složitost algoritmu jako funkci rozsahu vstupních dat, pak pro hodnocení efektivity algoritmu je důležité zejména to, jak roste složitost v závislosti na růstu rozsahu vstupních dat. Jinak řečeno, zajímá nás limitní chování složitosti tzv. asymptotická složitost. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 23/37 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 24/37

Θ(g(n)) O(g(n)) Pro každou funkci g(n), označíme zápisem Θ(g(n)) množinu funkcí Θ(g(n)) = f (n) :takových, že existují kladné konstanty c 1, c 2 a n 0 tak, že 0 c 1 g(n) f (n) c 2 g(n) pro všechna n n 0. Funkce f (n) patří do množiny Θ(g(n)) jestliže existují kladné konstanty c 1 a c 2 takové, že tato funkce nabývá hodnot mezi c 1 g(n) a c 2 g(n). Skutečnost, že f (n) splňuje předcházející vlastnost zapisujeme f (n) = Θ(g(n)). Tento zápis znamená f (n) Θ(g(n)). Θ-značení omezuje asymptoticky funkci zdola a shora. Jestliže budeme chtít omezit funkci jen shora použijeme O(g(n)). Pro každou funkci g(n), označíme zápisem O(g(n)) množinu funkcí O(g(n)) = f (n) : takových, že existují kladné konstanty c a n 0 tak, že 0 f (n) cg(n) pro všechna n n 0. Příklad: O(log n), n = 10 7, t = 7s. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 25/37 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 26/37 Ω(g(n)) o(g(n)), ω(g(n)) Pro každou funkci g(n), označíme zápisem Ω(g(n)) množinu funkcí Ω(g(n)) = f (n) :takových, že existují kladné konstanty c a n 0 tak, že 0 cg(n) f (n) pro všechna n n 0. o(g(n)) Pro každou funkci g(n), označíme zápisem o(g(n)) množinu funkcí o(g(n)) = f (n) :takových, že pro každou kladnou konstantu c existuje konstanta n 0 taková, že 0 f (n) < cg(n) pro všechna n n 0. ω(g(n)) Pro každou funkci g(n), označíme zápisem ω(g(n)) množinu funkcí ω(g(n)) = f (n) :takových, že pro každou kladnou konstantu c existuje konstanta n 0 taková, že 0 cg(n) < f (n) pro všechna n n 0. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 27/37 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 28/37 Příklad a) 3n = O(n) b) n 2 = O(n) c) n = O(n 2 ) d) e n = O(n 4 ) e) n = O(log n) f) log n = O(n) V programování je rekurze představována funkcí nebo procedurou, která uvnitř těla funkce nebo procedury obsahuje volání téže funkce nebo procedury. Říkáme, že funkce nebo procedura volá samu sebe. Princip rekurze si ukážeme na výpočtu faktoriálu čísla n. Funkce faktoriál je definována 1 pro n = 0 f (n) = f (n f (n 1)) pro n 1 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 29/37 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 30/37

- faktoriál - faktoriál f (n) = f (n f (n 1)) = f (n f ((n 1) f ((n 2)))) = = = f (n f ((n 1) f ((n 2) f (1 f (0))...)) což vede ke známému vyjádření n! = n (n 1)! = n (n 1)(n 2)! = = n (n 1) (n 2) 1 0! int factorial(int n) if (n == 0) return 1; else return (n * factorial(n - 1)); c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 31/37 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 32/37 - volání funkcí Efektivita rekurze Předpis Fibonacciho funkce: 0 pro n = 0 fib(n) = 1 pro n = 1 fib(n 1)+fib(n 2) pro n > 1 Řada Fibonacciho čísel vypadá následovně 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,... c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 33/37 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 34/37 Fibonacciho funkce Fibonacciho funkce složitost int fib(int n) if(n==0 n==1) return n; else return fib(n - 1) + fib(n - 2); Počítání již spočítaných hodnot exponenciální složitost. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 35/37 c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 36/37

Fibonacciho funkce lineární algoritmus int fibi(int n) int f[3], i; f[0] = 0; f[1] = 1; for (i = 2; i <= n; i++) f[i%3]=f[(i-1)%3]+f[(i-2)%3]; return f[(i - 1) % 3]; V pomocném poli jsou uloženy spočítané hodnoty lineární složitost. c 2005 Michal Krátký, Jiří Dvorský Úvod do programování 37/37