Časová složitost algoritmů

Podobné dokumenty
Algoritmy I, složitost

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

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

IAJCE Přednáška č. 9. int[] pole = new int[pocet] int max = pole[0]; int id; for(int i =1; i< pole.length; i++) { // nikoli 0 if (Pole[i] > max) {

Základy algoritmizace a programování

Algoritmizace prostorových úloh

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

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

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

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

Algoritmizace řazení Bubble Sort

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

Asymptotická složitost algoritmů

Algoritmy a datové struktury

5. Vyhledávání a řazení 1

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

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

Prioritní fronta, halda (heap), řazení

Zadání k 2. programovacímu testu

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

Algoritmizace a programování

Časová složitost / Time complexity

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

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

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

Vyvažování a rotace v BVS, všude se předpokládá AVL strom

COMPLEXITY

int t1, t2, t3, t4, t5, t6, t7, prumer; t1=sys.readint();... t7=sys.readint(); prume pru r = r = ( 1+t 1+t t3+ t3+ t4 t5+ t5+ +t7 +t7 )/ ;

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

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

IB111 Úvod do programování skrze Python

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

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

Základy řazení. Karel Richta a kol.

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

Rekurze a zásobník. Jak se vypočítá rekurzivní program? volání metody. vyšší adresy. main(){... fa(); //push ret1... } ret1

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

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

Datové struktury. alg12 1

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

Stromy, haldy, prioritní fronty

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

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

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

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

Zdůvodněte, proč funkce n lg(n) roste alespoň stejně rychle nebo rychleji než než funkce lg(n!). Symbolem lg značíme logaritmus o základu 2.

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

Spojové struktury. x, y, a, b. X1 y1 X2 y2 X3 y3. Grafické objekty bod. kružnice. obdélník. lomenáčára

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

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

10. Složitost a výkon

Řazení. Uspořádat množinu prvků obsahujících klíč podle definovaného kriteria.

NPRG030 Programování I, 2018/19 1 / :03:07

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

Sada 1 - Základy programování

Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost

Digitální učební materiál

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

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

SYSTÉMOVÉ INŽENÝRSTVÍ A INFORMATIKA (2-letý) (písemný test, varianta B)

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

Dynamické datové struktury III.

Časová a prostorová složitost algoritmů

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

Digitální učební materiál

Stromy. Jan Hnilica Počítačové modelování 14

Třídění a vyhledávání Searching and sorting

Binární vyhledávací stromy pokročilé partie

Rozklad problému na podproblémy

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

Maturitní téma: Programovací jazyk JAVA

Základy algoritmizace. Hašování

Datové struktury 2: Rozptylovací tabulky

Zpracoval: 7. Matematická indukce a rekurse. Řešení rekurentních (diferenčních) rovnic s konstantními koeficienty.

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

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

Základy algoritmizace, návrh algoritmu

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

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

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

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

IB111 Úvod do programování skrze Python

ABSTRAKTNÍ DATOVÉ TYPY (ADT)

PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI GLOBÁLNÍ PROMĚNNÉ. NSWI162: Sémantika programů 2

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

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.

IAJCE Přednáška č. 12

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

Vzdálenost uzlů v neorientovaném grafu

Pokročilé haldy. prof. Ing. Pavel Tvrdík CSc. Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010

68. ročník Matematické olympiády 2018/2019

1 LIMITA FUNKCE Definice funkce. Pravidlo f, které každému x z množiny D přiřazuje právě jedno y z množiny H se nazývá funkce proměnné x.

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

Robert Haken [MVP ASP.NET/IIS, MCT] software architect, HAVIT, Základní algoritmy v praxi

Úvod do problematiky

Rekurzivní algoritmy

R zné algoritmy mají r znou složitost

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

Datový typ prioritní fronta Semestrální práce z předmětu 36PT

Další příklady. Katedra softwarového inženýrství. Katedra teoretické informatiky, Fakulta informačních technologii, ČVUT v Praze. Karel Müller, 2011

Transkript:

Č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ýsledkem je časová složitost algoritmu Časová složitost algoritmu vyjadřuje závislost času potřebného pro provedení výpočtu na rozsahu ( velikosti ) vstupních dat Čas se však neměří sekundách, ale počtem provedených operací, přičemž trvání každé operace se chápe jako bezrozměrná jednotka Příklad: součet prvků pole static int soucet(int[] pole) { int s = 0; for (int i=0; i<pole.length; i++ ) s = s + pole[i] ; return s; Považujme za operace podtržené konstrukce, pak časová složitost je: C(n) = 2 + (n+1) + n + n = 3 + 3n kde n je počet prvků pole Algoritmizace (Y36ALG), Šumperk - 10. přednáška 1

Časová složitost algoritmů Doba výpočtu obvykle nezávisí jen na rozsahu vstupních dat, ale též na konkrétních hodnotách. Obecně proto rozlišujeme časovou složitost v nejlepším, nejhorším a průměrném případě Příklad: sekvenční hledání prvku pole s danou hodnotou static int hledej(int[] pole, int x) { Analýza: for (int i=0; i<pole.length; i++ ) if ( x==pole[i] ) return i; return -1; nejlepší případ: první prvek má hodnotu x Algoritmizace (Y36ALG), Šumperk - 10. přednáška 2

Časová složitost algoritmů Doba výpočtu obvykle nezávisí jen na rozsahu vstupních dat, ale též na konkrétních hodnotách Obecně proto rozlišujeme časovou složitost v nejlepším, nejhorším a průměrném případě Příklad: sekvenční hledání prvku pole s danou hodnotou static int hledej(int[] pole, int x) { Analýza: for (int i=0; i<pole.length; i++ ) if ( x==pole[i] ) return i; return -1; nejlepší případ: první prvek má hodnotu x C min (n) = 3 nejhorší případ: žádný prvek nemá hodnotu x Algoritmizace (Y36ALG), Šumperk - 10. přednáška 3

Časová složitost algoritmů Doba výpočtu obvykle nezávisí jen na rozsahu vstupních dat, ale též na konkrétních hodnotách Obecně proto rozlišujeme časovou složitost v nejlepším, nejhorším a průměrném případě Příklad: sekvenční hledání prvku pole s danou hodnotou static int hledej(int[] pole, int x) { Analýza: for (int i=0; i<pole.length; i++ ) if ( x==pole[i] ) return i; return -1; nejlepší případ: první prvek má hodnotu x C min (n) = 3 nejhorší případ: žádný prvek nemá hodnotu x C max (n) = 1 + (n+1) + n + n = 2 + 3n průměrný případ Algoritmizace (Y36ALG), Šumperk - 10. přednáška 4

Časová složitost algoritmů Doba výpočtu obvykle nezávisí jen na rozsahu vstupních dat, ale též na konkrétních hodnotách Obecně proto rozlišujeme časovou složitost v nejlepším, nejhorším a průměrném případě Příklad: sekvenční hledání prvku pole s danou hodnotou static int hledej(int[] pole, int x) { Analýza: for (int i=0; i<pole.length; i++ ) if ( x==pole[i] ) return i; return -1; nejlepší případ: první prvek má hodnotu x C min (n) = 3 nejhorší případ: žádný prvek nemá hodnotu x C max (n) = 1 + (n+1) + n + n = 2 + 3n průměrný případ C prum (n) = 2.5 + 1.5n Algoritmizace (Y36ALG), Šumperk - 10. přednáška 5

Časová složitost algoritmů Přesné určení počtu operací při analýze složitosti algoritmu bývá velmi složité Zvlášť komplikované, ba i nemožné, bývá určení počtu operací v průměrném případě; proto se většinou omezujeme jen na analýzu nejhoršího případu. Zpravidla nás nezajímají konkrétní počty operací pro různé rozsahy vstupních dat n, ale tendence jejich růstu při zvětšujícím se n. Pro tento účel lze výrazy udávající složitost zjednodušit: stačí uvažovat pouze složky s nejvyšším řádem růstu a i u nich lze zanedbat multiplikativní konstanty Příklad: řád růstu časové složitosti předchozích algoritmů je n (časová složitost je lineární). Časovou složitost vyjadřujeme pomocí tzv. asymptotické notace: O dvou funkcích f a g definovaných na množině přirozených čísel a s nezáporným oborem hodnot říkáme, že f roste řádově nejvýš tak rychle, jako g a píšeme f(n) = O(g(n)) pokud existují přirozenáčísla K a n 1 tak, že platí f(n) K.g(n) pro všechna n > n 1 Algoritmizace (Y36ALG), Šumperk - 10. přednáška 6

Časová složitost algoritmů Tabulka udávající dobu výpočtu pro různéčasové složitosti za přepokladu, že 1 operace trvá 1 µs n 10 20 40 60 500 1000 log n 2,3µs 4,3µs 5µs 5,8µs 9µs n 10µs 20µs 40µs 60µs 0,5s 1ms n log n 23µs 86µs 0,2ms 0,35ms 4,5ms 10ms n 2 0,1ms 0,4ms 1,6ms 3,6ms 0,25s 1s n 3 1ms 8ms 64ms 0,2s 125s 17min n 4 10ms 160ms 2,56s 13s 17h 11,6dní 2 n 1ms 1s 12,7 dní 36000 let n! 3,6s 77000 let Algoritmizace (Y36ALG), Šumperk - 10. přednáška 7

Hledání v poli Sekvenční hledání v poli lze urychlit pomocí zarážky. Za předpokladu, že pole není zaplněno až do konce, uložíme do prvního volného prvku hledanou hodnotu a cyklus pak může být řízen jedinou podmínkou. Sekvenční hledání se zarážkou: static int hledejsezarazkou(int[] pole, int volny, int x){ int i = 0; pole[volny] = x; // uložení zarážky while ( pole[i]!= x ) i++; if ( i<volny ) return i; // hodnota nalezena else return -1; // hodnota nenalezena Tak sice ušetříme n=volny testů indexu, avšak časová složitost zůstane O(n) a nejde tedy o významné urychlení. Algoritmizace (Y36ALG), Šumperk - 10. přednáška 8

Princip opakovaného půlení Pro některé problémy lze sestavit algoritmus založený na principu opakovaného půlení: o o základem je cyklus, v němž se opakovaně zmenšuje rozsah dat na polovinu časová složitost takového cyklu je logaritmická (dělíme-li n opakovaně 2, pak po log 2 (n) krocích dostaneme číslo menší nebo rovno 1) Při hledání prvku pole lze použít princip opakovaného půlení v případě, že pole je seřazené, tj. hodnoty jeho prvků tvoří monotonní posloupnost. Hledání půlením ve vzestupně seřazeném poli: o o o o zjistíme hodnotu y prvku ležícího uprostřed zkoumaného úseku pole je-li hledaná hodnota x = y, je prvek nalezen je-li x < y, budeme hledat v levém úseku je-li x > y, budeme hledat v pravém úseku Takovéto hledání se nazývá též binární hledání (binary search),časová složitost je O(log n). Algoritmizace (Y36ALG), Šumperk - 10. přednáška 9

Binární hledání Algoritmus binárního hledání: static int hledejbinarne(int[] pole, int x) { // metoda vrací index hledaného prvku x int dolni = 0; int horni = pole.length-1; int stred; while ( dolni<=horni ) { stred = (dolni+horni)/2; if ( x<pole[stred] ) horni = stred-1; // nalevo else if (x>pole[stred]) dolni = stred +1;// napravo else return stred; // nalezen return -1; // nenalezen Algoritmizace (Y36ALG), Šumperk - 10. přednáška 10

Řazení pole Algoritmy řazení pole jsou algoritmy, které přeskupí prvky pole tak, aby upravené pole bylo seřazené. Pole p je vzestupně seřazené, jestliže platí p[i-1] <= p[i]pro i = 1 počet prvků pole 1 Pole p je sestupně seřazené, jestliže platí p[i-1] >= p[i]pro i = 1 počet prvků pole 1 Principy některých algoritmůřazení ukažme na řazení pole prvků typu int. Ukážeme si následující metody řazení pole: o bubblesort( ) o selectsort( ) o insertsort( ) o mergesort( ) Algoritmizace (Y36ALG), Šumperk - 10. přednáška 11

Řazení zaměňováním ( BubbleSort ) Při řazení zaměňováním postupně porovnáváme sousední prvky a pokud jejich hodnoty nejsou v požadované relaci, vyměníme je; to je třeba provést několikrát. Hrubéřešení: for ( n=a.length-1; n>0; n-- ) for ( i=0; i<n; i++ ) if ( a[i]>a[i+1] ) // vyměň a[i] a a[i+1] Jak budou seřazeny prvky pole? Podrobnéřešení: static void bubblesort(int[] a) { int pom, n, i; for ( n=a.length-1; n>0; n-- ) for ( i=0; i<n; i++ ) Časová složitost je O( n 2 ) if ( a[i]>a[i+1] ) pom = a[i]; a[i] = a[i+1]; a[i+1] = pom; Algoritmizace (Y36ALG), Šumperk - 10. přednáška 12

Řazení výběrem ( SelectSort ) Při řazení výběrem se opakovaně hledá nejmenší prvek Hrubéřešení: for (i=0; i<a.length-1; i++) { Podrobnéřešení: "najdi nejmenší prvek mezi a[i] až a[a.length-1] ; "vyměň hodnotu nalezeného prvku s a[i] ; public static void selectsort(int[] a) { int i, j, imin, pom; for (i=0; i<a.length-1; i++) { imin = i; for (j=i+1; j<a.length; j++) if (a[j]<a[imin]) imin = j; if (imin!=i) { pom = a[imin]; a[imin] = a[i]; a[i] = pom; Časová složitost algoritmu SelectSort: O(n 2 ) Algoritmizace (Y36ALG), Šumperk - 10. přednáška 13

Řazení vkládáním ( InsertSort ) Pole lze seřadit opakovaným vkládání prvku do seřazeného úseku pole Hrubéřešení: for (n=1; n<a.length; n++) { Podrobnéřešení: úsek pole od a[0] do a[n-1] je seřazen vlož do tohoto úseku délky n hodnotu a[n] private static void vloz(int[] a, int n, int x) { int i; for (i=n-1; i>=0 && a[i]>x; i--) a[i+1]=a[i]; // odsun a[i+1] = x; // vlozeni public static void insertsort(int[] a) { for (int n=1; n<a.length ; n++) vloz(a, n, a[n]); Časová složitost algoritmu InsertSort: O(n 2 ) Algoritmizace (Y36ALG), Šumperk - 10. přednáška 14