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



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

Stromy, haldy, prioritní fronty

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

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

Prioritní fronta, halda

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

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

Dynamické datové struktury III.

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

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

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

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

PQ-stromy a rozpoznávání intervalových grafů v lineárním čase

TGH07 - Chytré stromové datové struktury

TGH07 - Chytré stromové datové struktury

PŘEDNÁŠKA 2 POSLOUPNOSTI

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

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

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

Stromové rozklady. Definice 1. Stromový rozklad grafu G je dvojice (T, β) taková, že T je strom,

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

Algoritmizace prostorových úloh

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

Datové struktury Úvod

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

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

Časová složitost algoritmů

5 Orientované grafy, Toky v sítích

Algoritmy I, složitost

Dynamické datové struktury IV.

Báze a dimenze vektorových prostorů

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

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

2. přednáška 8. října 2007

Složitosti základních operací B + stromu

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.

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

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

které je z různých pohledů charakterizují. Několik z nich dokážeme v této kapitole.

3. Prohledávání grafů

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

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

Konstrukce relace. Postupně konstruujeme na množině všech stavů Q relace i,

Padovan heaps Vladan Majerech

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

1. Vyhledávací stromy

Algoritmizace složitost rekurzivních algoritmů. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Dijkstrův algoritmus

8. Geometrie vrací úder (sepsal Pavel Klavík)

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.

ALGORITMY A DATOVÉ STRUKTURY

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

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

Základy algoritmizace a programování

Mimo samotné správnosti výsledku vypočteného zapsaným algoritmem je ještě jedno

Zpracoval: 7. Matematická indukce a rekurse. Řešení rekurentních (diferenčních) rovnic s konstantními koeficienty.

7. Geometrické algoritmy (sepsal Pavel Klavík)

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

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

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

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

Maturitní téma: Programovací jazyk JAVA

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

TGH05 - Problém za milion dolarů.

Ukážeme si lineární algoritmus, který pro pevné k rozhodne, zda vstupní. stromový rozklad. Poznamenejme, že je-li k součástí vstupu, pak rozhodnout

15. Moduly. a platí (p + q)(x) = p(x) + q(x), 1(X) = id. Vzniká tak struktura P [x]-modulu na V.

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

10 Přednáška ze

1. Minimální kostry Od mìsteèka ke kostøe

Texty k přednáškám z MMAN3: 4. Funkce a zobrazení v euklidovských prostorech

Modely Herbrandovské interpretace

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

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

3. přednáška 15. října 2007

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

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

Principy indukce a rekurentní rovnice

Kapitola 1. Úvod. 1.1 Značení. 1.2 Výroky - opakování. N... přirozená čísla (1, 2, 3,...). Q... racionální čísla ( p, kde p Z a q N) R...

4 Stromy a les. Definice a základní vlastnosti stromů. Kostry grafů a jejich počet.

Algoritmus pro hledání nejkratší cesty orientovaným grafem

Úvod do problematiky

Algoritmy na ohodnoceném grafu

63. ročník Matematické olympiády 2013/2014

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

10. Vektorové podprostory

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

Přednáška 3: Limita a spojitost

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

O dynamickém programování

zejména Dijkstrův algoritmus pro hledání minimální cesty a hladový algoritmus pro hledání minimální kostry.

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

Lineární algebra Kapitola 1 - Základní matematické pojmy

Matematická logika. Rostislav Horčík. horcik

2 Důkazové techniky, Indukce

Algoritmizace. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

H {{u, v} : u,v U u v }

V předchozí kapitole jsme podstatným způsobem rozšířili naši představu o tom, co je to číslo. Nadále jsou pro nás důležité především vlastnosti

Základy teorie množin

Sada 1 - Základy programování

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

Transkript:

1. Binární halda Uvažme následující problém ze života: jsme velmi vytíženým manažerem, kterému se plánovací diář stále plní obrovským množstvím úkolů. Každý úkol má předepsanou prioritu a vždy je třeba začít pracovat na úkolu, který ma v daný okamžik nejvyšší prioritu. Úkoly tedy průběžně přibývají a jsou zpracovávány a odstraňovány ze seznamu. Pro řádově desítky úkolů je asi zvládnutelné je prostě nějak zapsat a při odebírání vyhledat ten s nejvyšší prioritou. Pro tisíce nebo biliony úkolů je takový postup těžko představitelný. V následujícím textu popíšeme datovou strukturu, která nejen že bude schopná efektivně vyřešit manažerský problém, nýbrž bude mít podstatně širší využití. 1.1. Denice binární haldy Halda je datová struktura uchovávající množinu N porovnatelných prvků (v našem případě pro názornost celých čísel) ve vrcholech binárního stromu splňujícího jisté speciální vlastnosti. Vrcholy odpovídají různým prvkům, pojmem hodnota vrcholu v (značeno h(v)) rozumíme prvek ve vrcholu v uložený. Haldu přesně zavedeme v následující definici. Definice: Minimová halda je datová struktura uchovávající množinu N porovnatelných prvků ve vrcholech binárního stromu T, který: 1 má všechny hladiny plně obsazené, s výjimkou poslední, 2 v poslední hladině jsou všechny listy nalevo, 3 pro každý vrchol v T a jeho (až) dva syny l a r platí h(v) h(l) a h(v) h(r); tomuto axiomu říkáme haldová podmínka. 3 5 19 72 8 42 21 95 83 11 16 54 Obr. 1.1: Příklad haldy pro N = 12. Podotýkáme, že podmínka 3 se vztahuje pouze na relaci mezi otcem a syny a nic neříká a relaci mezi levým a pravým synem. Má smysl zavést též maximovou haldu, jejíž definice je naprosto stejná, pouze s opačnými relacemi v axiomu 3. Všechno, co v této kapitole ukážeme pro minimovou haldu platí i pro maximovou haldu, avšak s opačnými relacemi. 1 2014-11-03

Shrňme jednoduché vlastnosti haldy. Pozorování: Nechť T je minimová halda s N prvky. Potom 1 má k = log 2 N + 1 = O(log N) hladin, 2 každá cesta v T z kořene do listu obsahuje neklesající posloupnost prvků reprezentované množiny, 3 globální minimum reprezentované množiny je uloženo v kořeni T a je tedy přístupné v konstantním čase. Důkaz: Vlastnost 1 plyne z vlastností vyvážených binárních stromů, které mají O(log N) hladin. Vlastnost 2 je důsledkem haldové podmínky, která platí pro každý vrchol T ; indukcí snadno nahlédneme platnost pro libovolně dlouhou cestu z kořene T. Vlastnost 3 je důsledkem vlastnosti 2. Implementace haldy v poli Pozorný čtenář jistě postřehl, že jsme zatím k ničemu nevyužili axiom 2 definice haldy. Tento axiom skutečně pro všechny algoritmy nad haldou není nutný, vynikne však při jednoduché implementaci haldy v poli, jak nyní ukážeme. Prvky haldy očíslujeme od 1 do N postupně po jednotlivých hladinách shora dolů a v hladině zleva doprava. Prvek číslo i umístíme do pole na index i. Díky axiomu 2 je pole souvisle zaplněné. Všimněme si, že s tímto očíslováním je pro prvek na indexu i jeho otec na indexu i/2, jeho levý syn na indexu 2i, a jeho pravý syn na indexu 2i + 1. Kořen haldy tedy patří na index 1, znamená to tedy, že index 0 je v programovacích jazycích číslujících pole od 0 nevyužit. Můžeme ho však využít k zjednodušení některých algoritmů pro techniku zarážky. Poznamenejme také, že pokud dopředu neznáme počet prvků v haldě uložených, můžeme použít nafukovací pole, které umí přidávat nové prvky v amortizovaném čase O(1). Implementace haldy v poli je jednoduchá, kompaktní, velice šikovná a rychlá. Algoritmy však přesto budeme popisovat pro uložení haldy ve stromu, protože je to o něco názornější. 1.2. Operace s haldou Jak již bylo zmíněno, halda nabízí pohodlný přístup k nejmenšímu prvku v konstantním čase. Oproti tomu časová složitost vkládání a mazání prvků bude horší (dokonce to je nevyhnutelné, jak časem dokážeme). Uvedeme nejdříve přehledovou tabulku podporovaných operací spolu s jejich časy. 2 2014-11-03

Operace Čas Komentář HeapInsert Θ(log N) Vloží nový prvek. HeapGetMin Θ(1) Vrátí minimum reprezentované množiny. HeapExtractMin Θ(log N) Vrátí a odstraní minimum množiny. HeapBuild Θ(N) Postaví z N prvků haldu. HeapChangeKey Θ(log N) Změní hodnotu klíče prvku. HeapDelete Θ(log N) Smaže prvek. Operace HeapInsert, HeapGetMin, HeapExtractMin a HeapBuild popisujeme v tomto textu. Operace HeapChangeKey a HeapDelete ponecháváme čtenáři jako cvičení 1.5.2 a 1.5.3. Nejjednodušší operací je HeapGetMin, který také nevyžaduje hlubšího vysvětlování prostě vrátíme hodnotu uloženou v kořeni stromu haldy, což zvládneme za čas O(1). Vkládání do haldy Při vkládání v poslední hladině haldy vytvoříme nový list, a to samozřejmě dle definice haldy na první volné pozici zleva. Do tohoto listu uložíme přidávaný prvek. Používáme značení v pro vrchol obsahující nově přidávaný prvek a p(v) pro otce vrcholu v. Nyní hrozí, že některý z axiomů haldy neplatí, konkrétně haldová podmínka, protože by mohl otec p(v) mít vyšší klíč než v. V takovém případě mezi sebou prohodíme obsah v a p(v). Pokud stále není splněna haldová podmínka, provádíme opět prohození v s p(v), a to tak dlouho, až buďto haldová podmínka začala platit nebo s nový prvek dostal až do kořene stromu. Všimněme si, že prohazováním v a p(v) se nemůže porušit haldová podmínka mezi druhým synem r vrcholu p(v) a mezi v: již před prohozením byl klíč r větší než klíč jeho otce, výměnou za ještě menší prvek jsme tudíž nemohli poškodit haldovou podmínku. Z vlastností zmíněného prohazovacího postupu vyplývá, že se vykoná nejvýše tolik operací, kolik je výška stromu haldy. Z toho plyne i odhad Θ(log N) časové složitosti pro HeapInsert do N-prvkové haldy. Algoritmus HeapInsert Vstup: Halda H, vkládaný prvek x. Výstup: Upravená halda H. 1. Pokud je poslední hladina H plně zaplněná, založ novou hladinu. 2. Do poslední hladiny přidej na první volnou pozici zleva nový list l obsahující x. 3. v l 4. Dokud v není kořen a je h(p(v)) > h(v): 5. Prohoď obsah v a p(v). 6. v p(v) 3 2014-11-03

Odstranění minima Při odstraňování minima nejprve přesuneme prvek uložený v nejpravějším listu l poslední hladiny do kořene a l zrušíme. Tím jsme sice zrušili minimální prvek, nicméně v koření teď nejspíš bude porušená haldová podmínka. To vyřešíme podobným prohazovacím způsobem jako v Insertu, tentokrát však směrem shora dolů. Při zabublání dolů musíme dát pozor na jednu věc. Zatím co směrem vzhůru jsme prvek porovnávali jen s otcem, opačným směrem se můžou nacházet až dva synové. Pravidlo, které nám vybere správného syna na porovnání, je jednoduché. Prvek vždy porovnáváme a poté případně i prohazujeme s menším z obou synů. Kdybychom ho prohodili s větším synem, došlo by k další poruše haldové podmínky, protože by se větší syn stal otcem menšího. Algoritmus HeapExtractMin Vstup: Halda H. Výstup: Upravená halda H. 1. Do kořene H přesuň obsah nejpravějšího listu l poslední hladiny. 2. Zruš l. 3. v kořen H 4. Dokud má v syny: 5. s menší z obou synů (Při pouze jednom synovi je to snazší.) 6. Pokud h(s) h(v), skončí cyklus. 7. Prohoď obsah v a s. 8. v s V nejhorším případě se může stát, že náhradní prvek, který jsme si půjčili z konce haldy, bude zabublávat až zpátky na poslední hladinu. Počet operací je tedy opět přímo úměrný výšce stromu a celková složitost bude Θ(log N). Postavení haldy Nyní popíšeme, jak z neuspořádané množiny N prvků postavit korektní haldu. Máme na to dokonce už dostatek nástrojů: zavoláme N-krát operaci HeapInsert postupně na každý prvek, což tedy celkem za čas Θ(N log N) haldu vyrobí. Ukážeme nyní, že existuje, poněkud překvapivě, rychlejší algoritmus na stavbu haldy, který pracuje pouze v čase Θ(N). Nejprve vyrobíme N-vrcholový strom T dle podmínek tvaru haldy (axiomy 1 a 2) a do jeho vrcholů jednoduše bez dalšího uspořádání nějak nakopírujeme vstupní prvky. Všimněme si, že každý izolovaný vrchol v nejspodnější hladině T je vlastně korektní halda pro jednoprvkové stromy skutečně musí platit haldová podmínka. Zadíváme se nyní na předposlední hladinu T a bereme v úvahu izolované stromy, jejichž kořeny jsou vrcholy této hladiny ty mají 2 hladiny. Zde již nebude triviálně platná haldová podmínka, budeme ji muset ručně obnovit. To však je stejný problém, jaký jsme již řešili v operaci HeapExtractMin, kdy jsme do kořene haldy 4 2014-11-03

přesunuli jiný prvek, který jsme potom museli prohazováním zabublávat dolů. Stejný zabublávací postup nyní tedy spustíme na každý vrchol předposlední hladiny T, což ve výsledku vyrobí korektní dvouhladinové haldičky v předposledním hladině. Naprosto stejný postup můžeme nyní aplikovat i pro třetí hladinu stromu T, pak na čtvrtou nejnižší, a tak dále, až ve výsledku na kořen stromu T, což ve výsledku ze stromu T postaví korektní haldu. (Matematicky založený čtenář si může korektnost algoritmu dokázat formálně matematickou indukcí dle výšky stromu T.) Této operaci stavění haldy budeme říkat HeapBuild. Zanalyzujeme nyní časovou složitost operace HeapBuild. K tomu si uvědomíme, že čas potřebný na korekci haldové podmínky porušené v kořeni haldy výšky h je Θ(h). Dále, počet prvků poslední hladiny stromu T odhadneme shora N, počet prvků předposlední hladiny je nejvýše N/2, předpředposlední N/4, a tak dále, obecně k-tá hladina odspodu obsahuje jistě nejvýše N/2 k 1 vrcholů. Protože stavbu haldy dle předchozího odstavce stačí zahájit od předposlední hladiny, dostáváme řádový horní odhad na počet operací N 2 1 + N 4 2 + N 8 3 +... + N log 2 N N log 2 N N i=1 i 2 i N Pro analýzu poslední sumy nyní můžeme využít poznatků z matematické analýzy a použitím například podílového kritéria pro konvergenci řad ukázat, že suma i=1 i 2 i konverguje, což tedy dává odhad O(N) na počet operací. (Čtenáře odkážeme na cvičení 1.5.7, aby součet řady spočetl přesně.) Výsledná analýza časové složitosti Θ(N) plyne z toho, že vstupních N prvků musíme alespoň přečíst. Algoritmus HeapBuild Vstup: Prvky p 1,..., p N. Výstup: Halda H. i=1 i 2 i. 1. Postav N-vrcholový strom T dle axiomů haldy 1 a 2. 2. Do vrcholů T libovolně zapiš prvky p 1,..., p N. 3. Pro hladinu h postupně od druhé nejnižší až ke kořenové: 4. Pro každý vrchol v hladiny h: 5. Dokud má v syny opakuj: 6. s menší z obou synů (Při pouze jednom synovi je to snazší.) 7. Pokud h(s) h(v), skončí vnitřní cyklus. 8. Prohoď obsah v a s. 9. v s 10. Vrať strom T jako korektní haldu H. Poznamenejme, že zejména u operace HeapBuild vynikne jednoduchost implementace haldy pomocí pole (což čtenáři doporučujeme vyzkoušet ve cvičení 1.5.1), protože není třeba složitě rozlišovat, do které hladiny určitý vrchol T patří. 5 2014-11-03

1.3. Tøídíme haldou Třídění haldou (HeapSort) patří mezi klasická vylepšení přímých třídících metod, konkrétně Selectsortu popsaného v kapitole o třídění. Selectsort postupně budoval setříděné pole tak, že v každém kroku vybral z dosud nepoužitých prvků minimum a připojil ho na konec setříděné posloupnosti. A právě na tento výběr by se nám mohla velice hodit halda. Je poněkud nešikovné, když třídicí algoritmus potřebuje větší množství pomocné paměti, a proto se pokusíme haldu postavit a udržovat přímo v tříděném poli. V každém kroku pak odebereme z haldy minimum. Tím se nám halda přirozeně zmenší a na svém konci uvolní jednu pozici v poli, kam můžeme odebrané minimum umístit. Na konci, když se halda úplně vyprázdní, nám zůstanou jen sestupně setříděné prvky. halda setříděná část 11 16 19 72 54 42 21 95 83 8 5 3 Algoritmus HeapSort Vstup: Pole P [1... N]. Výstup: Setříděné pole P. Obr. 1.2: Halda v poli při třídění 1. V poli P postavíme maximovou haldu. 2. Pro i jdoucí od N do 2 opakujeme: 3. x P [1] (Dočasně podržíme maximum.) 4. ExtractMax(P [1... i]) (Smažeme maximum z i-prvkové haldy.) 5. P [i] x Pokud bychom chtěli prvky třídit vzestupně, máme několik možností. Samozřejmě bychom mohli reprezentaci haldy v poli otočit, takže kořen by byl na pozici N (místo 1), ale existuje i jednodušší způsob místo minimové haldy pracovat s haldou maximovou. Použitím maximové haldy zajistíme, že se prvky budou ukládat od největších a výsledné pole bude tedy setříděné sestupně. Nyní se podívejme na časovou složitost. Sestavení haldy nám zabere Θ(N), ale to provádíme jen jednou na začátku. Algoritmus má N 1 kroků a v každém z nich provádíme operaci odebrání ExtractMax, které trvá čas Θ(log N), takže celková složitost bude Θ(N + N log N) = Θ(N log N). 1.4. Dolní odhad slo¾itosti HeapExtractMin Dosud jsme nepoložili otázku, zda náhodou výše popsané operace nejdou ještě nějak podstatně urychlit. Ukážeme, že pokud opravdu trváme na zachování axiomů 6 2014-11-03

haldy po skončení každé operace, námi uvedený HeapExtractMin je nejrychlejší možný. Tvrzení: Nechť H je N-prvková binární halda. Potom každá korektní operace odebrání minima z haldy musí mít časovou složitost Ω(log N). Důkaz: Předpokládejme pro účely sporu, že existuje nějaký asymptoticky rychlejší algoritmus M na odstranění minima, který má časovou složitost O(f(N)), kde f(n) log N. Zkonstruujeme nyní následující třídící algoritmus na třídění libovolných prvků p 1,..., p N : pomocí operace HeapBuild sestavíme ze vstupních prvků korektní minimovou haldu a poté z ní algoritmem M postupně odebíráme minima, která vypisujeme na výstup. Tento algoritmus zjevně korektně třídí. Jeho složitost se skládá z O(N) za operaci HeapBuild a O(N f(n) za N volání algoritmu M. To však znamená, že jsme právě sestrojili třídící algoritmus s lepší časovou složitostí než O(N log N), neboť Nf(N) N log N. To je spor s dolním odhadem složitosti třídění, takový třídící algoritmus nemůže existovat a tedy nemůže existovat ani takový algoritmus M na odebírání minima z haldy. 1.5. Obecné d-regulární haldy Halda, kterou jsme představili, není pochopitelně jedinou strukturou, která umí rychle mazat minimum. Kromě komplikovanějších struktur jako jsou Binomiální a Fibonacciho haldy, se kterými se seznámíme v následujících kapitolách, můžeme lehce rozšířit i definici binární haldy na něco obecnějšího. Definice: d-regulární halda je datová struktura uchovávající množinu N porovnatelných prvků ve vrcholech d-árního (d > 1 přirozené) stromu T, který: 1 splňuje, že každý vrchol v T má maximálně d následníku, 2 má všechny hladiny plně obsazené, s výjimkou poslední, 3 v poslední hladině jsou všechny listy nalevo, 4 pro každý vrchol v T a jeho syny s 1,..., s d platí h(v) h(s i ) pro i = 1,..., d. Binární strom je tedy vlastně speciálním případem (2-ární strom) a halda, o které jsme mluvili doposud, se celým jménem nazývá 2-regulární halda. Všechny vlastnosti obecných d-regulárních hald jsou analogické vlastnostem klasické binární haldy. Výrazně se liší pouze svou výškou, protože úplný d-ární strom má log d N + 1 hladin. Časová složitost vkládání závisí pouze na výšce této haldy a je tedy rovna Θ(log d N). Operace vypouštění minima zároveň potřebuje v každém kroku vybrat nejmenšího syna. Složitost bude tedy Θ(d log d N). Parametr d nám poskytuje určitou možnost ladění a zvýhodnění složitosti vkládání oproti odebírání minima, pokud to aplikace žádá. V extrémním případě, pro d = O(N), bude vkládání probíhat v konstantním čase, ale odebrání minima nám zabere O(N). 7 2014-11-03

Toto rozšíření definice zde uvádíme pouze pro úplnost. Budeme-li dále mluvit pouze o haldě, budeme mít na mysli klasickou 2-regulární haldu, pokud nebude výslovně uvedeno jinak. Cvičení: 1. Napište všechny výše uvedené algoritmy pro haldu reprezentovanou v poli. 2. Navrhněte operaci HeapChangeKey(H, x, ), kde H je halda, x ukazatel na prvek v haldě a změna hodnoty klíče prvku x, která změní hodnotu klíče x od a pochopitelně zanechá haldu H v korektním stavu. Jakou bude mít časovou složitost? 3. Navrhněte operaci HeapDelete(H, x), kde H je halda a x ukazatel na prvek v haldě, která z haldy smaže prvek x. Jakou bude mít časovou složitost? 4. Prvky klasické haldy umíme uspořádat do pole tak, že první prvek bude kořen a prvek na pozici i bude mít syny na pozicích 2i a 2i+1. Jak byste vhodně poskládali ternární (3-regulární) a obecnou d-regulární haldu do pole indexovaného od 1? 5. Rozmyslete, jaké vlastnosti by měla 1-regulární halda. 6. Navrhněte, jak d-regulární haldu reprezentovat v poli. 7. Dokažte, že i=1 i/2i = 2. 8 2014-11-03