Časová složitost / Time complexity

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

Digitální učební materiál

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

Algoritmy I, složitost

Digitální učební materiál

10. Složitost a výkon

Časová a prostorová složitost algoritmů

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

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

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

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

2. Složitost, grafové algoritmy (zapsal Martin Koutecký)

Digitální učební materiál

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

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 algoritmů. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

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

Prioritní fronta, halda

IB111 Úvod do programování skrze Python

Úvod do informatiky. Miroslav Kolařík

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

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

Asymptotická složitost algoritmů

Základy algoritmizace a programování

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

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

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

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

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

Rekurentní rovnice, strukturální indukce

Datové struktury 2: Rozptylovací tabulky

Rekurze a rychlé třídění

Základy algoritmizace, návrh algoritmu

Obsah. Euler-Fermatova věta. Reziduální aritmetika. 3. a 4. přednáška z kryptografie

Časová složitost algoritmů

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

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

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

ALGORITMY A DATOVÉ STRUKTURY

TGH05 - Problém za milion dolarů.

COMPLEXITY

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

Rekurentní rovnice, strukturální indukce

Úvod do problematiky

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

NP-ÚPLNÉ PROBLÉMY. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT Č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í

Určování složitosti algoritmů. Základy diskrétní matematiky, BI-ZDM

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

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

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

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

NPRG030 Programování I, 2018/19 1 / :25:37

Problémy a algoritmy

Digitální učební materiál

Problémy a algoritmy

IB111 Úvod do programování skrze Python

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

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

Úvod do programování

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

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

IB109 Návrh a implementace paralelních systémů. Analytický model paralelních programů. RNDr. Jiří Barnat, Ph.D.

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

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

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

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

Asymetrická kryptografie a elektronický podpis. Ing. Dominik Breitenbacher Mgr. Radim Janča

Vztah teorie vyčíslitelnosti a teorie složitosti. IB102 Automaty, gramatiky a složitost, /31

1 Test 1 naivní vs standardní

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

IAJCE Přednáška č. 12

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

Výpočetní složitost algoritmů

Spojový seznam. Jan Kybic.

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

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

Aplikovaná matematika I

1 Nejkratší cesta grafem

Definiční obor funkce

TGH07 - Chytré stromové datové struktury

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

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

Šablony, kontejnery a iterátory

Dynamické datové struktury IV.

Dynamické datové struktury III.

19. a 20. přednáška z kryptografie

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.

Ukážeme si lineární algoritmus, který pro pevné k rozhodne, zda vstupní. stromový rozklad. Poznamenejme, že je-li k součástí vstupu, pak rozhodnout

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

Složitost problémů. Z. Sawa (VŠB-TUO) Úvod do teoretické informatiky 25. dubna / 23

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

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

Funkce. Limita a spojitost

Složitost a moderní kryptografie

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

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

Dynamické programování

3. Třídy P a NP. Model výpočtu: Turingův stroj Rozhodovací problémy: třídy P a NP Optimalizační problémy: třídy PO a NPO MI-PAA

Transkript:

Č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 na vstupních datech v nejhorším případě, v průměru... Který algoritmus je lepší? Jak velká data jsme schopni zpracovat? Empirická vs. teoretická analýza 2 / 24

Empirická časová složitost Teoretická časová složitost 3 / 24

Empirická časová složitost Změříme dobu běhu pro různá vstupní data Vyhodnocujeme algoritmus + implementace + hardware Kvantitativní výsledky Neposkytuje záruky, obtížná predikce 4 / 24

Příklad: Prvočísla Najdi všechna prvočísla menší než m Metody: 1. Zkus všechny dělitele do n 1 2. Zkus všechny dělitele do n 3. Eratosthenovo síto 4. Eratosthenovo síto, vylepšené ( n, jen lichá) Soubor porovnani_prvocislo.py 5 / 24

Prvočísla měření času (1) Implementation : prvocisla_jednoduse n= 100 CPU time= 0.001s n= 300 CPU time= 0.004s n= 1000 CPU time= 0.035s n= 3000 CPU time= 0.274s n= 10000 CPU time= 2.716s n= 30000 CPU time= 21.899s n=100000 CPU time=218.257s 6 / 24

Prvočísla měření času (2) Implementation : prvocisla_odmocnina n= 100 CPU time= 0.000s n= 300 CPU time= 0.001s n= 1000 CPU time= 0.003s n= 3000 CPU time= 0.012s n= 10000 CPU time= 0.063s n= 30000 CPU time= 0.278s n=100000 CPU time= 1.439s 7 / 24

Prvočísla měření času (3) Implementation : prvocisla_eratosthenes n= 100 CPU time= 0.000s n= 300 CPU time= 0.000s n= 1000 CPU time= 0.001s n= 3000 CPU time= 0.003s n= 10000 CPU time= 0.009s n= 30000 CPU time= 0.027s n=100000 CPU time= 0.095s 8 / 24

Prvočísla měření času (4) Implementation : prvocisla_eratosthenes2 n= 100 CPU time= 0.000s n= 300 CPU time= 0.000s n= 1000 CPU time= 0.000s n= 3000 CPU time= 0.002s n= 10000 CPU time= 0.005s n= 30000 CPU time= 0.017s n=100000 CPU time= 0.058s 9 / 24

Prvočísla graf 3.0 2.5 2.0 prvocisla_jednoduse prvocisla_odmocnina prvocisla_eratosthenes prvocisla_eratosthenes2 time [s] 1.5 1.0 0.5 0.0 0 2000 4000 6000 8000 10000 m Kvalitativní (řádové) rozdíly. 10 / 24

Prvočísla graf (2) 10 3 10 2 10 1 prvocisla_jednoduse prvocisla_odmocnina prvocisla_eratosthenes prvocisla_eratosthenes2 10 0 time [s] 10-1 10-2 10-3 10-4 10-5 10 2 10 3 10 4 10 5 m 11 / 24

Empirická časová složitost Teoretická časová složitost 12 / 24

Teoretická analýza časová složitosti Studujme funkci T (n) Velikost problému n vstupní parametr délka vstupních dat parametrů může být více Čas běhu programu T Ve fyzických jednotkách V počtu typických operací přiřazení, porovnání, sčítání,... (výpočetní model) 13 / 24

Asymptotická časová složitost Přesný vzorec pro T (n) není nutný... Zajímají nás pouze kvalitativní rozdíly Multiplikativní konstanty zanedbáme vliv počítače, programátora, programovacího jazyka... vždycky si můžeme koupit rychlejší počítač Zajímá nás chování pro velká n Rychlost růstu T (n) pro n Pomaleji rostoucí části T (n) zanedbáme 14 / 24

Asymptotická notace Řád růstu funkce / big-o notation f (n) : N R + 0 je O( g(n) ) pokud existují konstanty c > 0 a n 0 > 0 takové, že f (n) cg(n) pro všechna n n 0. Pro polynomiální f (n) člen nejvyššího řádu, bez konstanty. Příklady: f (n) = 456211n + 235166 je O ( n) f (n) = n(n + 2)/2 f (n) = 442(n + 12) log n je O ( n 2 ) je O ( n log n) f (n) = 4n 3 + 100n 2 + 1000n + 5000 je O ( n 3 ) 15 / 24

Asymptotická notace Řád růstu funkce / big-o notation f (n) : N R + 0 je O( g(n) ) pokud existují konstanty c > 0 a n 0 > 0 takové, že f (n) cg(n) pro všechna n n 0. Ověření: f (n) = 4n 3 + 100n 2 + 1000n + 5000 je O ( n 3 ) Možné ověření: a proto n 100 n 3 100n 2, n 3 1000n, n 3 5000 n 100 4n 3 + 100n 2 + 1000n + 5000 7n 3 n 0 = 100, c = 7 15 / 24

Asymptotická notace Řád růstu funkce / big-o notation f (n) : N R + 0 je O( g(n) ) pokud existují konstanty c > 0 a n 0 > 0 takové, že f (n) cg(n) pro všechna n n 0. O ( ) notace je horní odhad, ale uvádíme ten nejlepší známý. Tedy f (n) = 4n 3 + 100n 2 je nejenom O(n 3 ), ale zároveň i O(n 4 ) a O(n 10 ). 15 / 24

Asymptotická notace (2) Big-Θ notation f (n) : N R + 0 je Θ( g(n) ) pokud existují konstanty c 1 > 0, c 2 > 0 a n 0 > 0 takové, že c 1 g(n) f (n) c 2 g(n) pro všechna n n 0. Tedy konstantní násobek g je zároveň horní a dolní odhad. 4n 3 + 100n 2 je O(n 3 ), O(n 4 ), O(n 10 )... 4n 3 + 100n 2 je pouze Θ(n 3 ), ale nikoliv i Θ(n 4 ) či Θ(n 10 ). 16 / 24

Asymptotická notace (2) Big-Θ notation f (n) : N R + 0 je Θ( g(n) ) pokud existují konstanty c 1 > 0, c 2 > 0 a n 0 > 0 takové, že c 1 g(n) f (n) c 2 g(n) pro všechna n n 0. Tedy konstantní násobek g je zároveň horní a dolní odhad. 4n 3 + 100n 2 je O(n 3 ), O(n 4 ), O(n 10 )... 4n 3 + 100n 2 je pouze Θ(n 3 ), ale nikoliv i Θ(n 4 ) či Θ(n 10 ). Θ notace je přesnější, ale v praxi se často setkáte s O( ) ve významu Θ( ). Odhad O( ) je snazší nalézt. 16 / 24

Asymptotická notace (3) Limita pro velká n f (n) n g(n) pokud lim n f (n) g(n) = 1. Zkráceně f (n) g(n) (je asymptoticky rovno) Pro polynomy, pouze člen nejvyššího řádu, včetně konstanty. f (n) = 4n 3 + 100n 2 + 1000n + 5000 4n 3 f (n) = 456211n + 235166 456211n f (n) = n(n + 2)/2 n 2 /2 f (n) = 442(n + 12) log n 442n log n Místo f je O(n 3 ) píšeme f (n) O(n 3 ) 17 / 24

Druhy odhadů Časová složitost typicky závisí na datech (nejen na velikosti n) Průměrná složitost (Average complexity) složitá teoretická analýza lze odhadnout z experimentů na typických datech Nejhorší složitost (Worst-case complexity) jen experimentálně nelze teoretická analýza různě přesné horní odhady 18 / 24

Druhy odhadů Časová složitost typicky závisí na datech (nejen na velikosti n) Průměrná složitost (Average complexity) složitá teoretická analýza lze odhadnout z experimentů na typických datech Nejhorší složitost (Worst-case complexity) jen experimentálně nelze teoretická analýza různě přesné horní odhady Složitost může záležet na více parametrech vstupních dat (např. počet vstupních čísel a jejich maximální hodnota) 18 / 24

Složitost hledání prvočísel for n in range(2,m): # cyklus 2..m-1 p=2 # začátek testu while p<n: if n % p == 0: break p+=1 if p==n: # n je prvočíslo primes+=[p] 19 / 24

Složitost hledání prvočísel for n in range(2,m): # cyklus 2..m-1 p=2 # začátek testu while p<n: if n % p == 0: break p+=1 if p==n: # n je prvočíslo primes+=[p] Analýza: Vnější for cyklus proběhne m 1-krát Každý vnitřní cyklus while proběhne max. n 2-krát, kde n < m Vnitřní cyklus tedy proběhne max. m 2 -krát Složitost tohoto algoritmu je tedy O(m 2 ) 19 / 24

Složitost hledání prvočísel for n in range(2,m): # cyklus 2..m-1 p=2 # začátek testu while p<n: if n % p == 0: break p+=1 if p==n: # n je prvočíslo primes+=[p] Poznámky: Operace mimo vnitřní cyklus zanedbáme. Toto je horní odhad. Ve skutečnosti je složitost nižší, díky příkazu break. 19 / 24

Složitost hledání prvočísel (2) for n in range(2,m): # cyklus 2..m-1 p=2 # začátek testu while p*p<n: if n % p == 0: break p+=1 if p*p > n: # n je prvočíslo primes+=[n] Analýza: Vnější for cyklus proběhne m 1-krát Vnitřní while cyklus proběhne max. ( n 1)-krát, kde n < m Vnitřní cyklus tedy proběhne max. m 1.5 -krát Složitost tohoto algoritmu je tedy O(m 1.5 ) (nebo lepší) 20 / 24

Prvočísla graf 10 3 10 2 10 1 prvocisla_jednoduse prvocisla_odmocnina prvocisla_eratosthenes prvocisla_eratosthenes2 10 0 time [s] 10-1 10-2 10-3 10-4 10-5 10 2 10 3 10 4 10 5 m Asymptotická složitost Eratostenova síta je O ( n log(log n) ) 21 / 24

Srovnání složitostí složitost poznámka konstantní O(1) nejrychlejší logaritmická O(log n) skoro jako O(1), např. vyhledávání lineární O(n) rychlé, použitelné pro velká data O(n log n) skoro jako O(n), např. třídění kvadratické O(n 2 ) trochu pomalejší, vhodné do n 10 6 kubické O(n 3 ) pomalejší, vhodné do n < 10 4 polynomiální O(n k ) pomalé exponenciální O(b n ) velmi pomalé, do n 50 O(n!), O(n n ) nejpomalejší, do n 15 Jak se změní čas, zvětší-li se n 2n? 22 / 24

Srovnání složitostí (2) 10000 8000 6000 konstantní logaritmický lineární n log(n) kvadratický kubický exponenciální time 4000 2000 0 20 40 60 80 100 n 23 / 24

Složitost základních operací v Pythonu V konstantním čase: len(), a[i] (indexace), a+=[v] (přidání na konec), a.pop() (smazání posledního prvku) V lineárním čase: a+b (spojení), a[i:j] (řez pole), a.insert() (vkládání doprostřed pole), max(), sum()... V čase n log n: a.sort() 24 / 24

Složitost základních operací v Pythonu V konstantním čase: len(), a[i] (indexace), a+=[v] (přidání na konec), a.pop() (smazání posledního prvku) V lineárním čase: a+b (spojení), a[i:j] (řez pole), a.insert() (vkládání doprostřed pole), max(), sum()... V čase n log n: a.sort() Složitost přidání prvku na konec pole je konstantní jen v průměru (amortized complexity), nikoliv pro každou operaci. 24 / 24