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

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

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

Stromy, haldy, prioritní fronty

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

TGH07 - Chytré stromové datové struktury

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

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

TGH05 - Problém za milion dolarů.

Prioritní fronta, halda

Datové struktury. alg12 1

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

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

Algoritmy a datové struktury

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

Abstraktní datové typy FRONTA

Algoritmy na ohodnoceném grafu

Dynamické datové struktury IV.

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

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

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

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

Použití dalších heuristik

Konstruktory a destruktory

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

Dynamické datové struktury I.

Algoritmizace prostorových úloh

Radek Mařík

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

TGH06 - Hledání nejkratší cesty

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

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

ABSTRAKTNÍ DATOVÉ TYPY (ADT)

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

Základní datové struktury

Algoritmizace prostorových úloh

Binární vyhledávací stromy

Radomíra Duží L Datový typ množina

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

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

Datové struktury Úvod

Abstraktní datové typy

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í

Rekurzivní algoritmy

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

Implementace LL(1) překladů

Úvod do teorie grafů

TGH06 - Hledání nejkratší cesty

UNIVERZITA PARDUBICE DIPLOMOVÁ PRÁCE

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

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

1. Binomiální haldy Zavedení binomiální haldy

Datové struktury 1: Základní datové struktury

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

Dynamické datové struktury III.

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

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

Algoritmy výpočetní geometrie

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

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

STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach fronta

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

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

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

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

Homer. prvky. délka. přední 0 zadní 4. Použití fronty BUS STOP. 3 Lisa. 2 Bart. 4 Maggie. 1 Marge. Grafické znázornění předchozí animace:

Datové typy a struktury

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

TGH09 - Barvení grafů

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

Lineární datové struktury

6. Tahy / Kostry / Nejkratší cesty

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

TGH08 - Optimální kostry

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

1. Binomiální haldy Zavedení binomiální haldy

Časová a prostorová složitost algoritmů

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

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

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

Výroková a predikátová logika - II

Co když chceme najít i druhý nejmenší prvek? Nebo co když chceme najít k

a) b) c) Radek Mařík

prioritu a vždy je třeba začít pracovat na úkolu, který ma v daný okamžik

Algoritmizace a programování

Datové struktury - haldy a třídicí algoritmy

Vzdálenost uzlů v neorientovaném grafu

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

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.

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í

10. Složitost a výkon

Spojový seznam. Jan Kybic.

Matice sousednosti NG

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

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.

Datové struktury I NTIN066

Výroková a predikátová logika - IV

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

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

Algoritmy I, složitost

Transkript:

ADT prioritní fronta Haldy množina M operace Přidej(M,x) přidá prvek x do množiny M Odeber(M) odeber z množiny M prvek, který je na řadě Zásobník (LIFO), Fronta (FIFO) Prioritní fronta: Přidej(M,x) přidá prvek x do množiny M Min(M) vrátí ukazatel na prvek v M s minimálním klíčem OdeberMin(M) vrátí ukazatel na prvek s minimálním klíčem, a navíc odebere tento prvek z M 2 Binární halda implementace prioritní fronty (binární) halda 5 7 6 5 7 6 9 8 15 11 16 14 10 9 8 15 11 16 14 10 Další operace nad haldou SníženíKlíče(M,x,k) Vymaž(M,x) nová operace: sníží hodnotu klíče prvku x v M na k odstraní prvek x z M Sjednocení(M 1,M 2 ) vytvoří novou množinu M 1 M 2 množiny M 1 a M 2 jsou odstraněny slučovatelná halda 4 Časová složitost jednotlivých operací Binomické stromy Binomický strom řádu k (k 0) operace binární halda (nejhorš í přípa d) binomická halda (nejhorš í případ) Fibonacciho halda (amortizovaná složitost) Přidej Θ(log n) Θ(log n) Θ(1) Min Θ(1) Θ(log n) Θ(1) OdeberMin Θ(log n) Θ(log n) Θ(log n) Sjednocení Θ(n) Θ(log n) Θ(1) SníženíKlíče Θ(log n) Θ(log n) Θ(1) Vymaž Θ(log n) Θ(log n) Θ(log n) B 0 1 1 1 B 2 B 1 B 0 5 6

Vlastnosti binomického stromu Věta: Binomický strom obsahuje právě 2 k vrcholů ; má výšku k ; k i má právě vrcholů na ité úrovni pro i = 0,1,,k ; kořen má k synů, přičemž itý syn zprava (pro i=0,1,,k1) je kořenem podstromu B i. Binomická halda spojový seznam binomických stromů s ohodnocenými vrcholy splňující jeli x otcem y, pak ohodnocení(x) ohodnocení(y) pro každé k 0 se strom vyskytuje v haldě nejvýše jedenkrát stromy jsou uspořádány dle řádu (v rostoucí posloupnost) Příklad: M={1,6,8,10,11,,14,,,,27,29,8} 10 1 6 8 14 29 11 8 7 27 8 Implementace binomické haldy hlava 10 0 p klíč stupeň syn 1 0 0 bratr prvek x otec(x) na otce syn(x) na nejlevějšího syna bratr(x) na bratra stupeň(x) počet synů klíč(x) klíč prvku x Sjednocení Sjednocení(H 1, H 2 ) vytvoř prázdnou haldu H hlava(h) := HeapMerge(H 1,H 2 ) (* slévání spojových seznamů H 1 a H 2. Ve výsledném seznamu budou binomické stromy uspořádány v neklesající posloupnost dle řádu *) if hlava(h) = NIL then return H else předchozí := NIL; x := hlava(h) ; další := bratr(x) while další NIL do 9 10 a b c d a b c d 1 B l <l l a b c d a b d c k<l klíč(x) klíč(další) B l Bk+1 B l } a b c d a b c d 2 a b c d a c d 4 b k<l klíč(x) > klíč(další) B l Bk+1 B l } 11 od.

Operace Přidej a OdeberMin Operace Min, SníženíKlíče a Vymaž Přidej(H,x) vytvoř haldu H obsahující jediný prvek x H := Sjednocení(H,H ). OdeberMin(H) ve spojovém seznamu H najdi vrchol x s min. klíčem a vyjmi ho ze seznamu vytvoř prázdnou haldu H ulož syny vrcholu x do seznamu v inverzním pořadí a hlavu seznamu ulož do hlava(h) H := Sjednocení(H,H ) return x. Min(H) prohledej spojový seznam kořenů binomických stromů, na nějž ukazuje hlava(h) return prvek s minimálním klíčem. SníženíKlíče(H,k,x) if k > klíč(x) then error else klíč(x) := k ; y := x ; z := otec(y) ; while z NIL and klíč(y) < klíč(z) do y z ; y := z ; z := otec(y) od. Vymaž(H,x) SníženíKlíče(H,x, ) OdeberMin(H). 1 14 Fibonacciho halda Implementace Fibonacciho haldy 2 7 prvek x 52 8 9 41 2 7 0 26 46 5 otec(x) na otce, syn(x) na syna levy(x), pravy(x) na bratra stupeň(x) počet synů znacka(x) Booleovská položka; určuje, zda x ztratil syna od chvíle, kdy se stal synem svého současného otce halda H 52 8 0 26 46 min(h) na kořen stromu s min klíčem n(h) počet prvků v haldě 9 41 5 Položme D(n) = max {stupeň(x) x H, H je Fibonacciho halda o n prvcích} 15 16 Operace Přidej Sjednocení VytvořFibHaldu(H) min(h) := NIL; n(h) := 0. Přidej(H,x) stupeň(x) := 0; otec(x):=syn(x):=nil; levy(x):=pravy(x):=x; znacka(x):=false; uloz x do seznamu H ; if min(h) = NIL or klíč(x) < klíč(min(h)) then min(h) := x n(h)++. Sjednocení(H 1,H 2 ) VytvořFibHaldu(H); min(h) := min(h 1 ) ; zřetěz seznamy H 2 a H if (min(h 1 )=NIL) or (min(h 2 )<>NIL and min(h 2 )<min(h 1 )) then min(h):=min(h 2 ) n(h):=n(h 1 ) + n(h 2 ) ; dealokuj paměť pro H 1 a H 2 return H.

Odebrání minimálního prvku OdeberMin(H) z := min(h); if z<>nil then forall syny x vrcholu z do vlož x do seznamu H otec(x) := NIL od vyjmi z ze seznamu H if z=pravy(z) then min(h):=nil else min(h):=pravy(z); Konsolidace(H) n(h) return z. Pomocná operace spojení stromů Link(H,y,x) vyjmi y ze seznamu H připoj y k vrcholu x jako nového syna; stupeň(x)++ znacka(y) := FALSE. 19 20 Konsolidace Konsolidace dokončení Konsolidace(H) for i:=0 to D(n(H)) do A[i]:=NIL od forall vrchol w v seznamu H do x := w; d := stupeň(x); while A[d]<>NIL do y := A[d]; if klíč(x)>klíč(y) then x <> y Link(H,y,x); A[d] := NIL; d++ od A[d] := x od min(h) := NIL; for i:=0 to D(n(H)) do if A[i] <> NIL then přidej A[i] do seznamu if min(h)=nil or klíč(a[i])<klíč(min(h)) then min(h):=a[i] od. 21 22 Snížení klíče SníženíKlíče(H,x,k) if k>klíč(x) then error novy klic > aktualni klic klíč(x):=k ; y := otec(x); if y<>nil and klíč(x) < klíč(y) then Řez(H,x,y); KaskádovýŘez (H,y) if klíč(x) < klíč(min(h)) then min(h):=x. 2 Pomocné operace řez & kaskádový řez Řez(H,x,y) odstraň x ze seznamu synů vrcholu y; stupeň(y)++; přidej x do seznamu H otec(x):=nil; znacka(x):=false. KaskádovýŘez(H,y) z:= otec(y); if z<>nil then if znacka(y)=false then znacka(y):=true else Řez(H,y,z); KaskádovýŘez(H,z).

Literatura J.Vuillemin: A data structure for manipulation priority queues. Comm. ACM 21(1978), 0915. M.L.Fredman, R.E.Tarjan: Fibonacci heaps and their uses in improved network optimization algorithms. J. ACM 4(1987), 596615.