Stín hromady - Shadow heap

v počítačová věda, a stínová hromada je slučitelná hromada datová struktura který podporuje efektivní hromadění haldy v amortizovaný smysl. Konkrétněji, hromady stínu využít algoritmus stínového sloučení k dosažení vložení do Ó (F(n)) amortizovaný čas a výmaz v Ó((log n log log n)/F(n)) amortizovaná doba pro jakoukoli volbu 1 ≤ f (n) ≤ log log n.[1]

V celém tomto článku se předpokládá, že A a B jsou binární hromady s |A| ≤ |B|.

Sloučení stínů

Sloučení stínů je algoritmus pro sloučení dvou binární hromady efektivně, pokud jsou tyto hromady implementovány jako pole. Konkrétně se doba chodu stínu sloučila na dvou hromadách a je .

Algoritmus

Chtěli bychom sloučit dvě binární hromady a . Algoritmus je následující:

  1. Zřetězte pole na konci pole získat pole .
  2. Určete stín z v ; to znamená předkové posledního uzly v které zničí vlastnost haldy.
  3. Určete následující dvě části stínu z :
    • The cesta : sada uzlů ve stínu, pro které jsou v libovolné hloubce maximálně 2 ;
    • The podstrom : zbytek stínu.
  4. Rozbalte a roztřiďte nejmenší uzly ze stínu do pole .
  5. Přeměnit jak následuje:
    • Li , poté počínaje od nejmenšího prvku v seřazeném poli postupně vkládejte každý prvek z do , nahradí je nejmenší prvky.
    • Li , poté rozbalte a roztřiďte nejmenší prvky z a sloučit tento seřazený seznam s .
  6. Vyměňte prvky do svých původních pozic v .
  7. Udělejte hromadu .

Provozní doba

Opět nechte označit cestu a označte podstrom zřetězené hromady . Počet uzlů v je maximálně dvojnásobná hloubka , který je . Navíc počet uzlů v v hloubce je maximálně 3/4 počet uzlů v hloubce , takže podstrom má velikost . Protože na každé úrovni jsou maximálně 2 uzly , pak číst nejmenší prvky stínu do seřazeného pole bere čas.

Li , pak kombinovat a stejně jako v kroku 5 výše vyžaduje čas . Jinak je čas potřebný v tomto kroku . Nakonec je hromada podstromu bere čas. To se rovná celkové době chodu pro sloučení stínů .

Struktura

Hromada stínů sestává z prahové funkce a pole pro které je implementováno obvyklé pole binární hromada vlastnost je potvrzena ve svých prvních položkách a pro kterou není vlastnost haldy nutně potvrzena v ostatních položkách. Stínová halda je tedy v podstatě binární halda sousedící s polem . Chcete-li přidat prvek do haldy stínů, umístěte jej do pole . Pokud se pole stane příliš velkým podle zadané prahové hodnoty, nejprve vytvoříme hromadu použitím Floydův algoritmus pro stavbu haldy,[2] a poté sloučit tuto hromadu s pomocí stínového sloučení. Nakonec se sloučení hromád stínů jednoduše provede postupným vložením jedné hromady do druhé pomocí výše uvedeného postupu vložení.

Analýza

Dostali jsme hromadu stínů , s prahovou funkcí jak je uvedeno výše. Předpokládejme, že prahová funkce je taková, že každá změna v nevyvolává větší změnu než v . Odvozujeme požadované hranice doby chodu pro slučitelná hromada operace pomocí potenciální metoda pro amortizovaná analýza. Potenciál hromady je vybrán jako:

Pomocí tohoto potenciálu můžeme získat požadované amortizované doby chodu:

vytvořit(H): inicializuje novou prázdnou haldu stínů

Tady potenciál se nezmění, takže amortizovaná cena za vytvoření je skutečné náklady.

vložit(X, H): vložky do stínu hromady

Existují dva případy:
  • Pokud je sloučení použito, pak pokles potenciální funkce je přesně skutečná cena sloučení a , takže amortizovaná cena je .
  • Pokud sloučení neproběhne, pak je amortizovaná cena
Volbou prahové funkce tak získáme, že amortizovaná cena vložení je:

delete_min (H): odstraní prvek minimální priority z

Nalezení a odstranění minima vyžaduje skutečný čas . Kromě toho se potenciální funkce může po tomto smazání zvýšit pouze v případě, že hodnota klesá. Podle volby , máme, že amortizovaná cena této operace je stejná jako skutečná cena.

Související algoritmy a datové struktury

Naivní algoritmus sloučení binárních hald spojí dvě hromady a včas jednoduchým zřetězením obou hromad a vytvořením hromady z výsledného pole pomocí Floydův algoritmus pro stavbu haldy. Alternativně lze hromady jednoduše sloučit postupným vkládáním každého prvku do , čas .

Pytel a Strothotte navrhl algoritmus pro sloučení binárních hromad v čas.[3] Je známo, že jejich algoritmus je efektivnější než výše popsané druhé naivní řešení, když . Stínové sloučení funguje asymptoticky lépe než jejich algoritmus, a to i v nejhorším případě.

Existuje několik dalších hromad, které podporují rychlejší časy sloučení. Například, Fibonacci se hromadí lze sloučit do čas. Protože binární hromady vyžadují čas na sloučení,[4] sloučení stínů zůstává účinné.

Reference

  1. ^ Kuszmaul, Christopher L. (2000). Efektivní operace sloučení a vložení pro binární hromady a stromy (PDF) (Technická zpráva). Pokročilá superpočítačová divize NASA. 00-003.
  2. ^ Suchenek, Marek A. (2012), „Základní a přesto přesná nejhorší analýza programu výstavby haldy Floyd“, Fundamenta Informaticae, IOS Press, 120 (1): 75–92, doi:10.3233 / FI-2012-751
  3. ^ Sack, Jörg-R .; Strothotte, Thomas (1985), „Algoritmus pro slučování hromad“, Acta Informatica, Springer-Verlag, 22 (2): 171–186, doi:10.1007 / BF00264229.
  4. ^ Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L. (1990). Úvod do algoritmů (1. vyd.). MIT Press a McGraw-Hill. ISBN  0-262-03141-8.