Algoritmická matematika
|
|
- Štefan Vávra
- před 8 lety
- Počet zobrazení:
Transkript
1 Algoritmická matematika 1. Definice algoritmu, vlastnosti algoritmů, základní pojmy, možnost implementace algoritmů. 2. Euklidův algoritmus, důkaz správnosti 3. Složitost algoritmů, časová a prostorová, trvání výpočetu, tabulka složitostí 4. Datové struktury (pole,strom) 5. Asymptotika, nejhorší, nejlepší a průměrný případ 6. Řadící algoritmy 7. Příklady
2 1. Úvod do algoritmů Algoritmus je předpis, který se skládá z kroků a který zabezpečí, že na základě vstupních dat jsou poskytnuta požadovaná data výstupní. Každý algoritmus musí splňovat 5 základní vlastností: A, Konečnost požadovaný výsledek musí být poskytnout v rozumeném čase. Za rozumný čas považujeme čas, kdy nám výsledek k něčemu bude. B, Hromadnost Algoritmus neřeší jeden konkrétní problém, ale širkou škálu možných vstupů C, Jednoznačnost každý předpis je složen z kroků, které na sebe navazují. Každý krok lze charakterizovat jako přechod z jednoho stavu algoritmu do jiného, přičemž každý stav je určen zprcovávanými daty. D, Opakovatelnost Při použití stejných vstupních údajů musí algoritmus dospět vždy k témuž výsledku E, Rezultativnost Algoritmus vede ke správnému výsledku Programovací jazyk Jedná se o prostředek vyjádření naších představ o průběhu výpočtu. Program je algoritmus zapsaný v některém z programovacích jazyků. Algoritmus na rozdíl od programu respektuje pouze jeden možný výsledek. Každý vyšší programovací jazyk poskytuje uživateli 3 základní nástroje. 1, Primitivní výrazy, data (čísla, znky) a procedury (sčítání, násobení, logické operátory) 2, Mechanismy pro sestavení složitějších výrazů 3, Mechanismy pro pojmenování složitějších výrazů (definovaní nových procedur) Základní pojmy Instrukce příkaz k provedení operace, kterou daný jazyk podporuje Proměnná hodnota, která za běhu programu mění svůj stav Program Sada proměných, které při výpočetním procesu mění své hodnoty Problém množina přípustných vstupů a výstupů
3 2, Euklidův algoritmus Je algoritmus, kterým lze určit největšího společného dělitele dvou přirozených čísel, tedy největší číslo takové, že beze zbytku dělí obě čísla Pseudokód Mějme dána dvě přirozená čísla, uložená v proměnných u a w. Dokud w není nulové, opakuj: Do r ulož zbytek po dělení čísla u číslem w Do u ulož w Do w ulož r Konec algoritmu, v u je uložen největší společný dělitel původních čísel. Důkaz správnosti: Pro a > b platí : d a & d b d a b & d b. Důkaz. 1. Necht d je společný dělitel čísel a i b. Pak existují přirozená číısla x a y, že a = d x a b = d y. Pak ale d je i dělitelem a b, nebot a b = d x d y = d (x y). A triviálně d dělí i b. Důkaz. 2. Necht d je dělitel a b i b. Pak existují přirozená čísla x a y, žee a b = d x a b = d y. Pak d je dělitelem i a, nebot a = a b + b = d x + d y = d (x + y).
4 3, Složitost Intuitivní pojem složitosti je svázán s představou množství informace obsažené v daném jevu. Při realizaci výpočetních metod jsme omezeni časem a pamětí, kterou máme k dispozici. Důležitým parametrem každé výpočetní metody je její složitost. Trvání výpočtu = počet elementárních výpočetních kroků vykonaných od zahájení do skončení výpočetu Elementárním výpočetním krokem je obvykle instrukce (instrukce pseudokójdu nebo instrukce programovacího jazyka, ve kterém je algoritmus zaspsán Složitost dělíme na časovou tím rozumíme funkci, která každé množině vstupních dat přiřazuje počet operací vykonaných při výpočetu podle daného algoritmu. Dále na složitost paměťovou defnujeme jako závilost paměťových nároků algoritmu na vstupních datech. Pro zjednodušení někdy uvažujeme jen počet důležitých (pro algoritmus zákadních instrukcí, tj. těch které se při výpočetu vykonávají často. Jde typicky o instrucke vykonávané opakovaně, např. uvnitř cyklu Velikost vstupní úlohy log n n n n n n! Uvažujme algoritmy s časovými složitostmy T1 (n) = n 2 a T2 (n) = 20n log2 n. Stroj C1 má rychlost výkonů instrukcí instrukcí / sekundu, C instrukcí / sekundu. Pro C1 platí: Pro C2 platí:
5 4, Datové struktury Datová struktura typu POLE Pole je posloupnost proměnných stejného datového typu uložených v paměti jako jeden celek. K prvkům pole se přistupuje pomocí indexů. Počet prvků pole může být určen nebo se měnit v době zpracování (mluvíme o statickém a dynamickém poli). Datová struktura typu STROM Strom je široce využívanou datovou strukturou, která představuje stromovou strukturu s propojenými uzly. Jedná se o takové uspořádání dat, kdy prvek má nejvýše jednoho předka a může mít více než jednoho následníka. Základní prvky strom: Kořen stromu, vnitřní uzly, koncové uzly (listy) Procházení stromem: Do šířka procházení po hladinách (vstvách úrovní) prohledávání do šířky Do hloubky procházení od kořene stromu na potomky daného vrcholu po jednotlivých větvích prohledávání do hloubky Binární strom Binární strom je orientovaný graf s jedním kořenem, z něhož existuje cesta do všech vrcholů grafu. Každý vrchol má maximálně dva následovníky a s vyjímkou kořene právě jednoho předka kořen předka nemá. Binární strom jako pole vztahy uzlu na potomky jsou určeny funkcemi 2i+1 a 2i+2
6 Typy binárních stromů Binární strom obsahuje uzly které mají nejvýš 2 syny. Plný binární strom každý vnitřní uzel má dva syny. Vyvážený binární strom hloubka podstromů se od sebe liší maximálně o jedna. Úplný binární strom vyvážený binární strom plněný zleva. Datová struktura typu Halda Jedná se o stromovu datovou strukturu, splňující vlasnost haldy. V kořenu stromu se nachází prvek s nejmenším klíčem nebo naopak s největším. Další důležitou vlastností je, že pokud indexujeme (od čísla 1) prvky haldy od shora dolů, zleva doprava, pak potomci každého vrcholu jsou na indexu 2i a 2i + 1, tato vlastnost je zajištěna tím, že v haldě nevynecháváme mezery. Graficky si tedy haldu můžeme představit jako pyramidu s useknutou základnou. Vlastnost býti haldou je rekurzivní - všechny podstromy haldy jsou také haldy. Díky této vlastnosti máme zajištěno, že se halda chová jako prioritní fronta - na vrcholek haldy vždy musí vystoupit prvek s nejvyšší prioritou (čehož se využívá u heapsortu řazení haldou). Obvyklé operace: delete-max / delete-min: odstranění kořene z max-/min-heapu increase-key, decrease-key: aktualizace klíče v max-/min-heapu insert: vložení nového klíče merge: spojení dvou heapů do jednoho nového
7 Datová struktura typu SEZNAM Spojový seznam (Lineární seznam, Linked list) je kontejner určený k ukládání dat předem neznámé délky. Základní stavební jednotkou spojového seznamu je uzel, který vždy obsahuje ukládanou hodnotu a ukazatel na následující prvek. Ekvivalentní definice Jedná se o datovou strukuturu, která tvoří uspořádanou posloupnost položek. Jednolivé položky nemusí být umístěny zasebou, každá položka obsahuje odkaz na následující položku (popř. více ukazatelů). Obousměrný seznam V obousměrně zřetězeném spojovém seznamu prvky obsahují nejen ukazatel na další prvek, ale také ukazatel na předchozí prvek. Tímto se sice poněkud zkomplikuje implementace struktury, ale toto je vyváženo zvýšenou flexibilitou, protože lze traverzovat v obou směrech. Kruhový spojový seznam Kruhový seznam je speciálním typem seznamu zřetězeným do kruhu. Poslední uzel seznamu obsahuje místo prázdného odkazu ukazatel na první prvek listu. Kruhový seznam lze vytvořit v obou variantách zřetězení. Obousměrné zřetězení umožňuje tento typ spojového seznamu procházet libovolně v obou směrech od počátku i od konce.
8 Datová struktura typu ZÁSOBNÍK Představuje jednoduchý typ množiny, u které jepřesně určen způsob vkládání a mazání prvků. U zásobníku je uplatněn princip last-in, first out LIFO tj. prvek, který byl poslední vložen, je jako první ze zásobníku vyzvednut. Zásobník lze přirovnat k zásobníku nábojů v pistoli1. Náboje jsou přesouvány do nábojové komory v opačném pořadí, než byly do zásobníku vloženy. V jednom okamžiku máme k dispozici pouze horní náboj nebo je zásobník prázdný. Ke spodním nábojům se lze dostat jen vyjmutím předchozích nábojů. Ukazatel na aktuální prvek v zásobníku (posledně vložený) se nazývá vrchol zásobníku (angl. stack pointer). Opakem je dno zásobníku. Operace vložení do zásobníku se tradičně nazývá Push a vyjmutí se nazývá Pop. Jako třetí se u zásobníku implementuje dotaz Empty, který indikuje prázdnost zásobníku. Navíc se někdy přidává dotaz Top, který vrací prvek na vrcholu zásobníku, aniž by ho vyjmul (nedestruktivní varianta Pop). Datová struktura typu FRONTA Fronta uplatňuje mechanismus přístupu FIFO first in, first out jako první je z fronty odebrán prvek, který byl do fronty první vložen. Jde tudíž o obdobu fronty, jak ji známe z každodenního života. (V tomto okamžiku neuvažujeme prvky, které se mohou předbíhat. Potom bychom hovořili o frontě s prioritou). Operace vložení prvku se tradičně nazývá Put, operace odebrání potom Get. Obdobně jako u zásobníku je definován dotaz Empty, který indikuje prázdnost fronty. Pokud provedeme operaci Get nad prázdnou frontou, nastane chyba podtečení. U velikostně omezené fronty může nastat i přetečení, překročíme-li při vkládání přidělený prostor.
9 5, Asymptotická složitost
10 Předpoklad 1: Zanedbání multiplikativní konstanty c. Nechť f(n) je libovolna funkce a c libovolná konstanta, c > 0. Pak funkce f(n) a c f(n) jsou označovány jako (asymptoticky) stejně rychle rostoucí funkce Předpoklad 2: Zanedbání aditivní konstanty d. Nechť f(n) je libovolná funkce a d libovolná konstanta, d > 0. Pak funkce f(n) a f(n) + d jsou označovány jako (asymptoticky) stejně rychle rostoucí funkce Shrnutí Složitost algoritmu udává, jak je daný algoritmus rychlý (kolik provede elementárních operací) vzhledem k množině vstupních dat. Ke klasifikaci algoritmů se obvykle používá tzv. asymtotická složitost, což je rozdělení algoritmů do tříd složitostí, u kterých platí, že od určité velikosti dat, je algoritmus dané třídy vždy pomalejší než algoritmus třídy předchozí, bez ohledu na to, jestli je některý z počítačů c-násobně výkonnější (c je konstanta). Pokud máme dva algoritmy o srovnatelné složitosti, první Ο(n) a druhý Ο(2n), tak nám stačí ten druhý pustit na 2x rychlejším stroji a nepoznáme rozdíl. Pokud ovšem nejsou ve stejné třídě složitosti, například jeden Ο(n) a druhý Ο(n^{2}), tak nám na srovnání výkonu nepomůže libovolně výkonný počítač, protože dvojnásobný objem dat bude druhému algoritmu trvat 4x tolik času, desetinásobný 100x tolik času. Jednoduše řečeno: pokud spadají dva algoritmy do různých tříd asymptotické složitosti, pak vždy existuje takové množství dat, od kterého je asymptoticky lepší algoritmus vždy rychlejší, bez ohledu na to, kolikrát je některý z počítačů výkonnější. U většiny algoritmů nelze říci, že jejich složitost odpovídá přesně jedné třídě, protože rychlost algoritmu závisí také na povaze dat. Z tohoto důvodu se používáme řád růstu funkcí, který zohledňuje nejhorší i nejlepší možný běh algoritmu. O algoritmu tak například řekneme, že je v Omega(n) a Ο(n 2 ), což znamená, že nikdy nedoběhne rychleji než v lineárním čase, ale na druhou stranu jeho složitost není pro žádná data horší než kvadratická.
11 6. Řadící algoritmy Insertion sort Řazení vkládáním (anglicky insertion sort) je jednoduchý řadicí algoritmus založený na porovnávání. Vlastnosti IS A Je to jeden z nejrychlejších algoritmů s kvadratickou časovou složitostí. Je asymptoticky pomalejší než pokročilé algoritmy jako třeba quicksort nebo mergesort, ale má jiné výhody. B Je efektivnější než většina ostatních O(N 2 ) algoritmů (selection sort, bubble sort), průměrný čas je N 2 /4 a v nejlepším případě je dokonce lineární C Řadí stabilně (nemění vzájemné pořadí prvků se stejnými klíči) vyžaduje pouze O(1) paměti (kromě vlastního vstupu). Je online algoritmem, tzn. dokáže řadit data tak, jak přicházejí na vstup D Jednoduchá implementace a efektivita na malých množinách Princip 1 Posloupnost rozdělíme na seřazenou a neseřazenou tak, že seřazená obsahuje první prvek posloupnosti 2 Z neseřazené části vybereme první prvek a zařadíme jej na správné místo v seřazené posloupnosti 3 Prvky v seřazené posloupnosti posuneme o jednu pozici doprava 4 Seřazenou část zvětšíme o jeden prvek. Naopak neseřazenou část o jeden prvek zleva zmenšíme 5 Kroky 2 5 aplikujeme až do úplného seřazení neseřazené části
12 Pseudokód INSERTION-SORT (A[ ]) 1 for j 2 to length[a] 2 do key A[j] 3 Insert A[j] into the sorted sequence A[1.. j - 1]. 4 i j while i > 0 and A[i] > key 6 do A[i + 1] A[i] 7 i i A[i + 1] key
13 Selection sort Je implementačně jednoduchý řadicí algoritmus s časovou složitostí O(N²) na principu řazení výběrem. Vlastnosti SS A Algoritmus je univerzální (pracuje na základě porovnávání dvojic prvků), B Pracuje lokálně (nevyžaduje pomocnou paměť) C Není stabilním (prvkům se stejným klíčem může změnit vzájemnou polohu) D Nepatří mezi přirozené řadicí algoritmy (částečně seřazený seznam se bude zpracovávat stejně dlouho jako neseřazený). Princip 1 Rozdělíme si posloupnost na seřazenou a neseřazenou část 2 Najdeme prvek s nejmenší hodnotou v neseřazené části posloupnosti 3 Zaměníme ho s prvkem na první pozici neseřazené části 4 První prvek neseřazené části zahrneme do seřazené části a zároveň neseřazenou část zmenšíme o 1 prvek zleva 5 Zbytek posloupnosti se uspořádá opakováním kroků 2 až 5 pro zbylou neseřazenou část Pseudokód Selection-Sort(A[0..n 1]) 1 for j 0 to n 2 2 do imin j 3 for i j + 1 to n 1 4 do if A[i] < A[iMin] then imin i 5 t A[j]; A[j] A[iMin]; A[iMin] t
14 Bubble sort Je implementačně jednoduchý řadicí algoritmus. Algoritmus opakovaně prochází seznam, přičemž porovnává každé dva sousedící prvky, a pokud nejsou ve správném pořadí, prohodí je. Pro praktické účely je neefektivní Vlastnosti BS A Algoritmus je univerzální (pracuje na základě porovnávání dvojic prvků) B Pracuje lokálně (nevyžaduje pomocnou paměť), C Je stabilní (prvkům se stejným klíčem nemění vzájemnou polohu) D Patří mezi přirozené řadicí algoritmy (částečně seřazený seznam zpracuje rychleji než neseřazený). E - Průměrná i nejhorší asymptotická složitost bublinkového řazení je O(n 2 ). Princip Algoritmus postupně prochází pole a pokud 2 prvky vedle sebe nejsou ve správném pořadí, tak je prohodí. Tímto způsobem postupně probublá nejmenší (nevětší) prvek a dochází k postupnému setřídění. Optimalizace algoritmu Optimalizací algoritmu je detekce prohození prvků v průchodu seznamu. V případě, že algoritmus v průchodu neprohodil žádné dva prvky, tak žádné další prvky již nikdy neprohodí. Tudíž řazení můžeme ukončit s tím, že seznam je seřazen. Pseudokód Bubble-Sort(A[0..n 1]) 1 for j 0 to n 2 2 do for i n 1 downto j do if A[i] < A[i 1] 4 then temp A[i]; A[i] A[i 1]; A[i 1] temp
15 Coctail sort Je implementačně jednoduchý řadicí algoritmus, vycházející z algoritmu bublinkového řazení. Od bublinkového řazení se liší tím, že prochází seznam v obou směrech. Tedy od začátku seznamu ke konci a poté zpět. Tímto postupem se předejde nevýhodě bublinkového řazení, tzv. problému želv a zajíců. Problém spočívá v tom, že vysoké hodnoty probublají na konec pole rychle, ale ty nízké postupují na začátek velmi pomalu. Porovnávání prvků běží do té doby, dokud není seznam seřazený. Přestože se zmenšil počet zbytečných porovnání (viz. výše zmíněný problém želv a zajíců), tak asymptotická složitost zůstává stejná. Průměrná i nejhorší asymptotická složitost koktejlového řazení je O(n^2). Vlastnosti CS A Algoritmus je univerzální (pracuje na základě porovnávání dvojic prvků) B Pracuje lokálně (nevyžaduje pomocnou paměť) C Je stabilní (prvkům se stejným klíčem nemění vzájemnou polohu) D Patří mezi přirozené řadicí algoritmy (částečně seřazený seznam zpracuje rychleji než neseřazený). Pseudokód while (bylo_serazeno!=1) bylo_seřazeno = ano; for i od 1 to (počet_prvků - 1) pokud seznam[i] > seznam[i + 1] zaměň(seznam[i], seznam[i + 1]) bylo_seřazeno = ne; for i od počet_prvků downto 2 pokud seznam[i - 1] > seznam[i] zaměň(seznam[i], seznam[i - 1]) bylo_seřazeno = ne;
16 Quick sort Je jeden z nejrychlejších běžných algoritmů řazení založených na porovnávání prvků. Jeho průměrná časová složitost je pro algoritmy této skupiny nejlepší možná (O(N log N)), v nejhorším případě (kterému se ale v praxi jde obvykle vyhnout) je však jeho časová náročnost O(N 2 ). Vlastnosti A Při správné implementaci prakticky nepotřebuje dodatečnou paměť, řadí prvky přímo v poli B Jde o nestabilní algoritmus, způsob volby pivota může mít vliv na výsledek řazení C - V průměru jde o nejrychlejší známý univerzální algoritmus pro řazení polí v operační paměti počítače D Omezení pravděpodobnosti nejhoršího případu slouží různé postupy volby pivota Princip Základní myšlenkou quicksortu je rozdělení řazené posloupnosti čísel na dvě přibližně stejné části (quicksort patří mezi algoritmy typu rozděl a panuj). V jedné části jsou čísla větší a ve druhé menší, než nějaká zvolená hodnota (nazývaná pivot anglicky střed otáčení ). Pokud je tato hodnota zvolena dobře, jsou obě části přibližně stejně velké. Pokud budou obě části samostatně seřazeny, je seřazené i celé pole. Obě části se pak rekurzivně řadí stejným postupem, což ale neznamená, že implementace musí taky použít rekurzi QS (A, 0, 2) QS (A, 4, 7) QS (A, 0, 1) QS (A, 4, 4) QS (A, 6, 7) 1 2 QS (A, 1, 1) QS (A, 6, 6)
17 Pseudokód Quick-Sort(A, p, r) 1 if p < r 2 then q Partition(A, p,r) 3 Quick-Sort(A, p, q 1) 4 Quick-Sort(A, q + 1, r) Partition(A,p,r) 1 x A[r] 2 i p 1 3 for j p to r 1 4 do if A[j] x 5 then i i swap(a[i], A[j]) 7 swap(a[i + 1],A[r]) 8 return i + 1 Praktické testy ukázaly, že QuickSort je velice rychlý při třídění rozsáhlých polí, ale zaostává oproti přirozeným algoritmům třídění (InsertSort, SelectSort) při třídění malých polí. Ukazuje se, že složitost QuickSortu má jistou minimální hodnotu, pod kterou i při třídění malého počtu prvků neklesne. Kdežto složitost přirozených algoritmů roste úměrně s počtem třídě - ných prvků. Jinými slovy do jistého počtu prvků má QuickSort větší režii (třídí pomaleji) než např. InsertSort. Tato hranice byla experimentálně stanovena na asi 12 prvků. Vyplatilo by se tedy QuickSortem třídit rozsáhlé pole, ale jakmile úseky na než se pole dělí budou kratší než zvolená mez (řekněme zmíněných 12 prvků), tento krátký úsek dotřídit InsertSortem.
18 Nejlepší případ QuickSortu nastane, pokud se každým dělením tříděná posloupnost rozdělí přesně na poloviny. Potom počet porovnání lze vypo- čítat podle formule (stejnou formuli splňují i ostatní algoritmy založené na strategii divide-et-impera) Cn = 2Cn/2 + n Výraz 2Cn/2 pokrývá třídění dvou podposloupností, n je počet porovnání všech prvků v průběhu rozdělování posloupnosti. Výše uvedenou rekurzivní formuli lze vyřešit a dostáváme Cn n log n
19 Merge sort Merge sort je řadicí algoritmus, jehož průměrná i nejhorší možná časová složitost je (O(N log N)). Algoritmus je velmi dobrým příkladem programátorské metody rozděl a panuj. Vlastnosti A - Velkou nevýhodou oproti algoritmům stejné rychlostní třídy (např. heapsort) je, že Mergesort pro svou práci potřebuje navíc pole o velikosti N. B Mergesort je ve většině případů pomalejší než quicksort nebo heapsort. Mergesort je stabilní řadicí algoritmus C Velkou výhodou proti quicksortu je, že čas potřebný pro třídění je téměř nezávislý na počátečním řazení tříděné posloupnosti. D Merge sort pracuje na bázi slévání již seřazených částí pole za pomoci dodatečného pole velikosti n. Princip Dělicí část merge sortu má na svém vstupu celé pole. Pokud je pole sudé délky, tak jej rozdělí na dvě stejně velké části. Má-li pole lichou délku, tak bude jedna část obsahovat o prvek více než druhá. V každém případě pak algoritmus nově vzniklé části dále rekurzivně dělí. V okamžiku, kdy rekurze narazí na seznamy jednotkové velikosti, tak se zastaví. Nyní má algorimus v každé větvi k dispozici dva sousední seznamy, které obsahují jeden prvek a jsou tedy triviálně seřazeny. Merge sort se tedy začne navracet z rekurze a při každém návratu sleje dva seznamy pomocí výše zmíněné procedury slévání. Algoritmus má jistotu, že buď slévá triviálně seřazené prvky nebo seznamy, které již byly slity. V okamžiku, kdy se merge sort plně navrátí z rekurze, tak terminuje. Pole je seřazeno od nevyšší hodnoty. Ve skutečnosti slévá merge sort vždy dvě sousední části pole. Drží si dva ukazatele, každý na první prvek seznamu a po každém porovnání přesune jeden z prvků do pomocného pole a posune příslušný ukazatel o jedno místo (címž se dostane na nový nejvyšší prvek příslušného seznamu). Poté, co zkopíruje všechny prvky obou seznamů do pomocného pole, tak celé původní pole přepíše seřazeným seznamem (pomocným polem).
20 Merge sort (1, 6) MS1 (1, 3) MS2 (4, 6) MS3 (1, 3, 5) MS1.1 (1, 2) MS1.2 (3, 3) m1 (1, 2, 3) MS2.1 (4, 5) MS2.2 (6, 6) m2 (4, 5, 6) MS1.1A (1, 1) MS1.1B (2, 2) m1.1 (1, 1, 2) MS2.1A (4, 4) MS2.1B (5, 5) m2.1 (4, 4, 5) Princip slučování Základní idea třídění pomocí slučováním spočívá v dělení původní posloupnosti na dvě části (nejlépe o polovičním počtu prvků), jejich setřídění a poté použití metody slučování. Výsledkem je setříděná posloupnost o stejném počtu prvků jako byl v původní posloupnosti. Jak dojde k setřídění dvou rozdělených částí? Opětovným rozdělením na dvě části - v ideálním případě to budou části se čtvrtinovým počtem prvků. Z nich pak pomocí slučování dostaneme setříděné části s polovič- ním počtem prvků a následně setříděnou celou posloupnost. Rekurentně takto můžeme postupovat dál - z rozdělených osminÿ obdržíme slučová - ním setříděné čtvrtiny, z těch dalším slučováním poloviny a posledním slučováním celou setříděnou posloupnost. Kdy bude dělení posloupnosti na menší a menší části končit? Až dojdeme k takovému počtu prvků, které již budou setříděny. Nejmenší setříděnou posloupností je posloupnost jednoprvková, tím jsme tedy nalezli i podmínku pro ukončení rekurentního dělení posloupnosti na menší a menší části. Každé rekurentní volání znamená rozdělení posloupnosti na dvě části a návrat zpět znamená slučování rozdělených (již setříděných) částí do jedné pomocí metody slučování.
21 Pseudokód Merge-Sort (A, p, r) 1 if p < r 2 then q b(p + r)/2c 3 Merge-Sort(A, p, q) 4 Merge-Sort(A, q + 1, r) 5 Merge(A, p, q, r) Merge (A,p, q, r) 01 n1 q p n2 r q 03 L[0..n1] a R[0..n2] 04 for i 0 to n do L[i] A[p + i] 06 for j 0 to n do R[j] A[q j] 08 L[n1] 09 R[n2] 10 i 0 11 j 0 12 for k p to r 13 do if L[i] R[j] 14 then A[k] L[i] 15 i i else A[k] R[j] 17 j j + 1
22 Heap sort Heapsort (řazení haldou) je jedním z nejefektivnějších řadících algoritmů založených na porovnávání prvků s asymptotickou složitostí O(n log n ). Jelikož je tato složitost zaručená, tak je heapsort vhodnější pro použití v real-time systémech než v průměrném případě rychlejší quicksort, jenž však může dosahovat složitosti v nejhorším případě až O(n 2 ). Vlastnosti A Založen na porovnání prvků B Zaručená časová složitost O (n log n) C Konstantní nároky na paměť D Nejedná se o stabilní algoritmus Princip 1 Postavme haldu nad zadaným polem. 2 Utrhněme vrchol haldy (prvek s nejvyšší prioritou - nejvyšší nebo nejnižší prvek dle způsobu řazení). 3 Prohoďme utržený prvek s posledním prvkem haldy. 4 Zmenšeme haldu o 1 (prvky řazené dle priority na konci pole jsou již seřazené). 5 Opravme haldu tak, aby splňovala požadované vlastnosti (přestaly platit v momentě prohození prvků). 6 Dokud má halda prvky opakuj krok Pole je seřazené v opačném pořadí, než je priorita prvků.
23 Z indexu i prvku lze snadno určit index Parent (i) jeho rodiče Parent(i) 1 return (i 1)/2 (zaokrouhleno dolů) Left(i) 1 return 2i + 1 Right(i) 1 return 2i + 2 Pseudokód Max-Heapify (A, i) 1 l Left(i) 2 r Right(i) 3 if l heap-size(a) and A[l] > A[i] 4 then largest l 5 else largest i 6 if r heap-size(a) and A[r] > A[largest] 7 then largest r 8 if largest 6= i 9 then swap(a[i],a[largest]) 10 Max-Heapify(A, largest) Build-Max-Heap(A[0..n 1]) 1 heap-size(a) n 2 for i n/2 1 downto 0 3 do Max-Heapify(A, i)
24 Heap-Sort(A[0..n 1]) 1 Build-Max-Heap(A) 2 for i n 1 downto 1 3 do swap(a[0],a[i]) 4 heapsize(a) heapsize(a) 1 5 Max-Heapify(A, 0) Analýza: Všechny základní operace s haldou vložení, zrušení, výměna (naše pomocná funkce DownHeap) prvků vyžadují méně než 2 log n porovnání, za předpokladu, že halda má n prvků. Důkaz. Všechny tyto operace vyžadují průchod haldou od jejího kořene k listům, což představuje ne více než log n uzlů pro haldu s n prvky. Násobící faktor 2 pochází právě od funkce DownHeap, která ve svém cyklu provádí dvě porovnání. Konstrukci haldy zdola nahoru lze provést v lineárním čase.
25 Counting sort Je algoritmus řazení, který je vhodný pro řazení velkého pole prvků, nabývajících jen malý počet různých diskrétních hodnot. Jedná se o výkonný stabilní řadící algoritmus se složitostí O(n + k) Princip Algoritmus nejprve zleva (či zprava) projde vstupní pole a pro každý prvek, na který narazí, zvýší v pomocném poli četnost výskytu tohoto prvku o 1. Poté, co má v pomocném poli zaznamenán počet výskytů, poupraví toto pole následujícím způsobem: ke každé položce přičte počet výskytů všech předchozích položek. Tím u každé položky v pomocném poli získá přesnou pozici hranice, na které bude v seřazeném poli. Následuje vlastní řazení. Algoritmus začne zprava procházet neseřazené pole a pro každý prvek, na který narazí, se podívá do pomocného pole na horní hranici pro umístění. Na tuto hranici ho umístí a zároveň ji sníží o jedna. Takto postupuje, dokud neprojde celé pole. Tím je řazení skončeno. Časová náročnost je lineární k počtu prvků a počtu různých prvků (O(N+M)), protože musíme pro každý prvek zvýšit údaj o četnosti v pomocném poli, a pak každý prvek znovu vypsat do výsledného setříděného pole. Paměťová náročnost je (O(M)), protože si potřebujeme pamatovat četnosti pro všechny hodnoty prvků. Celé pole, které se třídí, není potřeba mít v paměti, proto se tento algoritmus dá použít i na pole, která jsou tak velká, že se nemohou do paměti celá vejít. Příklad: V příkladu ukážeme, jak setřídit čísel 1, 4, 2, 4, 1, 3, x, 2-1x, 3-1x, 4-2x 1 3, 2 4, 3 5, 4-7 [ ][ ][1][ ][3][ ][ ] [ ][1][1][ ][3][ ][ ] [ ][1][1][ ][3][ ][4] [ ][1][1][2][3][ ][4] [ ][1][1][2][3][4][4] [1][1][1][2][3][4][4]
26 Příklad: Mějme vstupní pole: Potom pole posčítaných četností B[C[A[n 1]] 1] A[n 1], tj. B[C[A[4]] 1] A[4], tj. B[1] 1, B[C[A[n 2]] 1] A[n 2], tj. B[C[A[3]] 1] A[3], tj. B[2] 2, B[C[A[2]] 1] A[2], tj. B[3] 5, B[C[A[1]] 1] A[1], tj. B[0] 0, B[C[A[0]] 1] A[0], tj. B[4] 7, Pseudokód Counting-Sort(A, B, k) 1 for i 0 to k 2 do C[i] 0 3 for j 0 to n 1 4 do C[A[j]] C[A[j]] + 1 //komentář C[i] obsahuje počet prvků v A rovných i 5 for i 1 to k 6 do C[i] C[i] + C[i 1] //komentář C[i] obsahuje počet prvků v A i 7 for j n 1 downto 0 8 do B[C[A[j]] 1] A[j] 9 C[A[j]] C[A[j]] 1
27 Radix sort Je řadicí algoritmus, který řadí celá čísla postupným procházením všech číslic (často se vstupní čísla převádějí do soustavy o jiném základu, odtud tedy název). Jelikož celočíselné hodnoty mohou reprezentovat řetězce (jména, data apod.), a dokonce i vhodně formátovaná čísla s plovoucí desetinnou čárkou, radix sort není omezen pouze na řazení celých čísel. Asymptotická složitost radix sortu je O(c C(n)), kde m je počet znaků řazených řetězců, n je velikost dat a C(n) je složitost vnitřního stabilního řadícího algoritmu (za tímto účelem je často použit counting sort). Příklad Pseudokód Radix-Sort(A, d) 1 for i 1 to d 2 do Stable-Sort(A, i)
28 #include<stdio.h> int getmax(int arr[], int n) { int mx = arr[0]; int i; for (i = 1; i < n; i++) if (arr[i] > mx) mx = arr[i]; return mx; } void countsort(int arr[], int n, int exp) { int output[n]; // output array int i, count[10] = { 0 }; // Store count of occurrences in count[] for (i = 0; i < n; i++) count[(arr[i] / exp) % 10]++; for (i = 1; i < 10; i++) count[i] += count[i - 1]; // Build the output array for (i = n - 1; i >= 0; i--) { output[count[(arr[i] / exp) % 10] - 1] = arr[i]; count[(arr[i] / exp) % 10]--; } } for (i = 0; i < n; i++) arr[i] = output[i]; // The main function to that sorts arr[] of size n using Radix Sort void radixsort(int arr[], int n) { int m = getmax(arr, n); } int exp; for (exp = 1; m / exp > 0; exp *= 10) countsort(arr, n, exp); void print(int arr[], int n) { int i; for (i = 0; i < n; i++) printf("%d ", arr[i]); } int main() { int arr[] = { 170, 45, 75, 90, 802, 24, 2, 66 }; int n = sizeof(arr) / sizeof(arr[0]); radixsort(arr, n); print(arr, n); return 0; }}
29 Bucket sort Bucket sort (bin sort) je stabilní řadicí algoritmus založení na rozdělení vstupního pole do několika částí takzvaných bucketů (přihrádek) a seřazení těchto částí pomocí jiného stabilního řadicího algoritmu. Princip Bucket sort nejprve rozdělí vstupní pole do několika (disjunktních) přihrádek. Každá přihrádka reprezentuje určitý rozsah vstupních dat data by měla být v optimálním případě rovnoměrně rozdělena, aby nedocházelo k situaci, kdy je jedna přihrádka přeplněna a další je prázdná. V druhé fázi pak bucket sort zavolá na každou z přihrádek stabilní řadicí algoritmus, případně rekurzivně sám sebe (bucket sort degeneruje na counting sort v případě, že je počet přihrádek stejný jako rozsah dat). Nakonec algoritmus nakopíruje postupně všechny seřazené přihrádky do výstupního pole. Připomeňme si, že pole je seřazeno, protože každá přihrádka pokrývala určitý rozsah a rozsahy se nepřekrývaly. Příklad 1. sloupec = indexy 2. sloupec = vstupn ı pole 3. sloupec = prvky zaˇrazen e v seznamech B[i]
30 Bucket-Sort(A[0..n 1]) 1 for i 0 to n 1 2 do vlož A[i] do seznamu B[bn A[i]c] 3 for i 0 to n 1 4 do Sort(B[i]) 5 vlož postupně prvky z B[0],..., B[n 1] do pole A Bucket sort se dá využít pro řazení obrovských dat, která by nemohl načíst klasický O(n log(n)) algoritmus najednou. Algoritmus rozdělí vstupní data do dostatečně malých přihrádek a tyto postupně řadí v paměti, zatímco neaktivní přihrádky nechává uložené ve vnější paměti (např. pevný disk).
31 Program v jazyce C 1. /* 2. * C Program to Sort Array using Bucket Sort 3. */ 4. #include <stdio.h> /* Function for bucket sort */ 7. void Bucket_Sort(int array[], int n) 8. { 9. int i, j; 10. int count[n]; 11. for (i = 0; i < n; i++) 12. count[i] = 0; for (i = 0; i < n; i++) 15. (count[array[i]])++; for (i = 0, j = 0; i < n; i++) 18. for(; count[i] > 0; (count[i])--) 19. array[j++] = i; 20. } 21. /* End of Bucket_Sort() */ /* The main() begins */ 24. int main() 25. { 26. int array[100], i, num; printf("enter the size of array : "); 29. scanf("%d", &num); 30. printf("enter the %d elements to be sorted:\n",num); 31. for (i = 0; i < num; i++) 32. scanf("%d", &array[i]); 33. printf("\nthe array of elements before sorting : \n"); 34. for (i = 0; i < num; i++) 35. printf("%d ", array[i]); 36. printf("\nthe array of elements after sorting : \n"); 37. Bucket_Sort(array, num); 38. for (i = 0; i < num; i++) 39. printf("%d ", array[i]); 40. printf("\n"); 41. return 0; 42. }
32 Pořádková statistika Statistika se zabývá jevy, které se vyznačují velkými počty hromadností, takže se mohou projevit a odhalit zákonitosti velkého počtu pozorování. Výběrový soubor (často jen výběr) vybrané prvky ze základního souboru, které sledujeme místo celého souboru Rozsah souboru počet prvků souboru (statistických jednotek), obvykle značíme n. Výsledkem statistického šetření, pozorování či měření je většinou nepřehledný soubor dat - souhrn čísel, která nám v uvedeném stavu nic neříkají. Snažíme se tedy charakterizovat tato data menším počtem čísel, která jsou pro nás přehlednější a lze z nich vyčíst hledané obecné vztahy a zákonitosti. K tomu setřídíme prvky souboru podle hodnot sledovaného znaku (proměnné). Vytváříme skupiny prvků souboru se stejnou hodnotou znaku a určujeme počet hodnot v dané skupině, tzv. četnost, neboli frekvenci. Při třídění získáme rozdělení četností, které udává kolikrát se jednotlivé hodnoty znaku (varianty) v souboru opakují. Modus V tabulce četností nebo na diagramu můžeme snadno najít nejčetnější hodnotu proměnné tzv. modus (hodnota, která má nejvyšší počet opakování); značívá se např. (písmeno se stříškou se častěji používá jako symbol odhadované hodnoty První pořádková statistika, x(1), je nejnižší hodnota, poslední pořádková statistika je hodnota nejvyšší, x(n). (Hodnota značená x1 je první naměřená hodnota, kdežto xn je poslední naměřená hodnota.) Kvantil, přesněji řečeno p-procentní kvantil (značíme x p) je hodnota, která dělí neklesající řadu pořádkových statistik na dvě části tak, že jedna obsahuje p% hodnot menších než kvantil nebo právě stejných a druhá obsahuje 100-p% (zbytek %) větších nebo právě stejných. Medián je padesátiprocentní kvantil, x 50% - hodnota, která dělí pořádkovou statistiku na dvě poloviny (soubor má 50% hodnot menších a 50% hodnot větších než je medián). Je-li počet prvků souboru lichý, určíme medián jako prostřední hodnotu z řady výsledků pozorování uspořádané tak, aby v ní hodnoty neklesaly. Je-li počet sudý, určíme medián jako průměr dvou prostředních hodnot.
33 Dolní kvartil x 25% ten jsme popsali v úvodu (dělí hodnoty seřazené v neklesající řadu na 25% hodnot pod ním, 75% hodnot nad ním). Horní kvartil x 75% (75% hodnot pod ním, 25% hodnot nad ním). Prostřední kvartil je vlastně medián (2x25%=50% hodnot pod ním, 50% nad ním).
34 Příklady Scitani-Cisel-Desitkove(a[0..n 1], b[0..n 1]) 1 t 0 2 for i 0 to n 1 3 do c[i] a[i] + b[i] + t mod 10 4 t b(a[i] + b[i] + t)/10c 5 c[n] t gcd-euclid(m, n) 1 while n 6= 0 2 do r m mod n 3 m n 4 n r 5 return m Set-To-Zero(A) 1 for i 0 to n 1 2 do A[i] 0 Set-To-Zero(A) 1 for i 0 to length(a) 1 2 do A[i] 0 Set-To-Zero(A) 1 for i 1 to n 2 do A[i] 0
35 Swap-Arrays(A[0..n 1],B[0..n 1]) 1 for i 0 to n 1 2 do temp A[i] 3 A[i] B[i] 4 B[i] temp Swap-Arrays(A[0..n 1],B[0..n 1]) 1 for i 0 to n 1 2 do swap(a[i], B[i]) Randomized-Select(A, p, r, i) 1 if p = r 2 then return A[p] 3 q Randomized-Partition(A, p,r) 4 k q p if i = k 6 then return A[q] 7 else if i < k 8 then return Randomized-Select(A, p, q 1, i) 9 else return Randomized-Select(A, q + 1, r, i q + p 1) Randomized-Partition(A, p, r) 1 k Random(p,r) 2 swap(a[k], A[r]) 3 return Partition(A, p,r)
36 Generátor permutací void permute(int k,int size){ int i; ccc++; if (k==0) printarray(size); else{ for (i=k-1;i>=0;i--){ swap(i,k-1); permute(k-1,size); swap(i,k-1); } } }
Stromy, haldy, prioritní fronty
Stromy, haldy, prioritní fronty prof. Ing. Pavel Tvrdík CSc. Katedra počítačů FEL České vysoké učení technické DSA, ZS 2008/9, Přednáška 6 http://service.felk.cvut.cz/courses/x36dsa/ prof. Pavel Tvrdík
DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3
DobSort Úvod do programování Michal Krátký 1,Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programování, 2004/2005 V roce 1980 navrhl Dobosiewicz variantu (tzv. DobSort),
přirozený algoritmus seřadí prvky 1,3,2,8,9,7 a prvky 4,5,6 nechává Metody řazení se dělí:
Metody řazení ve vnitřní a vnější paměti. Algoritmy řazení výběrem, vkládáním a zaměňováním. Heapsort, Shell-sort, Radix-sort, Quicksort. Řazení sekvenčních souborů. Řazení souborů s přímým přístupem.
Základní datové struktury III: Stromy, haldy
Základní datové struktury III: Stromy, haldy prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní
Náplň. v.0.03 16.02.2014. - Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění
Náplň v.0.03 16.02.2014 - Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění Spojení dvou samostatně setříděných polí void Spoj(double apole1[], int adelka1, double
Algoritmizace řazení Bubble Sort
Algoritmizace řazení Bubble Sort Cílem této kapitoly je seznámit studenta s třídícím algoritmem Bubble Sort, popíšeme zde tuto metodu a porovnáme s jinými algoritmy. Klíčové pojmy: Třídění, Bubble Sort,
NPRG030 Programování I, 2018/19 1 / :03:07
NPRG030 Programování I, 2018/19 1 / 20 3. 12. 2018 09:03:07 Vnitřní třídění Zadání: Uspořádejte pole délky N podle hodnot prvků Měřítko efektivity: * počet porovnání * počet přesunů NPRG030 Programování
Maturitní téma: Programovací jazyk JAVA
Maturitní téma: Programovací jazyk JAVA Insert Sort (třídění vkládáním) 1. Jako setříděnou část označíme první prvek pole. Jako nesetříděnou část označíme zbytek pole. 2. Vezmeme první (libovolný) prvek
IB111 Úvod do programování skrze Python
Vyhledávání, řazení, složitost IB111 Úvod do programování skrze Python 2012 Otrávené studny 8 studen, jedna z nich je otrávená laboratorní rozbor dokáže rozpoznat přítomnost jedu ve vodě je drahý (je časově
Základní datové struktury
Základní datové struktury Martin Trnečka Katedra informatiky, Přírodovědecká fakulta Univerzita Palackého v Olomouci 4. listopadu 2013 Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013
Algoritmizace prostorových úloh
INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Třídění, vyhledávání Daniela Szturcová
TGH07 - Chytré stromové datové struktury
TGH07 - Chytré stromové datové struktury Jan Březina Technical University of Liberec 1. dubna 2014 Prioritní fronta Datová struktura s operacemi: Odeber Minum (AccessMin, DeleteMin) - vrat prvek s minimálním
ALG 09. Radix sort (přihrádkové řazení) Counting sort. Přehled asymptotických rychlostí jednotlivých řazení. Ilustrační experiment řazení
ALG Radix sort (přihrádkové řazení) Counting sort Přehled asymptotických rychlostí jednotlivých řazení Ilustrační experiment řazení Radix sort Neseřazeno Řaď podle. znaku Cbb DaD adb DCa CCC add DDb adc
Prioritní fronta, halda
Prioritní fronta, halda Priority queue, heap Jan Kybic http://cmp.felk.cvut.cz/~kybic kybic@fel.cvut.cz 2016 2018 1 / 26 Prioritní fronta Halda Heap sort 2 / 26 Prioritní fronta (priority queue) Podporuje
A4B33ALG 2010/05 ALG 07. Selection sort (Select sort) Insertion sort (Insert sort) Bubble sort deprecated. Quicksort.
A4B33ALG 2010/05 ALG 07 Selection sort (Select sort) Insertion sort (Insert sort) Bubble sort deprecated Quicksort Stabilita řazení 1 Selection sort Neseřazeno Seřazeno Start T O U B J R M A K D Z E min
Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem
Test prvočíselnosti Úkol: otestovat dané číslo N, zda je prvočíslem 1. zkusit všechny dělitele od 2 do N-1 časová složitost O(N) cca N testů 2. stačí zkoušet všechny dělitele od 2 do N/2 (větší dělitel
Rekurzivní algoritmy
Rekurzivní algoritmy prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní algoritmy (BI-EFA) ZS
Dynamické datové struktury III.
Dynamické datové struktury III. Halda. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované
Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012
Obecná informatika Přednášející Putovních přednášek Matematicko-fyzikální fakulta Univerzity Karlovy v Praze Podzim 2012 Přednášející Putovních přednášek (MFF UK) Obecná informatika Podzim 2012 1 / 18
Rekurze a rychlé třídění
Rekurze a rychlé třídění Jan Kybic http://cmp.felk.cvut.cz/~kybic kybic@fel.cvut.cz 2016 2017 1 / 54 Rekurze Rychlé třídění 2 / 54 Rekurze Recursion Rekurze = odkaz na sama sebe, definice za pomoci sebe
13. Třídící algoritmy a násobení matic
13. Třídící algoritmy a násobení matic Minulou přednášku jsme probírali QuickSort, jeden z historicky prvních třídících algoritmů, které překonaly kvadratickou složitost aspoň v průměrném případě. Proč
Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost
Amortizovaná složitost. Prioritní fronty, haldy binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost 1. Asymptotické odhady Asymptotická složitost je deklarována na základě
bfs, dfs, fronta, zásobník, prioritní fronta, halda
bfs, dfs, fronta, zásobník, prioritní fronta, halda Petr Ryšavý 20. září 2016 Katedra počítačů, FEL, ČVUT prohledávání grafů Proč prohledávání grafů Zkontrolovat, zda je sít spojitá. Hledání nejkratší
bfs, dfs, fronta, zásobník, prioritní fronta, halda
bfs, dfs, fronta, zásobník, prioritní fronta, halda Petr Ryšavý 19. září 2017 Katedra počítačů, FEL, ČVUT prohledávání grafů Proč prohledávání grafů Zkontrolovat, zda je sít spojitá. Hledání nejkratší
Základy algoritmizace a programování
Základy algoritmizace a programování Složitost algoritmů. Třídění Přednáška 8 16. listopadu 2009 Který algoritmus je "lepší"? Různé algoritmy, které řeší stejnou úlohu zbytek = p % i; zbytek = p - p/i*i;
Algoritmizace prostorových úloh
INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Datové struktury Daniela Szturcová
Da D to t v o é v ty t py IB111: Datové typy
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 provádět? Navržení práce s daty je velice důležité
TGH07 - Chytré stromové datové struktury
TGH07 - Chytré stromové datové struktury Jan Březina Technical University of Liberec 5. dubna 2017 Prioritní fronta Datová struktura s operacemi: Odeber Minum (AccessMin, DeleteMin) - vrat prvek s minimálním
Bubble sort. příklad. Shaker sort
Bubble sort pseudokód function bubblesort(array a) for i in 1 -> a.length - 1 do for j in 1 -> a.length - i - 1 do if a[j] < a[j+1] prohoď(a[j], a[j+1]); //razeni od nejvyssiho function bubblesort(int[]
Vyvažování a rotace v BVS, všude se předpokládá AVL strom
Vyvažování a rotace v BVS, všude se předpokládá AVL strom 1. Jednoduchá levá rotace v uzlu u má operační složitost a) závislou na výšce levého podstromu uzlu u b) mezi O(1) a Θ(n) c) závislou na hloubce
Sada 1 - Základy programování
S třední škola stavební Jihlava Sada 1 - Základy programování 17. Řadící algoritmy Digitální učební materiál projektu: SŠS Jihlava šablony registrační číslo projektu:cz.1.09/1.5.00/34.0284 Šablona: III/2
V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto:
20. Programovací techniky: Abstraktní datový typ, jeho specifikace a implementace. Datový typ zásobník, fronta, tabulka, strom, seznam. Základní algoritmy řazení a vyhledávání. Složitost algoritmů. Abstraktní
Základy řazení. Karel Richta a kol.
Základy řazení Karel Richta a kol. Přednášky byly připraveny s pomocí materiálů, které vyrobili Marko Berezovský, Petr Felkel, Josef Kolář, Michal Píše a Pavel Tvrdík Katedra počítačů Fakulta elektrotechnická
Dynamické datové struktury IV.
Dynamické datové struktury IV. Prioritní fronta. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK. Tomáš Bayer bayertom@natur.cuni.cz (Katedra
Algoritmizace prostorových úloh
INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Datové struktury Daniela Szturcová
2 Datové struktury. Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky
Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky 25 Pole Datová struktura kolekce elementů (hodnot či proměnných), identifikovaných jedním nebo více indexy, ze kterých
Časová a prostorová složitost algoritmů
.. Časová a prostorová složitost algoritmů Programovací techniky doc. Ing. Jiří Rybička, Dr. ústav informatiky PEF MENDELU v Brně rybicka@mendelu.cz Hodnocení algoritmů Programovací techniky Časová a prostorová
ALGORITMY A DATOVÉ STRUKTURY
Název tématického celku: Cíl: ALGORITMY A DATOVÉ STRUKTURY Metodický list č. 1 Časová složitost algoritmů Základním cílem tohoto tematického celku je vysvětlení potřebných pojmů a definic nutných k popisu
IB111 Úvod do programování skrze Python
Vyhledávání, řazení, složitost IB111 Úvod do programování skrze Python 2014 1 / 48 Otrávené studny 8 studen, jedna z nich je otrávená laboratorní rozbor dokáže rozpoznat přítomnost jedu ve vodě je drahý
Prohledávání do šířky = algoritmus vlny
Prohledávání do šířky = algoritmus vlny - souběžně zkoušet všechny možné varianty pokračování výpočtu, dokud nenajdeme řešení úlohy průchod stromem všech možných cest výpočtu do šířky, po vrstvách (v každé
Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010
Dynamické programování Jiří Vyskočil, Marko Genyg-Berezovskyj 2010 Rozděl a panuj (divide-and-conquer) Rozděl (Divide): Rozděl problém na několik podproblémů tak, aby tyto podproblémy odpovídaly původnímu
Algoritmy I, složitost
A0B36PRI - PROGRAMOVÁNÍ Algoritmy I, složitost České vysoké učení technické Fakulta elektrotechnická v 1.01 Rychlost... Jeden algoritmus (program, postup, metoda ) je rychlejší než druhý. Co ta věta znamená??
Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.
Vyhledávání doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 21. září 2018 Jiří Dvorský (VŠB TUO) Vyhledávání 242 / 433 Osnova přednášky
ˇ razen ı rychlejˇ s ı neˇ z kvadratick e Karel Hor ak, Petr Ryˇsav y 20. dubna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT
řazení rychlejší než kvadratické Karel Horák, Petr Ryšavý 20. dubna 2016 Katedra počítačů, FEL, ČVUT Příklad 1 Která z následujících posloupností představuje haldu uloženou v poli? 1. 9 5 4 6 3 2. 5 4
Pole a kolekce. v C#, Javě a C++
Pole a kolekce v C#, Javě a C++ C# Deklarace pole typ_prvku_pole[] jmeno_pole; Vytvoření pole jmeno_pole = new typ_prvku_pole[pocet_prvku_pole]; Inicializace pole double[] poled = 4.8, 8.2, 7.3, 8.0; Java
Složitost algoritmů. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.
Složitost algoritmů Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol., 2017 Datové struktury a algoritmy, B6B36DSA 02/2017, Lekce 3
IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)
IB108 Sada 1, Příklad 1 ( ) Složitost třídícího algoritmu 1/-Sort je v O n log O (n.71 ). Necht n = j i (velikost pole, které je vstupním parametrem funkce 1/-Sort). Lehce spočítáme, že velikost pole předávaná
Michal Krátký. Úvod do programování. Cíl kurzu. Podmínky získání zápočtu III/III
Michal Krátký Úvod do programování Michal Krátký 1,Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programování, 2004/2005 tel.: +420 596 993 239 místnost: A1004 mail: michal.kratky@vsb.cz
Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy
Stromy úvod Stromy Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy Neorientovaný strom Orientovaný strom Kořenový orientovaný
3 Algoritmy řazení. prvku a 1 je rovněž seřazená.
Specifikace problému řazení (třídění): A... neprázdná množina prvků Posl(A)... množina všech posloupností prvků z A ... prvky množiny Posl(A) q... délka posloupnosti Posl(A), přičemž Delka()
Šablony, kontejnery a iterátory
7. října 2010, Brno Připravil: David Procházka Šablony, kontejnery a iterátory Programovací jazyk C++ Šablony Strana 2 / 21 Šablona funkce/metody Šablona je obecný popis (třídy, funkce) bez toho, že by
Lineární datové struktury
Lineární datové struktury doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 13. března 2017 Jiří Dvorský (VŠB TUO) Lineární datové
Dynamické datové struktury I.
Dynamické datové struktury I. Seznam. Fronta. Zásobník. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK. Tomáš Bayer bayertom@natur.cuni.cz
Binární soubory (datové, typované)
Binární soubory (datové, typované) - na rozdíl od textových souborů data uložena binárně (ve vnitřním tvaru jako v proměnných programu) není čitelné pro člověka - všechny záznamy téhož typu (může být i
Kolekce, cyklus foreach
Kolekce, cyklus foreach Jen informativně Kolekce = seskupení prvků (objektů) Jednu již známe pole (Array) Kolekce v C# = třída, která implementuje IEnumerable (ICollection) Cyklus foreach ArrayList pro
1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) 759 10 b) 2578 10
Úlohy- 2.cvičení 1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) 759 10 b) 2578 10 2. Převeďte dané desetinné číslo do dvojkové soustavy (DEC -> BIN): a) 0,8125 10 b) 0,35 10
Algoritmy I. Třídění ALGI 2010/2011
Algoritmy I Třídění 1 ALGI 2010/2011 Třídící problém Je dána množina A = {a 1,a 2,...,a n }. Je potřebné najít permutaci π těchto n prvků, která zobrazuje danou posloupnost do neklesající posloupnosti
Pokročilá algoritmizace amortizovaná složitost, Fibonacciho halda, počítačová aritmetika
amortizovaná složitost, Fibonacciho halda, počítačová aritmetika Jiří Vyskočil, Marko Genyg-Berezovskyj 2009 Amortizovaná složitost Asymptotická složitost často dostatečně nevypovídá o složitosti algoritmů,
Různé algoritmy mají různou složitost
/ 1 Různé algoritmy mají různou složitost 1/ 1 Rychlost... Jeden algoritmus (program, postup, metoda ) je rychlejší než druhý. Co ta věta znamená?? 2/ 1 Asymptotická složitost y y x x Každému algoritmu
Třídění a vyhledávání Searching and sorting
Třídění a vyhledávání Searching and sorting Jan Kybic http://cmp.felk.cvut.cz/~kybic kybic@fel.cvut.cz 2016 1 / 33 Vyhledávání Třídění Třídící algoritmy 2 / 33 Vyhledávání Searching Mějme posloupnost (pole)
Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy
Úvod do programování Michal Krátký 1,Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programování, 2004/2005 Procesor Procesorem je objekt, který vykonává algoritmem popisovanou
Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.
Vyhledávání doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 12. září 2016 Jiří Dvorský (VŠB TUO) Vyhledávání 201 / 344 Osnova přednášky
5 Rekurze a zásobník. Rekurzivní volání metody
5 Rekurze a zásobník Při volání metody z metody main() se do zásobníku uloží aktivační záznam obsahující - parametry - návratovou adresu, tedy adresu, kde bude program pokračovat v metodě main () po skončení
Řazení. Uspořádat množinu prvků obsahujících klíč podle definovaného kriteria.
Řazení Problém řazení: Uspořádat množinu prvků obsahujících klíč podle definovaného kriteria. Až 30% času běžného počítače. Příklad: Mějme zjistit zda jsou v posloupnosti prvků, například celých čísel,
Hledání k-tého nejmenšího prvku
ALG 14 Hledání k-tého nejmenšího prvku Randomized select CLRS varianta Partition v Quicksortu 0 Hledání k-tého nejmenšího prvku 1. 2. 3. Seřaď seznam/pole a vyber k-tý nejmenší, složitost (N*log(N)). Nevýhodou
Časová složitost algoritmů
Časová složitost algoritmů Důležitou vlastností algoritmu je časová náročnost výpočtů provedené podle daného algoritmu Ta se nezískává měřením doby výpočtu pro různá data, ale analýzou algoritmu, jejímž
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
Střední průmyslová škola a Vyšší odborná škola technická Brno, Sokolská 1 Šablona: Název: Téma: Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Třídění dat Autor:
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.
Informatika 10. 9. 2013 Jméno a příjmení Rodné číslo 1) Napište algoritmus pro rychlé třídění (quicksort). 2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus
Pojem algoritmus. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava
Pojem algoritmus doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 12. září 2016 Jiří Dvorský (VŠB TUO) Pojem algoritmus 54 / 344
Dynamické programování
Dynamické programování prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní algoritmy (BI-EFA)
Datový typ prioritní fronta Semestrální práce z předmětu 36PT
Datový typ prioritní fronta Semestrální práce z předmětu 36PT Martin Tůma Cvičení 113, Út 18:00 22. května 2004 Specifikace problému Často potřebujeme přístup k informacím, tak aby tyto byly seřazeny podle
TGH05 - Problém za milion dolarů.
TGH05 - Problém za milion dolarů. Jan Březina Technical University of Liberec 20. března 2012 Časová složitost algoritmu Závislost doby běhu programu T na velikosti vstupních dat n. O(n) notace, standardní
Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007
Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků
Datové struktury 2: Rozptylovací tabulky
Datové struktury 2: Rozptylovací tabulky prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní algoritmy
Mimo samotné správnosti výsledku vypočteného zapsaným algoritmem je ještě jedno
12 Délka výpočtu algoritmu Mimo samotné správnosti výsledku vypočteného zapsaným algoritmem je ještě jedno neméně důležité hledisko k posouzení vhodnosti algoritmu k řešení zadané úlohy. Jedná se o čas,
Adresní vyhledávání (přímý přístup, zřetězené a otevřené rozptylování, rozptylovací funkce)
13. Metody vyhledávání. Adresní vyhledávání (přímý přístup, zřetězené a otevřené rozptylování, rozptylovací funkce). Asociativní vyhledávání (sekvenční, binárním půlením, interpolační, binární vyhledávací
Algoritmizace prostorových úloh
INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Algoritmus Daniela Szturcová Tento
ADT/ADS = abstraktní datové typy / struktury
DT = datové typy obor hodnot, které může proměnná nabývat, s operacemi na tomto oboru určen: obor hodnot + výpočetní operace např. INT = { 2 147 483 648 až +2 147 483 647} + {+,,*,/,} ADT/ADS = abstraktní
Binární vyhledávací stromy pokročilé partie
Binární vyhledávací stromy pokročilé partie KMI/ALS lekce Jan Konečný 30.9.204 Literatura Cormen Thomas H., Introduction to Algorithms, 2nd edition MIT Press, 200. ISBN 0-262-5396-8 6, 3, A Knuth Donald
Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr
Seminář z IVT Algoritmizace Slovanské gymnázium Olomouc Tomáš Kühr Algoritmizace - o čem to je? Zatím jsme se zabývali především tím, jak určitý postup zapsat v konkrétním programovacím jazyce (např. C#)
Elegantní algoritmus pro konstrukci sufixových polí
Elegantní algoritmus pro konstrukci sufixových polí 22.10.2014 Zadání Obsah Zadání... 3 Definice... 3 Analýza problému... 4 Jednotlivé algoritmy... 4 Algoritmus SA1... 4 Algoritmus SA2... 5 Algoritmus
Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C
Hanojské věže - 3 kolíky A, B, C - na A je N disků různé velikosti, seřazené od největšího (dole) k nejmenšímu (nahoře) - kolíky B a C jsou prázdné - úkol: přenést všechny disky z A na B, mohou se odkládat
IAJCE Přednáška č. 9. int[] pole = new int[pocet] int max = pole[0]; int id; for(int i =1; i< pole.length; i++) { // nikoli 0 if (Pole[i] > max) {
Vyhledání extrému v poli použito v algoritmech řazení hledání maxima int[] pole = new int[pocet] int max = pole[0]; int id; for(int i =1; i< pole.length; i++) // nikoli 0 if (Pole[i] > max) max = pole[i];
Maturitní témata. IKT, školní rok 2017/18. 1 Struktura osobního počítače. 2 Operační systém. 3 Uživatelský software.
Maturitní témata IKT, školní rok 2017/18 1 Struktura osobního počítače Von Neumannova architektura: zakreslete, vysvětlete její smysl a popište, jakým způsobem se od ní běžné počítače odchylují. Osobní
Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.
Stromy Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol., 2018, B6B36DSA 01/2018, Lekce 9 https://cw.fel.cvut.cz/wiki/courses/b6b36dsa/start
Programování v C++, 2. cvičení
Programování v C++, 2. cvičení 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 Operátory new a delete 2 3 Operátory new a delete minule
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.
1 3 4 5 6 7 8 9 10 11 1 13 14 15 16 17 18 19 0 1 3 4 5 6 7 8 9 30 31 3 Zdůvodněte, proč funkce f(n) = n log(n) 1 n 1/ roste rychleji než funkce g(n) = n. Zdůvodněte, proč funkce f(n) = n 3/ log(n) roste
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
Euklidův algoritmus Doprovodný materiál pro cvičení Programování I. NPRM044 Autor: Markéta Popelová Datum: 31.10.2010 Euklidův algoritmus verze 1.0 Zadání: Určete největšího společného dělitele dvou zadaných
Stromy. Jan Hnilica Počítačové modelování 14
Stromy Jan Hnilica Počítačové modelování 14 1 Základní pojmy strom = dynamická datová struktura, složená z vrcholů (uzlů, prvků) propojených hranami hrany chápeme jako orientované, tzn. vedou z uzlu A
Šablony, kontejnery a iterátory
11. března 2015, Brno Připravil: David Procházka Šablony, kontejnery a iterátory Programovací jazyk C++ Šablony Strana 2 / 31 Obsah přednášky 1 Šablony 2 Abstraktní datové struktury 3 Iterátory 4 Array
Asymptotická složitost algoritmů
Semestrální projekt 1 Y14TED Asymptotická složitost algoritmů Autor: Antonín DANĚK Osnova Slide 2 Co je to složitost algoritmu? Jak se počítá složitost algoritmu? Smysl přesného výpočtu složitosti algoritmu
Poslední nenulová číslice faktoriálu
Poslední nenulová číslice faktoriálu Kateřina Bambušková BAM015, I206 Abstrakt V tomto článku je popsán a vyřešen problém s určením poslední nenulové číslice faktoriálu přirozeného čísla N. Celý princip
Pokročilé haldy. prof. Ing. Pavel Tvrdík CSc. Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010
Pokročilé haldy prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní algoritmy (I-EFA) ZS 2010/11,
ALG 14. Vícedimenzionální data. Řazení vícedimenzionálních dat. Experimentální porovnání řadících algoritmů na vícedimenzionálních datech
ABALG 5/ ALG Vícedimenzionální data Řazení vícedimenzionálních dat Experimentální porovnání řadících algoritmů na vícedimenzionálních datech ABALG 5/ Vícedimenzionální data..7.. -.. d = 6 5 6.....7.. -.....9
NEJKRATŠÍ CESTY I. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze
NEJKRATŠÍ CESTY I Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze BI-GRA, LS 2010/2011, Lekce 7 Evropský sociální fond Praha & EU: Investujeme do vaší
Algoritmus. Přesné znění definice algoritmu zní: Algoritmus je procedura proveditelná Turingovým strojem.
Algoritmus Algoritmus je schematický postup pro řešení určitého druhu problémů, který je prováděn pomocí konečného množství přesně definovaných kroků. nebo Algoritmus lze definovat jako jednoznačně určenou
Datové struktury. alg12 1
Datové struktury Jedna z klasických knih o programování (autor prof. Wirth) má název Algorithms + Data structures = Programs Datová struktura je množina dat (prvků, složek, datových objektů), pro kterou
Funkce, intuitivní chápání složitosti
Příprava studijního programu Informatika je podporována projektem financovaným z Evropského sociálního fondu a rozpočtu hlavního města Prahy. Praha & EU: Investujeme do vaší budoucnosti Funkce, intuitivní
Informatika navazující magisterské studium Přijímací zkouška z informatiky 2018 varianta A
Informatika navazující magisterské studium Přijímací zkouška z informatiky 2018 varianta A Každá úloha je hodnocena maximálně 25 body. Všechny své odpovědi zdůvodněte! 1. Postavte na stůl do řady vedle
bin arn ı vyhled av an ı a bst Karel Hor ak, Petr Ryˇsav y 23. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT
binární vyhledávání a bst Karel Horák, Petr Ryšavý 23. března 2016 Katedra počítačů, FEL, ČVUT Příklad 1 Naimplementujte binární vyhledávání. Upravte metodu BinarySearch::binarySearch. 1 Příklad 2 Mysĺım