Dynamické proměnné (1) Proměnné, jejichž počet a (nebo) velikost pa-měti využívané těmito proměnnými se v prů-běhu programu mění Dynamické proměnné lze.

Slides:



Advertisements
Podobné prezentace
LOGISTICKÉ SYSTÉMY 14/15.
Advertisements

NEJKRATŠÍ CESTY MEZI VŠEMI UZLY
Stavový prostor. • Existují úlohy, pro které není k dispozici univerzální algoritmus řešení • různé hry • problém batohu, problém obchodního cestujícího.
Dualita úloh lineárního programování a analýza citlivosti
Programovací jazyk C++
Třída SIMSET je druhou standardní systémovou třídou, která obsahuje prostředky pro práci se spojovými seznamy. KRUHOVÉ SPOJOVÉ SEZNAMY Spojový seznam –
Přednáška 11 Jiří Šebesta
Programování 2 Cvičení 5.
10. Dynamické datové struktury
25/08/20141 Typ struktura (1) Datový typ struktura ( struct ) je agrego- vaný heterogenní datový typ Jedná se o skupinu několika proměnných, které mohou.
Fronta - a)Implementace s využitím statických struktur (pole) b)Implementace s využitím dynamických struktur (spojového seznamu) odebírá se ze začátku.
Aplikace teorie grafů Základní pojmy teorie grafů
Operační systémy. OPERAČNÍ SYSTÉMY pomoc operátorovi, podpora vlastností reálného času, víceuživatelských a více úlohových systémů.
ALGO – Algoritmizace 1. cvičení
Základy informatiky přednášky Kódování.
ADT Strom.
Skip-List je datová struktura, která může být použita jako náhrada za vyvážené stromy. představují pravděpodobnostní alternativu k vyváženým stromům (struktura.
FORMALIZACE PROJEKTU DO SÍŤOVÉHO GRAFU
Databáze Jiří Kalousek.
LOGISTICKÉ SYSTÉMY 7/14.
Funkce.
Základní číselné množiny
LINEÁRNÍ OPTIMALIZAČNÍ MODEL
Řešení dynamických problémů s podmínkami Pavel Surynek Univerzita Karlova v Praze Matematicko-fyzikální fakulta.
Řadicí algoritmy autor: Tadeáš Berkman.
Vyučovací hodina 1 vyučovací hodina: Opakování z minulé hodiny 5 min Nová látka 20 min Procvičení nové látky 15 min Shrnutí 5 min 2 vyučovací hodiny: Opakování.
BRVKA Leonard Paul Euler (1707 – 1783). Pod označením INVERZNÍ proces chápeme opačný děj, takový, který probíhá opačným směrem, např. tání a tuhnutí.
TI 7.1 NEJKRATŠÍ CESTY Nejkratší cesty - kap. 6. TI 7.2 Nejkratší cesty z jednoho uzlu Seznámíme se s následujícími pojmy: w-vzdálenost (vzdálenost na.
ORIENTOVANÉ GRAFY V této části se seznámíme s následujícími pojmy:
Algoritmy a programovací techniky
Sémantická analýza Jakub Yaghob
Stromy.
Matice.
A1PRG - Programování – Seminář Ing. Michal Ukazatele a pole 10 Verze
Další abstraktní datové typy
Turingův stroj.
Výpočetní složitost Odhlédneme-li od realizace algoritmu na konkrétním hardwaru a v konkrétním prostředí informačního systému, lze časovou složitost hodnotit.
Číselné posloupnosti.
Nelinearity s hysterezí Přerušení platnosti relace vytváří dvě různé charakteristiky, jejichž platnost je podmíněna směrem pohybu Hystereze přepínače x.
Graf nepřímé úměrnosti
Počítače a programování 1 7.přednáška. Základy Pole ve třídách a metodách Pole Arrays.
Kanonické indexování vrcholů molekulového grafu Molekulový graf: G = (V, E, L, ,  ) Indexování vrcholů molekulového grafu G: bijekce  : V  I I je indexová.
Teorie čísel Prvočíslo Generování prvočísel: Erathosenovo síto
Vícerozměrná pole (1) Jazyk C povoluje, aby pole mělo více rozměrů (dimenzí) než jeden Z vícerozměrných polí bývá nejčastěji použí-váno pole dvourozměrné.
Doc. Josef Kolář (ČVUT)Prohledávání grafůGRA, LS 2010/11, Lekce 4 1 / 15Doc. Josef Kolář (ČVUT)NP-úplné problémyGRA, LS 2012/13, Lekce 13 1 / 14 NP-ÚPLNÉ.
Datové typy IB111: Datové typy. Data a algoritmizace jaká data potřebuji pro vyřešení problému? jak budu data reprezentovat? jaké operaci s nimi potřebuji.
PROGRAMOVÁNÍ 3ITA,3ITB Jaroslav Burdys Hlavní zdroj:
Typ struktura (1) Datový typ struktura (struct) je agrego-vaný heterogenní datový typ Jedná se o skupinu několika proměnných, které mohou mít různé datové.
Vícerozměrná pole (1) Jazyk C povoluje, aby pole mělo více rozměrů (dimenzí) než jeden Z vícerozměrných polí bývá nejčastěji použí-váno pole dvourozměrné.
Obsah a rozsah pojmu Pojem lze vymezit buď definicí, jež určí nutné specifické vlastnosti, anebo výčtem všech předmětů, které pod tento pojem spadají.
Programovací jazyk C++
Znázornění dopravní sítě grafem a kostra grafu Předmět: Teorie dopravy - cvičení Ing. František Lachnit, Ph.D.
Programování 2. hodina RNDr. Jan Lánský, Ph.D.
Předávání parametrů z příkazové řádky OS (1)
Abstraktní datové typy
Příkazy cyklu (1) Umožňují vícekrát (nebo ani jednou) pro-vést určitý příkaz Jazyk C rozlišuje příkaz cyklu: s podmínkou na začátku: obecný tvar: while.
1 Lineární (vektorová) algebra
Dynamické proměnné (1) Proměnné, jejichž počet a (nebo) velikost pa-měti využívané těmito proměnnými se v prů-běhu programu mění Dynamické proměnné lze.
Oblast platnosti identifikátoru (1)
Typ pole (1) Proměnná typu pole představuje kolekci proměnných stejného datového typu, které mohou být označovány společným jménem (identifikátorem) Pole.
Množina bodů dané vlastnosti
Výpočetní složitost algoritmů
Různé algoritmy mají různou složitost
Jiří Vyskočil, Marko Genyg-Berezovskyj 2010
Toky v sítích.
Fronta (1) Dynamická datová struktura typu FIFO (First In First Out)
Typ ukazatel (1) Proměnné typu ukazatel (pointer) uchovávají paměťovou adresu Hodnota ukazatele říká, kde (na jaké adrese) se v paměti nachází nějaký objekt.
Cyklus for (1) Obecný tvar: for (výraz1; výraz2; výraz3) příkaz
Množina bodů dané vlastnosti
Algoritmizace a datové struktury (14ASD)
Transkript prezentace:

Dynamické proměnné (1) Proměnné, jejichž počet a (nebo) velikost pa-měti využívané těmito proměnnými se v prů-běhu programu mění Dynamické proměnné lze vytvářet, zpřístup-ňovat a rušit pomocí proměnných datového typu ukazatel Dynamické proměnné nemají vlastní identifi-kátor a přístup k nim se provádí zprostředko-vaně přes hodnotu typu ukazatel 12/11/2018

Proměnná p datového typu ukazatel Dynamické proměnné (2) Proměnná p datového typu ukazatel Dynamická proměnná Proměnná typu ukazatel obsahuje adresu pa-měti, kde se nachází hodnota dynamické pro-měnné Na jednu dynamickou proměnnou může uka-zovat více ukazatelů, pomocí nichž je možné provést její zpřístupnění 12/11/2018

Dynamické proměnné (3) Pozor! definicí proměnné typu ukazatel ještě nevzniká vlastní dynamická proměnná Paměťové místo pro dynamickou proměnnou lze alokovat pomocí funkce malloc Zpřístupnění dynamické proměnné se realizu-je použitím dereferenčního operátoru (*) Uvolnění paměťového místa vymezeného pro dynamickou proměnnou (zrušení dynamické proměnné) se provádí prostřednictvím funkce free 12/11/2018

Dynamické proměnné (4) Příklad: int *ptrInt1, *ptrInt2; ptrInt1 = (int *)malloc(sizeof(int)); ptrInt2 = (int *)malloc(sizeof(int)); *ptrInt1 = 0; *ptrInt1 = *ptrInt1+1; scanf(”%d”,ptrInt2); printf(”%d, %d\n”,*ptrInt1,*ptrInt2); free(ptrInt1); free(ptrInt2); 12/11/2018

Dynamické datové struktury (1) Datové struktury, jejichž velikost (počet po-ložek) není známa v době překladu progra-mu Jednotlivé položky těchto struktur mohou vznikat a zanikat během činnosti programu Bývají velmi často realizovány pomocí da-tového typu struct, který obsahuje: část nesoucí vlastní datové informace ukazatel(e), dovolující zpřístupnit další položku (resp. položky) dané struktury 12/11/2018

Dynamické datové struktury (2) Ukazatele v typu struct (pro dynamické datové struktury) typicky obsahují odkaz na právě definovanou strukturu Příklad: typedef struct polozka { int hodnota; struct polozka *dalsi; } typPolozka; typPolozka *dynStrukt; 12/11/2018

Dynamické datové struktury (3) Poznámka: jestliže se struktura odkazuje na sebe samu, pak není možné uvnitř struktury použít identifikátor vytvořený pomocí typedef Proměnná dynStrukt (definovaná jako uka-zatel) může následně sloužit pro zpřístupnění některé z položek celé struktury Pro zpřístupnění ostatních položek lze (opako-vaně) využívat ukazatel dalsi 12/11/2018

Dynamické datové struktury (4) Při práci s ukazateli na typ struktura je možné pro přístup k jednotlivým jejím složkám vy-užít operátor -> Je-li ptrStr ukazatel na strukturu, pak zápis: ptrStr->slozka odkazuje na složku slozka struktury, na níž ukazuje ukazatel ptrStr a je ekvivalentní zápisu: (*ptrStr).slozka 12/11/2018

Dynamické datové struktury (5) Příklad: dynStrukt = (typPolozka *) malloc(sizeof(typPolozka)); dynStrukt->hodnota = 10; /* (*dynStrukt).hodnota = 10; */ Příklady dynamických datových struktur: zásobník (stack) fronta (queue) lineární seznam (linear list) různé typy stromů obecné grafy 12/11/2018

Zásobník (1) Dynamická datová struktura typu LIFO (Last In First Out) Dovoluje přidávat (odebírat) data pouze na jednom svém místě – vrcholu zásobníku 10 vrchol zásobníku 5 20 Po postupném přidání hodnot 100 a 15 bude zásobník vypadat takto: 12/11/2018

Zásobník (2) Odebírání hodnot je možné opět pouze z vrcholu zásobníku 15 vrchol zásobníku 100 10 5 20 Odebírání hodnot je možné opět pouze z vrcholu zásobníku Není možné zpřístupnit jinou hodnotu než tu, která je právě na vrcholu zásobníku 12/11/2018

Zásobník (3) Se zásobníkem je obecně možné provádět následující operace: init (Z): provede prvotní inicializaci zásobníku Z (před jeho prvním použitím) push (Z, X): uloží hodnotu X na vrchol zásob-níku Z pop (Z, X): odebere hodnotu z vrcholu zásob-níku Z a vloží ji do proměnné X empty (Z): testuje, zda-li je zásobník Z prázdný či nikoliv 12/11/2018

Zásobník (4) Implementace zásobníku pomocí dynamických proměnných: typedef struct zasobnik { int hodnota; struct zasobnik *naslednik; } typZasobnik; typZasobnik *z; z hodnota NULL 15 100 10 5 20 naslednik 12/11/2018

Fronta (1) Dynamická datová struktura typu FIFO (First In First Out) Dovoluje data: přidávat pouze na jednom svém místě – konci fronty odebírat pouze na jednom svém místě – čele fronty 10 čelo fronty 5 20 konec fronty 12/11/2018

Fronta (2) Po postupném přidání hodnot 100 a 15 bude fronta vypadat takto: 10 čelo fronty 5 20 100 15 konec fronty Odebírání hodnot je možné pouze z čela fronty, tj. první odebíraný prvek bude 10 12/11/2018

Fronta (3) Stav fronty po odebrání jednoho prvku: 5 čelo fronty 20 100 15 konec fronty Podobně jako u zásobníku, tak i u fronty není možné zpřístupnit libovolnou hodnotu, která je v ní uložená 12/11/2018

Fronta (4) S frontou je obecně možné provádět násle-dující operace: init (F): provede prvotní inicializaci fronty F (před jejím prvním použitím) enqueue (F, X): přidá hodnotu X na konec fronty F dequeue (F, X): odebere hodnotu z čela fronty F a vloží ji do proměnné X empty (F): testuje, zda-li je fronta F prázdná či nikoliv 12/11/2018

Fronta (5) Implementace fronty pomocí dynamických proměnných: typedef struct prvek { int hodnota; struct prvek *naslednik; } typPrvek; typedef struct fronta { typPrvek *celo, *konec; } typFronta; typFronta f; 12/11/2018

Fronta (6) f celo konec hodnota 5 20 100 15 NULL naslednik 12/11/2018

Složitost algoritmů (1) Na začátku minulého století vzniká pochyb-nost o tom, zda některé algoritmy vůbec existují V této době totiž vznikla také potřeba najít matematický ekvivalent doposud intuitivně chápaného pojmu algoritmus Tato formalizace se uskutečnila kolem roku 1936 a přinesla důkaz, že existují nerozhod-nutelné (neřešitelné) algoritmické problémy 12/11/2018

Složitost algoritmů (2) Teorie, která vznikla formalizací pojmu algo-ritmus a které se často říká teorie algoritmů je v podstatě teorií vyčíslitelnosti, teorií existen-ce algoritmů a teorií nerozhodnutelných prob-lémů Existence rychlých počítačů vytvořila podmín-ky a potřebu pro vznik teorie, která věnuje po-zornost problematice: analýzy a efektivity algoritmů (programů) složitosti algoritmů hledání optimálních algoritmů 12/11/2018

Složitost algoritmů (3) Má to následující důvody: nalezení efektivnějšího algoritmu často umožňu-je řešit předtím prakticky neřešitelné problémy nalezení efektivnějšího algoritmu může přinést více než realizovatelné zrychlení počítačů i malé zefektivnění velmi často prováděných algoritmů (programů) může přinést výrazný ča-sový a ekonomický efekt. Toto je zvláště důležité při: tvorbě základního programového vybavení (firmwa-re, OS, ovladače zařízení) při práci s velkým množstvím dat 12/11/2018

Asymptotická složitost alg. (1) Při konstrukci algoritmu se snažíme obvykle najít co nejlepší algoritmus a k tomu potře-bujeme kritérium, které by dovolilo vzájem-né porovnání algoritmů Z praktického i teoretického hlediska má v tomto směru velký význam složitost: časová: udává jak roste čas, který algoritmus potřebuje ke své činnosti v závislosti na rozsahu problému (veli-kosti vstupních dat) 12/11/2018

Asymptotická složitost alg. (2) paměťová: udává jak roste kapacita paměti, kterou algoritmus potřebuje ke své činnosti v závislosti na rozsahu problému (velikosti vstupních dat) Detailní vyjádření těchto závislostí je větši-nou velmi komplikované, těžko určitelné a také velmi nepřehledné Proto je užitečné zaměřit se na vyjádření tzv. asymptotické složitosti algoritmu 12/11/2018

Asymptotická složitost alg. (3) Nás bude především zajímat časová asymp-totická složitost Vstupní údaje problému charakterizujeme jediným přirozeným číslem n: tzv. rozsah problému jistým způsobem reprezentuje rozsah (velikost) vstupních dat – např. délku posloupnosti, počet uzlů grafu, rozměr matice atd. 12/11/2018

Asymptotická složitost alg. (4) Je-li A algoritmus řešení daného problému, označme fA(n) funkci udávající maximální počet základních operací charakteristických pro daný problém, např. srovnání pro třídící algoritmy násobení u násobení matic které algoritmus provede při řešení problé-mu rozsahu n 12/11/2018

Asymptotická složitost alg. (5) Jsou-li f(n) a g(n) dvě funkce (které přiřazují přirozeným číslům reálná čísla), píšeme: f (n) = O (g (n)) jestliže existují přirozená čísla n0 a k tak, že pro každé n ł n0 platí: f (n) Ł k.g (n) Je-li fA (n) = O (g (n)), říkáme, že funkce fA (n) (až na multiplikativní konstantu) z asymptotic-kého hlediska neroste rychleji než g (n) 12/11/2018

Asymptotická složitost alg. (6) Funkci g (n) nazýváme časovou asymptotic-kou složitostí algoritmu A O algoritmu A řekneme, že jeho časová slo-žitost je: polynomiální: jestliže fA (n) = O (Pm (n)), kde Pm(n) je polynom nějakého pevného stupně m exponenciální: v opačném případě 12/11/2018

Polynomiální algoritmy Čas, který potřebují ke zpracování vstupních dat algoritmy považované za rychlé bývá zpravidla shora omezen funkcemi typu n, n.log (n), n2 a n3 Jako horní hranici lze vždy použít polynom Proto se těmto algoritmům říká polynomiál-ní nebo také prakticky použitelné 12/11/2018

Exponenciální algoritmy (1) Pomalé (prakticky nepoužitelné) algoritmy užívají metodu „hrubé síly“, kterou probírají všechny možnosti Je-li dána n prvková množina a probírají-li se všechny její: podmnožiny: je potřeba alespoň 2n kroků permutace: je potřeba alespoň n! kroků zobrazení do sebe: je potřeba alespoň nn kroků Odhad počtu kroků je alespoň exponenciální 12/11/2018

Exponenciální algoritmy (2) Příklad: Problém obchodního cestujícího je dán seznam n měst a pro každou dvojici měst je známa jejich vzdálenost (výše jízdného). Určete nejkratší (nejlevnější) cestu procházející všemi městy daného seznamu Algoritmus, který systematicky vyčísluje všechny permutace je exponenciální, jeho časová složitost je O (n!) 12/11/2018

Srovnání algoritmů (1) Následující tabulka uvádí maximální rozsah problému, který je možné řešit jednotlivými algoritmy v čase 1sekunda, 1 minuta a 1 hodina Základní časová jednotka, tj. délka trvání základní operace je jedna milisekunda 12/11/2018

Srovnání algoritmů (2) Max. rozsah problému 1 sec. 1 min. 1 hod. A1 n 1000 60 000 3 600 000 A2 n + log (n) 990 59 984 3 599 978 A3 n.log (n) 140 4 893 200 000 A4 10n 100 6 000 360 000 A5 n2 31 244 1 897 A6 100n2 3 24 189 A7 n3 10 39 153 A8 n3 + n2 + 10n 3 9 38 153 2 A9 2n 9 15 21 12/11/2018

Srovnání algoritmů (3) V následující tabulce je uveden čas potřeb-ný ke zpracování vstupních dat rozsahu n, jestliže počet operací, které je nutné provést, je dán funkcí f (n) Provedení jedné operace trvá jednu mikrosekundu 12/11/2018

Srovnání algoritmů (4) n f(n) 20 40 60 80 100 200 500 1 000 n 20 ms n.log (n) 86 ms 0,2 ms 0,35 ms 0,5 ms 0.7 ms 1,5 ms 4,5 ms 10 ms n2 0,4 ms 1,6 ms 3,6 ms 6,4 ms 10,0 ms 40 ms 0,25 s 1 s n3 8,0 ms 64 ms 0,22 s 0,5 s 1 s 8 s 125 s 17 min n4 0,16 s 2,56 s 13 s 41 s 100 s 27 min 17 h 11,6 dní 2n 1,00 s 11,7 dní 36 600 let 3,6.109 let n! 77 000 let 12/11/2018

Srovnání algoritmů (5) Následující tabulka ukazuje zvětšení rozsa-hu zpracovatelných úloh, které odpovídá zvětšení výpočetní rychlosti použitého počítače 10 x, 100 x a 1 000 x Hodnoty v tabulce vychází z předpokladu, že původně bylo možno v daném časovém limitu zpracovat vstupní data o rozsahu n = 100 12/11/2018

Srovnání algoritmů (6) f(n) 1 x 10 x 100 x 1000 x n 100 1 000 10 000 100 000 n.log (n) 100 702 5 362 43 150 n2 100 316 1 000 3 162 n3 100 215 464 1 000 n4 100 177 316 562 2n 100 103 106 109 n! 100 100 100 101 12/11/2018