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

Podobné dokumenty
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

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

ˇ 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

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

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

Bubble sort. příklad. Shaker sort

Algoritmizace řazení Bubble Sort

Dynamické datové struktury III.

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

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

IB111 Úvod do programování skrze Python

Dynamické datové struktury IV.

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

Sada 1 - Základy programování

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

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

IB111 Úvod do programování skrze Python

Šablony, kontejnery a iterátory

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

Rekurze a rychlé třídění

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

Algoritmizace prostorových úloh

Základy programování (IZP)

Spojový seznam. Jan Kybic.

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

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

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

Šablony, kontejnery a iterátory

Robert Haken [MVP ASP.NET/IIS, MCT] software architect, HAVIT, Základní algoritmy v praxi

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

ÚVODNÍ ZNALOSTI. datové struktury. správnost programů. analýza algoritmů

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

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

Úvod do programovacích jazyků (Java)

Úvod do programování - Java. Cvičení č.4

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

Časová složitost / Time complexity

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Elegantní algoritmus pro konstrukci sufixových polí

Poslední nenulová číslice faktoriálu

Algoritmy I, složitost

Digitální učební materiál

Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz

Algoritmizace prostorových úloh

Datové struktury. alg12 1

Časová a prostorová složitost algoritmů

MAXScript výukový kurz

Jméno:... St. Sk.:. Cvičící:.. Bodů ze cv.: (Tučná čísla indikují počet neuspěvších (z 50) v jednotlivých otázkách) 1.

Spojové struktury. Spojová struktura (linked structure):

Prioritní fronta, halda

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

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

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

Úvod do programování 6. hodina

7. Datové typy v Javě

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

KTE / ZPE Informační technologie

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

Algoritmizace a programování

PG 9.5 novinky ve vývoji aplikací

IUJCE 07/08 Přednáška č. 1

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Spojová implementace lineárních datových struktur

PB161 Programování v jazyce C++ Přednáška 3

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

6. Problém typové anonymity prvků v kolekci Sjednocení typově rozdílných prvků pomocí rozhraní Kolekce pro jeden typ prvků...

IB111 Úvod do programování 1 / 62

TGH07 - Chytré stromové datové struktury

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

Odborná maturitní práce

Algoritmizace prostorových úloh

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }

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

Datové struktury 2: Rozptylovací tabulky

TGH07 - Chytré stromové datové struktury

Cvičení MI-PRC I. Šimeček

Základy algoritmizace. Hašování

Abstraktní datové typy

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

IB111 Základy programování Radek Pelánek 1 / 61

Kolekce, cyklus foreach

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Úvod do mobilní robotiky AIL028

Semestrální projekt. Předmět: Programování v jazyce C. Zadání: Operace s maticemi. Uživatelský manuál. ver. 1.0

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

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

Maturitní téma: Programovací jazyk JAVA

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

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

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

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

Algoritmy a datové struktury

6. Příkazy a řídící struktury v Javě

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

Stromy, haldy, prioritní fronty

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. December 7, 2016

Strukturované typy a ukazatele. Úvod do programování 1 Tomáš Kühr

Transkript:

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 bbc bab B a b C D DCa Cbb CCC Cba adb adc DDb bbc bab acb DaD add DbD DbD Cba acb Staré pořadí Nové pořadí

Radix sort Seřazeno od. znaku Řaď podle. znaku DCa Cba Cbb B _ a b C D_ adb DDb bab acb CCC bab DaD Cba Cbb bbc DbD DCa acb CCC adb DDb adc add adc bbc DaD add DbD

Radix sort Seřazeno od. znaku Řaď podle. znaku bab DaD Cba Cbb bbc DbD DCa acb CCC B a b C D acb adb adc add bab Cba bbc Cbb CCC DaD DbD DCa DDb adb DDb adc add Seřazeno!

Implementace radix sortu Neseřazeno Seřazeno dle. znaku Pomocná pole indexů registrují nové pořadí. Cbb DaD adb DCa CCC add DDb adc bbc bab DbD Cba acb B a DCa Cba b Cbb adb DDb bab acb Příklad C CCC adc bbc D DaD add DbD zač. & konec a b C D Příklad další

Implementace radix sortu Neseřazeno Cbb DaD adb DCa CCC add DDb adc bbc bab DbD Cba acb Jedno pole pro všechny seznamy a b C D z k Ukázka seznamu pro 'b' Pole ukazatelů na začátek a konec seznamu pro každý znak Aktuálně obě pole přesně registrují stav po seřazení podle. znaku. Radix sort lze provést bez přesouvání původních dat, pouze manipulací s uvedenými celočíselnými poli, která obsahují veškerou informaci o aktuálním stavu řazení.

Implementace radix sortu Neseřazeno Cbb DaD adb DCa CCC add DDb adc bbc bab DbD Cba acb Stav po seřazení podle. znaku. a b C D z k z k Ukázka seznamů pro 'b' Stav po seřazení podle. znaku = seřazeno. a b C D

Implementace radix sortu Neseřazeno Stav po seřazení podle. znaku = seřazeno. Stačí vypsat data v pořadí daném seznamy: a b C D Cbb DaD adb DCa CCC add DDb adc bbc bab DbD Cba acb a b C D z k acb adb adc add bab bbc Cba Cbb CCC DaD DbD DCa DDb

Od seřazení podle. znaku k seřazení podle. znaku Pole obsahují uspořádání podle. znaku. a b C D z k a b C D z k Pole budou obsahovat uspořádání podle. znaku Cbb DaD adb DCa CCC add DDb adc bbc bab DbD Cba acb d d Aktualizace polí z, k, d proběhne tak, že naplníme nová pole z, k, d, která nakonec zkopírujeme zpět do z, k, d. Implementačně ovšem není třeba cokoli kopírovat, stačí záměna referencí (ukazatelů, pointerů) na tato pole.

Od seřazení podle. znaku k seřazení podle. znaku Usp. dle. zn. a b C D z k a b C D z k z k z k z k z k z k z k Cbb DaD adb DCa CCC add DDb adc bbc bab DbD Cba acb d d d d d d d d

Od seřazení podle. znaku k seřazení podle. znaku Usp. dle. zn. a b C D z k a b C D z k z k z k z k z k z k z k Cbb DaD adb DCa CCC add DDb adc bbc bab DbD Cba acb d d d d d d d d Hotovo

Implementace radix sortu void radix_sort( String [] a ) { int charcount =...; // number of chars used (^?) int [] z = new int [charcount]; int [] k = new int [charcount]; int [] z = new int [charcount]; int [] k = new int [charcount]; int [] d = new int [a.length]; int [] d = new int [a.length]; int [] aux; initstep( a, z, k, d ); // st pass with last char } for( int p = a[].length()-; p >= ; p-- ) { radixstep( a, p, z, k, d, z, k, d ); // do the job aux = z; z = z; z = aux; // just swap arrays aux = k; k = k; k = aux; // dtto aux = d; d = d; d = aux; // dtto } output( a, z, k, d ); // print sorted array

Implementace radix sortu void initstep( String[] a, int [] z, int [] k, int [] d ){ int pos = a[].length()-; // last char in string int c; // char as array index for Radix sort for( int i = ; i < z.length; i++ ) // init arrays z[i] = k[i] = -; // empty for( int i = ; i < a.length; i++ ){ // all last chars c = (int) a[i].charat(pos); // char to index if( z[c] == - ) k[c]= z[c] = i; // start new list else { d[k[c]] = i; // extend existing list k[c] = i; } } } Řetězce různé délky nutno uvést na stejnou délku připojením "nevýznamných znaků", např. mezer. V ukázkovém kódu všechny indexy polí začínají, v obrázcích začínají.

Implementace radix sortu void radixstep( String [] a, int pos, int [] z, int [] k, int [] d, int [] z, int [] k, int [] d ){ int j; // index traverses old lists int c; // char as array index for Radix sort for( int i = ; i < z.length; i++ ) // init arrays z[i] = k[i] = -; // for( int i = ; i < z.length; i++ ) // for all used chars if (z[i]!= -) { // unempty list j = z[i]; while( true ){ // scan the list c = (int) a[j].charat(pos); // char to index if( z[c] == - ) k[c]= z[c] = j; // start new list else { d[k[c]] = j; // extend existing list k[c] = j; } if( j == k[i] ) break; j = d[j]; // next string index } } }

Radix sort d znaků... d cyklů Shrnutí cyklus... celkem... (n) operací (d n) operací d << n... (n) operací Radix sort nemění pořadí stejných hodnot Asymptotická složitost Radix sortu je Pro malé konstantní d lze psát (n*d) (n) Je to stabilní řazení

Counting sort vstup vstup.length == N cetnost cetnost.length == k k = max(vstup) - min(vstup) + vystup vstup.length == N

Counting sort Krok Vynulování pole četností Jeden průchod vstupním polem Naplnění pole četností

Counting sort Krok jeden průchod Pole četností mění svou roli Úprava pole četností for( int i = dmez+; i <= hmez; i++ ) cetnost[i] += cetnost[i-] Prvek cetnost[ j ] obsahuje pozici posledního prvku s hodnotou j v budoucím výstupním poli.

Counting sort Krok i == N for( int i = N; i > ; i-- ) { vystup[cetnost[vstup[i]]] = vstup[i]; cetnost[vstup[i]]--; } i ==

Counting sort Krok i == N- for( int i = N; i > ; i-- ) { vystup[cetnost[vstup[i]]] = vstup[i]; cetnost[vstup[i]]--; } i ==

Counting sort Krok i == N- for( int i = N; i > ; i-- ) { vystup[cetnost[vstup[i]]] = vstup[i]; cetnost[vstup[i]]--; } i == atd...

Counting sort Krok i == for( int i = N; i > ; i-- ) { vystup[cetnost[vstup[i]]] = vstup[i]; cetnost[vstup[i]]--; } i == atd...

Orientační přehled vlastností řadících algoritmů Velikost pole n Nejhorší případ Nejlepší případ "typický", "běžný" případ Stabilní Všeobecné Selection sort (n ) (n ) (n ) Ne Ano Insertion sort (n ) (n) (n ) Ano Ano Bubble sort (n ) (n ) (n ) Ano Ano Quick sort (n ) (n log(n)) (n log(n)) Ne Ano Merge sort (n log(n)) (n log(n)) (n log(n)) Ano Ano Heap sort (n log(n)) O(n log(n)) (n log(n)) Ne Ano Radix sort (n) (n) (n) Ano Ne Counting sort (n) (n) (n) Ano Ne

Ilustrační experiment řazení Prostředí Intel(R). GHz, Microsoft Windows XP SP, jdk.._. Organizace Použita řazení, v nichž se prvky (double) navzájem porovnávají. Kódy převzaty z přednášky (žádné další triky). Řazení v jednotlivých velikostech prováděna na stejných datech. Pole náhodně zamíchána generátorem pseudonáhodných čísel s rovnoměrným rozložením. Výsledky průměrovány přes větší počet běhů. Závěr Neexistuje jedno univerzální řazení, které by bylo optimální za všech okolností. Hraje roli stabilita, velikost dat i stupeň předběžného seřazení dat.

Ilustrační experiment řazení Délka pole % seř. % % % % % % % % % % % % Doba běhu v milisekundách, není-li uvedeno jinak Sort Select Insert Bubble Quick Merge Heap................................................. min min min min. min. min Seřazená část pole. Pole je nejprve seřazeno, pak náhodně vybrané prvky změní libovolně hodnotu.

Ilustrační experiment řazení Délka pole % seř. % % % % % % % % % % % % Koeficient zpomalení ( > ) vůči Quick sortu pro danou velikost dat a předběžné seřazení Sort Select Insert Bubble Quick Merge Heap........................................ Nejrychlejší Nejpomalejší Select a Bubble sorty nesoutěží. Stabilní

Ilustrační experiment řazení Délka pole % seř. % % % % % % % % % % % % Koeficient zpomalení ( > ) při srovnání rychlosti řazení neseřazeného a částečně seřazeného pole Sort Select Insert Bubble Quick Merge Heap................................. Stabilní