Dynamické datové struktury III.

Podobné dokumenty
Dynamické datové struktury IV.

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

Dynamické datové struktury I.

Algoritmy a datové struktury

Prioritní fronta, halda

Stromy, haldy, prioritní fronty

Dynamické datové struktury II.

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

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

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

TGH07 - Chytré stromové datové struktury

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.

Prioritní fronta, halda (heap), řazení

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

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

TGH07 - Chytré stromové datové struktury

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

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

Dynamicky vázané metody. Pozdní vazba, virtuální metody

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

Předmět: Algoritmizace praktické aplikace

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

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

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.

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

IB111 Úvod do programování skrze Python

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

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

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

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

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

Vyhledávací algoritmy

Algoritmizace řazení Bubble Sort

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.

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

Algoritmy na ohodnoceném grafu

R zné algoritmy mají r znou složitost

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

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

Maturitní téma: Programovací jazyk JAVA

Geometrické vyhledání.

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

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

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

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) b)

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

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

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

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

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Grafové algoritmy. Programovací techniky

Grafové algoritmy. Programovací techniky

Struktura programu v době běhu

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

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

Cílem kapitoly je seznámit studenta se seznamem a stromem. Jejich konstrukci, užití a základní vlastnosti.

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

Dynamické programování

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

Sada 1 - Základy programování

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

Abstraktní datové typy

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

Algoritmizace prostorových úloh

Algoritmy výpočetní geometrie

Konstruktory a destruktory

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

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

Základní datové struktury

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í

Úvod do programovacích jazyků (Java)

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

Použití dalších heuristik

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

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

Anotace. Spojové seznamy, haldy. AVL-stromy, A-B stromy. Martin Pergel,

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

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

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

Programování 3. hodina. RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

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

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

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

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

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

Časová a prostorová složitost algoritmů

Rekurzivní algoritmy

ABSTRAKTNÍ DATOVÉ TYPY (ADT)

Bubble sort. příklad. Shaker sort

Rekurze a rychlé třídění

Algoritmizace prostorových úloh

TGH05 - Problém za milion dolarů.

Booleovská algebra. Booleovské binární a unární funkce. Základní zákony.

Základní stavební prvky algoritmu

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

Rekurze a zásobník. Jak se vypočítá rekurzivní program? volání metody. vyšší adresy. main(){... fa(); //push ret1... } ret1

Spojový seznam. Jan Kybic.

Algoritmy používané ve výpočetní geometrii

Binární halda (= binary heap)

Transkript:

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é Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 1 / 27

Obsah přednášky 1 Halda 2 Operace nad haldou Inicializace Oprava haldy nahoru Oprava haldy dolů Přidání prvku do haldy Nalezení maxima Smazání kořene Třídící algoritmus Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 2 / 27

Halda 1. Halda tzv. Heap. Patří mezi rekurzivní datové struktury, reprezentována binárním stromem. Volnější definice než BST. Varianty: MinHeap: v kořeni minimum, běžná varianta. MaxHeap: v kořeni maximum, použití u prioritní fronty. Vlastnosti min-haldy: Hodnota v každém uzlu menší než v libovolném z potomků. V hladinách 1, x 1 maximální počet prvků n (x) u n (x) u = 2 x 1. V hladině x prvky řazeny co nejvíce vlevo. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 3 / 27

2. Halda, další vlastnosti Vlastnosti: Halda V kořenu minimální prvek, někde v úrovni x maximální prvek. Nalezení minima s konstantní složitostí, nalezení maxima se složitostí O(N). Při vkládání prvku nemusíme měnit tvar stromu, provádíme pouze vzájemné výměny prvků ve stromu. Odpadá nutnost převažovat strom. Implementace haldy: binárním stromem, 1D polem. Varianta 2: Častější (nemění se tvar stromu), nutno však znát horní odhad počtu prvků. Rychlý přístup k prvkům. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 4 / 27

Halda 3. Ukázka haldy 6 10 33 15 19 38 65 25 22 31 30 45 54 85 93 Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 5 / 27

Halda 4. Reprezentace haldy polem Definice: Halda představuje takovou posloupnost prvků h l, h l+1, h l+2,..., h r, že pro každý index i = l,..., r/2 platí h i h 2i h i h 2i+1. Ukázka: Halda definována posloupností h 1, h 2,..., h n, kde i = n/2. Kořen stromu h 1, h 2 levý potomek, h 3 pravý potomek. Levý potomek uzlu h 2 je h 4, pravý potomek je h 5, atd. L potomci sudý index, P potomci lichý index. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 6 / 27

Halda 5. Ukázka haldového stromu h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 h11 h12 h13 h14 h15 h[i] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 h i - h 1 h 2 h 3 h 4 h 5 h 6 h 7 h 8 h 9 h 10 h 11 h 12 h 13 h 14 Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 7 / 27

Halda 6. Reprezentace haldy polem, důsledky Z důvody neměnnosti tvaru stromu výhodná implementace polem. Vztah mezi pořadovým číslem uzlu h i a indexem uzlu h[i] v poli h i h[i]. Vztah mezi prvkem h[i] a rodičem r r = h[i/2]. Vztah mezi prvkem h[i] a levým potomkem l l = h[2i]. Vztah mezi prvkem h[i] a pravým potomkem p p = h[2i+1]. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 8 / 27

7. Operace nad heapem Operace nad heapem: inicializace heapu (Init): O(1); přidání prvku do heapu (Insert): O(log(N)). oprava heapu (Heapifying): O(log(N)). nahoru: fixheapup dolů: fixheapdown, nalezení max: O(N), velmi neefektivní! smazání minima: O(log(N)). tisk: O(N). Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 9 / 27

Inicializace 8. Reprezentace haldy a inicializace Datová položka n uchovává aktuální velikost heapu. Velikost haldy inicializována na hodnotu maxn představující horní odhad velikosti množiny. Složitost O(1). class Heap { int n; double [] h; void init(int maxn){ n = 0; h = new [] h(maxn); Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 10 / 27

9. Oprava haldy nahoru Oprava haldy nahoru Pohyb haldou od uzlu U směrem ke kořeni haldy, nemá vliv na potomky U. Stromová reprezentace: Pokud předchůdce P uzlu U má vyšší hodnotu, prohodíme U P. Pokračujeme v předchůdci U = P, dokud U není kořen. Reprezentace polem: Pokud prvek [i/2] má menší hodnotu než prvek [i], prohodíme [i/2] [i]. Pokračujeme v předchůdci i = i/2 dokud i > 1. public void fixheapup(int i) { while (i > 1 && (h[i / 2] > h[i])) { //Opakuj pro predchudce double temp = h[i / 2]; //Prohozeni s pouzitim h[i / 2] = h[i]; //lokalni promenne h[i] = temp; i = i / 2; //Jdi na rodice Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 11 / 27

10. Ukázka opravy haldy nahoru Oprava haldy nahoru 6 19 33 15 30 38 65 25 22 31 10 45 54 85 93 Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 12 / 27

Oprava haldy nahoru 11. Ukázka opravy haldy nahoru (30<->10) 6 19 33 15 10 38 65 25 22 31 30 45 54 85 93 Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 13 / 27

Oprava haldy nahoru 12. Ukázka opravy haldy nahoru (10<->19) 6 10 33 15 19 38 65 25 22 31 30 45 54 85 93 Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 14 / 27

Oprava haldy dolů 13. Oprava haldy dolů Pohyb haldou od uzlu U směrem od kořene k listům haldy, nemá vliv na předchůdce U. Stromová reprezentace: Najdi následníky uzlu U: V L, V P. Pokud V P < V L, následník V = V P, jinak V = V L (přidáváme do menšího). Pokud U > V, prohod U V, jinak ukonči. Pokračuj v prohozeném vrcholu, dokud nedosáhneme listu. Reprezentace polem: Najdi následníky uzlu [i]: [2 i], [2 i + 1]. Pokud [2 i + 1] < [2 i], následník [k] = [2 i + 1], jinak [k] = [2 i] (přidáváme do menšího). Pokud [i] > [k], prohod [i] [k] jinak ukonči. Pokračuj v prohozeném vrcholu, dokud nedosáhneme listu Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 15 / 27

Oprava haldy dolů 14. Algoritmus pro opravu haldy dolů public void fixheapdown(int i, int n) { int k; while (2 * i <= n) { k = 2 * i; //Levy potomek if ( h[k + 1] < h[k]) //Porovnani L a P potomka { k++; //Index ukazuje na mensiho potomka if (h[i] > h[k]) //Nesplneny podminky, prohodit { double temp = h[i]; h[i] = h[k]; h[k] = temp; else break; //Ukonceny podminky, nepokracuj i = k; //Pokracuj od prohozeneho potomka Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 16 / 27

15. Ukázka opravy haldy dolů Oprava haldy dolů 6 19 33 15 30 38 65 18 22 31 32 45 54 85 93 Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 17 / 27

Oprava haldy dolů 16. Ukázka opravy haldy dolů (19<->15) 6 15 33 19 30 38 65 18 22 31 32 45 54 85 93 Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 18 / 27

Oprava haldy dolů 17. Ukázka opravy haldy dolů (18<->19) 6 15 33 18 30 38 65 19 22 31 32 45 54 85 93 Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 19 / 27

Přidání prvku do haldy 18. Přidání prvku do haldy Složitost O(log(N)). Nevhodná konfigurace vstupních dat: v každém kroku přidáváme největší prvek. V takovém případě musí být opravován strom ke kořeni. Postup: Nový uzel s hodnotou x vytvořen na poslední hladině co nejvíce vpravo. Oprava haldy nahoru U. void add (double item) { n++;//zvetseni heapu o 1 h[n] = item; fixheapup(h, n); //Oprav heap nahoru do akt. pozice Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 20 / 27

19. Ukázka budování haldy Přidání prvku do haldy 3 1 3 1 3 1 1 1 3 5 3 5 3 5 6 6 2 1 1 1 2 5 2 5 2 5 6 3 6 3 9 6 3 9 4 Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 21 / 27

Nalezení maxima 20. Nalezení maxima v haldě Maximum se nachází v některém z listu. Z definice heapu nevyplývá, v kterém listu bude ležet. Nutno projít všechny listy, tj. posledních n/2 1 prvků: h[n/2],..., h[n 1]. Složitost operace O(n), překvapivě neefektivní oproti BST. public double findmax() { double max = h[n/2]; for (int i=n/2 + 1;i < n; i++) if (h[i] > max) max = h[i]; return max; Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 22 / 27

Smazání kořene 21. Smazání minima Minimum se nachází v kořeni, provádíme smazání kořene. Důsledkem zmenšení haldy o jeden prvek. Složitost O(log(N)). Postup: Do kořene zkopíruj prvek z poslední úrovně nejvíce vpravo: [1] = [n]. Oprava haldy z vrchu od kořene: fixheapdown(); void delmin(){ h[1] = h[h.length()-1]; fixheapdown(h, 1); //Oprav heap od korene n--; Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 23 / 27

Třídící algoritmus 22. Heap Sort Probíhá nad vybudovanou haldou, triviální implementace. Opakuj, dokud halda neobsahuje pouze kořen: Prohození kořene (minima haldy) s prvkem haldy nejnižší úrovně nejvíce vpravo. Oprava haldy dolů (v kořeni není minimum). Zkrácení haldy o prvek nejnižší úrovně nejvíce vpravo. Nad polem snadno algoritmizovatelné. Opakuj, dokud n > 1 Prohodíme h[1] a h[n]. Provedeme opravu haldy dolů z kořene. Dekrementujeme n. První výběr: nejmenší prvek, druhý výběr: druhý nejmenší prvek, atd. Jsou řazeny za koncem zkracované haldy sestupně. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 24 / 27

23. Ukázka činnosti algoritmu Třídící algoritmus 1 5 2 2 4 2 4 3 4 6 3 9 5 6 3 9 1 6 5 9 1 9 3 9 3 4 5 4 5 4 6 5 2 1 6 9 2 1 6 3 2 1 4 6 5 5 9 5 9 6 9 ; 6 3 2 1 4 3 2 1 4 3 2 1 Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 25 / 27

24. Algoritmus Heap Sort Třídící algoritmus Pouze třídící procedura: Vlastnosti algoritmu: while (n > 1) { double temp = h[1]; //Vem nejmensi prvek h[1] = h[n]; //Prohod s poslednim h[n] = temp; n--; //Zkrat heap o 1 fixheapdown(h, 1, n); Algoritmus má složitost O(N lg 2 N). Asi o 20% pomalejší než Merge Sort a o 50% pomalejší než Quick Sort. Použití pro hledání k tého nejmenšího prvku. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 26 / 27

25. Zdrojový kód (celek) Třídící algoritmus public void heapsort(double[] x) { int i = 1, n = x.length; double[] h = new double[n + 1]; //Heap o jeden prvek delsi for (int k = 0; k < n; k++) //Pridej vsechny prvky,oprav heap { h[i] = x[k]; //Pridej do heapu fixheapup(h, i); //Oprav heap zdola i++; //Inkrementuj i while (n > 1) { double temp = h[1]; //Vem nejmensi prvek h[1] = h[n]; //Prohod s poslednim h[n] = temp; n--; //Zkrat heap fixheapdown(h, 1, n); Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, III. Přírodovědecká fakulta UK.) 27 / 27