Halda (datová struktura)


V informatice je halda specializovaná datová struktura stromového typu ,  která splňuje vlastnost haldy : pokud B je podřízený uzel uzlu A , pak key( A ) ≥ key( B ). Z toho vyplývá, že prvek s největším klíčem je vždy kořenový uzel haldy, takže někdy se takové haldy nazývají max-heaps (alternativně, pokud je srovnání obráceno, nejmenším prvkem bude vždy kořenový uzel, takové haldy se nazývají min-hromady ). Neexistuje žádné omezení, kolik podřízených uzlů má každý uzel haldy, i když v praxi tento počet obvykle není větší než dva. Halda je nejúčinnější implementací abstraktního datového typu nazývaného prioritní fronta . Hromady jsou klíčové v některých efektivních grafových algoritmech , jako je Dijkstrův algoritmus pro d-hromady a heapsort .

Struktura dat haldy by neměla být zaměňována s konceptem haldy v dynamické alokaci paměti . Termín byl poprvé použit speciálně pro datové struktury. Některé rané populární programovací jazyky, jako je LISP , poskytovaly dynamickou alokaci paměti pomocí datové struktury „haldy“, která dala jméno přidělenému množství paměti. [1] .

Haldy jsou obvykle implementovány jako pole, což eliminuje potřebu ukazatelů mezi jejími prvky.

Na hromadách se obvykle provádějí následující operace:

Možnosti

Srovnání teoretických odhadů variant

Níže jsou uvedeny odhady časové složitosti výpočtů pro operace na určitých typech hald. [1] Je- li hodnota označena hvězdičkou, je odhad založen na analýze amortizace (nejhorší doba), jinak je odhad běžný nejhorší případ. O(F) udává asymptotickou horní hranici a Θ(F) je asymptoticky přesný odhad (viz označení „O“ velké a „o“ malé ). Názvy operací jsou vybrány pro min-hromadu.

(*) Doba amortizace
(**) Kde n je velikost největší haldy

Všimněte si, že "Brodalova fronta" je implementací paralelní prioritní fronty vyvinuté skupinou vedenou Gertem Brodalem. [3]

Aplikace

Datové struktury haldy mají mnoho využití.

Kompletní a téměř kompletní binární haldu lze reprezentovat velmi efektivním způsobem pomocí indexového pole . První (nebo poslední) prvek bude obsahovat kořen. Další dva prvky pole obsahují podřízené uzly kořene. Další čtyři prvky obsahují čtyři potomky ze dvou uzlů, které jsou potomky kořene atd. Potomci uzlu úrovně nbudou tedy umístěni na pozicích 2na 2n+1pro pole indexované z jednoho nebo na pozicích 2n+1a 2n+2pro pole indexované od nuly. To vám umožňuje pohybovat se ve stromu nahoru nebo dolů pomocí jednoduchých výpočtů indexu pole. Vyvažování haldy se provádí přeskupením prvků, které jsou mimo provoz. Protože můžeme vytvořit haldu pomocí pole bez další paměti (například pro uzly), můžeme použít heapsort k seřazení pole na místě.

Implementace

Viz také

Poznámky

  1. 1 2 3 Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest (1990): Úvod do algoritmů. MIT Press / McGraw-Hill.
  2. Iacono, John (2000), Vylepšené horní hranice pro párování hromad , Proc. 7th Scandinavian Workshop on Algorithm Theory , sv. 1851, Poznámky k přednáškám z informatiky, Springer-Verlag, s. 63–77 , DOI 10.1007/3-540-44985-X_5 
  3. Paralelní prioritní fronta s operacemi s konstantním časem , < http://www.ceid.upatras.gr/faculty/zaro/pub/jou/J9-JPDC-pq.pdf > Archivováno 26. července 2011 na Wayback Machine 
  4. Frederickson, Greg N. (1993), Optimal Algorithm for Selection in a Min-Heap , Information and Computation , sv. 104, Academic Press, s. 197–214, doi : 10.1006/inco.1993.1030 , < http://ftp.cs.purdue.edu/research/technical_reports/1991/TR%2091-027.pdf > Archivováno 3. prosince 2012 na Wayback Machine 
  5. Python heapq . Získáno 31. května 2011. Archivováno z originálu 18. října 2012.
  6. Perl Heap