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

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

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

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

Stromy, haldy, prioritní fronty

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

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

ˇ 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

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

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

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

Pokročilé haldy. prof. Ing. Pavel Tvrdík CSc. Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010

Algoritmizace prostorových úloh

Složitost algoritmů. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

IB111 Úvod do programování skrze Python

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

Dynamické datové struktury III.

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

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

Rekurzivní algoritmy

Techniky návrhu algoritmů

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

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

Algoritmizace řazení Bubble Sort

NEJKRATŠÍ CESTY I. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

Rekurze a rychlé třídění

TGH07 - Chytré stromové datové struktury

Algoritmy I, složitost

Bubble sort. příklad. Shaker sort

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

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

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

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

Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost

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

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

R zné algoritmy mají r znou složitost

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

Časová a prostorová složitost algoritmů

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

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

bin arn ı vyhled av an ı a bst Karel Hor ak, Petr Ryˇsav y 23. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

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

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

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

Dynamické datové struktury IV.

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í

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

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

TGH07 - Chytré stromové datové struktury

Dynamické programování. Optimální binární vyhledávací strom

Úvod do problematiky

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

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

Datové struktury 2: Rozptylovací tabulky

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

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

IB111 Úvod do programování skrze Python

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

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

Různé algoritmy mají různou složitost

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

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

Zdůvodněte, proč funkce n lg(n) roste alespoň stejně rychle nebo rychleji než než funkce lg(n!). Symbolem lg značíme logaritmus o základu 2.

Dynamické programování

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

TGH05 - Problém za milion dolarů.

Základy algoritmizace a programování

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

Datový typ prioritní fronta Semestrální práce z předmětu 36PT

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

Algoritmy výpočetní geometrie

Elegantní algoritmus pro konstrukci sufixových polí

Algoritmy na ohodnoceném grafu

Prioritní fronta, halda

Sada 1 - Základy programování

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

ADT prioritní fronta. Haldy. Další operace nad haldou. Binární halda. Binomické stromy. Časová složitost jednotlivých operací.

Algoritmy vyhledávání a řazení. Zatím nad lineární datovou strukturou (polem)

5. Vyhledávání a řazení 1

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

Pokročilá algoritmizace amortizovaná složitost, Fibonacciho halda, počítačová aritmetika

Předmět: Algoritmizace praktické aplikace

Algoritmy a datové struktury

Programování v C++, 2. cvičení

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

ALGORITMY A DATOVÉ STRUKTURY

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

Šablony, kontejnery a iterátory

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

Časová složitost algoritmů

TGH05 - aplikace DFS, průchod do šířky

Návrh Designu: Radek Mařík

TGH05 - aplikace DFS, průchod do šířky

2 Datové struktury. Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky

Použití dalších heuristik

4 Stromy a les. Definice a základní vlastnosti stromů. Kostry grafů a jejich počet.

a) b) c) Radek Mařík

Datové struktury Úvod

Definice. B-stromu. B-strom řádu m je strom, kde každý uzel má maximálně m následníků a ve kterém platí:

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

Transkript:

Pokročilé řazení arel ichta a kol. Přednášky byly připraveny s pomocí materiálů, které vyrobili arko erezovský a ichal Píše atedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze arel ichta a kol., 2018 Datové struktury a algoritmy, 636DS 01/2018, Lekce 7 https://cw.fel.cvut.cz/wiki/courses/b6b36dsa/start 636DS, 2018, Lekce 7, 1/77

Řazení dělením - diskuse QUIC-ST 636DS, 2018, Lekce 7, 2/77

Diskuse k řazení dělením QUIC-ST je typický představitel řešení metodou ozděl-a-panuj. Existují varianty dvou typů: jednoduché a stabilní, které ale mají větší skryté konstanty a vyžadují (n) pomocné paměti, komplikovanější, nestabilní, ale fakticky rychlejší a nevyžadující extra paměť, tzv. in place algoritmy. lgoritmy prvního typu: Vyberou pivota. Projdou pole, označí a oindexují čísla menší, rovna a větší než pivot. Zahustí čísla menší než pivot doleva, za ně nahustí čísla rovna pivotu a za ně čísla větší než pivot. Nad první a třetí částí spustí rekurzivně totéž. lgoritmus uvedený v předchozí přednášce byl druhého typu. V obou případech záleží hodně na výběru pivota. 636DS, 2018, Lekce 7, 3/77

Složitost v průměrném případě Předpoklad rovnoměrného rozložení: každá z n! možných vstupních posloupností se objevuje s pravděpodobností 1/n!. Je velmi nepravděpodobné, že dělící poměr na všech úrovních bude stejný. Pravděpodobně některá dělení budou vyvážená a některá nevyvážená. odel průměrného případu: např. střídání nejlepšího (1/1) a nejhoršího dělícího průměru (1/n 1), vyjde jenom o něco hůře než nejlepší. točíme pohled: místo modelování a spekulování o dělících poměrech vnutíme vstupním datum charakter náhodné posloupnosti. Typicky: vstupní posloupnost podrobíme randomizaci (rozházení), čímž složitost řazení dělením není závislá na uspořádanosti vstupu. Potřebujeme náhodný generátor. 636DS, 2018, Lekce 7, 4/77

Příklad randomizovaného QUIC-ST ějme funkci andom(a, b), která vrátí celé číslo c, a c b, s pravděpodobností 1/(b a+1). Pak randomizovaný QUIC-ST používá: function SelectandomPivot(, low, high) { i andom(low, high); [i] [low]; return [low] } 636DS, 2018, Lekce 7, 5/77

Diskuse k řazení dělením (pokr.) Časová složitost v nejhorším případě (n 2 ). Časová složitost v průměrném (a očekávaném) případě (n log n). Nízká multiplikativní konstanta. Potřebuje případně jen konstantní prostor navíc. Správnost = částečná správnost + terminace Částečná správnost (invariant)? Terminace? 636DS, 2018, Lekce 7, 6/77

Řazení pomocí haldy HEP-ST 636DS, 2018, Lekce 7, 7/77

Halda Halda (binární) D J T E Z U Pravidlo haldy (INHEP) b a c a b a c 636DS, 2018, Lekce 7, 8/77

Halda Terminologie b a c a... predecessor, parent of b c... předchůdce, rodič b, c... successor, child of a... následník, potomek... (heap) top... vrchol (haldy) D 636DS, 2018, Lekce 7, 9/77

Halda v poli Halda uložená v poli 1 2 D 3 r k 4 J 5 T 6 E 7 s t 2k 2k+1 Z 8 9 10 11 U 12 následníci následníci k 2k 2k+1 r s t 1 2 3 4 5 6 7 8 9 10 11 12 D J T E Z U 636DS, 2018, Lekce 7, 10/77

Vrchol odstraněn (1) 1 odstraň vrchol Datové struktury a algoritmy 1 prava haldy 3 vlož na vrchol U D D J 2 T E J T E Z U Z 2 poslední první U >, U > D, < D prohoď U 636DS, 2018, Lekce 7, 11/77

3 Vrchol odstraněn (2) Datové struktury a algoritmy vlož na vrchol - pokračování prava haldy U D J D J T E U T E Z Z U >, U > J, J < prohoď J U U >, U >, < prohoď U 636DS, 2018, Lekce 7, 12/77

Vrchol odstraněn (3) prava haldy 3 3vlož na vrchol - hotovo J D T E Z U Nová halda 636DS, 2018, Lekce 7, 13/77

prava haldy Vrchol odstraněn II (1) 1 odstraň vrchol 1 3 vlož na vrchol J D J D T E T E Z U Z U 2 poslední první > J, > D, D < J prohoď D 636DS, 2018, Lekce 7, 14/77

prava haldy 3 Vrchol odstraněn II (2) Vrchol odstraněn II (3) vlož na vrchol - pokračování D 3 vlož na vrchol - hotovo D J J E T E T Z U Z U < T, > E prohoď E Nová halda 636DS, 2018, Lekce 7, 15/77

Řazení pomocí haldy - HEP-ST I Neseřazeno J U Z T E D II Vytvoř haldu III for (i = 0; i < n; i++) a[i] = odstraň vrchol ; D J T E J E D Z U Z T U IV Seřazeno Z U T J E D 636DS, 2018, Lekce 7, 16/77

ekurzivní vlastnost býti haldou D J T E Z U je halda je halda a je halda 636DS, 2018, Lekce 7, 17/77

Vytvoř jednu haldu ze dvou menších Z halda halda není (ještě) halda Z > nebo Z > prohoď: Z min(,) 636DS, 2018, Lekce 7, 18/77

Vytvoř jednu haldu ze dvou menších Z F C halda halda není halda není halda halda 636DS, 2018, Lekce 7, 19/77

Vytvoř haldu 6 1 Vytvoř haldu zde 5 4 2 vytvoř haldu zde... J 3 2 Z T 1 U E 3 4 vytvoř haldu zde... vytvoř haldu zde... 5 vytvoř haldu zde... D 6 vytvoř haldu zde, celá halda je hotova. 636DS, 2018, Lekce 7, 20/77

Halda v poli Halda uložená v poli 1 2 D 3 r k 4 J 5 T 6 E 7 s t 2k 2k+1 Z 8 9 10 11 U 12 následníci následnící k 2k 2k+1 r s t 1 2 3 4 5 6 7 8 9 10 11 12 D J T E Z U 636DS, 2018, Lekce 7, 21/77

arel ichta a kol. (ČVUT FEL) 636DS, 2018, Lekce 7, 22/77 Pokročilé řazení Datové struktury a algoritmy D E J T U Z 2 1 3 4 5 6 7 8 9 10 11 12 D E J T U Z 5 10 9 1 6 2 7 3 8 4 12 11 Není halda Neseřazeno 1 2 3 4 5 6 1 2 3 4 5 6 Tvorba haldy v poli

arel ichta a kol. (ČVUT FEL) 636DS, 2018, Lekce 7, 23/77 Pokročilé řazení Datové struktury a algoritmy D E J T U Z 2 1 3 4 5 6 7 8 9 10 11 12 D E J T U Z D E J T U Z 2 1 3 4 5 6 7 8 9 10 11 12 2 1 3 4 5 6 7 8 9 10 11 12 D E J T U Z 2 1 3 4 5 6 7 8 9 10 11 12 D E J T U Z 2 1 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 tvorba haldy: Tvorba haldy v poli

arel ichta a kol. (ČVUT FEL) 636DS, 2018, Lekce 7, 24/77 Pokročilé řazení Datové struktury a algoritmy D E J T U Z 2 1 3 4 5 6 7 8 9 10 11 12 D E J T U Z 2 1 3 4 5 6 7 8 9 10 11 12 D E J T U Z 5 10 9 1 6 2 7 3 8 4 12 11 Tvorba haldy 6 Halda Tvorba haldy v poli

HEP-ST Halda D J T E Z U rok 1 D J T E Z U 1 2 3 4 5 6 7 8 9 10 11 12 U D J T E Z J D T E Z U Halda 636DS, 2018, Lekce 7, 25/77

HEP-ST rok k J T U Z E D 1 2 3 4 5 6 7 8 9 10 11 12 Z T U J E D Z T U J E D halda k 636DS, 2018, Lekce 7, 26/77

HEP-ST // array: a[1]...a[n]!!!! void heapsort(item a[], int n) { int i, j, // create a heap for (i = n/2; i > 0; i--) repairtop(array, i, n); } // sort for (i = n; i > 1; i--) { swap(a, 1, i); repairtop(array, 1, i-1); } 636DS, 2018, Lekce 7, 27/77

// array: a[1]...a[n]!!!!!! void repairtop(item a[], int top, int bott) { int i = top; // a[2*i] and a[2*i+1] int j = i*2; // are successors of a[i] Item topval = a[top]; EPITP pro HEP-ST // try to find a successor < topval if ((j < bott) && (a[j] > a[j+1])) j++; } // while (successors < topval) // move successors up while ((j <= bott) && (topval > a[j])) { a[i] = a[j]; i = j; j = j*2; // skip to next successor if ((j < bott) && (a[j] > a[j+1])) j++; } a[i] = topval; // put the topval 636DS, 2018, Lekce 7, 28/77

Shrnutí pro HEP-ST repairtop operace nejhorší případ... log 2 (n) (n=velikost haldy) vytvoř haldu... n/2 repairtop operací log 2 (n/2) + log 2 (n/2+1) +... + log 2 (n) (n/2)(log 2 (n)) = (n log 2 (n)) seřaď haldy... n-1 repairtop operací, nejhorší případ: log 2 (n) + log 2 (n-1) +... + 1 n log 2 (n) = (n log 2 (n)) ale i nejlepší případ = celkem... vytvoř haldu + seřaď haldu = (n log 2(n)) (n log 2 (n)) symptotická složitost HEP-ST je (n log 2 (n)) HEP-ST není stabilní 636DS, 2018, Lekce 7, 29/77

Řazení slučováním EGE-ST 636DS, 2018, Lekce 7, 30/77

Slučování posloupností Sluč (slij?) dvě seřazená pole porovnávané prvky T U Z D E J T U Z D E J T U Z D E J 636DS, 2018, Lekce 7, 31/77

Slučování posloupností Sluč dvě seřazená pole - pokr. T U Z D D E J T U Z D E D E J T U Z D E J D E J 636DS, 2018, Lekce 7, 32/77

Slučování posloupností Sluč dvě seřazená pole - pokr. T U Z D E J D E J T U Z D E J D E J T U Z D E J D E J 636DS, 2018, Lekce 7, 33/77

Sluč dvě seřazená pole - pokr. Slučování posloupností kopíruj zbytek T U Z D E J D E J Seřazeno T U Z D E J T U Z D E J 636DS, 2018, Lekce 7, 34/77

ozděl a Panuj! Divide & Conquer! Divide et Impera! úloha ozděl! jejich" práce naše práce úloha úloha úloha Vyřeš částečnou úlohu Vyřeš částečnou úlohu řešení Sluč! řešení Sluč! řešení 636DS, 2018, Lekce 7, 35/77

EGE-ST Neseřazeno Z U T E J D ozděl! Z U T E J D Zpracuj odděleně Process seřaď! seřaď! separatel y T U Z D E J Panuj! Seřazeno Sluč! D E J T U Z 636DS, 2018, Lekce 7, 36/77

EGE-ST Neseřazeno Z U T E J D ozděl! ozděl! Z U T E J D ozděl! Sluč! Sluč! Sluč! Seřazeno U Z T E J D T U Z D E J 636DS, 2018, Lekce 7, 37/77

EGE-ST void mergesort (int a[], int aux[], int low, int high) { int half = (low+high)/2; int i; if (low >= high) return; // too small! // sort mergesort(a, aux, low, half); // left half mergesort(a, aux, half+1, high); // right half merge(a, aux, low, high); // merge halves // put result back to a for (i = low; i <= high; i++) a[i] = aux[i]; // optimization idea: /* swaprray(a, aux) */ // better to swap // references to a & aux! } 636DS, 2018, Lekce 7, 38/77

EGE-ST void merge(int in[], int out[], int low, int high) { int half = (low+high)/2; int i1 = low; int i2 = half+1; int j = low; } // compare and merge while ((i1 <= half) && (i2 <= high)) { if (in[i1] <= in[i2]) { out[j] = in[i1]; i1++; } else { out[j] = in[i2]; i2++; } j++; } // copy the rest while (i1 <= half) { out[j] = in[i1]; i1++; j++; } while (i2 <= high) { out[j] = in[i2]; i2++; j++; } 636DS, 2018, Lekce 7, 39/77

symptotická složitost EGE-ST ozděl!... Sluč!... log 2 (n) log 2 (n) krát krát ozděl!... (1) operací Sluč!... (n) operací Celkem... (n) (log 2(n)) = (n log 2 (n)) operací symptotická složitost EGE-ST je (n log 2 (n)) 636DS, 2018, Lekce 7, 40/77

Stabilita EGE-ST ozděl!... Nepohybuje prvky Sluč!... if (in[i1] <= in[i2]) { out[j] = in[i1]; Zařaď nejprve levý prvek když slučuješ stejné hodnoty EGE-ST je stabilní 636DS, 2018, Lekce 7, 41/77

ptimalita algoritmů řazení Definice: lgoritmus je optimální, pokud má v nejhorším případě složitost rovnou asymptoticky spodní mezi složitosti řešení daného problému. Věta: Spodní mez složitosti asociativního řešení problému řazení n čísel je (n log n). sociativní řazení využívá porovnání a případného přesunu (tzv. CE operace Compare and Exchange). Důkaz: Uvažujme pouze vstupy s n různými čísly = a1,.., an>. Libovolný CE algoritmus S lze abstraktně popsat pomocí rozhodovacího stromu S(S, n): aždý vnitřní uzel stromu odpovídá CE(a i, a j ) pro nějaká 1 i j n. Levý podstrom diktuje následné CE operace, pokud a i a j nebo je to list stromu. Pravý podstrom diktuje následné CE operace, pokud a i > a j nebo to je list stromu. 636DS, 2018, Lekce 7, 42/77

Příklad rozhodovacího stromu pro n=3 636DS, 2018, Lekce 7, 43/77

ptimalita algoritmů řazení (pokr.) Důkaz (pokr.): aždý list odpovídá právě jedné permutaci (), kde: a (1) a (2) a (n). aždému provedení algoritmu S odpovídá právě jeden průchod stromem z kořene do nějakého listu. Pro libovolný algoritmus S je odpovídající strom plný binární strom s n! listy - jeho hloubka je nejméně log(n!) = (n log n). Důsledek: lgoritmy erge-sort v každém případě, Heap-Sort v nejhorším a Quick- Sort v průměrném případě jsou optimální. Poznámka: log(n!) = log(n*(n-1)* *1) = log(n)+log(n-1)+ +log(1) n log n log(n!) = (n log n) log(n!) log(n/2)+ +log(n) = n/2 * log n/2 log(n!) = (n log n) log(n!) = (n log n) log(n!) = (n log n) log(n!) = (n log n) 636DS, 2018, Lekce 7, 44/77

Speciální algoritmy řazení v čase (n) Vzhledem k výše popsané nepřekročitelné mezi (n log n) lze seřadit n čísel v čase menším, pouze pokud: Je na vstupní hodnoty uvalena dodatečná omezující podmínka a díky tomu můžeme využít nějaké sofistikované vylepšení. Řazení není založeno na porovnání (operaci CE - složitost algoritmu se počítá pomocí základních operací). Uvedeme si 3 takové algoritmy: DIX-ST CUNTING-ST UCET-ST 636DS, 2018, Lekce 7, 45/77

Číslicové řazení DIX-ST 636DS, 2018, Lekce 7, 46/77

Neseřazeno DIX-ST řaď podle 3. znaku 1 2 3 4 5 6 7 8 9 10 11 12 13 Cbb DaD adb DCa CCC add DDb adc bbc bab DbD Cba acb a b C D DCa Cba Cbb 3 adb 7 DDb 10bab 13aCb CCC adc bbc 4 1 1 3 5 8 2 12 2 4 5 6 7 8 9 9 10 6 11 DaD add DbD 11 12 13 636DS, 2018, Lekce 7, 47/77

DIX-ST Seřazeno od 3. znaku 1 2 3 4 5 6 7 8 9 10 11 12 13 DCa Cba Cbb adb DDb bab acb CCC adc bbc DaD add DbD 6 11 _ a b C D_ bab DaD 1 2 řaď podle 2. znaku 2 3 10 13 Cba Cbb bbc DbD 3 4 5 6 1 7 DCa acb CCC 7 8 4 5 8 9 9 12 adb DDb adc add 10 11 12 13 636DS, 2018, Lekce 7, 48/77

DIX-ST Seřazeno od 2. znaku 1 2 3 4 5 6 7 8 9 10 11 12 13 bab DaD Cba Cbb bbc DbD DCa acb CCC adb DDb adc add 8 10 12 13 a b C D acb adb adc add 1 2 3 4 řaď podle 1. znaku bab bbc Cba Cbb CCC 1 5 3 7 2 5 6 4 8 6 9 9 7 11 DaD DbD DCa DDb seřazeno! 10 11 12 13 636DS, 2018, Lekce 7, 49/77 lgoritmus a program není totéž

Neseřazeno Implementace DIX-ST seřazeno dle 3. znaku pomocná pole indexů 1 2 3 4 5 6 7 8 9 10 11 12 13 Cbb DaD adb DCa CCC add DDb adc bbc bab DbD Cba acb 4 12 a DCa Cba b 1 Cbb 3 adb 7 DDb 10bab 13aCb Příklad 1 2 3 4 5 6 7 5 8 9 2 6 11 C CCC adc bbc D DaD add DbD 636DS, 2018, Lekce 7, 50/77 8 9 10 11 12 13 a b C D zač. & konec 4 1 5 2 Příklad 12 13 9 11 1 2 3 4 5 6 7 8 9 10 11 12 13 další 3 6 7 12 8 11 10 9 0 13 0 0 0

Příklad běhu DIX-ST 636DS, 2018, Lekce 7, 51/77

Pseudokód DIX-ST 636DS, 2018, Lekce 7, 52/77

orektnost DIX-ST Věta: lgoritmus DIX-ST řadí vstupní čísla správně a je stabilní. Důkaz: Indukcí podle čísla pozice. Dokážeme indukční hypotézu: Po provedení i iterací for cyklu platí, že vstupní pole hodnot ořezaných na nižších i-pozicích je správně seřazené. Základ indukce: Platí evidentně pro první iteraci, kdy se nahoru přesunou čísla končící číslicí 0, pak následují čísla končící číslicí 1, atd. Indukční krok: Předpokládejme, že uvedené tvrzení platí pro j, 1 j < k. Řazení v (i = j + 1)-té iteraci posouvá směrem nahoru nejprve čísla mající na pozici i číslici 0. Protože tato čísla oříznutá na posledních i 1 pozic byla v předchozích iteracích seřazena správně, bude tato skupina čísel oříznutých na i pozic také seřazena správně. Pak bude podobným způsobem následovat skupina čísel, majících na pozici i číslici 1, po té číslicí 2, atd. Po skončení i-té iterace cyklu budou tedy čísla oříznutá na i pozic seřazena správně. 636DS, 2018, Lekce 7, 53/77

Shrnutí: DIX-ST d znaků... d cyklů cyklus... celkem... (n) operací (d n) operací d << n... (n) operací Číslicové řazení nemění pořadí stejných hodnot symptotická složitost adix sortu je (n) Je to stabilní řazení 636DS, 2018, Lekce 7, 54/77

Řazení čítáním CUNTING-ST 636DS, 2018, Lekce 7, 55/77

CUNTING-ST vstup vstup.length == N 1 2 3 4 5 6 7 8 9 10 11 12 10 3 8 8 6 3 8 10 6 10 8 5 četnost cetnost.length == k k = max(vstup) - min(vstup) + 1 3 4 5 6 7 8 9 10 2 0 1 2 0 4 0 3 výstup vstup.length == N 1 2 3 4 5 6 7 8 9 10 11 12 3 3 5 6 6 8 8 8 8 10 10 10 636DS, 2018, Lekce 7, 56/77

CUNTING-ST rok 1 vynulování pole četností 3 4 5 6 7 8 9 10 0 0 0 0 0 0 0 0 jeden průchod vstupním polem 10 3 8 8 6 3 8 10 6 10 8 5 3 4 5 6 7 8 9 10 2 0 1 2 0 4 0 3 naplnění pole četností 636DS, 2018, Lekce 7, 57/77

CUNTING-ST rok 2 jeden průchod 3 4 5 6 7 8 9 10 2 0 1 2 0 4 0 3 úprava pole četností for(i = dez+1; i <= hez; i++) cetnost[i] += cetnost[i-1] 3 4 5 6 7 8 9 10 2 2 3 5 5 9 9 12 Prvek cetnost[ j ] obsahuje pozici posledního prvku s hodnotou j v budoucím výstupním poli. 1 2 3 4 5 6 7 8 9 10 11 12 3 3 5 6 6 8 8 8 8 10 10 10 636DS, 2018, Lekce 7, 58/77

rok 3 i == N CUNTING-ST for(i = N; i > 0; i--) { vystup[cetnost[vstup[i]] = vstup[i]; cetnost[vstup[i]]--; } 1 2 3 4 5 6 7 8 9 10 11 12 i == 12 10 3 8 8 6 3 8 10 6 10 8 5 3 4 5 6 7 8 9 10 2 2 3 5 5 9 9 12 3 4 5 6 7 8 9 10 2 2 2 5 5 9 9 12 1 2 3 4 5 6 7 8 9 10 11 12 5 636DS, 2018, Lekce 7, 59/77

rok 3 i == N-1 CUNTING-ST for(i = N; i > 0; i--) { vystup[cetnost[vstup[i]] = vstup[i]; cetnost[vstup[i]]--; } 1 2 3 4 5 6 7 8 9 10 11 12 i == 11 10 3 8 8 6 3 8 10 6 10 8 5 3 4 5 6 7 8 9 10 2 2 2 5 5 9 9 12 3 4 5 6 7 8 9 10 2 2 2 5 5 8 9 12 1 2 3 4 5 6 7 8 9 10 11 12 5 8 636DS, 2018, Lekce 7, 60/77

rok 3 i == N-2 CUNTING-ST for(i = N; i > 0; i--) { vystup[cetnost[vstup[i]] = vstup[i]; cetnost[vstup[i]]--; } 1 2 3 4 5 6 7 8 9 10 11 12 i == 10 10 3 8 8 6 3 8 10 6 10 8 5 3 4 5 6 7 8 9 10 2 2 2 5 5 8 9 12 3 4 5 6 7 8 9 10 2 2 2 5 5 8 9 11 1 2 3 4 5 6 7 8 9 10 11 12 5 8 10 atd... 636DS, 2018, Lekce 7, 61/77

rok 3 i == 3 CUNTING-ST for(i = N; i > 0; i--) { vystup[cetnost[vstup[i]] = vstup[i]; cetnost[vstup[i]]--; } 1 2 3 4 5 6 7 8 9 10 11 12 i == 3 10 3 8 8 6 3 8 10 6 10 8 5 3 4 5 6 7 8 9 10 1 2 2 4 5 6 9 10 3 4 5 6 7 8 9 10 1 2 2 4 5 5 9 10 1 2 3 4 5 6 7 8 9 10 11 12 3 5 6 6 8 8 8 8 10 10 atd... 636DS, 2018, Lekce 7, 62/77

Shrnutí pro CUNTING-ST rok 1... (N) operací rok 2... (k) operací rok 3... (N) operací Celkem... (k + N) operací Pokud k N, je asymptotická složitost CUNTING-ST (N) CUNTING-ST je stabilní N je velikost vstupního pole, k je velikost intervalu, v němž všechny vstupní hodnoty leží. 636DS, 2018, Lekce 7, 63/77

Přihrádkové řazení UCET-ST 636DS, 2018, Lekce 7, 64/77

UCET-ST Vstupní čísla jsou z intervalu [0, 1). lgoritmus je vhodný, pokud jsou vstupní čísla rovnoměrně rozložena v tomto intervalu. Hlavní myšlenky: Interval [0, 1) rozdělíme na n přihrádek, do kterých vstupní pole distribuujeme. Díky předpokladu rovnoměrnosti rozdělení předpokládáme, že do jedné přihrádky spadne málo čísel. Nicméně, protože velikost přihrádky nelze dopředu přesně určit, je implementována jako dynamický zřetězený seznam. aždou přihrádku rychle seřadíme a výsledek dostaneme zřetězením seřazených přihrádek. 636DS, 2018, Lekce 7, 65/77

Příklad běhu UCET-ST 636DS, 2018, Lekce 7, 66/77

Příklad běhu UCET-ST (pokr.) 636DS, 2018, Lekce 7, 67/77

orektnost a stabilita UCET-ST Věta: lgoritmus UCET-ST řadí vstupní čísla správně a je stabilní. Důkaz: Uvažujme 2 vstupní hodnoty [i] a [j]. Pokud padnou do stejné přihrádky, pak jsou v ní seřazeny a objeví se na výstupu ve správném pořadí. Dvě stejné vstupní hodnoty díky stabilnosti řazení v přihrádkách nezmění pořadí. Nechť padnou do různých přihrádek [i ] a [j ]. Nechť i < j. Funkce f(x) = n * x je ale neklesající funkce: f(x) < f(y) x < y. Čili: i = n * [i] < j = n * [j] [i] < [j]. 636DS, 2018, Lekce 7, 68/77

Shrnutí pro UCET-ST symptotická časová složitost UCET-ST je v nejhorším případě (n 2 ), kde n je délka řazené posloupnosti. Průměrná očekávaná časová složitost je (n + k), kde k je počet přihrádek. Pokud k n, pak průměrná očekávaná složitost je (n). symptotická paměťová složitost v nejhorším případě je (n*k). UCET-ST je stabilní (pokud je stabilní řazení v přihrádkách) 636DS, 2018, Lekce 7, 69/77

ŘZENÍ N VNĚJŠÍCH ÉDIÍCH 636DS, 2018, Lekce 7, 70/77

Řazení na vnějších médiích etody řazení lze rozlišit na tzv. vnitřní řazení (řazení v paměti) a tzv. vnější řazení (využívající vnější média). Vnější řazení lze dále rozlišit na práci s médii se sekvenčním přístupem (páska) a náhodným přístupem (disk). Základním principem řadících metod na vnějších, sekvenčně organizovaných paměťových médiích, je řazení slučováním (merging). Pro řazení na vnějších médiích s náhodným přístupem se využívají -stromy, příp. řazení dělením. 636DS, 2018, Lekce 7, 71/77

etoda přímého slučování (STIGHT-EGING) Tato metoda potřebuje kromě souboru, v němž jsou řazená data, dva další pomocné soubory. V prvním kroku se data původního (zdrojového) souboru rozdělí rovnoměrně do dvou pomocných souborů. Ve druhém kroku se přečte z každého pomocného souboru jeden prvek, vytvoří se uspořádaná dvojice, která se uloží do zdrojového souboru. Tato akce se opakuje až se ze všech údajů vytvoří soubor uspořádaných dvojic. Ve třetím kroku se uspořádané dvojice rozdělí rovnoměrně do dvou pomocných souborů. Ve čtvrtém kroku se ze dvou souborů seřazených dvojic vytvoří soubor seřazených čtveřic atd. Tento cyklus se opakuje pro všechny 2 k -tice až po k, pro něž platí, že 2 k+1 >=n. Jako poslední sloučíme poslední 2 k -tici a zbývající seřazenou posloupnost ve druhém souboru. Protože typickou implementací vnějšího sekvenčního souboru je magnetická páska, říká se této metodě také přímá metoda tří pásek. 636DS, 2018, Lekce 7, 72/77

Schéma postupu třípáskových metod Fáze rozdělování Fáze slučování PP PP PP ZP ZP ZP ZP PP PP PP ZP zdrojová páska, PP pomocná páska 636DS, 2018, Lekce 7, 73/77

lgoritmus řazení přímým slučováním ozděl prvky souboru f 1 do pomocných souborů f 2 a f 3 ; n :=0; repeat i :=0; Sloučením posloupností o délce 2 n z pásek f 2 a f 3 vytvoř posloupnosti o délce 2 n+1 a ulož je do souboru f 1. S každou vytvořenou posloupností zvyš i o 1. if i>1 then ozděl posloupnosti o délce 2 n+1 ze souboru f 1 do souborů f 2 a f 3 until i=1; 636DS, 2018, Lekce 7, 74/77

Přirozené slučování (natural merging) Na rozdíl od předchozí přímé metody tří pásek, přirozená metoda slučování pomocí tří pásek nevytváří seřazené posloupnosti o délce 2 n při vzrůstajícím n, ale využívá počátečního uspořádání řazeného souboru. V první fázi rozdělování zapisuje střídavě do dvou pomocných souborů celé neklesající posloupnosti. Dále se již střídá fáze slučování a rozdělování s tím, že při slučování algoritmus musí rozeznat konec neklesající posloupnosti. Proces končí sloučením posledních dvou posloupností do zdrojového souboru. Přirozená metoda čtyř pásek (také přirozené vyvážené slučování, angl. natural balanced merging) podobně jako u přímého slučování, zkracuje proces řazení vyloučením fází rozdělení za cenu použití dalšího pomocného souboru (pásky). V rámci slučovacího procesu se uspořádané n-tice rovnou zapisují do dvou souborů (rovnou se rozdělují). Nelze-li u čtyřpáskové metody umístit v závěrečném slučování výsledný seřazený soubor na původní zdrojovou pásku, vloží se do procesu řazení kopírovací cyklus, který umístí seřazený soubor na původní pásku. 636DS, 2018, Lekce 7, 75/77

Demo pro různé metody řazení http://www.cs.ubc.ca/~harrison/java/sorting-demo.html 636DS, 2018, Lekce 7, 76/77

The End 636DS, 2018, Lekce 7, 77/77