Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

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.

Podobné prezentace


Prezentace na téma: "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."— Transkript prezentace:

1 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

2 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

3 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

4 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

5 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

6 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

7 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

8 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

9 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

10 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

11 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

12 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

13 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

14 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

15 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

16 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

17 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

18 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

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

20 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

21 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

22 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

23 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

24 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

25 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

26 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

27 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

28 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

29 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

30 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

31 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

32 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

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

34 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

35 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í let 3,6.109 let n! let 12/11/2018

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

37 Srovnání algoritmů (6) f(n) 1 x 10 x 100 x 1000 x n 100 1 000 10 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


Stáhnout ppt "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."

Podobné prezentace


Reklamy Google