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

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.

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

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

Dynamické datové struktury III.

Bubble sort. příklad. Shaker sort

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

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

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

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

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

Algoritmizace prostorových úloh

IB111 Úvod do programování skrze Python

Rekurze a rychlé třídění

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

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

Algoritmy I, složitost

Algoritmizace řazení Bubble Sort

Java - řazení objektů

Algoritmy a datové struktury

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

Dynamické datové struktury IV.

Úvod do programovacích jazyků (Java)

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

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

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

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 programování - Java. Cvičení č.4

IB111 Úvod do programování skrze Python

Sada 1 - Základy programování

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

TGH07 - Chytré stromové datové struktury

PB přednáška (26. října 2015)

Generické programování

Datové struktury. alg12 1

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

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

Šablony, kontejnery a iterátory

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

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

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

Poslední nenulová číslice faktoriálu

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

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

BI-EP2 Efektivní programování 2

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

Standardní algoritmy vyhledávací.

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

boolean hasnext() Object next() void remove() Kolekce

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

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

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

Stromy, haldy, prioritní fronty

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

Základy algoritmizace a programování

Algoritmizace a programování

Techniky návrhu algoritmů

Rekurzivní algoritmy

Digitální učební materiál

ČVUT FEL X36PAA - Problémy a algoritmy. 4. úloha - Experimentální hodnocení algoritmů pro řešení problému batohu

3 KTE / ZPE Informační technologie

TGH07 - Chytré stromové datové struktury

Šablony, kontejnery a iterátory

Generování vnitřní reprezentace programu

Úvod do Matlabu. Praha & EU: Investujeme do vaší budoucnosti. 1 / 24 Úvod do Matlabu

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE PŘEKLADY TYPICKÝCH JAZYKOVÝCH KONSTRUKCÍ PROGRAMOVACÍCH JAZYKŮ.

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

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

Prioritní fronta, halda

Pro kontrolu správného formátu hodnoty N použijeme metodu try-catch.

RMI Remote Method Invocation

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

Abstraktní datové typy

Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické

Dekompozice problému, rekurze

R zné algoritmy mají r znou složitost

20. Projekt Domácí mediotéka

Typický prvek kolekce pro české řazení

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

Programování jako nástroj porozumění matematice (seriál pro web modernivyuka.cz)

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

Časová a prostorová složitost algoritmů

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

PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI GLOBÁLNÍ PROMĚNNÉ. NSWI162: Sémantika programů 2

Datové struktury 2: Rozptylovací tabulky

VZOR. Vzor přijímacího testu do magisterského studia oboru Otevřená informatika

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

Řídicí struktury. alg3 1

Principy objektově orientovaného programování

Základy programování (IZP)

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

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

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

Úvod do programovacích jazyků (Java)

Spojový seznam. Jan Kybic.

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

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Transkript:

ABALG 5/ ALG Vícedimenzionální data Řazení vícedimenzionálních dat Experimentální porovnání řadících algoritmů na vícedimenzionálních datech

ABALG 5/ Vícedimenzionální data..7.. -.. d = 6 5 6.....7.. -.....9 6. 9. -. -. -. -.. 5.6 -...7. -. -..9 Datový prvek je vektor délky d ( = dimenze vektoru) Řazené pole obsahuje (typicky) vektory stejné délky..7.. -.. <..7.. -5..9 <..8.. -5..8 Dvojici vektorů porovnáváme po složkách od začátku, první neshodná dvojice složek určuje pořadí vektorů.

ABALG 5/ Přímé a neefektivní řazení vícedimenzionálních dat Vstupní pole Seřazené pole 5 6 7 5 6 7 Řadící algoritmus Klad Bezprostřední přístup k datům je rychlý. Zápor Výměna prvků je pomalá, musí se fyzicky přesouvat. Zápor převažuje

ABALG 5/ Řazení vícedimenzionálních dat s pomocnými ukazateli Pole pomocných ukazatelů na datové prvky Řadíme pouze ukazatele podle velikosti jim odpovídajících dat. 5 6 7 5 6 7 5 6 7 7 6 5 Klad Výměna prvků je rychlá, děje se pouze výměnou ukazatelů. Zápor Přístup k datům pomocí ukazatelů je pomalejší. Klad převažuje

ABALG 5/ Pomocná funkce pro porovnání dvou vektorů class L { int compare( int[] a, int[] b) { for( int i = ; i < a.length; i++) { if (a[i] == b[i]) continue; if (a[i] < b[i]) return -; else return +; return ;...

ABALG 5/ Insert sort pro D pole (opakování) void insertsort (int [] a, int low, int high) { int insval, j; for (int i = low+; i <= high; i++) { // find & make place for a[i] insval = a[i]; j = i-; while ((j >= low) && (a[j] > insval)) { a[j+] = a[j]; j--; // insert a[i] a[j+] = insval; 5

ABALG 5/ Insert sort pro řazení pole vektorů s využitím ukazatelů void insertsort( int[][] a, int[] ptrs, int low, int high){ int j; int insvalptr; for (int i = low+; i <= high; i++) { // find & make place for a[i] insvalptr = ptrs[i]; j = i-; while ((j >= low) && (L.compare(a[ptrs[j]], a[insvalptr]) == )) { ptrs[j+] = ptrs[j]; j--; // insert a[i] ptrs[j+] = insvalptr; 6

ABALG 5/ Merge sort pro řazení pole vektorů s využitím ukazatelů I void mergesortcore (int[][] data, int ptr[], int ptr[], int low, int high){ int half = (low+high)/; int i; if (low >= high) return; // too small! // sort: mergesortcore(data, ptr, ptr, low, half); // left mergesortcore(data, ptr, ptr, half+, high); // right merge(data, ptr, ptr, low, high); // merge halves void mergesort (int[][] data, int [] ptr) { initptrs(ptr); // init pointers int [] ptr = new int [data.length]; initptrs(ptr); mergesortcore(data, ptr, ptr,, data.length-); 7

ABALG 5/ Merge sort pro řazení pole vektorů s využitím ukazatelů II void merge( byte [][] data, int inptr[], int outptr[], int low, int high) { int half = (low+high)/; int i = low; int i = half+; int j = low; // compare and merge while ((i <= half) && (i <= high)) if ( compare(data[inptr[i]], data[inptr[i]]) <= ) outptr[j++] = inptr[i++]; else outptr[j++] = inptr[i++]; // copy the rest while (i <= half) outptr[j++] = inptr[i++]; while (i <= high) outptr[j++] = inptr[i++]; 8

ABALG 5/ Quick sort pro řazení pole vektorů s využitím ukazatelů II void sortqp( int[][] a, int[] ptrs, int low, int high) { int il = low, ir = high, aux; int pivotptr = ptrs[low]; do { while (L.compare(a[ptrs[iL]],a[pivotPtr])==-) il++; while (L.compare(a[ptrs[iR]],a[pivotPtr])== ) ir--; if (il < ir) { //swap(a,il,ir) aux = ptrs[il]; ptrs[il] = ptrs[ir]; ptrs[ir] = aux; il++; ir--; else if (il == ir) { il++; ir--; while(il <= ir); if (low < ir) sortqp(a, ptrs, low, ir); if (il < high) sortqp(a, ptrs, il, high); 9

ABALG 5/ Knihovní funkce řazení Příklad použití zabudovaného řazení v Javě pro řazení pole celočíselných vektorů libovolné dimenze class MyCompar implements Comparator { public int compare( Object obj, Object obj) { int [] a = (int []) obj; int [] b = (int []) obj; for( int i = ; i < a.length; i++) { if (a[i] == b[i]) continue; if (a[i] < b[i]) return -; else return +; return ; // end of class // usage: int [][] MyDataArray =... ; // any initialization Arrays.sort(MyDataArray, new MyCompar());

ABALG 5/ Ilustrační experiment řazení Prostředí Intel(R).7 GHz, Microsoft Windows 7 Enterprise, SP, version 6. Java:.7._5; Java HotSpot(TM) 6-Bit Server VM.5-b LCacheSize 56 KB, LCacheSize 96 KB. Organizace Pole celých čísel z intervalu <,7> 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 Rozhodně neexistuje jedno univerzální řazení, včetně prostředků poskytovaných ve standardních knihovnách jazyka, které by bylo optimální za všech okolností. Hraje roli velikost, dimenzionalita i stupeň předběžného seřazení dat.

ABALG 5/ Výsledky experimentu Náhodně uspořádaná data Délka vektoru Délka vektoru Quick Merge Java Radix Insert Quick Merge Java Radix..7..6 Doba běhu v ms Délka pole Insert... ~ ~..7...5.....7.8. 6.9. 6..... ~ ~5.6..6..9..7..7 5.5..5.9.5..8.9.. 5. Insert... ~ ~ Délka Quick...7. 9. vektoru Merge....9. Java..5... Radix.75.5.9. ~ nesoutěží

ABALG 5/ Výsledky experimentu Vzestupně uspoř. data s % šumem Délka vektoru Insert Quick Merge Java Radix..5...8 Doba běhu v ms Délka pole.. 9.5 ~......6.5..5.7.5.. 9.9 7.9.8 Délka vektoru Insert Quick Merge Java Radix..5...7.. 9.7 ~.5..5.5..6.5.8.9.8.6. 9.. 9. 7. Insert....5 ~ Délka Quick.5..5. 7. vektoru Merge.5..6.8.5 Java..8.6.7.5 Radix.6.5.6. ~ nesoutěží

ABALG 5/ Výsledky experimentu Zjištění závislá na stupni uspořádání dat Náhodně uspořádaná data Při střední nebo vysoké dimenzionalitě dat je výhodné použít vlastní implementaci Merge sortu, vůči knihovnímu řazení je typicky rychlejší, o jednotky až desítky procent, zejména se zvětšujícími se daty. Vzestupně uspořádaná data s % šumem Knihovní řazení detekuje stupeň uspořádání dat a maximálně jej využívá. V nejlepších případech dosahuje složitost (N). Při vyšší dimenzionalitě a velkých datech bylo v experimentu mírně rychlejší než vlastní implementace Merge sortu, lze čekat, že při menším šumu v datech bude rozdíl výraznější.

ABALG 5/ Výsledky experimentu Společná zjištění Náhodně uspořádaná data Vzestupně uspořádaná data s % šumem Při velmi malém rozsahu dat (nejvýše desítky) nezávisle na dimenzi poskytuje standardně Insert sort nejlepší výkon. Také knihovní řazení Javy detekuje malá data a aplikuje Insert sort, výkon je tu srovnatelný. Pokud lze použít Radix sort, je to výhodné zejména při nízké dimenzionalitě a velkém objemu dat, zrychlení vůči knihovnímu řazení jsme v tomto případě naměřili cca 5 až -i násobné. Používání Quick sortu nespíše nelze ve většině případů doporučit. 5