Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilAlena Navrátilová
1
Úvod do programování 5. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015
2
Jan LánskýÚvod do programování 5. hodina2 Umíme z minulé hodiny Syntax Předávání parametrů funkce referencí ref Pole Algoritmy Kopie pole Nesetříděné pole: nalezení hodnoty a počtu výskytů, nejdelší posloupnost stejných hodnot Eratostenovo síto Ladění programu
3
Jan LánskýÚvod do programování 5. hodina3 Cíle hodiny Algoritmy Třídění pole: Selection sort, Insertion sort, Bubble sort Třídění pole omezených hodnot: Counting sort Binární vyhledávání v setříděném poli Syntax Globální proměnné Měření počtu operací Měření doby běhu programu
4
Jan LánskýÚvod do programování 5. hodina4 Třídění Budeme třídit pole vzestupně od nejnižší hodnoty po nejvyšší hodnotu Pokud i<j pak pole[i]<pole[j] Setříděné pole umožňuje rychleji hledat prvky podle hodnoty než pole nesetřídění Algoritmy budou pro jednoduchost předpokládat, že hodnoty prvků jsou po dvou různé. V praxi hodnoty různé nebývají ale u představených algoritmů není třeba úprava.
5
Jan LánskýÚvod do programování 5. hodina5 Třídící algoritmy Přímé algoritmy O(n 2 ) Selection sort, Insertion sort, Bubble sort Dva vnořené cykly, setřídí původní pole Omezené hodnoty prvků Counting sort Pomocné pole, jehož délka odpovídá maximu z hodnot prvků pole. Chytré algoritmy O(n log(n)) Heapsort, Mergesort, Quicksort Složitější implementace, naučíme se později
6
Jan LánskýÚvod do programování 5. hodina6 Selection sort Český název: Třídění výběrem, Pole je rozděleno na levou a pravou část. Levá část je setříděná a pravá je nesetříděná Každý prvek v levé části má menší hodnotu než libovolný prvek v pravé části V každém kroku nalezneme prvek s nejmenší hodnotou v pravé části a vyměníme ho s prvním prvkem pravé částí Touto výměnou jsme prvek připojili na nakonec levé části
7
Jan LánskýÚvod do programování 5. hodina7 Selection sort Nesetříděná část pole začíná na indexu i Index aktuálně minimálního prvku z nesetříděné posloup. Index prvku z nesetříděné části s aktuálně nejmenší hodnotou Prvek s nejmenší hodnotou v nesetříděné posloupnosti prohodíme s prvním prvkem nesetříděné posloupnosti. Tento prvek se nyní stává posledním prvkem setříděné posloupnosti. Stačilo by Length -1, ale pro přehlednost programu necháme Length
8
Jan LánskýÚvod do programování 5. hodina8 Selection sort 0112345679 0112345697 0112345796 0112349756 0112349756 0112649753 0117649253 0117649253 0917641253 2917641053 0 2 4 5 7 9 ii 0499 4 0 j Krok i = 9 jde vynechat Kroky i = 2 a i = 5 Minimum bylo na prvním místě
9
Jan LánskýÚvod do programování 5. hodina9 Selection sort Funkce Vymena se použije i pro Bubble Sort. Funkce Main bude obdobná i pro Insert Sort a Bubble Sort 0, 1, 1, 2, 3, 4, 5, 6, 7, 9
10
Jan LánskýÚvod do programování 5. hodina10 Insertion sort Český název: Třídění vkládáním Pole je rozděleno na levou a pravou část. Levá část je setříděná a pravá je nesetříděná V každém kroku vezmeme první prvek v pravé části a vložíme ho na správné místo v levé části. Prvky v levé části, které mají větší hodnotu než právě vložený prvek posuneme o jednu pozici doprava. Procházíme je zprava doleva
11
Jan LánskýÚvod do programování 5. hodina11 Insertion sort akt – hodnota aktuálně vkládaného prvku Po konci cyklu: hodnota pole[j] je nejmenší z hodnot prvků větších než hodnota aktuálně vkládaného prvku. Do prvku napravo okopírujeme hodnotu prvku nalevo Cyklus končí, pokud hodnota prvku nalevo není větší než hodnota vkládaného prvku
12
Jan LánskýÚvod do programování 5. hodina12 Insertion sort 0112456793 0112467953 1124679053 1246791053 1267941053 1279641053 1297641053 2917641053 2917641053 2917641053 0 2 4 5 7 9 ii 0499 4 0 j Krok i = 0 není součástí algoritmu
13
Jan LánskýÚvod do programování 5. hodina13 Bubble sort Český název: Bublinkové třídění, V setříděném poli je hodnota prvku nalevo vždy vyšší než hodnota prvku napravo. V každém kroku vyměníme všechny sousední prvky, které nesplňují nerovnost. V každém kroku se alespoň jeden prvek dostane na své finální místo Možné vylepšení Průchod polem jen do místa posledního uskutečněné výměny z minulého kroku V praxi na obecné pole horší než Insertion Sort a Selection Sort. Výhodný, pokud je pole částečně setříděné
14
Jan LánskýÚvod do programování 5. hodina14 Bubble sort Porušena nerovnost Došlo k výměně, musí být další iterace while cyklu Budeme testovat, zda ve for cyklu dojde k výměně Pokud nedošlo k výměně, je pole setříděné
15
Jan LánskýÚvod do programování 5. hodina15 Bubble sort 0112345679 1012345679 1102345679 1210435679 1241053679 1264105379 2176410539 2917641053 0499 4 0 i Krok i = 9 jde vynechat while
16
Jan LánskýÚvod do programování 5. hodina16 Counting Sort Český název: Třídění počítáním V poli se vyskytují pouze hodnoty z intervalu až 0 až k pro k malé Pomocné pole o velikosti k Časová složitost O(n+k) V pomocném poli uchováváme četnosti výskytů jednotlivých hodnot. Indexy pomocného pole odpovídají hodnotám původního pole Projdeme pomocné pole a hodnotu reprezentovanou indexem prvku dáme na výstup tolikrát, kolik je jeho četnost (hodnota prvku v pomocném poli). Naše implementace třídí hodnoty 0 až k. Jde udělat obecně i když hodnoty nejsou od 0
17
Jan LánskýÚvod do programování 5. hodina17 Counting Sort Zjistíme maximální hodnotu v poli Vytvoříme pomocné pole pro počítání četností hodnot. Pozor: musí být délky max+1 Pomocné pole může být děravé, díry přeskočí else větev. Snížíme čítač hodnoty a přiřadíme ji na příslušné místo původního pole Nejde snadno nahradit for cyklem
18
Jan LánskýÚvod do programování 5. hodina18 Counting sort I 0110001101 0110000101 0110000001 0010000001 0010000000 1211111101 1210111101 1210101101 0210101101 0110101101 049 940 i Dvakrát 1, chybí 8 hodnoty 2917641053 Původní pole
19
Jan LánskýÚvod do programování 5. hodina19 Counting sort II 0112341053 0112641053 0117641053 0117641053 0917641053 0112345679 0112345673 0112345653 0112345053 0112341053 049 940 i Původní pole 1211111101 hodnoty Původní pole
20
Jan LánskýÚvod do programování 5. hodina20 Binární vyhledávání Hledáme výskyt hodnoty v setříděném poli. Časová složitost O(log(n)) vs. hledání v nesetříděném poli se složitostí O(n) Pole rozpůlíme na poloviny a podle hodnoty dělícího prvku si vybereme levou nebo pravou polovinu. Je-li hledaný prvek menší než dělící prvek, vybereme levou polovinu. Předchozí krok opakujeme na vybrané polovině pole dokud nenalezneme prvek, nebo jsme v jednoprvkovém poli
21
Jan LánskýÚvod do programování 5. hodina21 Binární vyhledávání Hodnota nenalezena Aspoň jeden prvek Výběr poloviny nalezeno Nalezení indexu prvku s hledanou hodnotou. Nevrací první výskyt ! Length - 1
22
Jan LánskýÚvod do programování 5. hodina22 Binární vyhledávání levypravystred 666 565 597 094 5 45 45679 0112345679 049 Hledáme hodnotu 5 while
23
Jan LánskýÚvod do programování 5. hodina23 Globální proměnné Lokální proměnné Definovány v těle funkcí. Viditelné jen ve funkci, kde jsou definovány Globální proměnné Definovány mimo tělo funkcí Viditelné ze všech funkcí Raději je nepoužívat, nepřehledný zdrojový kód. Rozumné použití: při testování pro čítače (počtu operací, počtů volání funkcí, atd.) Doposud známe jen lokální proměnné
24
Jan LánskýÚvod do programování 5. hodina24 Globální proměnné Globální proměnná musí být static V kódu na stejném místě jako definice funkce Použití globální proměnné ve funkci Funkce Použití globální proměnné ve funkci Main
25
Jan LánskýÚvod do programování 5. hodina25 Měření počtu operací Funkce provádějící danou operaci inkrementuje čítač operací, který je globální proměnnou Porovnání vlastností dvou algoritmů na konkrétních datech. Porovnání vlastností algoritmu pro různá data Najednou můžeme sledovat počty různých operací (porovnání, přiřazení, sčítání, …) Nenahrazuje asymptotickou složitost
26
Jan LánskýÚvod do programování 5. hodina26 Měření počtu operací Globální proměnnou musím vynulovat mezi jednotlivými měřeními Funkce, která měří počet operací Využití funkce
27
Jan LánskýÚvod do programování 5. hodina27 Měření doby běhu programu Analogické použití jako v případě měření počtu operací. Výsledek v ms nebo tikách procesoru Výsledek může být ovlivněn vnějšími vlivy Př.: Jiné běžící procesy, obsah cash pamětí Opakovat měření vícekrát Měřit na čisté instalaci OS Nenahrazuje asymptotickou složitost
28
Jan LánskýÚvod do programování 5. hodina28 Stopwatch using System.Diagnostics Stopwatch Start – začne měřit čas Stop – ukončí měření Reset - vynuluje ElapsedTicks – tiky procesoru ElapsedMilliseconds - miliseknudy
29
Jan LánskýÚvod do programování 5. hodina29 Stopwatch Přidat Systém.Diagnostics Nové stopky V druhém zavolání jsme rychlejší 6 vs. 1246 tiků, (tj. cca 0,1 ms) Důvod: cashe Řešení: ignorovat první měření
30
Jan LánskýÚvod do programování 5. hodina30 Zpětná vazba Objevili jste ve slajdech chyby? Včetně pravopisných Nechápete nějaký slajd? Je příliš obtížný, nesrozumitelný? Máte nějaký nápad na vylepšení? Anonymní formulář Odeslání za pár vteřin http://goo.gl/forms/WxkZqBsZLs
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.