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í:
- Zřetězte pole na konci pole získat pole .
- Určete stín z v ; to znamená předkové posledního uzly v které zničí vlastnost haldy.
- 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.
- Rozbalte a roztřiďte nejmenší uzly ze stínu do pole .
- 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 .
- Vyměňte prvky do svých původních pozic v .
- 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
- ^ 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.
- ^ 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
- ^ 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.
- ^ 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.