Dynamické datové struktury IV.

Podobné dokumenty
Dynamické datové struktury III.

Dynamické datové struktury I.

Dynamické datové struktury II.

Prioritní fronta, halda

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

Stromy, haldy, prioritní fronty

Algoritmy a datové struktury

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

Základní datové struktury

AVL stromy. pro každý uzel u stromu platí, že rozdíl mezi výškou jeho levého a pravého podstromu je nejvýše 1 stromy jsou samovyvažující

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

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

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

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

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

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

Datové struktury. alg12 1

Časová a prostorová složitost algoritmů

Kolekce, cyklus foreach

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

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

TGH07 - Chytré stromové datové struktury

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

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

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

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

TGH07 - Chytré stromové datové struktury

Abstraktní datové typy

Lineární spojový seznam (úvod do dynamických datových struktur)

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

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

Základní datové struktury.

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

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

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

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

Vyhledávací algoritmy

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

Algoritmizace prostorových úloh

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

Šablony, kontejnery a iterátory

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

Algoritmizace prostorových úloh

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

Red Black strom (Red Black Tree) Úvod do programování. Rotace. Red Black strom. Rotace. Rotace

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

Semestrální práce 2 znakový strom

Datové struktury a datové typy.

Algoritmy na ohodnoceném grafu

Část I Spojové struktury

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

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

Lineární datové struktury

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.

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

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

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

Konstruktory a destruktory

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

ALG 04. Zásobník Fronta Operace Enqueue, Dequeue, Front, Empty... Cyklická implementace fronty. Průchod stromem do šířky

Datové typy a struktury

Spojové struktury. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 10 A0B36PR1 Programování 1

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

Šablony, kontejnery a iterátory

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

IRAE 07/08 Přednáška č. 7. Začátek (head)

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

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

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í

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

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

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

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

Část 1 Spojové struktury (stromy) Dynamické struktury a Abstraktní Datový Typy (ADT) Část 2 Abstraktní datový typ. Část 3 Příklad ADT Prioritní fronta

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

Abstraktní datové typy: zásobník

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

R zné algoritmy mají r znou složitost

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

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

Dynamické struktury a Abstraktní Datový Typy (ADT)

TÉMATICKÝ OKRUH TZD, DIS a TIS

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

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

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:

ADT/ADS = abstraktní datové typy / struktury

Reprezentace dat v informačních systémech. Jaroslav Šmarda

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

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

ABSTRAKTNÍ DATOVÉ TYPY (ADT)

Geometrické vyhledání.

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

KTE / ZPE Informační technologie

Da D to t v o é v ty t py IB111: Datové typy

Spojový seznam. Jan Kybic.

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

Datové struktury Úvod

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

Návrh Designu: Radek Mařík

Transkript:

Dynamické datové struktury IV. Prioritní fronta. 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, IV. Přírodovědecká fakulta UK.) 1 / 18

Obsah přednášky 1 Prioritní fronta Vlastnosti prioritní fronty 2 Implementace PQ neuspořádaným seznamem 3 Implementace PQ pomocí BST 4 Implementace PQ pomocí haldy Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, IV. Přírodovědecká fakulta UK.) 2 / 18

Prioritní fronta 1. Prioritní fronta Priority Query. Někdy nazývána fronta s předbíháním. Patří mezi zobecněné datové struktury, kombinuje činnost fronty a zásobníku. Široce používaná struktura pracující s prvky nestejné váhy. Prioritní fronta představuje strukturu dvojic (klíč,položka) uspořádanou sestupně dle hodnot klíče. Hodnota klíče (tj. priorita) určena ohodnocovací funkcí, udává význam prvku. Prvek s vyšší prioritou může přeběhnout prvek s nižší prioritou rozdíl oproti běžné frontě. Princip prioritní fronty: Prvky ukládány v pořadí, v jakém jsou přidávány na konci fronty. Prvky postupně odebírány na základě hodnoty klíče, v každém kroku Tomáš odebrán Bayer bayertom@natur.cuni.cz prvek s nejvyšší (Katedra aplikované prioritou. Dynamické geoinformatiky datové struktury a kartografie, IV. Přírodovědecká fakulta UK.) 3 / 18

Prioritní fronta Vlastnosti prioritní fronty 2. Operace s prioritní frontou Implementace prioritní fronty: lineární seznam, BST, halda. Velké rozdíly ve výkonnostních charakteristikách! Operace nad prioritní frontou: Vytvoření fronty Přidání položky: push Smazání položky s největší prioritou: pop Změna priority položky. Výmaz libovolné položky Smazání fronty. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, IV. Přírodovědecká fakulta UK.) 4 / 18

Prioritní fronta Vlastnosti prioritní fronty 3. Ukázka prioritní fronty Key Val 204 123 197 239 152 246 142 177 105 432 97 404 92 44 88 164 53 149 45 186 13 98 Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, IV. Přírodovědecká fakulta UK.) 5 / 18

Prioritní fronta Vlastnosti prioritní fronty 4. Přehled metod a odhadů složitosti Metoda push pop find Neuspořádaný seznam O(1) O(N) O(N) Uspořádaný seznam O(N) O(1) O(1) BST, vyvážený* O(h) O(h) O(h) Heap O(log(N)) O(log(N)) O(log(N)) *Pro AVL stromy h = 1.4 log(n), pro degenerované případy BST h = N 1, neefektivní. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, IV. Přírodovědecká fakulta UK.) 6 / 18

Implementace PQ neuspořádaným seznamem 5. Implementace PQ neuspořádaným seznamem Vhodné pouze pro menší datové množiny. Obousměrný spojový seznam uchováván v neuspořádaném tvaru, značně neefektivní. Rychlé realizace push(), přidání prvku na konec seznamu: O(1). Velká režie spojená s pop(), nutno nalézt nejmenší prvek: O(N)! Drtivá většina operací stejná jako u implementace spojového seznamu. public class Uzel { double klic, hodnota; Uzel predchozi, dalsi; //par (klic, hodnota) public Uzel (String klic_, hodnota_) { //Konstruktor klic=klic_; hodnota = hodnota_; predchozi = null; dalsi=null; Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, IV. Přírodovědecká fakulta UK.) 7 / 18

Implementace PQ neuspořádaným seznamem 6. Přidání prvku Operace push() stejná jako u běžné fronty: public void push (double klic_, hodnota_){ Uzel u = new Uzel(klic_, hodnota_); if (posledni == null) { //Prazdna fronta prvni = u; posledni = u; else { //Neprazdna fronta posledni.dalsi = u; //Nastaveni dalsiho uzlu u.predchozi = posledni; //Nastaveni predchoziho uzl posledni = u; //Nastaveni posledniho uzlu Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, IV. Přírodovědecká fakulta UK.) 8 / 18

Implementace PQ neuspořádaným seznamem 7. Odebrání prvku Operace pop() neefektivní, složitost O(N). Nepoužitelné pro větší množiny. Postup: 1 Nutno sekvenčně projít seznam a nalézt prvek u max = (k max, v) Pokud je fronta tvořená jedním prvkem, prvni = null, posledni = null. 2 Prvek u max smazán a přenastaveny pointery: u max.predch.dalsi = u max.dalsi. u max.dalsi.predch=u max.predch. u max =null. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, IV. Přírodovědecká fakulta UK.) 9 / 18

Implementace PQ neuspořádaným seznamem 8. Odebrání prvku, ukázka public void pop() { if (prvni.dalsi == null) { //Pouze jeden prvek prvni = null; posledni = null; else { //Neprazdna fronta Uzel u = prvni, u_max = prvni; //Nalezeni uzlu s max klicem for(double k_max = prvni.klic, u = u.dalsi;u!=null;u=u.dalsi ) { if (u.klic >k_max) { k_max = u.klic; u_max = u; //Presmerovani odkazu u_max_prev.predch.dalsi = u_max_dalsi; u_max.dalsi.predchozi = u_max.predchozi; u_max = null; //Smazani maxima Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, IV. Přírodovědecká fakulta UK.) 10 / 18

Implementace PQ pomocí BST 9. Implementace PQ pomocí BST Výhodnější odhady složitosti pro všechny varianty u vyvážených stromů. U AVL stromů operace závisí na h, O(h) = O(1.4 log(n)). Pro degenerované stromy odhad složitosti O(N) nutné převažování stromu. Operace push() odpovídá operaci insert() v BST. Modifikace třídy Uzel: public class Uzel { int klic, hodnota; //Dvojice (klic, hodnota) Uzel levy; //Odkaz na levy podstrom Uzel pravy; //Odkaz na pravy podstrom public Uzel(double klic_, double hodnota_) klic = klic_; hodnota = hodnota_; levy = null; pravy = null; { //Konstruktor Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, IV. Přírodovědecká fakulta UK.) 11 / 18

10. Odebrání prvku Složitost O(1.4 log(n)). Implementace PQ pomocí BST Postup využívá pro nalezení uzlu u max cyklus, hledá nejpravější podstrom na nejvyšší úrovni x. Uzel u max předchůdcem uzlu u, pomocná proměnná p ukládá předchůdce uzlu u max. Postup: 1 Cyklem nalezení maxima v BST: nejpravější prvek v pravém podstromu. Uzel u=koren, u max =null; Opakuj dokud u.pravy!= null; p = u max u max = u u = u.dalsi 2 Smazání uzlu u max s obnovením rovnováhy stromu. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, IV. Přírodovědecká fakulta UK.) 12 / 18

Implementace PQ pomocí BST 11. Odebrání prvku, ukázka public void pop() { Uzel u=koren, umax=null, p = null; while (u.pravy!= null) { p = umax umax = u; u = u_dalsi; //Smaz list if ((umax.levy==null)&&(umax.pravy==null)) smazlist(u,p); //Smaz uzel 1 potomek else if(umax.levy==null umax.pravy==null) smaz1vetev(umax, p); //Smaz uzel 2 potomci else smaz2vetve(umax, p); Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, IV. Přírodovědecká fakulta UK.) 13 / 18

Implementace PQ pomocí haldy 12. Implementace PQ pomocí haldy Standardní implementace haldy, konstantní složitost operací O(log(N)). Dosahuje nejlepších výsledků, na rozdíl od BST netřeba strom převažovat. Využívána datová struktura maxheap: V kořeni maximum, nejmenší hodnoty v listech. Oproti minheapu u fixheapup() a fixheapdown() záměna < za >. Operace push(), pop() stejné jako u běžné haldy. push(): přidání prvku do haldy. pop(): odebrání kořene haldy. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, IV. Přírodovědecká fakulta UK.) 14 / 18

Implementace PQ pomocí haldy 13. Ukázka maxheapu 109 86 95 64 52 65 58 25 22 31 30 45 54 15 39 Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Dynamické geoinformatiky datové struktury a kartografie, IV. Přírodovědecká fakulta UK.) 15 / 18

Implementace PQ pomocí haldy 14. Oprava haldy nahoru Varianta pro maxheap public void fixheapup(int i) { while (i > 1 && (h[i / 2] < h[i])) { //Zamena > za < 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, IV. Přírodovědecká fakulta UK.) 16 / 18

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

Implementace PQ pomocí haldy 16. Přidání a odebrání prvku Přidání prvku do haldy: void push (double item) { n++; //Zvetseni pq o 1 h[n] = item; fixheapup(h, n); //Oprav heap nahoru do akt. pozice Odebrání kořene haldy: void pop(){ 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, IV. Přírodovědecká fakulta UK.) 18 / 18