Praktická cvičení algoritmů

Rozměr: px
Začít zobrazení ze stránky:

Download "Praktická cvičení algoritmů"

Transkript

1 UČEBNÍ TEXTY OSTRAVSKÉ UNIVERZITY Přírodovědecká fakulta Praktická cvičení algoritmů Hashim Habiballa Ostravská Univerzita 2006

2 Praktická cvičení algoritmů KIP/XPOP1 distanční studijní opora RNDr. PaedDr. Hashim Habiballa, PhD. Hashim Habiballa, 2006

3 Praktická cvičení algoritmů Hashim Habiballa Cíl předmětu Navázat na dovednosti studentů v programování a algoritmizaci z předmětu Algoritmy a datové struktury 1,2. Naučit studenty tvorbě rozsáhlejších programů s pomocí složitějších algoritmů, datových struktur a technik, včetně jejich implementace. 1

4 Recenzenti: RNDr. PaedDr. Eva Volná, PhD. Mgr. Rostislav Fojtík, PhD. 2

5 Obsah: 1. Úvod do praktických cvičení algoritmů Řadící algoritmy Fronta s prioritou Algoritmy řazení...11 Nejznámější třídicí algoritmy Bubble-Sort Select-Sort Insert-Sort Heap-Sort Quick-Sort Výhody a nevýhody Implementace řadících algoritmů v Javě Práce se soubory Tvorba náhodného pole čísel a odečet času Jednoduché textové menu Dělení do knihoven Dynamické datové struktury Datový typ ukazatel a dynamická proměnná Dynamické datové struktury Zásobník Fronta Jednosměrný spojový seznam Dvousměrný spojový seznam Implementace fronty s prioritou Hlavní program pro simulaci letiště Fronta a operace Vstupy a výstupy...76 Literatura

6 Úvod pro práci s textem pro distanční studium. Průvodce studiem: Účel textu Tento text má sloužit pro potřeby výuky praktických cvičení algoritmů. Má ukázat základní problémy tvorby rozsáhlejších programů. Jde o prakticky orientovaný kurz, který má spočívat především v programování komplexní úkolů včetně jejich komentáře a dokumentace. Předpokládá se, že máte znalosti na úrovni kurzu Algoritmy a datové struktury 1 a zároveň studujete kurz Algoritmy a datové struktury 2. tedy dobře ovládáte základní techniky algoritmizace jako jsou větvení, cykly, proměnné a umíte pracovat alespoň se strukturovanými programovacími jazyky. Zároveň byste měli mít alespoň vstupní znalosti k datovému typu ukazatel a práci s vstupně/výstupními funkcemi (se soubory). Je pochopitelné, že v tomto kurzu bude mnoho z vás považovat nároky korespondenčních úkolů za velmi vysoké na hranici možností (zvláště pokud máte mále zkušenosti s algoritmizací předchozího studia) a naopak profesionální programátoři budou úlohy považovat za zcela triviální (až možná urážlivě jednoduché). Tyto úlohy jsem vybral po delších zkušenostech z výuky programování v prezenčním studiu. Příliš malé úlohy (rozsahem označil bych je po programátorsku jako úlohy typu - printf( Hello world ); ) nevedou ke správnému chápání tvorby programu jako komplexního souboru různých rutin. Tato výuka je již vedena v rámci cvičení z algoritmizace a tento předmět by ji tedy stejně pouze zdvojoval. Jsou tedy zvoleny dvě rozsáhlejší úlohy, které by vám měli usnadnit vaši další programátorskou práci při studiu informatiky (budete ji například potřebovat v kurzech jako je počítačová grafika, kde se probírané algoritmy rovněž programují a předpokládá se poměrně velmi slušná znalost algoritmizace). Vše na dalších stránkách je tedy kompromis mezi trivialitou a profesionalitou v programování vynikajícího programátora zde asi nic nového nenaučím, ale to není nic překvapivého v 1. ročníku bakalářského studia a naopak úplný nováček může být zoufalý z vysokých nároků oproti cvičení z algoritmizace. Snažte se tedy prosím při kritice obtížnosti příkladů vžít i do postavení studenta na opačné straně programátorských zkušeností. Tato distanční studijní opora se může po přečtení první kapitoly, která obsahuje dva rozsáhlé korespondenční úkoly, jako naprosto postavená naruby. Není to však žádné opomenutí ani chyba, ale naopak účel. Jelikož si by si ji regulérně měli číst absolventi kurzu Algoritmy a datové struktury 1, chci vás již úvodu seznámit s oběma úkoly (nejprve, co musíte vyřešit) a ty pak budeme postupně rozebírat a ukazovat si postupy, jak jednotlivé části řešit (návody a rady, jak je vyřešit). Tento kurz je ryze praktický! Zpracujte prosím všechny korespondenční úkoly a zašlete je včas. Zároveň Vás chci laskavě poprosit, abyste jakékoliv věcné i formální chyby v textu zdokumentovali a kontaktovali mne. Budu Vám za tuto pomoc vděčen a usnadní to učení i Vašim kolegům. 4

7 1. Úvod do praktických cvičení algoritmů Cíl: Získáte základní přehled o těchto otázkách: co bude cílem studia tohoto předmětu a jaké úlohy zpracujete jaký je systém tvorby složitějších programů Algoritmizace a programování patří k základní výbavě každého informatika. I když se to dnes v kontextu snižující se úrovně výuky na středních školách v naší zemi může zdát jako diskutabilní tvrzení (to samozřejmě platí pouze v národním měřítku), jsou algoritmy páteří znalostí a dovedností absolventu předmětu nebo oboru informatika. Algoritmické myšlení pracuje především s pojmem algoritmu pro řešení konkrétního problému a to pomocí správného řízení výpočtu. Zároveň je nesmírně důležitý pojem datové struktury, jejíž správný výběr rovněž ovlivňuje efektivitu řešení problému. Efektivita je stejně jako v běžném životě vyžadovanou součástí realizovaného postupu pro řešení problému. Jinak řečeno, hledáme ty nejrychlejší či nejúspornější metody. Proto se i v rámci tohoto kurzu pokusíme vytvořit dva úkoly, které závisí na správném výběru metody nebo datové struktury. Algoritmy a datové struktury V tomto textu jsou vyžadovány k vyřešení dva rozsáhlejší korespondenční úkoly. V samotném textu nenajdete sice (vcelku logicky) samotné řešení včetně všech náležitostí, ale bude zde mnoho velmi podobných ukázkových programů, částí kódu a také schémat, jak daný algoritmus pracuje. Chci zdůraznit, že v tomto předmětu je důležitá algoritmizace a nikoliv výběr konkrétního jazyka nebo nástroje implementace. V původní verzi byl tento kurz postaven na programování v jazyce Pascal, ale i přesto jsem ponechal výběr jazyka na studentech (samozřejmě si většina vybrala Pascal, neboť byl jazykem preferovaným pro 1. ročník studia). Někteří studenti samozřejmě zvolili jimi více používaný nástroj, např. C, C++, Javu, PHP atd. Nyní je preferovaným jazykem Java a i proto, jsou v tomto textu zdrojové kódy převedeny do jazyka Java (s vyjímkou kapitoly ). Není účelem tohoto kurzu učit vás Javu, ale algoritmy. I proto opět nabízím možnost odevzdat program v libovolném jiném strukturovaném programovacím jazyce, umožňující práci se soubory a dynamickými strukturami. Pokud si ale zvolíte nějaký nestandardní jazyk (jiný než Pascal, C, Java), prosím konzultujte se mnou jeho implementační možnosti (např. některé jazyky nemají ukazatele, což by u druhého úkolu znamenalo příliš velký zásah do požadovaných výsledků vaší práce). 5

8 1.1. Řadící algoritmy Je pravděpodobné, že jste se již ve své praxi informatiků setkali s vcelku běžnou úlohou, která spočívá v nutnosti seřadit posloupnost nějakých objektů podle určitého kritéria. Například šlo o nutnost napsat program, který seřadí posloupnost čísel od nejmenšího po největší nebo seřadí jména osob v nějakém seznamu. Před podobným problémem stojí nejen informatik, ale třeba člověk, který má seřadit testy studentů podle jejich jména apod. Samozřejmě jde-li o malý počet objektů (jednotky, desítky), pak příliš nevynikne rozdíl v používaných postupech. Někdo by si například mohl vzít nesetříděnou hromádku testů a snažit se na nějakém místě vytvářet postupně přidáváním testů po jednom setříděnou hromádku. Tedy vzal by jeden a k němu se na správné místo (před nebo za) snažil přidat druhý, mezi dva by se postupným hledáním od počátku správného místa podle příjmení snažil přidat třetí atd... (této metodě zpracované formou algoritmu říkáme InsertSort). Jiný člověk by naopak vzal všechny testy, rozprostřel je vedle sebe náhodně a pak se snažil mezi sebou vyměňovat testy, které jsou ve špatném pořadí (to by byla jakási varianta algoritmu známého jako BubbleSort). Samozřejmě při malém počtu testů by asi nebyly velké rozdíly v obou metodách, ale už při stovkách a tisících testů by asi každá nevýhoda nějakého postupu vyplula na povrh ve formě obrovského rozdílu v čase řazení. Na této úloze si tedy můžeme velmi ilustrativně ukázat, jaké jsou charakteristiky časové složitosti algoritmů. Navíc se přitom naučíme programovat opravdu ucelenější projekt, protože budeme chtít nejen implementovat několik různých algoritmů řazení, ale také je spouštět pomocí ovládacího programu a nakonec automatizovaně testovat na náhodně vygenerovaných souborech různé velikosti a odečítat konkrétní čas, který řazení takového souboru trvalo. Tato úloha vám tedy dá následující dovednosti a pochopení principů: - tvorba aplikace s několika vlastními moduly, navzájem volanými metodami, - tvorba jednoduchého textového menu programu - práce se soubory dat čtení, ukládání, generování náhodných dat - měření časové složitosti (rychlosti) algoritmů Je potřeba ještě zdůraznit, že u této úlohy nemusíte používat žádný druh dynamické datové struktury. Ono to ani z povahy dané úlohy nevyplývá sice byste eventuálně mohli použít jako datové úložiště objekt typu seznam, ale narazili byste přitom na implementační obtíže a neefektivitu při práci s některými metodami řazení. Proto prosím použijte datové struktury statické předem dimenzované na maximální přípustnou velikost. V podstatě byste si úlohu spíše zkomplikovali použitím dynamických prvků, neboť práce s ukazateli by úlohu učinila o dimenzi složitější. 6

9 Oba úkoly mají vyústit v odevzdání plně funkční aplikace včetně zdrojových kódů. Musí jít o kód rozdělený logicky do modulů podle funkce jednotlivých metod (procedur) komentáře nejsou nezbytně nutné, ale určitě nebudou na škodu. Oba programy musí být souborově orientované a tudíž musí minimalizovat standardní vstupy a výstupy (téměř vše by se mělo načítat a ukládat v souborech výjimku může tvořit název souboru, interaktivní menu apod.). V žádném případě by se neměla ze standardních vstupů načítat řazená data nebo informace o letadlech (viz zadání). Korespondenční úkol č.1 Porovnání efektivity řadících algoritmů Aplikační rozhraní: Aplikace má interaktivní menu (záleží samozřejmě na platformě a nástroji, jak složité a vzhledné bude není to podstatná věc), které umožní vybrat z těchto nabídek: 1. Načtení souboru celých čísel (integer) do paměti (statického pole o max velikosti cca 10 tis. prvků). 2. Uložení seřazeného pole do souboru. 3. Generování souboru náhodných čísel o určité velikosti. 4. Setřídění pole metodou SelectSort. 5. Setřídění pole metodou InsertSort. 6. Setřídění pole metodou BubbleSort. 7. Setřídění pole metodou QuickSort. 8. Setřídění pole metodou HeapSort (nepovinné). 9. Porovnání efektivity různých metod na různých velikostech souboru. Aplikace tedy umožní načíst diskový soubor s neuspořádanou posloupností čísel a vyjmenovanými metodami ji seřadit a zpět uložit. Nejpodstatnější částí je pak poslední nabídka, která umožní zcela automatizovaně vygenerovat několik souborů různých velikostí a ty postupně načítat a řadit všemi metodami. Během každého řazení odečtete potřebný čas k vykonání operace a nakonec sestavíte takto tabulku o r řádcích a s sloupcích, kde r je počet řadících algoritmů a s je počet souborů. Počet souborů a jejich velikost zvolte dle vlastního uvážení účelem je abyste viděli nejen funkčnost algoritmů, ale také jejich časovou náročnost na konkrétních příkladech. Doporučuji víceméně logaritmickou škálu tj. třeba 10, 100, 1000, prvků pro každou metodu. Samozřejmě tento soubor musí být vždy pro každou metodu stejný, abychom mohli porovnávat čas! Programátorské rozhraní: Opět máte volnost ve výběru vašich modulů, pojmenování metod samozřejmě to dělejte racionálně. Tedy dát vše do jednoho souboru a 7

10 každou proměnnou pojmenovat pomocna1, pomocna2,... asi nebude nejlepší řešení. Doporučuji následující dělení: Hlavní modul interaktivní menu a volání jednotlivých akcí dle menu Modul 1 metody pro práci se soubory (vstup, výstup, generování náhodného souboru) Modul 2 vlastní třídící metody (SelectSort, atd..) Modul 3 porovnání efektivity (metody pro generování všech náhodných souborů, jejich postupné třídění všemi metodami a tisk tabulky, odečtení času) Dalším oříškem pak bývá nějaký centrální modul, který definuje společné datové typy. Ve vašem případě to bude minimálně typ tříděné pole (což podle zadání bude statické pole předefinované na max prvků nebo více podle vašeho výběru). Samozřejmě nezapomeňte, že při práci se statickou strukturou, která reprezentuje pole proměnné velikosti, musíte si vždy někde držet také aktuální velikost pole a posílat ji jako argument i do zpracovávajících metod. Například budete mít definovaný typ Pole jako array[ ] of integer (Pascalovsky řečeno), pak při volání metody SelectSort musíte mít minimálně dva argumenty odkaz typu Pole a typu Počet prvků využitých ve statickém poli. Tento modul je oříškem zejména pro různé způsoby implementace v různých jazycích. Pascal je například náchylný na takzvané cyklické reference tedy musíte si dát pozor, abyste si nezahrnuli do použitých modulů takový, který by pak zahrnoval tento výchozí modul (vzniknul by cyklus ve přidávání modulů). Jazyk C toto umožňuje částečně řešit pomocí hlavičkových souborů. Je samozřejmé, že byste měli dobře zvážit, jaké argumenty procedur zvolíte. Pokud pracujeme se statickým typem pole, je předávání hodnotou sebevražednou akcí programu. Jednak bude program při každém volání muset alokovat minimálně buněk pro číslo, všechny buňky zkopírovat (jistě namítnete, že na to existují blokové transfery paměti), ale v každém případě jde o naprosto zbytečné zahlcení procesu. Za druhé je předávání hodnotou zcela k ničemu, pokud chceme měnit prvky pole a to při řazení určitě budeme Fronta s prioritou Zatímco u první úlohy není vyžadována práce s dynamickými datovými strukturami, druhá úloha vás má provést poměrně důležitým mezníkem v chápání procesu algoritmizace úlohy a její implementace. Jde o práci s tzv. dynamickými strukturami. Dynamické struktury jsou dalším velice používaným prostředkem při programování. I když většinou autoři knih o paradigmatech při programování zmiňují jako obrovský myšlenkový krok při přechodu od (neobjektového) strukturovaného programování k objektovému 8

11 programování, je přechod od používání statických k dynamickým strukturám pro nováčka v programování možná ještě větší. Zatímco objektový princip oddělení dat od metod je vcelku z normálního života přirozený, používání dynamických struktur už tak přirozené není (jistě bychom k němu našli paralely) a proto i jeho implementace v programech přináší studentům velké komplikace. Zvyknout si, že místo transparentního používání vlastních paměťových buněk (tedy přímý zápis čísla, znaku do proměnné) musíte jako programátoři sami vyžádat prostor pro číslo nebo znak a pak s ním pracovat jaksi vzdáleně přes ukazatel, je pro mnoho nováčků skutečně prubířským kamenem. Navíc je to práce velmi nepohodlná programátor si musí velmi dobře hlídat vyžádanou paměť a zase ji sám regulérně uvolňovat (jazyky jako je Java toto sice už umí dělat automaticky ovšem za cenu snížení efektivity musí existovat tzv. Garbage Collector jakýsi čistič již nepoužívaných buněk, který ovšem není zadarmo z hlediska časové složitosti). Práce s ukazateli také znamená často havárii programu nebo dokonce operačního systému (pokud používáme např. MS-DOS nebo starší verze MS-Windows), pokud nepracujeme s ukazateli korektně. I přesto jsou dynamické struktury pro profesionální programování naprosto nezbytné. I tak triviální struktura jako je seznam se používá téměř všude seznamy osob, názvů států atd.. Profesionální programátor zřejmě namítne, že tyto struktury už jsou v moderních jazycích a knihovnách v mnoha mutacích připravené a že není třeba je programovat od základů. To je samozřejmě pravda ať už v Javě nebo C++ nebo modernějších verzích Pascalu jsou desítky ne-li stovky připravených seznamů, od abstraktních, kde si můžete sami dávat vlastní objekty až ke specializovaných typu Fronta nebo seznam souborů v adresáři. Všechny již mají naprogramovány desítky metod od přidávání prvků až k již zmiňovanému řazení pomocí efektivních metod. Proč se tedy učit s nimi pracovat na té nejnižší úrovni? Odpověď bych nechal na analogii s počty a vašem vlastním uvážení této analogie. Na základní škole se také učíme sčítat, násobit, dělit, i když dnes je jednoduchá kalkulačka v každém mobilu. Bez této znalosti bychom těžko mohli vůbec chápat problém násobení nebo jiných operací a těžko bychom pak mohli pochopit fungování složitějších matematických operací a výpočtů. Korespondenční úkol č.2 Simulace fronty nad letištěm Aplikační rozhraní: Aplikace umožňuje simulovat situaci nad fiktivním letištěm. Tedy ve vstupním souboru máme seznam letadel, které budou přilétat, včetně jejich času příletu a času na kolik jim vystačí palivo. Zjednodušíme časovou informaci na rozumnou časovou jednotku např. sekundy, abychom mohli náš program testovat. Pro jednoduchost předpokládejme, že letadla jsou ve vstupním souboru seřazena podle času příletu. Přiletět může samozřejmě více letadel během jedné časové jednotky, avšak nemohou všechna 9

12 najednou přistát (kapacita letiště je omezena například na jedno letadlo za sekundu). Proto se nad letištěm tvoří takzvaná fronta a navíc nejde o klasickou frontu, ale o frontu s prioritou kde prioritou je nedostatek paliva (času, který se ještě letadlo udrží ve vzduchu). Program pracuje samostatně do té doby, dokud ještě jsou nějaká letadla ve vstupním souboru nebo ve frontě. Každou časovou jednotku se provede zařazení letadel, která v daném čase přiletěla, do fronty, provede se přistání jednoho letadla, případně se musí také kontrolovat, zda nějaké letadlo již není bez paliva a tudíž došlo k havárii. Všechny operace nad letištěm se musí zapisovat do.log souboru, který bude obsahovat informace o plnění fronty, přistávání, případně haváriích. Programátorské rozhraní: Opět je potřeba vytvořit modulární strukturu: Hlavní modul obslužný cyklus, který každou sekundu zavolá příslušné rutiny Modul 1 práce se soubory Modul 2 implementace fronty (zařazování, výběr, kontrola všech prvků) Stěžejním momentem je správné vytvoření datové struktury typu fronta s prioritou (nejlépe obousměrná). To samozřejmě hodně závisí na jazyce v Pascalu je nutné ošetřovat alokaci paměti, což třeba v Javě padá díky Garbage Collectoru. Obecně se také dají využít již hotové kolekce přesto doporučuji si práci s ukazateli vyzkoušet. Rozdíl mezi klasickou frontou s prioritou je ve vkládání prvků. Zatímco v klasické frontě se každý příchozí prvek zařadí na konec fronty a musí vyčkat až se dostane na obsluhu (začátek fronty), u fronty s prioritou se prvek již na počátku zařadí podle své priority třeba doprostřed fronty (jde vlastně o jakousi frontu s protekcí ). V tomto případě je mírou protekce to, na kolik času má ještě letadlo palivo čím dřív palivo dojde, tím více letadel se předběhne. Nejdůležitější probrané pojmy: - algoritmy řazení - dynamické struktury 10

13 2. Algoritmy řazení Cíl: Seznámíte se: s metodami pro řazení jejich časovou složitostí Řadící algoritmy jsou algoritmy, které seřadí prvky v kontejneru, nebo jeho části. Řadícím algoritmům se často říká třídicí algoritmy. Není to ale přesné označení, protože pod pojmem třídicí algoritmus by jsme si měli představit spíše něco, co rozděluje objekty podle toho, jaké jsou třídy. Na třídícím algoritmu může záležet rychlost celého výsledného programu. A právě proto musíme zvolit takový, který je dostatečně rychlý a stabilní. Tříděním rozumíme uspořádání prvků vzestupně či sestupně. Pro vzestupně seřazenou posloupnost musí platit: i-tý prvek < i+1 prvek Pro sestupně seřazenou posloupnost musí platit : i-tý prvek > i+1 prvek Klíč - položka záznamu, podle které se záznamy řadí Třídění (sorting, sort) - rozdělování údajů na skupiny se stejnými vlastnostmi. Uspořádání podle klíčů (collating) - seřazení údajů podle prvků (klíčů) lineárně uspořádané množiny. Vlastnosti řazení Řazení (sequencing) - uspořádání údajů podle relace lineárního uspořádání. Slučování (coalescing) - vytváření souboru sjednocením několika souborů. Setřídění (zakládání, merging) - vytváření souboru sjednocením několika souborů, jejichž údaje jsou seřazeny podle téže relace uspořádání se zachováním této relace. Ve smyslu těchto definic budeme algoritmy tradičně nazývané "třídicí algoritmy" nazývat "řadicí algoritmy" a řazení budeme chápat jako zvláštní případ obecnějšího pojmu třídění. 11

14 Přirozenost Přirozenost řazení je vlastnost algoritmu, která vyjadřuje, že doba potřebná k řazení již seřazené množiny údajů je menší než doba pro seřazení náhodně uspořádané množiny a ta je menší než doba pro seřazení opačně seřazené množiny údajů. Stabilita Stabilita řazení je vlastnost řazení, která vyjadřuje, že algoritmus zachovává vzájemné pořadí údajů se shodnými klíči. Stabilita je nutná tam, kde se vyžaduje, aby se při řazení údajů podle klíče s vyšší prioritou neporušilo pořadí údajů se shodnými klíči vyšší priority, získané předcházejícím řazením množiny podle klíčů s nižší prioritou. Rychlost Rychlost je funkcí doby třídění v závislosti na počtu řazených prvků. Požadavky na hardware Tedy přesněji řečeno požadavky na paměť. U kvalitního algoritmu nepřekročíme nároky na paměť více, než zabírá seznam nesetříděných údajů. Podle typu paměti v níž je řazená struktura uložena vnitřní (interní) metody řazení (metody řazení polí) předpokládají uložení seřazované struktury v operační paměti a přímý (nesekvenční) přístup k položkám struktury. vnější (externí) řazení (metody řazení souborů) předpokládají sekvenční přístup k položkám seřazované struktury. Podle řádu složitosti Od O(n log 2 n) do O(n 2 ) Podle metody přímé metody - přirozené postupy řazení, složitost n 2 nepřímé metody - založené na speciálních metodách. Podle základního principu řazení metody založené na principu výběru (selection) - postupný přesun největšího (nejmenšího) prvku do seřazené výstupní struktury metody založené na principu vkládání (insertion) - postupné zařazování prvku na správné místo ve výstupní struktuře metody založené na principu rozdělování (partition) - rozdělování řazené množiny na dvě části tak, že prvky jedné jsou menší než prvky druhé metody založené na principu setřídění (merging) - sdružování seřazených podmnožin do větších celků 12

15 metody založené na jiných principech - nesourodá skupina ostatních metod nebo kombinací metod Nejznámější třídicí algoritmy Bubble Sort Select Sort Insert Sort Binary Insert Sort Shell Sort Shaker Sort Heap Sort Radix Sort Merge Sort Quick Sort 2.1. Bubble-Sort Je nejprimitivnějším, ale také ale také nejpomalejším třídícím algoritmem. Bublinkové řazení (angl. Bubblesort) se chová tak, že porovnává každý prvek se svým následníkem, a je-li tento větší, pak je zamění. Toto provede pro celou posloupnost n prvků. Celý postup (n porovnání a záměn) musíme aplikovat n-krát, abychom si byli jisti, že prvky jsou seřazeny. Největší prvky tak probublají na konec seznamu, odtud název algoritmu. Ale pokud necháme algoritmem projít již seřazenou posloupnost, je tato metoda jedna z nejrychlejších! Tohoto můžeme využít, pokud chceme např. zjistit, zda je pole již seřazené. Bubble-Sort Analýza algoritmu Bubble-Sort Algoritmus bublinové řazení nemá nejhorší a nejlepší případ. Počet porovnání a přesunů nezávisí na počátečních hodnotách prvků. 13

16 procedure BubbleSort(var pole:tpole; N:word); var i,j, pom: integer; for j:=1 to N-1 do {probublavani provadime pro n-1 prvku} for i:=1 to N-1 do {postupne pro vsechny prvky pred poslednim} if pole[i]>pole[i+1] then {pokud je prvek mensi nez nasledujici} {prehod prvky => probublavani vetsiho prvku polem} pom:=pole[i+1]; {prvky snadno prohodime pomoci pomocne promenne pom} pole[i+1]:=pole[i]; pole[i]:=pom end Princip algoritmu Bubble-Sort Cyklicky se prochází pole a porovnávají se sousední prvky. Je-li prvek vpravo menší než vlevo, pak se vzájemně prohodí. Řazení končí průchodem, ve kterém se nic neprohodilo. První průchod: for j:=1 to N-1 do for i:=1 to N-1 do if pole[1]>pole[2] then {dále nic nedělám podmínka není splněna} pom:=pole[i+1]; pole[i+1]:=pole[i]; pole[i]:=pom; Řešený příklad 1: for j:=1 to N-1 do for i:=1 to N-1 do if pole[3]>pole[4] then {podmínka splněna} {dochází k přehození prvků} pom:=pole[4]; {do pom se uloží hodnota 6} pole[4]:=pole[3]; {do pole[4] se uloží hodnota 8 z pole[3]} pole[3]:=pom; {do pole[3] se uloží pom což je 6} 14

17 for j:=1 to N-1 do for i:=1 to N-1 do if pole[4]>pole[5] then {podmínka splněna} {dochází k přehození prvků} pom:=pole[5]; {do pom se uloží hodnota 5} pole[5]:=pole[4]; {do pole[5] se uloží hodnota 8 z pole[4]} pole[4]:=pom; {do pole[4] se uloží pom což je 5} for j:=1 to N-1 do for i:=1 to N-1 do if pole[5]>pole[6] then {podmínka splněna} {dochází k přehození prvků} pom:=pole[6]; {do pom se uloží hodnota 7} pole[6]:=pole[5]; {do pole[6] se uloží hodnota 8 z pole[5]} pole[5]:=pom; {do pole[5] se uloží pom což je 7} for j:=1 to N-1 do for i:=1 to N-1 do if pole[6]>pole[7] then {dále nic nedělám podmínka není splněna} pom:=pole[i+1]; pole[i+1]:=pole[i]; 15

18 pole[i]:=pom; for j:=1 to N-1 do for i:=1 to N-1 do if pole[7]>pole[8] then {podmínka splněna} {dochází k přehození prvků} pom:=pole[8]; {do pom se uloží hodnota 1} pole[8]:=pole[7]; {do pole[8] se uloží hodnota 9 z pole[7]} pole[7]:=pom; {do pole[7] se uloží pom což je 1} for j:=1 to N-1 do for i:=1 to N-1 do if pole[8]>pole[9] then {podmínka splněna} {dochází k přehození prvků} pom:=pole[9]; {do pom se uloží hodnota 3} pole[9]:=pole[8]; {do pole[9] se uloží hodnota 9 z pole[8]} pole[8]:=pom; {do pole[8] se uloží pom což je 3} Druhý průchod: - začíná se procházet od začátku pole stejným způsobem jako v prvním - průchodu Atd. 16

19 Varianty Bubble-Sort Ripple-Sort - pamatuje si, kde došlo v minulém průchodu k první výměně a začíná až z tohoto místa Shaker-Sort - prochází oběma směry a "vysouvá" nejmenší na začátek a největší na konec Shuttle-Sort - dojde-li k výměně, algoritmus se vrací s prvkem zpět, pokud dochází k výměnám. Pak se vrátí do místa, odkud se vracel a pokračuje Upravený algoritmus Bubble-Sort a) Zjišťujeme, zda při průchodu pole došlo alespoň k jedné záměně prvků. Algoritmus končí, když projdeme n-prvkové pole n-1 krát nebo když při průchodu nedošlo k záměně. Takto upravený algoritmus dokáže rozpoznat seřazené pole. procedure BubbleSort(var pole:tpole; N:word); var i,j, pom: integer; konec: boolean; for j:=1 to N-1 do {probublavani provadime pro n-1 prvku} konec:=true; {pred zacatkem vnitrniho cyklu nastavime konec na true} for i:=1 to N-1 do {postupne pro vsechny prvky pred poslednim} if pole[i]>pole[i+1] then {pokud je prvek mensi nez nasledujici} {prehod prvky => probublavani vetsiho prvku polem} pom:=pole[i+1]; pole[i+1]:=pole[i]; pole[i]:=pom; konec:=false {s prvkem se provedla vymena} if konec then Break {pokud nebyl ani jeden prvek v cyklu vymenen, tj. vsechny prvky byly uz na svem miste, ukoncime trideni (bylo by zbytecne setridene prvky dale prochazet} end b) Při průchodu polem si pamatujeme místo, kdy došlo k poslední záměně prvků. Dále doprava je již pole seřazeno. Při dalším průchodu porovnáváme pouze prvky před poslední záměnou. 17

20 Takto upravený algoritmus dokáže rozpoznat seřazené pole. Procedure BubbleSort(var a:pole;n:integer); var i,j,r,pom:integer; j:=0; r:=n-1; repeat j:=1; for i:=1 to r do if a[i]>a[i+1] then pom:=a[i]; a[i]:=a[i+1]; a[i+1]:=pom; j:=i; r:=j-1; until r=0; 2.2. Select-Sort Select-Sort Tato metoda pracuje tak, že vyhledá nejmenší prvek v nesetříděné části a zařadí ho na konec již setříděné části. Tzn. že musíme projít celé pole, najít nejmenší prvek a zařadit ho na první místo. Poté znova musí projít pole od druhého prvku pole (protože první prvek má již svou konečnou pozici) a vyhledá opět nejmenší prvek. Ten zařadí na druhou pozici. Tato činnost se opakuje tak dlouho, dokud neprojde celou posloupnost a nesetřídí ji. Tato metoda také pracuje tak, že vyhledává největší prvek v nesetříděné části a zařadí ho na konec nesetříděné části. Tzn. že musíme projít celé pole, najít největší prvek a zařadit ho na poslední místo. Poté znova musí projít pole od předposledního prvku pole (protože poslední prvek má již svou konečnou pozici) a vyhledá opět největší prvek. Ten zařadí na předposlední pozici. Tato činnost se opakuje tak dlouho, dokud neprojde celou posloupnost a nesetřídí ji. Procedura hledání maxima procedure SelectSort(var a:pole;n:integer); var i,j,k,max:integer; for i:=n downto 2 do max:=a[i]; 18

21 k:=i; for j:=1 to i do if a[j] > max then max:=a[j]; k:=j; a[k]:=a[i]; a[i]:=max; Procedura hledání minima procedure SelectSort(var a:pole;n:integer); var i,j,k,min : integer; { poslední minimum } for i:=1 to n-1 do k:=i; min :=a[k]; for j:=i+1 to n do { hledání minima } if a[j] < min then min:=a[j]; k:=j; a[i]:=a[k]; { výměna prvků } Řešený příklad 2: Princip algoritmu Select Sort - hledání maxima 1. for i:=n downto 2 do {zleva do prava i je 10} max:=a[i]; {do max ulozim poslední hodnotu 10} k:=i; {do k ulozim i coz je 10} for j:=1 to 10 do {od zacatku pole do konce} if a[j] > max then {jestlize hodnota je vetsi nez max podmínka není splněna} max:=a[j]; k:=j; a[k]:=a[i]; {a[10]:=a[10]} a[i]:=max; {max je stale 10} 19

22 for i:=n downto 2 do {zmensuji i na 9} max:=a[i]; {do max ulozim predposlední hodnotu 8} k:=i; {do k ulozim i coz je 9} for j:=1 to 9 do {prohledavam od zacatku} if a[j] > max then {jestlize hodnota je vetsi nez max podmínka splněna} max:=a[j]; {do max ulozim a[8]=9} k:=j; {k=8} a[k]:=a[i]; {přehodím prvky a[8]:=a[9]} a[i]:=max; {max je 9} for i:=n downto 2 do {zmensuji i na 8} max:=a[i]; {do max ulozim predposlední hodnotu 8} k:=i; {do k ulozim i coz je 8} for j:=1 to 8 do {prohledavam od zacatku} if a[j] > max then {jestlize hodnota je vetsi nez max neni splněna} max:=a[j]; k:=j; a[k]:=a[i]; {nechávám stejne} a[i]:=max; {max je 8} 20

23 for i:=n downto 2 do {zmensuji i na 7} max:=a[i]; {do max ulozim hodnotu 4} k:=i; {do k ulozim i coz je 7} for j:=1 to 7 do {prohledavam od zacatku, postupne procházím} if a[j] > max then {jestlize hodnota je vetsi nez max neni splněna} max:=a[j]; k:=j; a[k]:=a[i]; {prehozeni prvku} a[i]:=max; {pri poslednim pruchodu je max 7} Zde jsme našli další maximum což je 7 a pokračujeme cyklem od začátku! 5. for i:=n downto 2 do {zmensuji i na 6} max:=a[i]; {do max ulozim hodnotu 1} k:=i; {do k ulozim i coz je 6} for j:=1 to 6 do {prohledavam od zacatku, postupne procházím} if a[j] > max then {jestlize hodnota je vetsi nez max neni splněna} max:=a[j]; 21

24 k:=j; a[k]:=a[i]; {prehozeni prvku} a[i]:=max; {pri poslednim pruchodu je max 6} for i:=n downto 2 do {zmensuji i na 5} max:=a[i]; {do max ulozim hodnotu 2} k:=i; {do k ulozim i coz je 5} for j:=1 to 5 do {prohledavam od zacatku, postupne procházím} if a[j] > max then {jestlize hodnota je vetsi nez max neni splněna} max:=a[j]; k:=j; a[k]:=a[i]; {prehozeni prvku} a[i]:=max; {pri poslednim pruchodu je max 5}

25 Tím jsme získali seřazenou posloupnost! 2.3. Insert-Sort Algoritmus Insert Sort pracuje tak, že vyhledává index, kam se má prvek zařadit a zároveň zbývající prvky posune o jednu pozici směrem ke konci pole. procedure Insert_Sort(var a:pole; n:integer); var i,j:integer; pom:integer; for i:=2 to n do pom:=a[i]; j:=i-1; a[0]:=pom; while (pom<a[j]) do a[j+1]:=a[j]; místa j:=j-1; a[j+1]:=pom; Princip algoritmu Insert Sort... nastavení zarážky... nalezení a uvolnění... vložení prvku Insert-Sort Pole je rozděleno na seřazenou a neseřazenou část. V seřazené části se nalezne pozice, na kterou přijde vložit první prvek z neseřazené části a od této pozice až do konce seřazené části se prvky odsunou. Na začátku má seřazená část délku jedna. Řešený příklad 3: 1. for i:=2 to n do pom:=a[i]; {do pom se přiřadí hodnota a[2] čili 3} j:=i-1; {j se přiřadí 1} a[0]:=pom;... nastavení zarážky {a[0]se uloží číslo 3} while (pom<a[j]) do 23

26 a[j+1]:=a[j];... nalezení a uvolnění místa {do a[2] se uloží hodnota a[1] čili 5} j:=j-1; {snížení indexu j čili 0} a[j+1]:=pom;... vložení prvku do a[1] for i:=3 to n do pom:=a[i]; {do pom se přiřadí hodnota a[3] čili 6} j:=i-1; {j se přiřadí 2} a[0]:=pom;... nastavení zarážky while (pom<a[j]) do {podmínka neplatí} a[j+1]:=a[j]; j:=j-1; a[j+1]:=pom;... vložení prvku do a[3] for i:=4 to n do pom:=a[i]; {do pom se přiřadí hodnota a[4] čili 7} j:=i-1; {j se přiřadí 3} 24

27 a[0]:=pom; while (pom<a[j]) do a[j+1]:=a[j]; j:=j-1; a[j+1]:=pom;... nastavení zarážky {podmínka neplatí}... vložení prvku do a[4] for i:=5 to n do pom:=a[i]; {do pom se přiřadí hodnota a[5] čili 2} j:=i-1; {j se přiřadí 4} a[0]:=pom;... nastavení zarážky while (pom<a[j]) do a[j+1]:=a[j];... nalezení a uvolnění místa {do a[5] se uloží hodnota a[4] čili 7} j:=j-1; {snížení indexu j čili 3} a[j+1]:=pom;... vložení prvku do a[4] Dochází k postupnému posunutí prvků v pořadí jak jdou za sebou! while (pom<a[j]) do a[j+1]:=a[j]; j:=j-1;

28 for i:=6 to n do pom:=a[i]; {do pom se přiřadí hodnota a[6] čili 1} j:=i-1; {j se přiřadí 5} a[0]:=pom;... nastavení zarážky while (pom<a[j]) do a[j+1]:=a[j];... nalezení a uvolnění místa {do a[6] se uloží hodnota a[5] čili 7} j:=j-1; {snížení indexu j čili 4} a[j+1]:=pom;... vložení prvku do a[5] Dochází k postupnému posunutí prvků v pořadí jak jdou za sebou! while (pom<a[j]) do a[j+1]:=a[j]; j:=j-1; for i:=7 to n do pom:=a[i]; {do pom se přiřadí hodnota a[7] čili 4} j:=i-1; {j se přiřadí 6} a[0]:=pom;... nastavení zarážky while (pom<a[j]) do 26

29 a[j+1]:=a[j];... nalezení a uvolnění místa {do a[7] se uloží hodnota a[6] čili 7} j:=j-1; {snížení indexu j čili 5} a[j+1]:=pom;... vložení prvku do a[6] Dochází k postupnému posunutí prvků v pořadí jak jdou za sebou! while (pom<a[j]) do a[j+1]:=a[j]; j:=j-1; Vznikla již setříděná posloupnost Heap-Sort Jedná se o nejuniverzálnější třídící algoritmus. Je to nejrychlejší nerekurzivní algoritmus z dosud vyčtených. Pracuje na principu kontroly platnosti binárního stromu. Binární strom, je struktura prvků, kde každý uzel může mít maximálně dva potomky. Vezmeme-li náš nesetříděný seznam prvků jako binární strom, můžeme prvek na první pozici pokládat jako jeho kořen, prvek na druhé pozici bude levým potomkem kořene, prvek na třetí pozici bude pravým potomkem kořene, prvek na čtvrté pozici bude levým potomkem levého potomka kořene, prvek na páté pozici bude pravým potomkem levého potomka kořene atd. Obecně platí, že pro prvek na i-té pozici najdeme levého Princip haldy 27

30 potomka na pozici 2*i a pravého potomka na pozici 2*i +1. Podmínka platnosti binárního stromu zní: potomek musí být vždy nižší než rodičovský prvek. Při kontrole podmínky vlastně zjišťujeme, zda je větší potomek levý nebo pravý, a ten pak zaměníme s rodičovským. Pro první prvek najdeme oba potomky, a zjistíme platnost podmínky. To opakujeme pro druhý, třetí atd. Strom bude mít platnou podmínku (tedy že seznam bude seřízený) tehdy, jestliže zkontrolujeme podmínky pro první polovinu seznamu. Vezmeme-li totiž prostřední prvek seznamu, víme, že jsme vybrali zároveň poslední prvek stromu, který má ještě alespoň jednoho potomka. Dále už jsou pouze koncové prvky stromu (ty bez potomků) jímž se říká listy, a pro něž nemusí již žádná podmínka platit. Postup přidání nové hodnoty do haldy (vytvoření haldy): Vytvoříme jeden nový uzel, ten připojíme do poslední hladiny co nejvíce vlevo, aby byl zachován tvar haldy. Do nového uzlu vložíme hodnotu a zajistíme správné uspořádání hodnot v haldě. Zkontrolujeme, zda nová hodnota je větší než hodnota předchůdce. Pokud ano, je halda v pořádku a nic nemusíme dělat. V opačném případě je nutné vyměnit data uložená v těchto dvou uzlech. Stejným způsobem postupujeme v haldě výše. Formování haldy končí v okamžiku, když se nové přidaná hodnota dostane postupnými výměnami buď do uzlu, jehož předchůdce již obsahuje hodnotu menší, nebo až do kořene. Postup vypuštění minimální hodnoty z haldy: Minimální hodnotu uloženou v kořeni smažeme (odebereme). Haldu nyní chceme zmenšit o jeden uzel. Musí to být uzel umístěný v poslední hladině co nejvíce vpravo, aby zůstal správný tvar haldy. Hodnotu z tohoto uzlu umístíme do kořene haldy. Tím jsme získali strom o správném počtu uzlů, se správnou množinou uložených údajů a se správným tvarem haldy. Zbývá pouze zajistit správné uspořádání hodnot(regulérnost haldy) vzájemnými výměnami. Začneme od kořene stromu a postupujeme směrem k listům. Hodnotu H v kořeni porovnáme s hodnotami obou jeho následníků. Je-li menší než oba následníci, halda je v pořádku a jsme hotovi. Jinak zaměníme hodnotu H z kořene s menší z hodnot následníků. Tím jsou nerovnosti mezi uzly první a druhé hladiny napraveny a pokračujeme stejným způsobem o hladinu níže od uzlu, do kterého se právě přesunula hodnota H. Postupné výměny hodnot uzlů končí ve chvíli, kdy se hodnota H dostane do místa, kde je menší než hodnoty následníků, nebo až do listu. Postupným rozebíráním haldy dostaneme seřazenou posloupnost hodnot. Realizace v programu: V programech ukládáme haldu do pole, což není pro binární stromy obvyklé, ale v případě třídění je to efektivní co do rychlosti i paměťových nároků. 28

31 Uzly haldy si očíslujeme po hladinách zleva doprava čísly od 1 do N. Kořen má číslo 1, jeho následníci 2 a 3, atd. Tato čísla slouží jako indexy pro uložení uzlů v poli. Zvolené očíslování má jednu velmi důležitou vlastnost: následníci uzlu s číslem i mají čísla 2*i a 2*i+1 Řešený příklad 4: Např Reprezentace stromu v paměti: První prvek pole obsahuje hodnotu z kořene stromu. Následníci uzlu, který leží na i_té pozici, se v poli nacházejí na pozici 2*i (levý) a 2*i + 1 (pravý) Quick-Sort Je asi nejrychlejším algoritmem ze všech, ale má obrovskou nevýhodu je rekurzivní. Rekurzivní algoritmy jsou takové, které při svém průběhu volají samy sebe. Problematika rekurze je náplní mnohých knih a je nad rámec tohoto článku ji přiblížit. Zjednodušeně se dá říct, že najdeme v seznamu medián (prvek na prostřední pozici) a všechny menší prvky zařadíme vlevo a větší prvky vpravo. Pro každý tento rozpůlený interval se znovu zavolá quicksort, až do okamžiku, kdy bude medián jediným členem v intervalu. Nevýhoda je zřejmá pro velká pole se může stát, že se algoritmus tak 29

32 vnoří do sebe, že přeteče systémový zásobník, do kterého se zaznamenává počet volání, a třídění se zhroutí. Analýza algoritmu Quick Sort Základní myšlenka: Zvolíme číslo X a prvky pole přerovnáme v poli tak, aby v levé části pole byly pouze prvky menší nebo rovné X a v pravé části prvky větší nebo rovné X. Po tomto rozdělení platí, že prvky ležící v levé části pole tam zůstanou i po úplném setřídění celého pole. Totéž platí i pravou část pole. Pak stačí samostatně setřídit levý a pravý úsek pole, jedná se dvě dílčí menší úlohy naprosto stejného typu, jako byla úloha původní - řešíme naprosto stejným způsobem. Pole postupně dělíme tak dlouho, dokud nezískáme úseky délky 1 (ty jsou samy o sobě již seřazené a nemusíme s nimi nic dělat). Quick-Sort a rekurze Volba hodnoty X: Na vhodné volbě X závisí rychlost algoritmu. Pokud bychom za X zvolili pokaždé nejmenší (největší) prvek zpracovávaného úseku, rozdělí se pole v prvním kroku na úseky délky 1 a N-1, ve druhém kroku by se větší z nich opět dělil na úseky délek 1 a N-2 atd. Časová složitost by v tomto případě byla O(N 2 ). Nejlepší by bylo zvolit za číslo X pokaždé tzv. medián právě zpracovávaného úseku. Medián je číslo s prostřední hodnotou ze všech čísel úseku, např. medián z dvaceti čísel je desáté největší číslo z nich. Přesné vyhledávání mediánu je dosti pracné a v quicksortu se nepoužívá. Nejjednodušší je vzít za X vždy první prvek úseku, nebo za X zvolit prostřední prvek zpracovávaného úseku nebo X vypočítat jako aritmetický průměr několika málo čísel (např. prvního, posledního a prostředního), aby se snížila pravděpodobnost té nejméně příznivé volby. Časová složitost při těchto volbách je O(N*logN). V quick sortu je X stanoveno jako prostřední prvek úseku: (L + R) div 2. Přesuny prvků v poli do dvou úseků v závislosti na X: K přerovnání pole potřebujeme dva pomocné indexy ukazující do právě pracovávaného úseku pole. Index I začíná na levém okraji úseku a zvětšuje se tak dlouho, dokud v pli nenajdeme první prvek větší než X (ten nepatří do levé části a má se přesunout někam vpravo. Index J postupuje od pravého okraje úseku smětem doleva tak dlouho, až narazí na prvek menší než X (ten se má přesunout do levé části). Oba nalezené prvky spolu vyměníme. Pak pokračujeme stejným způsobem v pohybu indexů I a J směrem ke středu a s výměnami prvků tak dlouho, dokud se oba indexy nesetkají. V tom okamžiku je celý úsek rozdělen na levou část s menšími prvky a pravou část s většími prvky. procedure QuickSort(var pole:tpole; Zac,Kon:integer); {procedura setridi v poli usek od indexu Zac do indexu Kon} 30

33 var P: integer; {hodnota pro rozdeleni pole na useky - pivot} pom: integer; {pomocna promenna pro vymenu prvku} i,j: integer; {pracovni indexy pro vymezeni casti pole} i:=zac; {na zacatku zabiraji mezni indexy cele pole} j:=kon; P:=pole[(Zac+Kon) div 2]; {urcime si pivotni prvek - vezmeme prostredni prvek pole}{idealni pivot by byl median - prostredni z hodnot v poli} repeat {nalevo od pivota budeme radit mensi prvky, napravo vetsi prvky nez pivot} while pole[i]<p do inc(i); {posouv me levě index, dokud neni na prvku vetsim nez pivot} while pole[j]>p do dec(j); {posouvame pravy index, dokud neni na prvku mensim nez pivot} if i<j then {pokud se indexy neprekrizily a nejsou shodne} pom:=pole[i]; {vymenime nalezene prvky} pole[i]:=pole[j]; pole[j]:=pom; inc(i); dec(j); {a posuneme indexy na dalsi prvky} end else if i=j then {pokud se indexy sesly (ukazuji na pivota)} inc(i); {posunume je jeste dale, aby vymezovaly roztridene poloviny pole} dec(j); {a doslo k prekrizeni, coz vede k ukonceni cyklu} end until i>j; {opakujeme, dokud nejsou obeti casti pole roztrideny podle pivota} {Pole [Zac,Kon] je rozdeleno na 2 useky [Zac,j] a [i,kon], ktere zpracujeme rekurzivne (opet touto procedurou)} if Zac<j then QuickSort(pole,Zac,j); {ma smysl tridit nejmene dva prvky} if i<kon then QuickSort(pole,i,Kon); Princip algoritmu Základem je rozdělení pole do dvou částí a přeskládání prvků tak, aby všechny prvky v levé byly menší než v pravé. Tento algoritmus se potom aplikuje rekurzivně na levou a pravou polovinu pole. 31

34 Řešený příklad 5: Základní problém - nalezení dělící hodnoty: Hodnotu není možné určit algoritmicky - hledání by znehodnotilo celou metodu. Proto se "uhodne" jako hodnota prvku ležícího uprostřed řazené části. V nejhorším případě se pole rozdělí na jeden prvek a zbytek Výhody a nevýhody Je zřejmé, že algoritmy probrané v prvních třech podkapitolách (Bubble- Sort, Select-Sort, Insert-Sort) patří k méně efektivním a pro profesionální využití nevhodným algoritmům. Jejich časová složitost principiálně kvadratická o(n 2 ). To znamená, že v průměrném případě stoupá čas potřebný k seřazení pole kvadraticky vzhledem k počtu prvků. Jde tedy sice o postupy poměrně efektivní (v informatice je mnoho problémů, které neumíme řešit v polynomiálním čase, např. optimalizační problémy), ale přesto není tato kvadratická složitost tím nejlepším možným. Přesto existují i případy, kdy tyto postupy mohou být relativně zajímavé pro využití v praxi. Shrňme je nyní pro každý algoritmus zvlášť. Bubble-Sort: 32

35 - velmi dobrá efektivita pro téměř seřazené vstupní posloupnosti - díky přesunům mezi sousedními prvky je velmi vhodný pro použití u dynamických datových struktur jako jsou spojové seznamy - jednoduchá implementace a možnost přidat dodatečné modifikace pro speciální typy vstupních polí Insert-Sort: - vhodný pro dynamické datové struktury (vkládání mezi prvky), odpadá časově náročné přesouvání celého zbytku pole u statických struktur je to náročná operace Select-Sort: - dává nejstabilnější časové výsledky provádí se vždy (u libovolného pole stejné velikosti) přesně stejný postup Samozřejmě pro profesionální využití jsou použitelné dvě poslední metody (Quick-Sort a Heap-Sort). Více používanou metodou je Quick-Sort, který v průměrném případě má o něco lepší složitost. Přesto je složitost obou o((log n)*n) tedy logaritmicko-lineární. Pokud si dokážete představit graf takovéto funkce, je jasné, že složitost této metody je výrazně lepší než u třech metod triviálních. I v řádech tisíců řazených prvků bude metoda hotova velmi rychle narozdíl od kvadraticky rostoucí funkce. Problém QuickSortu je možná jeho rekurzivní založení a pak také, že pronejhorší případ může degradovat až na kvadratickou složitost. Tuto nevýhodu nemá právě Heap-Sort, který pro všechny případy logaritmicko-lineární, avšak v průměrném případě má o něco horší koeficienty dané funkce. Nejdůležitější probrané pojmy: - triviální algoritmy třídění Bubble-Sort, Insert-Sort, Select-Sort - efektivní algoritmy třídění Quick-Sort, Heap-Sort Úkoly a otázky k textu: 1. Vyčíslete přesný počet operací, které vám nad vámi zvoleným polem prvků provedou postupně všechny uvedené algoritmy řazení. 33

36 3. Implementace řadících algoritmů v Javě Cíl: Seznámíte se: se způsobem práce se soubory v jazyce JAVA možnostmi rozdělení úlohy do více knihoven způsobem implementace jednoduchého textového menu způsobem odečítání času a dalších speciálních technik generování náhodných dat V předchozí kapitole jsme se seznámili s tím nejdůležitějším algoritmickým vybavením, které pro zpracování první úlohy budete potřebovat. Algoritmy jsme ukázali na příkladech a kódech (původně Pascal ovšem ten je velmi podobný pseudokódu), ovšem pouze na konceptuální úrovni. Nyní je potřeba vás připravit na implementační problémy. A jak již bylo řečeno v úvodu, nyní je preferovaným jazykem implementace JAVA. Chci zdůraznit, že toto v žádném případě není kurz programování v Javě. To by vyžadovalo solidně vás nejprve uvést do problematiky objektově-orientovaného programování, což není účelem kurzu a ani by to dost dobře nešlo skloubit s výukou základní algoritmizace. Java je samozřejmě objektový jazyk, i když v rámci metod programujete spíše procedurálně a právě tento moment se pokusíme využít. Je to poněkud těžkopádné, protože vás tím vlastně ochuzuji o podstatu jazyka JAVA, ale je to nezbytné, abych jste mohli zpracovat daný úkol. Vychází to z obecného konceptu výuky na Ostravské Univerzitě a i přestože by pro vás asi byla vhodnější implementace v neobjektovém jazyce, musíme se držet této stanovené linie. Předpokládám, že po absolvování kurzu Algoritmy a datové struktury již 3.1. Práce se soubory Nezbytnou součástí snad každé profesionální aplikace je vstupně-výstupní práce se soubory. Účelem informačních systémů je nějakým způsobem zpracovávat data a ty jsou většinou uloženy v externích souborech a rovněž se do souborů ukládají. Je tedy potřeba, co nejvhodnějším způsobem načíst data (např. čísla) do datových struktur v operační paměti. V jazyce Pascal jsme neměli příliš na výběr, jakou datovou strukturu použít. V objektové hierarchii jazyka JAVA existuje však mnoho objektů, pomocí kterých lze načíst daná data do datových struktur. Následující ukázka se jeví pro naše účely jako poměrně nejpohodlnější. Java má mnoho možností jak načítat u ukládat data do souborů. V zásadě můžete využívat buď zcela základních objektů typů Stream, které ovšem nebudou schopny přímo načítat různé typy dat (čísla, řetězce atd..), ale jsou určeny spíše pro primitivní práci s byty, maximálně 34

37 nekonvertovanými řetězci. Je možno tedy doporučit cestu nejmenšího odporu a použití objektu typu Scanner. Ten umožňuje otevřít textový soubor, definovat si dokonce regulární výrazy jako oddělovače a jednotlivá celá čísla ze vstupního souboru načítat pohodlně například metodou nextint (následující číslo). Rovněž lze velice elegantně testovat, zda jste již na konci souboru prostým zavoláním metody hasnextint, která sama otestuje, zda je v souboru ještě nějaké číslo. Lze si prohlédnout v dokumentaci JDK celou třídu typu Scanner, uvidíte, že je tam obrovské množství velice komfortních funkcí pro programátory, které by jinak zabraly velké úsilí. Navíc ve Streamech není k dispozici test konce souboru, tak jak ho známe třeba z Pascalu a tudíž je nutné provést otestování vzniku výjimky na konec souboru, což u Scanneru není. Proto silně doporučuji Scanner pro práci se soubory (textovými). Třída Scanner Následující zdrojový kód vám načte připravený soubor test.txt (musíte si ho vytvořit) do pole, ve kterém jsou mezerami oddělená celá čísla. Zároveň vám uchová počet prvků ve stejnojmenné proměnné. Pole je deklarováno jako statické s pevným počtem prvků (10tis.). Řešený příklad 6: import java.io.*; import java.util.*; public class souborvstup { public static void main (String[] args) { int pole[] = new int[10000]; int pocetprvku = 0; sc.nextint(); try { Scanner sc = new Scanner(new File("test.txt")); while (sc.hasnextint()) pole[pocetprvku++] = sc.close(); } catch (IOException e) { System.out.println("Chyba pri cteni souboru!"); } for (int i = 0;i<pocetPrvku;i++){ System.out.print("pole["); System.out.print(i); System.out.print("]="); System.out.print(pole[i]); System.out.println(""); } } } Výstupy do textového souboru s pole lze nejjednodušeji provést pomocí připraveného komfortního objektu Typu PrintWriter. Ten lze opět vytvořit přímo jako diskový soubor. V cyklu se pak jednotlivá čísla v poli uloží pomocí metody print. 35

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

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.

Více

1 Úvod do Turbo Pascalu

1 Úvod do Turbo Pascalu 1 Úvod do Turbo Pascalu 1.1 Klávesové zkratky TP - spuštění TP : tp.exe, bp.exe, tpx.exe apod. - nápověda: F1 - volá vysvětlení (help) Ctrl + F1 - help podle polohy kurzoru Alt + F1 - vrací předcházející

Více

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

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

Více

Sada 1 - Základy programování

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íce

Intervalové stromy. Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme. 1. Změna jednoho čísla v posloupnosti.

Intervalové stromy. Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme. 1. Změna jednoho čísla v posloupnosti. Intervalové stromy Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme průběžně provádět tyto dvě operace: 1. Změna jednoho čísla v posloupnosti. 2. Zjištění součtu čísel

Více

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

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í

Více

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

Více

Algoritmizace prostorových úloh

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á

Více

Dynamické datové struktury III.

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é

Více

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

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č

Více

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

Více

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í. 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),

Více

Maturitní téma: Programovací jazyk JAVA

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

Více

IB111 Úvod do programování skrze Python

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ě

Více

5 Rekurze a zásobník. Rekurzivní volání metody

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í

Více

Algoritmizace řazení Bubble Sort

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,

Více

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

Třídící algoritmy. Insert Sort. Bubble Sort. Select Sort. Shell Sort. Quick Sort. Merge Sort. Heap Sort. Třídící algoritmy. Insert Sort. Bubble Sort. Select Sort. Shell Sort. Quick Sort. Merge Sort. Heap Sort. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká

Více

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

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:

Více

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu Ukazatel a dynamické datové struktury v prostředí DELPHI Důležitým termínem a konstrukčním programovým prvkem je typ UKAZATEL. Je to vlastně

Více

Algoritmizace I. Ak. rok 2015/2016 vbp 1. ze 132

Algoritmizace I. Ak. rok 2015/2016 vbp 1. ze 132 Ak. rok 2015/2016 vbp 1. ze 132 Ing. Vladimír Beneš, Ph.D. vedoucí katedry Petrovický K101 katedra informatiky a kvantitativních metod E-mail: vbenes@bivs.cz Telefon: 251 114 534, 731 425 276 Konzultační

Více

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

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á

Více

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

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

Více

Stromy. Jan Hnilica Počítačové modelování 14

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

Více

Časová složitost algoritmů

Č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ž

Více

NPRG030 Programování I 3/2 Z --- NPRG031 Programování II --- 2/2 Z, Zk

NPRG030 Programování I 3/2 Z --- NPRG031 Programování II --- 2/2 Z, Zk NPRG030 Programování I 3/2 Z --- NPRG031 Programování II --- 2/2 Z, Zk Pavel Töpfer Katedra softwaru a výuky informatiky MFF UK MFF Malostranské nám., 4. patro, pracovna 404 pavel.topfer@mff.cuni.cz http://ksvi.mff.cuni.cz/~topfer

Více

IB111 Úvod do programování skrze Python

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ý

Více

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) {

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];

Více

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

Více

GRAFY A GRAFOVÉ ALGORITMY

GRAFY A GRAFOVÉ ALGORITMY KATEDRA INFORMATIKY PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITA PALACKÉHO GRAFY A GRAFOVÉ ALGORITMY ARNOŠT VEČERKA VÝVOJ TOHOTO UČEBNÍHO TEXTU JE SPOLUFINANCOVÁN EVROPSKÝM SOCIÁLNÍM FONDEM A STÁTNÍM ROZPOČTEM ČESKÉ

Více

Prioritní fronta, halda

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

Více

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

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)

Více

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

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á

Více

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

Anotace. Dynamické programování, diskrétní simulace. Anotace Dynamické programování, diskrétní simulace. Problémy, které byly Přednášející jde tentokrát do M1, počet platných uzávorkování pomocí n párů závorek, počet rozkladů přirozeného čísla na součet

Více

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

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

Více

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

Na začátku rozdělíme práci a určíme, které podproblémy je potřeba vyřešit. Tyto Kapitola 1 Rozděl a panuj Rozděl a panuj je programovací metoda. Často se označuje latinsky Divide et Empera nebo anglicky Divide and Conquer. Vychází z toho, že umíme zadaný problém rozložit na menší

Více

Bubble sort. příklad. Shaker sort

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[]

Více

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

Více

Stromy, haldy, prioritní fronty

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

Více

Předmět: Algoritmizace praktické aplikace

Předmět: Algoritmizace praktické aplikace Předmět: Algoritmizace praktické aplikace Vytvořil: Roman Vostrý Zadání: Vytvoření funkcí na stromech (reprezentace stromu haldou). Zadané funkce: 1. Počet vrcholů 2. Počet listů 3. Součet 4. Hloubka 5.

Více

Střední škola informačních technologií a sociální péče, Brno, Purkyňova 97. Vybrané části Excelu. Ing. Petr Adamec

Střední škola informačních technologií a sociální péče, Brno, Purkyňova 97. Vybrané části Excelu. Ing. Petr Adamec INVESTICE DO ROZVOJE VZDĚLÁVÁNÍ Střední škola informačních technologií a sociální péče, Brno, Purkyňova 97 Vybrané části Excelu Ing. Petr Adamec Brno 2010 Cílem předmětu je seznámení se s programem Excel

Více

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7 Pascal Katedra aplikované kybernetiky Ing. Miroslav Vavroušek Verze 7 Proměnné Proměnná uchovává nějakou informaci potřebnou pro práci programu. Má ve svém oboru platnosti unikátní jméno. (Připadne, musí

Více

Digitální učební materiál

Digitální učební materiál Digitální učební materiál Číslo projektu: CZ.1.07/1.5.00/34.0548 Název školy: Gymnázium, Trutnov, Jiráskovo náměstí 325 Název materiálu: VY_32_INOVACE_149_IVT Autor: Ing. Pavel Bezděk Tematický okruh:

Více

PROGRAMOVÁNÍ. Cílem předmětu Programování je seznámit posluchače se způsoby, jak algoritmizovat základní programátorské techniky.

PROGRAMOVÁNÍ. Cílem předmětu Programování je seznámit posluchače se způsoby, jak algoritmizovat základní programátorské techniky. Cílem předmětu Programování je seznámit posluchače se způsoby, jak algoritmizovat základní programátorské techniky. V průběhu budou vysvětlena následující témata: 1. Dynamicky alokovaná paměť 2. Jednoduché

Více

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

Více

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

Více

Algoritmy I. Třídění ALGI 2010/2011

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

Více

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

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ší

Více

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

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ší

Více

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

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz (2 + 5) * (13-4) * + - 2 5 13 4 - listy stromu obsahují operandy (čísla) - vnitřní uzly obsahují operátory (znaménka)

Více

Interpret jazyka IFJ2011

Interpret jazyka IFJ2011 Dokumentace projektu Interpret jazyka IFJ2011 Tým číslo 093, varianta b/3/i: 20 % bodů: Cupák Michal (xcupak04) vedoucí týmu 20 % bodů: Číž Miloslav (xcizmi00) 20 % bodů: Černá Tereza (xcerna01) 20 % bodů:

Více

Digitální učební materiál

Digitální učební materiál Digitální učební materiál Číslo projektu: CZ.1.07/1.5.00/34.0548 Název školy: Gymnázium, Trutnov, Jiráskovo náměstí 325 Název materiálu: VY_32_INOVACE_147_IVT Autor: Ing. Pavel Bezděk Tematický okruh:

Více

10. Editor databází dotazy a relace

10. Editor databází dotazy a relace 10. Editor databází dotazy a relace Dotazy Dotazy tvoří velkou samostatnou kapitolu Accessu, která je svým významem téměř stejně důležitá jako oblast návrhu a úpravy tabulek. Svým rozsahem je to ale oblast

Více

Časová složitost algoritmů, řazení a vyhledávání

Časová složitost algoritmů, řazení a vyhledávání Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Časová složitost algoritmů, řazení a vyhledávání BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky Miroslav Balík Fakulta

Více

Anotace. pointery (pars prima). Martin Pergel,

Anotace. pointery (pars prima). Martin Pergel, 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

Více

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5 Obsah Obsah 1 Řídicí struktury 1 2 Podmínka 1 2.1 Podmínka typu case......................... 2 3 Příkaz skoku 3 4 Cykly 4 4.1 Cyklus s podmínkou na začátku................... 4 4.2 Cyklus s podmínkou

Více

Umělá inteligence I. Roman Barták, KTIML. roman.bartak@mff.cuni.cz http://ktiml.mff.cuni.cz/~bartak

Umělá inteligence I. Roman Barták, KTIML. roman.bartak@mff.cuni.cz http://ktiml.mff.cuni.cz/~bartak Umělá inteligence I Roman Barták, KTIML roman.bartak@mff.cuni.cz http://ktiml.mff.cuni.cz/~bartak Na úvod Agent s reflexy pouze převádí současný vjem na jednu akci. Agent s cílem umí plánovat několik akcí

Více

Binární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620

Binární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620 Binární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620 1. Vymezení pojmů Strom: Strom je takové uspořádání prvků - vrcholů, ve kterém lze rozeznat předchůdce - rodiče a následovníky - syny.

Více

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

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#)

Více

Principy operačních systémů. Lekce 6: Synchronizace procesů

Principy operačních systémů. Lekce 6: Synchronizace procesů Principy operačních systémů Lekce 6: Synchronizace procesů Kritická sekce Při multitaskingu (multithreadingu) různé procesy často pracují nad společnou datovou strukturou (např. zápis a čtení do/z fronty)

Více

Základy algoritmizace a programování

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;

Více

Lineární spojový seznam (úvod do dynamických datových struktur)

Lineární spojový seznam (úvod do dynamických datových struktur) Lineární spojový seznam (úvod do dynamických datových struktur) Jan Hnilica Počítačové modelování 11 1 Dynamické datové struktury Definice dynamické struktury jsou vytvářeny za běhu programu z dynamicky

Více

VYSOKÁ ŠKOLA EKONOMICKÁ V PRAZE. Optimalizace trasy při revizích elektrospotřebičů

VYSOKÁ ŠKOLA EKONOMICKÁ V PRAZE. Optimalizace trasy při revizích elektrospotřebičů VYSOKÁ ŠKOLA EKONOMICKÁ V PRAZE FAKULTA INFORMATIKY A STATISTIKY Hlavní specializace: Ekonometrie a operační výzkum Název diplomové práce Optimalizace trasy při revizích elektrospotřebičů Diplomant: Vedoucí

Více

IB111 Úvod do programování 1 / 62

IB111 Úvod do programování 1 / 62 Vyhledávání, řazení, složitost IB111 Úvod do programování 2016 1 / 62 Výpočet odmocniny vstup: číslo x výstup: přibližná hodnota x Jak na to? 2 / 62 Výpočet odmocniny vstup: číslo x výstup: přibližná hodnota

Více

Kolekce ArrayList. Deklarace proměnných. Import. Vytvoření prázdné kolekce. napsal Pajclín

Kolekce ArrayList. Deklarace proměnných. Import. Vytvoření prázdné kolekce. napsal Pajclín Kolekce ArrayList napsal Pajclín Tento článek jsem se rozhodl věnovat kolekci ArrayList, protože je to jedna z nejpoužívanějších. Tento článek není kompletním popisem třídy ArrayList, ale budu se snažit

Více

Návod na vkládání videogalerií na stránky klubu SIG-N.A.L. Třebíč

Návod na vkládání videogalerií na stránky klubu SIG-N.A.L. Třebíč Návod na vkládání videogalerií na stránky klubu SIG-N.A.L. Třebíč Část první: Čeho vlastně chceme dosáhnout. Chtěli bychom vytvořit videogalerii, která bude mít příznačný název a v hlavičce se zobrazí

Více

STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach fronta

STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach fronta STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach vlož do fronty kořen opakuj, dokud není fronta prázdná 1. vyber uzel z fronty a zpracuj jej 2. vlož do fronty levého následníka

Více

Zadání k 2. programovacímu testu

Zadání k 2. programovacímu testu Zadání k 2. programovacímu testu Úvod do programovacích jazyků (Java) 4.12.2008 00:08 Michal Krátký Katedra informatiky Technická univerzita Ostrava Historie změn, příklady: 21 Poznámka: Pokud není řečeno

Více

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

1. Implementace funkce počet vrcholů. Předmět: Algoritmizace praktické aplikace (3ALGA) Předmět: Algoritmizace praktické aplikace (3ALGA) Vytvořil: Jan Brzeska Zadání: Vytvoření funkcí na stromech (reprezentace stromu směrníky). Zadané funkce: 1. Počet vrcholů 2. Počet listů 3. Součet 4.

Více

Rekurze - tvorba a zápis algoritmů v jazyce Pascal

Rekurze - tvorba a zápis algoritmů v jazyce Pascal Rekurze - tvorba a zápis algoritmů v jazyce Pascal 1 Autor kurzu Zbyněk Hamerník 2 Vyučovací předmět (volitelný) seminář z IVT 3 Ročník maturitní ročník gymnázia 4 Téma Vysvětlení myšlenky rekurze, užití

Více

Select sort: krok 1: krok 2: krok 3: atd. celkem porovnání. výběr nejmenšího klíče z n prvků vyžaduje 1 porovnání

Select sort: krok 1: krok 2: krok 3: atd. celkem porovnání. výběr nejmenšího klíče z n prvků vyžaduje 1 porovnání Select sort: krok 1: výběr klíče z n prvků vyžaduje 1 porovnání krok 2: výběr klíče z 1 prvků vyžaduje 2 porovnání krok 3: výběr klíče z 2 prvků vyžaduje 3 porovnání atd. celkem porovnání Zlepšení = použít

Více

V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto:

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í

Více

Rekurze a rychlé třídění

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

Více

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

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í

Více

Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39

Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39 Základy algoritmizace Michal Krátký 1, Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Základy algoritmizace, 2006/2007 Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39

Více

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář Vazba (binding) Tabulka symbolů Miroslav Beneš Dušan Kolář vazba = spojení mezi entitou a vlastností okamžik vazby (binding time) při návrhu jazyka při implementaci jazyka během překladu/spojování/zavádění

Více

ALG 09. Radix sort (přihrádkové řazení) Counting sort. Přehled asymptotických rychlostí jednotlivých řazení. Ilustrační experiment řazení

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

Více

Office 2013. podrobný průvodce. Tomáš Šimek

Office 2013. podrobný průvodce. Tomáš Šimek Office 2013 podrobný průvodce Tomáš Šimek Seznámení se společnými postupy při práci s dokumenty Office Popis základních a pokročilejších postupů při práci s Wordem, Excelem, PowerPointem a OneNote Možnosti

Více

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

Ř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

Více

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

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ 1) PROGRAM, ZDROJOVÝ KÓD, PŘEKLAD PROGRAMU 3 2) HISTORIE TVORBY PROGRAMŮ 3 3) SYNTAXE A SÉMANTIKA 3 4) SPECIFIKACE

Více

Časová a prostorová složitost algoritmů

Č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á

Více

Vzdělávání v egoncentru ORP Louny

Vzdělávání v egoncentru ORP Louny Zpracováno v rámci projektu č. CZ.1.04/4.1.00/40.00067 Vzdělávání v egoncentru ORP Louny Město Louny Obsah 1. Databáze... 4 2. Třídění pomocí filtrů... 5 3. Ukotvení a uvolnění příček... 6 3.1 Ukotvení

Více

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

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

Více

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

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky Vyučovací hodina 1vyučovací hodina: Opakování z minulé hodiny Nová látka Procvičení nové látky Shrnutí 5 min 20 min 15 min 5 min 2vyučovací hodiny: Opakování z minulé hodiny Nová látka Procvičení nové

Více

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

Universita Pardubice Fakulta elektrotechniky a informatiky. Mikroprocesorová technika. Semestrální práce Universita Pardubice Fakulta elektrotechniky a informatiky Mikroprocesorová technika Semestrální práce Jméno: Chmelař Pavel Datum: 14. 5. 2008 Úkol: Příklad č. 1 V paměti dat je uložen blok 8 b čísel se

Více

Adresní vyhledávání (přímý přístup, zřetězené a otevřené rozptylování, rozptylovací funkce)

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í

Více

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

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

Více

ˇ 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

ˇ 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

Více

Abstraktní datové typy FRONTA

Abstraktní datové typy FRONTA Abstraktní datové typy FRONTA Fronta je lineární datová struktura tzn., že ke každému prvku s výjimkou posledního náleží jeden následník a ke každému prvku s výjimkou prvního náleží jeden předchůdce. Do

Více

Obří prvky: jak postavit větší kostky

Obří prvky: jak postavit větší kostky Obří prvky: jak postavit větší kostky KAPITOLA 5 V této kapitole: Zvětšení měřítka: jak na to Ostatní měřítka: která fungují a proč Shrnutí: obří kostky jsou jen začátek V kapitole 3 jsme pracovali s měřítkem

Více

Distanční opora předmětu: Programování v jazyce C Tématický blok č. 8: Dynamické datové struktury, ladění programů Autor: RNDr. Jan Lánský, Ph.D.

Distanční opora předmětu: Programování v jazyce C Tématický blok č. 8: Dynamické datové struktury, ladění programů Autor: RNDr. Jan Lánský, Ph.D. Distanční opora předmětu: Programování v jazyce C Tématický blok č. 8: Dynamické datové struktury, ladění programů Autor: RNDr. Jan Lánský, Ph.D. Obsah kapitoly 1 Dynamické datové struktury 1.1 Příklad:

Více

Dynamické datové struktury IV.

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

Více

Po nastudování této kapitoly byste měli být schopni:

Po nastudování této kapitoly byste měli být schopni: 4 Tvorba prezentací Cíl kapitoly Po nastudování této kapitoly byste měli být schopni: vytvořit jednoduchou prezentaci v Microsoft PowerPoint 2010, vkládat nové snímky, měnit návrh, rozvržení a přechody

Více

Struktura programu v době běhu

Struktura programu v době běhu Struktura programu v době běhu Miroslav Beneš Dušan Kolář Struktura programu v době běhu Vztah mezi zdrojovým programem a činností přeloženého programu reprezentace dat správa paměti aktivace podprogramů

Více

2. lekce Algoritmus, cyklus Miroslav Jílek

2. lekce Algoritmus, cyklus Miroslav Jílek 2. lekce Algoritmus, cyklus Miroslav Jílek 1/36 Algoritmus 2/36 Algoritmus je konečná posloupnost operací, která dává řešení skupiny problémů 3/36 Algoritmus je konečná posloupnost operací, která dává

Více

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.

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

Více

NPRG030 Programování I, 2017/18 1 / :22:16

NPRG030 Programování I, 2017/18 1 / :22:16 NPRG030 Programování I, 2017/18 1 / 26 20. 10. 2017 11:22:16 Ordinální typy standardní: integer, char, boolean Vlastnosti ordinálních typů: 1. hodnot je konečný počet a hodnoty jsou uspořádány 2. ke každé

Více

Paměti a jejich organizace

Paměti a jejich organizace Kapitola 5 Paměti a jejich organizace 5.1 Vnitřní a vnější paměti, vlastnosti jednotlivých typů Vnější paměti Jsou umístěny mimo základní jednotku. Lze je zařadit mezi periferní zařízení. Zápis a čtení

Více

Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy

Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy Volné stromy Úvod do programování Souvislý, acyklický, neorientovaný graf nazýváme volným stromem (free tree). Často vynecháváme adjektivum volný, a říkáme jen, že daný graf je strom. Michal Krátký 1,Jiří

Více

TGH07 - Chytré stromové datové struktury

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

Více

VYTVÁŘENÍ A POUŽITÍ VZDĚLÁVACÍCH MODULŮ

VYTVÁŘENÍ A POUŽITÍ VZDĚLÁVACÍCH MODULŮ VYTVÁŘENÍ A POUŽITÍ VZDĚLÁVACÍCH MODULŮ Mgr. Hana Rohrová Ing. Miroslava Mourková Ing. Martina Husáková Fakulta informatiky a managementu Univerzity Hradec Králové Projekt je spolufinancován Evropským

Více