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:
- tablicę końcu aby tablicę
- Zidentyfikuj cień w { ; czyli przodkowie ostatniego węzły w węzłach które niszczą właściwość sterty do
- 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ęść .
- Wyodrębnij i posortuj najmniejszy węzły z cienia do tablicy .
- 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 .
- Zamień elementy na .
- 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