Problem: Drzewa Mieniające Shape
Drzewo podłoże jest znane strukturą: hierarchię, w której każdy węzeł oprócz korzenia ma dokładnie jednego rodzica. Drzewo definiuje naturalne pojęcie pochodzenia, głębokości i ścieżek między węzłami. Wiele algorytmów opiera się na drzewach budowanych raz i następnie wielokrotnie zapytanych, takich jak drzewo binarne używane do wyszukiwań lub drzewo segmentowe używane do zapytań zakresu. Ale duża klasa problemów potrzebuje czegoś innego: lasu drzew, który jest wielokrotnie zmieniany w czasie. Dwie operacje definiują tę potrzebę. Operacja łączenia połącza korzeń jednego drzewa jako potomka węzła w drugim drzewie, łącząc dwa drzewa w jedno. Operacja podziału usuwa krawędź między węzłem a jego rodzicem, dzieląc jedno drzewo na dwa. Wśród tych aktualizacji nadal chcemy odpowiadać pytaniom, takim jak: jakie jest korzeń drzewa danego węzła obecnie, czy dwa węzły są w tym samym drzewie, lub jakie jest najmniejsza lub największa wagą krawędzi na ścieżce łączącej dwa węzły. Jeśli użylibyśmy zwykłej reprezentacji drzewa z jasnymi wskaźnikami do rodziców i, powiedzmy, tablicą głębokości lub tabelami przodeków, pojedynczy podział głęboko w dużym drzewie mógłby wymusić na nam ponowne obliczenie głębokości i informacji o przodekach dla całego poddrzewa, kosztując liniowe czasu w najgorszym przypadku. Powtarzanie tego po wielu operacjach szybko staje się nieakceptowalne dla dużych dynamicznych systemów. Drzewo łącza-ciecia zostało zaprojektowane dokładnie, aby uniknąć tego: gwarantuje, że operacje łączenia, podziału i ścieżkowych zapytań wykonują się w amortyzowanym czasie O(log n), niezależnie od tego, jak las jest zmieniany, poprzez ciekawą ograniczenie całkowitej ilości pracy wykonanej przez sekwencję operacji, a nie ograniczając każdą operację w izolacji.
Decompozycja Preferowanego Ścieżki
Podstawa link-cut tree polega na dekompozycji każdego drzewa w lesie na zestaw ścieżek preferowanych, często nazywanych ciężkimi ścieżkami. W każdym momencie każda węzeł ma co najwyżej jednego preferowanego dziecka wśród swoich dzieci w reprezentowanym drzewie, a krawędź do tego dziecka nazywa się preferowaną krawędzią. Najsilniejsza łańcuch preferowanych krawędzi tworzy preferowaną ścieżkę. Ta dekompozycja nie jest stała na zawsze; zmienia się w zależności od tych ścieżek, przez które lesie były niedawno przechodzone. W kluczowej chwili każda preferowana ścieżka jest przechowywana nie jako prosta lista węzłów, ale jako dodatkowa drzewo splay, z węzłami uporządkowanymi według głębokości w oryginalnym reprezentowanym drzewie. W ten sposób najlepszy węzeł w drzewie splay jest najgłębszy ( najbliżej korzenia tej ścieżki), a najprawie lepszy - naj.IsNullOrdee. Krawędzie, które nie są preferowane, nazywane kreskowymi krawędziami, łączą korzeń jednego dodatkowego drzewa splay z określonym węzłem w innym dodatkowym drzewie splay, co efektywnie łączy struktury ścieżek w hierarchię ścieżek. Dwa poziomy tego zaprojektowanego systemu są kluczowe: wewnątrz preferowanej ścieżki drzewa splay umożliwiają skuteczną amortyzowaną dostępu do dowolnego węzła według głębokości, a kreskowymi krawędziami struktura może reprezentować drzewo o dowolnej gałęziuzy tylko z użyciem zbioru prostych ścieżek. Liczba preferowanych ścieżek od każdego węzła do korzenia jego drzewa jest ograniczona logarytmicznie dzięki temu samemu argumentowi rachunkowemu używanemu w dekompozycji ciężkich ścieżek, co służy jako źródło granic amortyzowanej czasu dla całej struktury.
Operacja dostępu i łączenie
Practycznym podstawowym elementem większości operacji na drzewach łącza-ciecia jest operacja dostępu. Dany wierzchołek dostępu przewodni z tego wierzchołka do korzenia reprezentowanego drzewa, a jednocześnie robi każdego krawędzi na tym ścieżce preferowaną, co efektownie przenosi całą ścieżkę od wierzchołka do korzenia w jedno jedynym preferowanym kierunku. To osiąga się poprzez powtarzane splaying wierzchołka do korzenia własnego drzewa splayingowego, a następnie śledzenie po zaznaczonym krawędzią do ścieżki rodzica i ponowne splaying na tej ścieżce. W trakcie tego procesu zamienia się preferowany syn, co sprawia, że właśnie przesunięta ścieżka staje się preferowaną. Ten proces nazywany jest łączeniem: każda operacja łączy drzewo splayingowe obecnego kierunku z drzewem splayingowym na kolejnej ścieżce wyżej, używając operacji splaying do ponownego podłączenia i balansowania. Po zakończeniu operacji dostępu, wierzchołek dostępu jest najdalszym w drzewie splayingowym, który przechodzi całą ścieżkę od korzenia do tego wierzchołka, a sam wierzchołek jest spalowany do korzenia tego drzewa splayingowego. To umożliwia bezpośredni dostęp do niego oraz, rozszerzając to, do informacji o całej ścieżce. Ponieważ drzewa splayingowe gwarantują amortyzowaną czas operacji logarytmicznego poprzez znane argumenty funkcji potencjałowej, a liczba różnych preferowanych ścieżek przekroczonych podczas dowolnego dostępu jest sama w sobie ograniczona logarytmicznie w sensie amortyzowanym, cała operacja dostępu działa w czasie amortyzowanym O(log n). Każda inna operacja na drzewach łącza-ciecia, w tym łączenie, odcięcie, znalezienie korzenia i zapytania agregacyjne ścieżki takie jak najmniejszy wagowy krawędź, jest wyrażona jako mała stała liczba operacji dostępu plus O(1) dodatkowej manipulacji wskaźnikami, co jest powodem dla tego, że cała struktura dziedziczy tę samą granicę logarytmiczną.
Link, Cut i Zapytania o ścieżki w Praktyce
Z dostępu jako podstawy, inne operacje stają się krótkie i eleganckie. Aby połączyć dwa drzewa, uczyniąc węzeł u potomkiem węzła v, najpierw dostęp do węzła u przynosi go na korzeń swojego reprezentowanego drzewa bez preferowanego rodzica, a następnie łączy go jako nowy preferowany potomek pod węzłem v po dostępie do v. Aby odciąć krawędź powyżej węzła u, najpierw dostęp do węzła u przynosi całą ścieżkę od u do korzenia swojego drzewa do jednego drzewa spajanej z u na najgłębszym poziomie; ponieważ kolejność drzewa spajanego odpowiada głębokości, lewe poddrzewo węzła u w tym drzewie spajanym odpowiada wszystkim prawidłowym przodekłom u, więc odcięcie polega jedynie na odłączaniu tego lewego poddrzewa, co jest operacją O(1) po uporządkowaniu drzewa spajanego. Aby odpowiedzieć na zapytanie o ścieżkę, takie jak najmniejszy wagę krawędzi między dwoma węzłami, zwykle dostęp do jednego z węzłów przynosi go na korzeń całego lasu (technika często nazywana make-root lub evert, osiągana za pomocą flagi wolnej od obciążenia odwracania orientacji), a następnie dostęp do drugiego węzła. Wynikujące drzewo spajane pokrywa dokładnie ścieżkę między nimi, co pozwala czytać wartość agregatową utrzymywana incymentalnie na każdym węźle drzewa spajanego, podobnie jak segmentowe drzewo przechowuje agregaty zakresu. Te elementy budowlane sprawiają, że drzewa link-cut są narzędziem wybranym dla algorytmów takich jak utrzymanie dynamicznego lasu minimalnego podczas wstawiania i usuwania krawędzi, przyspieszanie algorytmów strumienia sieciowych poprzez ulepszenie drzew dynamicznych algorytmu Dinica, oraz wsparcie pełnych dynamicznych zapytań o połączenia, gdzie krawędzie są dodawane i usuwane w ciągu długiej sekwencji operacji.
Kontrast z statycznymi drzewami
Wartość drzewa łącza-ciecia staje się jasna, gdy porównujesz je do statycznych reprezentacji drzew używanych dla tego samego dynamicznego obciążenia. Statyczne drzewo jest zazwyczaj budowane raz, a może być oparte na wcześniej obliczonych tabelach przodeków dla podnoszenia binarnego, tur Eulera do zapytań o najniższy wspólny przodka lub dekompozycji ciężko-jakich mapowanych na drzewo segmentów. Wszystkie te techniki są doskonałe, gdy kształt drzewa nigdy nie zmienia się, oferując szybkie zapytania po jednorazowej kosztowności przetwarzania. Ale już w momencie, gdy potrzebujesz odcięć krawędzi głęboko wewnątrz drzewa lub podłączenia nowego poddrzewa, ta wcześniej obliczona informacja staje się starej. Tur Eulera musi być ponownie zbudowana, tabely przodeków muszą zostać ponownie obliczone dla potencjalnie każdego potomka zmienionego poddrzewa, a dekompozycja ciężko-jakich może wymagać całych łańcuchów ponownej przydzielania, co może kosztować O(n) czasu na pojedyncze aktualizacje w najgorszym przypadku. Jeśli aktualizacje są częste i mieszane z zapytaniami, jak w problemach dynamicznej połączoności lub utrzymaniu drzewa minimalnego spójnego online, ta statyczna podejście staje się nieakceptowalnie długotrwałe w ciągu długiej sekwencji operacji. Drzewo łącza-ciecia uniknie tego całkowicie, nigdy nie kompromitując się do stałej dekompozycji: jego ulubione ścieżki są pozwolone na przesuwanie przy każdym dostępie, a koszt tego przesuwania pokrywa się z analizą amortyzowaną podstawowych drzew splay, tak że nawet najgorsza sekwencja adwersarialna operacji łączeń, odcięć i zapytań nadal daje tylko O(m log n) czasu dla m operacji na lesie o n wierzchołkach. To jest kluczowy kompromis, który laboratorium ma na celu pokazać: statyczna struktura kupuje prostej reprezentacji i szybkie zapytania tylko tak długo, jak nic się nie zmienia, podczas gdy drzewo łącza-ciecia kupuje odporność na stałe przebudowy za cenę bardziej skomplikowanej reprezentacji wewnętrznej.
Często zadawane pytania
Kto zaprojektował drzewa łącza-cięcia i dlaczego?
Daniel Sleator i Robert Tarjan wprowadzili drzewa łącza-cięcia w publikacji z 1983 roku, motywując to potrzebą utrzymania dinastycznego lasu drzew korzeniowych efektywnie podczas wsparcia operacji łączenia, odcięcia i zapytania o ścieżki. W tym samym czasie wprowadzili drzewa splay, które stały się kluczowymi elementami struktury pomocniczej drzewa łącza-cięcia.
Co exactly oznacza dekompozycja ścieżkową preferowaną?
Na każdym momencie każdy węzeł w lasie ma co najwyżej jednego preferowanego dziecka, a śledzenie po preferowanych krawędziach prowadzi do maksymalnych łańcuchów nazywanych ścieżkami preferowanymi. Każda ścieżka preferowana jest wewnętrznie reprezentowana jako indywidualne drzewo splay uporządkowane według głębokości, a łańcuchy są łączone ze sobą poprzez przerywane, niepreferowane krawędzie, tak że cały las jest reprezentowany jako hierarchia drzew splay, a nie jednolitej struktury.
Dlaczego złożoność czasowa jest amortyzowana, a nie najgorszego przypadku na operację?
Jedno zapytanie może w teorii dotknąć wielu łańcuchów preferowanych i spowodować kilka operacji splay, które mogłyby być drogiej indywidualnie. Złożoność amortyzowana wynika z argumentu funkcji potencjałowej, tej samej techniki używanej do analizy prostych drzew splay, która pokazuje, że całkowita kosztosć pośród dowolnej serii operacji pozostaje proporcjonalna do O(log n) na średnim poziomie, nawet jeśli pojedyncza operacja rzadko kosztowała więcej.
Jak drzewo łącza-cięcia różni się od segmentu drzewa lub zbalansowanego drzewa BST używanego do stałej tablicy?
Segment drzewa lub zbalansowanej drzewa BST nad tablicą stałą przyjmuje stabilny, niezmieniający się zestaw elementów o ustalonej kolejności. Drzewo łącza-cięcia z kolei reprezentuje całe dinastycznego lasu drzew, gdzie kształt, co jest zapytane, a nie tylko wartości przechowywane, może ulec zmianie poprzez operacje łączenia i odcięcia, a jego wewnętrzne drzewa splay są reorganizowane dynamycznie, aby odzwierciedlać ten zmieniający się kształt.
Jakie są typowe zastosowania praktyczne drzew drzew łącza-cięcia?
Czynne zastosowania obejmują utrzymanie dinastycznego lasu minimalnych drzew rozpinających podczas dodawania i usuwania krawędzi, odpowiadanie kompleksowym zapytaniom o połączenie w zmieniającym się grafie oraz przyspieszanie algorytmów przepływu sieciowych, takich jak obliczenia blokujących przepływu w algorytmie Dinica, gdzie struktura rozpinająca residualnego grafu musi być aktualizowana efektywnie podczas przeprowadzania przepływu i zatapiania krawędzi.
Wypróbuj na żywo
Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Link-Cut Tree i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.
▶ Otwórz symulację Link-Cut Tree