Digitální učební materiál

Podobné dokumenty
Digitální učební materiál

Digitální učební materiál

Digitální učební materiál

Digitální učební materiál

Digitální učební materiál

Digitální učební materiál

Digitální učební materiál

Digitální učební materiál

Digitální učební materiál

Digitální učební materiál

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

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

Digitální učební materiál

Algoritmizace prostorových úloh

Sada 1 - Základy programování

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

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

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

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

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

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

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

Algoritmizace řazení Bubble Sort

Šablony, kontejnery a iterátory

Vyhodnocování dotazů slajdy k přednášce NDBI001. Jaroslav Pokorný MFF UK, Praha

Digitální učební materiál

1 Úvod do Turbo Pascalu

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

Rekurze a rychlé třídění

Anotace. pointery (pars prima). Martin Pergel,

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

Dynamické datové struktury III.

Úvod do programování

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

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

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

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

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

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

Předmět: Algoritmizace praktické aplikace

Základy algoritmizace a programování

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

Bubble sort. příklad. Shaker sort

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

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

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

Standardní algoritmy vyhledávací.

Sada 1 - Základy programování

IB111 Úvod do programování skrze Python

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

Implementace LL(1) překladů

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

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

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

Střední odborná škola a Střední odborné učiliště, Hořovice

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

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Anotace. Pointery, dynamické proměnné

Programovací jazyk Pascal

Digitální učební materiál

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

DTP Základy programování Úvod do předmětu

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

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

Tematická oblast: Programování 2 (VY_32_INOVACE_08_2_PR) Anotace: Využití ve výuce: Použité zdroje:

Časová a prostorová složitost algoritmů

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.

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

Maturitní téma: Programovací jazyk JAVA

Řazení. Uspořádat množinu prvků obsahujících klíč podle definovaného kriteria.

Rekurzivní algoritmy

ALGORITMY A DATOVÉ STRUKTURY

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Časová složitost algoritmů

Vyvažování a rotace v BVS, všude se předpokládá AVL strom

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

Prioritní fronta, halda

NPRG030 Programování I, 2018/19 1 / :25:37

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

Závěrečná zkouška z informatiky 2011

Šablony, kontejnery a iterátory

Sada 1 - Základy programování

Vector datový kontejner v C++.

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

Číslo projektu: CZ.1.07/1.4.00/ Název DUM: Měření délky Číslo DUM: III/2/FY/2/1/2 Vzdělávací předmět: Fyzika Tematická oblast: Fyzikální

Podprogramy; procedury a funkce

Funkční objekty v C++.

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

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

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

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

Pokročilé řazení. Karel Richta a kol. Přednášky byly připraveny s pomocí materiálů, které vyrobili Marko Berezovský a Michal Píše

Několik příkladů v Turbo Pascalu

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

3 Algoritmy řazení. prvku a 1 je rovněž seřazená.

NMIN102 Programování /2 Z, Zk

Digitální učební materiál

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

Transkript:

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_153_IVT Autor: Ing. Pavel Bezděk Tematický okruh: Algoritmy Datum tvorby: srpen 2013 Ročník: 4. ročník a oktáva Anotace: Algoritmus XIII. Třídění dat V. - Merge Sort Metodický pokyn: Při výuce nutno postupovat individuálně. Pokud není uvedeno jinak, je použitý materiál z vlastních zdrojů autora DUM.

Autor Ing. Pavel Bezděk Vytvořeno dne 25. 8. 2013 Odpilotováno dne 3. 3. 2014 ve třídě 8.Y Vzdělávací oblast Vzdělávací obor Tematický okruh Téma Klíčová slova Informatika a informační a komunikační technologie Informatika a výpočetní technika Algoritmus Algoritmus XIII. - Třídění dat V. Merge Sort Algoritmus, Merge Sort, rekurze Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Pavel Bezděk. Dostupné z Metodického portálu www.rvp.cz ; ISSN 1802-4785. Provozuje Národní ústav pro vzdělávání, školské poradenské zařízení a zařízení pro další vzdělávání pedagogických pracovníků (NÚV).

Třídění dat Merge Sort

MergeSort Řadicí algoritmus, jehož průměrná i nejhorší možná asymptotická časová složitost je (O(N log N)). Z těchto důvodů je Merge Sort implementován v mnoha programovacích jazycích jako implicitní třídící algoritmus. Algoritmus je velmi dobrým příkladem programátorské metody rozděl a panuj (latinsky divide et impera). Merge sort pracuje na bázi slévání již seřazených částí pole za pomoci dodatečného pole velikosti n. Algoritmus využívá řazení pomocí slučování (merging). Slučování je proces, kdy ze dvou či více seřazených sekvencí vzniká jedna seřazená sekvence. Merge sort byl vynalezen v roce 1945 Johnem von Neumannem. Paměťová složitost: O(N ) algoritmus potřebuje druhé pomocné pole, navíc je ale třeba paměť na realizaci rekurzivních volání (zásobník) Časová složitost: O(N.logN) procházíme 1 úsek délky N, 2 úseky délky N/2, 4 úseky délky N/4,, celkem hloubka rekurze logn a na každé hladině rekurze práce N (součet délek K úseků, každý dlouhý N/K prvků) O(N.logN)

Popis Merge Sort rozděl a panuj Rozdělit: Jestliže má sekvence S více než dva prvky (pokud má 0 nebo jeden prvek, je již seřazená), odeber všechny prvky z S a vlož je do dvou sekvencí S 1 a S 2, kde každá bude obsahovat polovinu prvků sekvence S. S 1 obsahuje první polovinu prvků posloupnosti S S 2 obsahuje zbývající prvky posloupnosti S. Rekurze: Rekurzivně setřiď sekvence S 1 a S 2. (Rekurzivně se sekvence stále zmenšují až dvouprvkové sekvence (tříprvková sekvence se dělí na jednu dvouprvkovou, třetí prvek zůstává součástí předchozí rekurze). Panovat: Vrať elementy do sekvence S, sloučením (sléváním) setříděných sekvencí S 1 a S 2 do jediné setříděné sekvence.

program Mergesort_rekurzivni; {Tridici algoritmus Mergesort - rekurzivni verze uses Crt; {Unita pro praci s obrazovkou const MaxN = 100; {maximalni pocet tridenych cisel (dle potreby) type Pole = array[1..maxn] of integer; {tridena cisla var P: Pole; {ulozeni tridenych udaju Q: Pole; {Q je pomocne odkladaci pole pro realizaci slevani N: 1..MaxN; {pocet prvku v poli P I: integer; procedure Mergesort (var P,Q:Pole; Zac,Kon:integer);{Zacatek deklarace procedury {setridi v poli P usek od indexu Zac do indexu Kon {Q je pomocne odkladaci pole pro realizaci slevani var Stred:integer; {index prostredku trideneho useku i,j,k: integer; {pomocné indexy pro slevani begin Stred:=(Zac+Kon) div 2; {konec leveho useku pri rozdeleni useku <Zac,Kon> Merge Sort Pascal if Zac < Stred then Mergesort(P,Q,Zac,Stred); {utridit levy usek if Stred+1 < Kon then Mergesort(P,Q,Stred+1,Kon); {utridit pravy usek {Máme proceduru MergeSort1(P,Q,1,4), volá procedura MergeSort1 proceduru MergeSort11(P,Q,1,2), která slévá 1. a 2. prvek a pak skončí procedura MergeSort11, a procedura MergeSort1 volá MergeSort12(P,Q,3,4), která slévá 3. a 4. prvek a pak skončí procedura MergeSort12 a pokračuje dále procedura MergeSort1 sléváním 1.,2. a 3.,4. prvku a po slévání skončí procedura MergeSort1 {Máme proceduru MergeSort1(P,Q,1,3), volá procedura MergeSort1 proceduru MergeSort11(P,Q,1,2), která slévá 1. a 2. prvek a pak skončí procedura MergeSort11, a procedura MergeSort1 již nevolá MergeSort12(P,Q,3), ale pokračuje procedura MergeSort1 sléváním 1.,2. a 3. prvku a po slévání skončí procedura MergeSort1

{slevani obou useku: i:=zac;{levy usek j:=stred+1;{pravy usek k:=zac;{vysledek while (i<=stred) and (j<=kon) do {slevani setridenych useku do pomocneho pole Q begin if P[i]<=P[j] then begin Q[k]:=P[i]; i:=i+1 end else begin Q[k]:=P[j]; j:=j+1 end; k:=k+1 end; {Může nastat případ, že již i>stred a j<=kon, a my jsme ještě neprobrali min. 1 prvek zprava, ale nelze dále pokračovat ve while cyklu nebo již i<=stred a j>kon, neprobrali jsme min. 1 prvek zleva, ale nelze již pokračovat ve while cyklu. while i<=stred do {dokopirovani zbytku leveho useku begin Q[k]:=P[i]; i:=i+1; k:=k+1 end; while j<=kon do {dokopirovani zbytku praveho useku begin Q[k]:=P[j]; j:=j+1; k:=k+1 end; {zbyva prenest setrideny usek <Zac,Kon> zpet z Q do P: for k:=zac to Kon do P[k]:=Q[k] end; {konec deklarace procedury Mergesort

begin {hlavni program clrscr; {Vymazani obrazovky write('pocet tridenych cisel: '); readln(n); writeln; writeln('zadani posloupnosti tridenych cisel:'); for I:=1 to N do read(p[i]); Mergesort(P,Q,1,N); writeln; writeln('setridena cisla:'); writeln; for I:=1 to N do write(p[i]:5); repeat until keypressed; end.

#include <iostream> //Merge Sort using namespace std; const int POCET=10; int merge(int p[],int q[],int n); int main() { int pocet=pocet; // vstupni parametr - pocet prvku int pole[pocet]; int pole2[pocet]; int k; cout<<endl; // vstupní pole pro trideni // pro mergesort cout<<" Zadej prvky pole ke trideni: "<<endl<<endl; for (k=0; k<pocet; k++) cout<<endl<<endl; merge(pole,pole2,pocet); cout<<" Setridene pole (mergesort): "<<endl; for (k=0; k<pocet; k++) {cout<<" "<<pole2[k]; return 0; Merge Sort C++ {cout<<" pole["<<k<<"]= "; cin>>pole[k]; Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Pavel Bezděk. Dostupné z Metodického portálu www.rvp.cz ; ISSN 1802-4785. Provozuje Národní ústav pro vzdělávání, školské poradenské zařízení a zařízení pro další vzdělávání pedagogických pracovníků (NÚV).

int merge(int p[], int q[], int n) // trideni slucovanim - mergesort, algoritmus se lisi od standardniho postupu // v tom, ze nerozdeluji tridene pole na useky stejne velikosti, nybrz delitkem je // inverze mezi sousednimi prvky. Algoritmus se diky tomu chova prirozeneji. { int * uk; int * pom; int i,j,k,m,l1,r1,l2,r2; uk=p; while(m<n) // tady pamatovat ukazatel na pole p // pro vymenu ukazatelu zac:m=0; { l1=m;r1=l1+1; // urcim meze 1.serazeneho useku while ((r1<n)&&(p[r1]>p[r1-1])) r1++; if ((r1==n) && (l1==0)) { if (pom==uk) // je to pole p? // a urcim, není-li to cele pole { for(k=0;k<n;k++) q[k]=p[k]; return 0; // hotovo Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Pavel Bezděk. Dostupné z Metodického portálu www.rvp.cz ; ISSN 1802-4785. Provozuje Národní ústav pro vzdělávání, školské poradenské zařízení a zařízení pro další vzdělávání pedagogických pracovníků (NÚV).

if (r1==n) {for (i=l1;i<r1;i++) {q[k]=p[i]; k++; m=i+1; else { l2=r1; r1--; r2=l2+1; while ((r2<n) && (p[r2]>p[r2-1])) r2++; // 2. usek r2--; i=l1; k=l1; j=l2; while ((i<=r1) && (j<=r2)) { if (p[i] < p[j]) { q[k]=p[i]; k++; i++; else { if (p[j] < p[i]) { q[k]=p[j]; j++; k++; Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Pavel Bezděk. Dostupné z Metodického portálu www.rvp.cz ; ISSN 1802-4785. Provozuje Národní ústav pro vzdělávání, školské poradenské zařízení a zařízení pro další vzdělávání pedagogických pracovníků (NÚV).

if (i>r1) else pom=p; p=q; q=pom; goto zac; m=r2+1; { while (j<=r2) { q[k]=p[j]; j++; k++; if (j>r2) { while(i<=r1) { q[k]=p[i]; i++; k++; Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Pavel Bezděk. Dostupné z Metodického portálu www.rvp.cz ; ISSN 1802-4785. Provozuje Národní ústav pro vzdělávání, školské poradenské zařízení a zařízení pro další vzdělávání pedagogických pracovníků (NÚV).

Dělení Jak algoritmus rozdělí jeden seznam na dva seznamy. Dělicí část Merge Sortu má na svém vstupu celé pole. Toto rozdělí na dvě stejně velké části, když je N sudé, (N liché S1= (N div 2)+1; S2=(N div 2) ), tyto dvě části pak dále rekurzivně dělí. V okamžiku, kdy rekurze rozdělí seznamy na dva dvouprvkové, dělení se zastaví. Popř. tříprvkový seznam se dělí na jeden dvouprvkový, třetí prvek zůstává součástí předchozí rekurze. Dvouprvkový seznam se setřídí již jednoduše. Není-li setříděn, prohodí se prvky. Slévání Předpokládejme, že máme dva seznamy (S 1, S 2 ) seřazené ve vzestupném pořadí. Tyto seznamy můžeme setřídit do jediného seznamu (S) následující procedurou. V každém kroku vždy porovnejme první prvky obou seznamů (tj. nejmenší prvky obou seznamů) a vyberme ten menší. Tento nakopírujme na začátek pomocného seznamu S a odstraňme jej ze seznamu původního. Tento postup opakujme tak dlouho, dokud se jeden ze seznamů nevyprázdní. Potom překopírujme zbytek druhého seznamu do pomocného seznamu S a překopírujeme prvky z pomocného seznamu S do seznamu S. 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 (čímž se dostane na nový nejnižší 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).

Řazení 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 (končí). Pole je seřazeno od nejnižší hodnoty po nejvyšší. Merge Sort lze s výhodou aplikovat na sekvenčních médiích s nižší přístupovou dobou, typicky například u dříve používaných magneto-páskových systémů. Dnes tape drive na serverech (servery pravidelně zálohující na Tape Drive). Tape drive (streamer) - pásková mechanika pro ukládání dat zařízení, která čte a zapisuje data na magnetickou pásku. Obvykle se používá pro archivaci nebo zálohy dat. Pásková média obecně mají příznivé náklady a dlouhou archivní stabilitu. Pásková jednotka poskytuje sekvenční přístup k ukládání, na rozdíl od disku, který poskytuje libovolný přístup k datům. Na disku lze přesunout data na libovolné místo na disku během několika milisekund, ale pásková jednotka musí fyzicky odmotat pásku a číst nějakou jednu konkrétní část dat, což nám neumožňuje dosahovat vysoké rychlosti přenosu dat. Páskové mechaniky jsou pomalejší, ale např. pro zálohovaní dat jsou vhodné (zálohujeme velké soubory dat, které v případě potřeby kopírujeme zpět na disk ( máme pásková zařízení s kapacitou vyšší než 1TB)). Pro sekvenční přístup k datům, zde lze dobře použít Merge Sort.

15 4 28 9 51 21 14 15 4 28 9 15 4 15 4 4 15 28 9 28 9 9 28 4 9 15 28 51 21 14 51 21 51 21 21 51 14 14 21 51 4 9 14 15 21 28 51 Schéma třídění MergeSort Je načten nesetříděný seznam. Pro snazší vysvětlení si zjednodušíme parametry volání procedury. Nejprve zavoláme proceduru MergeSort(15,4,28,9,51,21,14), ta volá MergeSort1(15,4,28,9). MergeSort1 volá MergeSort11(15,4), MergeSort11 setřídí sléváním 15 a 4 na seznam 4,15 a MergeSort11 skončí. MergeSort1 pokračuje dále a volá MergeSort12(28,9). MergeSort12 setřídí sléváním 28 a 9 na seznam 9,28 a MergeSort12 končí. MergeSort1 pokračuje dále a setřídí sléváním seznamy 4,15 a 9,28 na seznam 4,9,15,28 a MergeSort1 končí, ale MergeSort ještě stále běží. MergeSort volá MergeSort2(51,21,14). MergeSort2 volá MergeSort21(51,21), MergeSort21 setřídí sléváním 51 a 21 na seznam 21,51 a MergeSort21 skončí. MergeSort2 pokračuje dále, ale nevolá další proceduru, protože s jedním prvkem se procedura nevolá. MergeSort2 setřídí sléváním 21,51 a 14 na seznam 14,21,51 a MergeSort2 končí. MergeSort pokračuje dále a setřídí sléváním seznamy 4,9,15,28 a 14,21,51 na seznam 4,9,14,15,21,28,51 a MergeSort končí. Vytiskne se setříděný seznam a program skončil. {Ve skutečnosti je procedura MergeSort volána s polem, ve kterém je uložen tříděný seznam, s pomocným polem pro slévání a s počátečním a koncovým indexem tříděného pole.

Doporučená videa Merge Sort: Merge Sort taneční soubor: http://www.youtube.com/watch?v=xaqr3g_nvoo Vizualizace: http://www.youtube.com/watch?v=a215ccrily4 http://www.youtube.com/watch?v=_r0gv2hqyf0 http://www.youtube.com/watch?v=63imrspwdq8 http://www.youtube.com/watch?v=ir7dfdej6l4 Videa od Unacademy v angličtině: https://www.facebook.com/unacademy http://www.youtube.com/watch?v=zkdwpdhluii http://www.youtube.com/watch?v=myywuhrznpi

Použité zdroje WIRTH, Niklaus. Algoritmy a štruktúry údajov. 2.vyd. Bratislava: Alfa, 1989, 481 s. ISBN 80-050-0153-3. BÖHM, Martin. Programátorská kuchařka: Recepty z programátorské kuchařky [online]. Praha: KSP MFF UK Praha, 2011/2012 [cit. 2013-08-25]. KSP, Korespondenční seminář z programování: Programátorské kuchařky, 24. ročník KSP. Dostupné z: http://ksp.mff.cuni.cz/tasks/24/cook1.html Licence Creative Commons CC-BY-NC-SA 3.0.