Anotace. pointery (pars prima). Martin Pergel,

Podobné dokumenty
Anotace. Jednotky (tvorba a využití), struktury (typ record),

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

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

Algoritmizace prostorových úloh

Základy algoritmizace a programování

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

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

Digitální učební materiál

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Anotace. Dijkstrův algoritmus,

Maturitní otázky z předmětu PROGRAMOVÁNÍ

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

Sada 1 - Základy programování

Digitální učební materiál

ALGORITMY A DATOVÉ STRUKTURY

Anotace. Pointery, dynamické proměnné

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

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

Úvod do programování

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

Algoritmizace složitost rekurzivních algoritmů. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Časová a prostorová složitost algoritmů

Algoritmizace. 1. Úvod. Algoritmus

Je n O(n 2 )? Je n 2 O(n)? Je 3n 5 +2n Θ(n 5 )? Je n 1000 O(2 n )? Je 2 n O(n 2000 )? Cvičení s kartami aneb jak rychle roste exponenciála.

Maturitní téma: Programovací jazyk JAVA

1 Úvod do Turbo Pascalu

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

Programovací jazyk Pascal

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

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.

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

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

Na začátku rozdělíme práci a určíme, které podproblémy je potřeba vyřešit. Tyto

Implementace LL(1) překladů

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Inovace a zkvalitnění výuky prostřednictvím ICT Programování se strukturovanými údaji Programové jednotky

Zadání k 2. programovacímu testu

Rekurze a rychlé třídění

Stromy, haldy, prioritní fronty

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

TGH05 - Problém za milion dolarů.

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Třídění dat. Ing. Hodál Jaroslav, Ph.D. VY_32_INOVACE_26 04

SII - Informatika. 1. Atribut relace, jehož hodnota jednoznačně určuje prvek v jiné relaci, se nazývá:

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

13. Třídící algoritmy a násobení matic

Sada 1 - Základy programování

IB111 Úvod do programování skrze Python

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

Unity a Objekty (NMIN102) RNDr. Michal Žemlička, Ph.D.

Anotace. Dynamické programování, diskrétní simulace.

Anotace. Ordinalni typy - typ char, funkce ord, chr, succ, prev, inc, dec,

1. Implementace funkce počet vrcholů. Předmět: Algoritmizace praktické aplikace (3ALGA)

Hledání k-tého nejmenšího prvku

Digitální učební materiál

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

Algoritmizace řazení Bubble Sort

Třídící algoritmy. Insert Sort. Bubble Sort. Select Sort. Shell Sort. Quick Sort. Merge Sort. Heap Sort.

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

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

3 Co je algoritmus? Trocha historie Definice algoritmu Vlastnosti algoritmu... 3

PŘEDNÁŠKA 2 POSLOUPNOSTI

Aplikace. vliv na to, jakou mají strukturu i na to, jak pracné je je vyvinout. Bylo vypozorováno, že aplikace je možné rozdělit do skupin

každého programátora, a tak není divu, že třídicí algoritmy jsou jedny z nejstudovanějších.

dovolují dělení velkých úloh na menší = dekompozice

Rozděl a panuj. Často se setkáme s úlohami, které lze snadno rozdělit na nějaké menší úlohy a z jejich

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

Program a životní cyklus programu

Universita Pardubice Fakulta elektrotechniky a informatiky. Mikroprocesorová technika. Semestrální práce

Prioritní fronta, halda

IB111 Úvod do programování skrze Python

Předmět: Algoritmizace praktické aplikace

Prohledávání do šířky = algoritmus vlny

Úvod do programování 10. hodina

Anotace. Spojové seznamy, haldy. AVL-stromy, A-B stromy. Martin Pergel,

Podprogramy; procedury a funkce

bfs, dfs, fronta, zásobník, prioritní fronta, halda

Algoritmy I, složitost

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

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Časová složitost algoritmů

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

Dijkstrův algoritmus

Násobení pomocí sčítání

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

Rekurzivní algoritmy

Několik příkladů v Turbo Pascalu

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

ALGORITMIZACE A PROGRAMOVÁNÍ

Pracovní listy - programování (algoritmy v jazyce Visual Basic) Algoritmus

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

Hranová konzistence. Arc consistency AC. Nejprve se zabýváme binárními CSP. podmínka odpovídá hraně v grafu podmínek

bfs, dfs, fronta, zásobník, prioritní fronta, halda

Příklady: (y + (sin(2*x) + 1)*2)/ /2 * 5 = 8.5 (1+3)/2 * 5 = /(2 * 5) = 1.3. Pavel Töpfer, 2017 Programování 1-3 1

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

Anotace. Soubory a práce s nimi, rekurze podruhé, struktury (datový typ record), Martin Pergel,

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

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

Slepé prohledávání do šířky Algoritmus prohledávání do šířky Při tomto způsobu prohledávání máme jistotu, že vždy nalezneme koncový stav, musíme ale p

Transkript:

Anotace Základní třídicí algoritmy, jednotky oddělený překlad, pointery (pars prima).

Problém třídění jednoduché třídicí algoritmy Bublinkové třídění (BubbleSort), zatřid ování alias třídění přímým vkládáním (InsertSort), třídění vyběrem (SelectSort), QuickSort.

Bublinkové třídění Geometrická interpretace: Bublinky v kapalině jdou zpravidla vzhůru Myšlenka: Porovnáváme po sobě jdoucí čísla (ve smyslu sousední v zadaném poli) od prvního k poslednímu, jsou-li v nesprávném pořadí, prohodíme je. Prvky probublávají správným směrem. Opakujeme bublání, dokud se prohazuje.

Bubblesort v pseudokódu prohazovalose:=true; while prohazovalose:=true do begin prohazovalose:=false; for i:=1 to pocet - 1 do begin if pole[i]>pole[i+1] then begin prohod(pole[i],pole[i+1]); prohazovalose:=true; end; end; end;

Složitost bubble-sortu Kolikrát se provede vnější while-cyklus? V i-tém kroku dojede i-tý největší na své místo! Stačí tedy n-krát probublat, jedno probublání porovná po sobě jdoucí dvojice, tedy má složitost lineární. Složitost BubbleSortu je tedy O(n 2 ). Implementaci, kdy se střídavě bublá z jedné strany na druhou a z druhé na první se říká ShakeSort a funguje pro něj stejný odhad složitosti.

Třídění přímým výběrem a zatřid ováním Přímý výběr: Opakuj, dokud není tříděné pole prázdné: Najdi v poli minimum a přesuň ho na konec setříděného pole. Zatřid ování: Opakuj, dokud není tříděné pole prázdné: Vyjmi z něj první prvek a zatřid do cílového pole, tedy: najdi pozici, kam prvek patří, přidej ho tam a zbytek setříděného pole posuň (o jedna dál). Analýza složitosti: nkrát opakujeme proces, který trvá nejvýše n kroků, tedy také O(n 2 ).

Quicksort třídění za pomoci rekurze idea: Pokud třídíme jedno číslo, nic nedělej (posloupnost je setříděna), tedy vrat posloupnost tak, jak jsme ji dostali. V poli POLE vyber jeden prvek (dále pivot). Rozděl POLE na pole A obsahující prvky menší než pivot a na pole B obsahující prvky větší nebo rovné pivotu. Pomocí sebe sama setřid pole A, pomocí sebe sama setřid pole B, Vypiš: pole A, pivot, pole B.

Quicksort Implementace bude na webu.

Quicksort analýza složitosti V nejhorším případě: Θ(n 2 ). V nejlepším případě: Θ(n log n). V průměrném případě: Θ(n log n).

Quicksort varianty a složitosti Randomizovaný quicksort: Pivotem voĺıme náhodný prvek, složitost v průměrném případě Θ(n log n). Analýza se opírá o netriviální (i když známá) tvrzení teorie pravděpodobnosti.

Quicksort přirozené otázky? Na čem závisí složitost? Jak volbu pivota ovlivnit? Lze volit pivot tak, aby quicksort provedl vždy jen O(logn) fází? Mediánem nazveme takový prvek, že alespoň polovina prvků je alespoň taková jako on a alespoň polovina nejvýše taková.

Quicksort ponaučení metoda rozděl a panuj Rozdělenému nepříteli se lépe vládne. Rozděl a panuj rozděĺı instanci na přesně definované menší instance, vyřeší každou zvlášt a z jejich řešení zjistí řešení původní instance. Příklady: Řízení podniku (ředitel leteckých závodů zpravidla neřeší, jak přinýtovat zadní část křídla), Příklady (algoritmické): Quicksort, binární vyhledávání.

Metody analýzy složitosti problémů typu rozděl a panuj Složitost zpravidla získáme ve tvaru rekurentní formule T(n) = T(n 1 )+T(n 2 )+...+T(n k )+f(n). My chceme rekurenci rozbít. Jedna z metod je indukce. Příklad: T(n) = T( n 2 )+k (binární vyhledání) Co když v Quicksortu jako pivot vybereme medián? V tom případě máme rekurenci: T(n) = 2T( n 2 )+kn. Nelze použít jinou metodu?

Master theorem (symetrická verze) Theorem Je-li T(1) = c a T(n) = a T( n b )+Θ(nd ), kde a 1, b > 1, d 0 a a,b přirozená čísla, potom platí: T(n) Θ(n d ), pokud a < b d, T(n) Θ(n d logn), pokud a = b d a T(n) Θ(n log b a ), pokud a > b d.

Master theorem myšlenka důkazu: Výpočet si představíme po hladinách podle hloubky rekurze. Zjistíme složitost každé hladiny zvlášt, zjistíme, která bude trvat nejdéle, posčítáme. Hladin bude log b n, protože čekáme, až z n zbyde v argumentu jen konstanta. Jaká je složitost hladiny k?: a k ( n b k ) d.

Která hladina bude trvat nejdéle? První (pokud ( a b d ) k < 1), což je první případ. Nebo poslední (pokud ( a b d ) k > 1), což je třetí případ. Nebo všechny stejně (pokud ( a b d ) k = 1), což je druhý případ. Složitost je tedy součtem geometrické posloupnosti! Kvocient této řady je menší než jedna, větší než jedna, nebo právě jedna. Je-li kvocient různý od jedné, odhadneme součet největším z členů, zbytek je konstanta. Je-li kvocient jedna, součet je: hloubka krát složitost libovolné hladiny. A hloubka je logn.

Analýza master-theoremem: Binární vyhledání: T(n) = T( n 2 )+Θ(n0 ) druhý případ a = 1,b = 2,d = 0,a = b d, tedy složitost binárního vyhledání je Θ(log n). Quicksort obecně: T(n) = T(n 1 )+T(n n 1 )+Θ(n 1 ). Master theorem mlčí! Quicksort vybereme-li za pivot medián a umíme-li medián vybrat s lineární složitostí: T(n) = 2T( n 2 )+Θ(n1 ). Jde opět o druhý případ a = 2,b = 2,d = 1,a = b d, získáváme opět složitost Θ(n log n).

Další příklad násobení matic: Naivní algoritmus: T(n) = Θ(n 3 ). Strassenův algoritmus použije jen 7 násobení matic o polovinu menších, režie každé iterace je kvadratická (vůči šířce matice), rekurence tedy vychází: T(n) = 7T( n 2 )+Θ(n2 ). Jde o 3. případ (a = 7,b = 2,d = 2,a > b d ) a tedy složitost Strassenova algoritmu je: Θ(n log 2 7 ). Dokazujte toto indukcí...

Jednotky oddělený překlad Občas máme obecně využitelné funkce, které chceme používat v různých programech současně. Bud to je můžeme okopírovat mezi zdrojovými soubory (špatný nápad) nebo je dáme do zvláštního souboru, který budeme kompilovat zvlášt Tomu (druhému) řešení říkáme jednotky.

Jednotky výhody a nevýhody Kód se rozlézá ve více souborech, jeden kód nemusíme psát vícekrát, chceme-li jej sdílet ve více programech.

Jednotky syntax a sémantika Místo slovem program zahájíme soubor slovem unit, opět následuje jméno jednotky a tentokrát už se kontroluje! Jednotka má interface (popis, co je vidět zvenku) a část implementační (zahájenou slovem implementation).

Jednotky interface Interface popisuje, co z jednotky je vidět. V části interface jsou: definice proměnných (viditelných zvenku), prototypy funkcí a procedur (rovněž viditelných zvenku), prototypem rozumíme hlavičku funkce ( první řádek ).

Jednotky impelementace To, co nemá být vidět zvenku, tedy: Samotné definice funkcí, definice proměnných, které nemají být vidět zvenku, definice pomocných funkcí (které nemají být vidět zvenku). Jednotku ukončíme end. (!)

Jednotky příklad unit trideni; interface type po=array[0..9] of integer; procedure bublej(var pole:array of integer); procedure vytrid(var a:po); procedure zatridovani(var a:po); procedure quicksort(var pole:array of integer;kolik:integer); procedure vypis(a:array of integer);

Jednotky příklad (pokr.)... implementation var zatrideno:integer; procedure bublej(var pole:array of integer);... function najdi min(var a:po):integer; {Pozor, funkci najdi min neni zvenku videt!}... procedure vytrid(var a:po):integer;...... end.

Použití jednotky Chceme-li jednotku použít, oznámíme to pomocí kĺıčového slova uses, před názvem dotyčné jednotky: Příklad: uses trideni;

Použití jednotky příklad program trid; uses trideni; var p:array [0..9] of integer; i:integer; begin for i:=0 to 9 do read(p[i]); quicksort(p,10); vypis(p); end.

Standardní jednotky Turbo Pascal je vybaven několika standardními jednotkami: crt, dos, graph, printer,... Jednotky se mohou lišit pro různé překladače!

Jednotka crt Jednotka pro práci s obrazovkou a klávesnicí (barvy, zvuky) Proměnné: LastMode (údaj o posledním textovém módu před přechodem do grafiky), TextAttr (aktuální atribut zobrazení ovládaný pomocí TextBackground a TextColor), Procedura TextBackground nastaví barvu pozadí, proc. TextColor nastaví barvu popředí, funkce keypressed (vrací boolean a říká, zda byla stisknuta klávesa), clrscr (smaže obrazovku).

Jednotky dos, graph a printer Jednotka dos slouží především k práci se soubory, adresáři, disky... Jednotka graph slouží k práci s grafikou (InitGraph, CloseGraph, GraphResult, SetColor, GetColor...). Jednotka Printer slouží k tisku. Všechny tyto jednotky obsahují mnoho funkcí, které si nastudujete v případě potřeby.

Podivný příklad: Ukazoval jsem několikrát program obsahující: program nic; uses crt;... begin... repeat until keypressed; end. Co to bylo? Použití jednotky crt, resp. její funkce keypressed.

Direktiva forward Občas nám mezi dvěma funkcemi vznikne vzájemná závislost: Jedna funkce volá druhou a druhá funkce volá funkci první. Překladač Pascalu se začne bouřit při prvním volání druhé funkce, protože ta ještě není definována! Proto před definicí první funkce musíme oznámit, že bude existovat druhá funkce. Napíšeme její prototyp a místo definice těla dáme kĺıčové slovo forward: procedure dva(a:integer);forward;

Forward příklad: program qq; procedure dva(a:integer);forward; procedure jedna(a:integer); begin dva(a); end; procedure dva(a:integer); begin jedna(a); end; begin jedna(1); {Ponechme stranou, že program nic nedela!} end.