Kupa cienia

W informatyce kopia cienia jest strukturą danych sterty, którą można scalać , która obsługuje wydajne łączenie sterty w sensie amortyzowanym . Dokładniej, stosy cieni wykorzystują algorytm scalania cienia, aby uzyskać wstawienie w zamortyzowanym czasie O (f( n )) i usunięcie w zamortyzowanym czasie O ((log n log log n )/f( n )) dla dowolnego wyboru 1 ≤ fa ( n ) ≤ log log n .

W całym artykule zakłada się, że A i B są stosami binarnymi z | | _ ≤ | B. |.

Łączenie cieni

Shadow merge to algorytm efektywnego łączenia dwóch stert binarnych , jeśli te sterty są zaimplementowane jako tablice . szczególności czas działania scalania cieni na dwóch stosach i wynosi .

Algorytm

Chcemy scalić dwa binarne kopce min i i . Algorytm jest następujący:

  1. tablicę końcu aby tablicę
  2. Zidentyfikuj cień w { ; czyli przodkowie ostatniego węzły w węzłach które niszczą właściwość sterty do
  3. Zidentyfikuj następujące dwie części cienia z: do :
    • Ścieżka : zbiór węzłów w cieniu, dla których są co na ;
    • Poddrzewo pozostała część .
  4. Wyodrębnij i posortuj najmniejszy węzły z cienia do tablicy .
  5. Przekształć w następujący sposób:
    • Jeśli następnie zaczynając od najmniejszego elementu w posortowanej tablicy, kolejno wstawiaj każdy element z do , zastępując je do do najmniejsze elementy.
    • Jeśli , a następnie wyodrębnij i posortuj najmniejsze elementy z połącz tę posortowaną listę z . do .
  6. Zamień elementy na .
  7. Zrób kupę z .

Czas działania

Ponownie, i poddrzewo połączonej Liczba węzłów w niż głębokość , czyli . Ponadto liczba węzłów na głębokości to co najwyżej 3/4 liczby węzłów na głębokości ma rozmiar . są co najwyżej 2 węzły , to odczytanie najmniejszego elementy cienia do posortowanej tablicy zajmuje czas.

Jeśli , a następnie połączenie i do , jak w kroku 5 powyżej, wymaga czasu . W przeciwnym razie czas potrzebny na wykonanie tego kroku wynosi . sterty zajmuje _ Odpowiada to całkowitemu czasowi działania scalania cieni .

Struktura

Kupa cienia składa się z funkcji progowej i tablicy , której zwykła właściwość sterty binarnej zaimplementowana w właściwość sterty niekoniecznie jest zachowana w innych wpisach. sterta cieni jest zasadniczo stertą binarną sąsiadującą z tablicą . Aby dodać element do sterty cienia, umieść go w tablicy . Jeśli tablica zbyt duża zgodnie z określonym progiem, najpierw budujemy stertę z użyciem algorytmu Floyda do budowy sterty, a następnie łączymy tę stertę z scalania cieni Wreszcie, łączenie kopców cieni odbywa się po prostu poprzez sekwencyjne wstawianie jednej sterty do drugiej przy użyciu powyższej procedury wstawiania.

Analiza

Otrzymujemy _ jak wyżej. Załóżmy, że funkcja progowa jest taka, że ​​każda zmiana wywołuje nie większą zmianę niż w . Wyprowadzamy żądane granice czasu na stercie łączenia, używając metody analizy potencjału dla analizy amortyzowanej . Potencjał sterty wybiera się jako:

Wykorzystując ten potencjał możemy uzyskać pożądane czasy pracy zamortyzowanej:

utwórz ( H. ) : inicjuje nową pustą stertę cieni

potencjał więc zamortyzowany koszt stworzenia rzeczywisty

wstaw ( x , H. ) : wstawia do sterty cieni

Istnieją dwa przypadki:
  • stosuje się scalanie, to spadek funkcji potencjalnej jest dokładnie rzeczywistym kosztem łączenia i koszt zamortyzowany wynosi i .
  • Jeśli scalanie nie zostanie wykonane, wówczas zamortyzowany koszt wynosi
Wybierając funkcję progową, otrzymujemy zatem, że zamortyzowany koszt wstawienia wynosi:

delete_min ( H. ) : usuwa element o minimalnym priorytecie z

Znalezienie i usunięcie minimum zajmuje rzeczywisty czas . gdy wartość maleje. Wybierając , , że zamortyzowany koszt tej operacji jest taki sam jak koszt rzeczywisty

Powiązane algorytmy i struktury danych

połączy dwa stosy i czasie łącząc oba stosy stertę z wynikowej tablicy za pomocą algorytmu Floyda do budowy sterty. Alternatywnie, stosy można po prostu scalić, kolejno wstawiając każdy element do zajmuje trochę czasu. .

Sack i Strothotte zaproponowali algorytm łączenia stosów binarnych w czas. Wiadomo, że ich algorytm jest bardziej wydajny niż drugie naiwne rozwiązanie opisane powyżej z grubsza, gdy . Shadow merge działa asymptotycznie lepiej niż ich algorytm, nawet w najgorszym przypadku.

Istnieje kilka innych stosów, które obsługują szybsze czasy scalania. przykład Fibonacciego scalić w stosy binarne wymagają na scalenie, scalanie