Scalenie dwóch drzew wyszukiwania binarnego


17

Szukam algorytmu do połączenia dwóch drzew wyszukiwania binarnego o dowolnej wielkości i zakresie. Oczywisty sposób byłoby przejść o wdrażaniu tego byłoby znaleźć całe poddrzewa, których zakres można dopasować do dowolnego węzła zewnętrznego w drugim drzewie. Jednak najgorszy czas działania tego typu algorytmu wydaje się być w kolejności, O(n+m)gdzie ni msą wielkości odpowiednio każdego drzewa.

Powiedziano mi jednak, że można to zrobić w miejscu O(h), gdzie hjest wysokość drzewa o większej wysokości. I jestem całkowicie zagubiony, jak to jest możliwe. Próbowałem najpierw eksperymentować z obracaniem jednego drzewa, ale obrócenie drzewa do kręgosłupa to już O (h).


Nie wiem, erick, mam też to samo pytanie.

Szczerze mówiąc, było to pytanie zadane w zadaniu domowym Algorytmy. Okazuje się, że O (h) jest zbyt rygorystyczne dla środowiska wykonawczego, ponieważ pytanie zapomniało podać bardziej niezbędne informacje: że wszystkie klucze z jednego drzewa były mniejsze niż wszystkie klucze z prawego drzewa.
efritz

Czy czegoś brakuje? Czy połączenie drzew binarnych nie byłoby łatwe O(log n)dzięki prostej funkcji przenoszenia węzła?
AT

@AT Tak, ale nie wiedzieliśmy, że klucze z jednego BST wzajemnie się wykluczają.
efritz

1
To jest czerwono-czarne drzewo, a nie BST. Czerwona czerń (a także drzewa AVL i hałdy) to specjalne rodzaje drzew, które zachowują właściwości związane z wysokością. Waniliowe BST mogą być pojedynczym kręgosłupem. Spróbuj wstawić do BST nie malejącą lub nie rosnącą serię liczb, a zobaczysz, że wysokość tych drzew jest w rzeczywistości n. Tylko pełne lub pełne drzewa binarne mają logarytmiczną wysokość w stosunku do całkowitej liczby węzłów.
efritz

Odpowiedzi:


24

W ArXiv: 1002.4248 John Iacono i Özgür Özkan opisują stosunkowo prosty algorytm scalania dwóch drzew wyszukiwania binarnego w czasie zamortyzowanym ; analiza jest najtrudniejsza. [ Aktualizacja: Jak Joe słusznie zauważa w swojej odpowiedzi, algorytm ten jest spowodowany przez Browna i Tarjana.] Opisują również bardziej skomplikowaną strukturę danych słownika, opartą na stronniczych listach pominięć, która obsługuje scalanie w czasie zamortyzowanym O ( log n ) .O(log2n) O(logn)

Z drugiej strony, ograniczenie w najgorszym przypadku jest niemożliwe. Rozważmy dwa drzewa wyszukiwania binarnego z n węzłami, jedno przechowujące parzyste liczby całkowite między 2 a 2 n , drugie przechowujące nieparzyste liczby całkowite między 1 a 2 n - 1 . Scalenie dwóch drzew tworzy nowe drzewo wyszukiwania binarnego, przechowujące wszystkie liczby całkowite od 1 do 2 n . W każdym takim drzewie stały ułamek węzłów ma inną parzystość niż ich rodzice. (Dowód: rodzic nieparzystego liścia musi być parzysty.) Zatem połączenie drzew parzystych i nieparzystych wymaga zmianyO(logn)n22n12n112n .Ω(n)


Jedna uwaga: jeśli poprawnie przeczytałem opis w tym dokumencie, drzewa te nie obsługują wstawiania i usuwania. scalania tylko następujące procedury wyszukiwania połączenia palec drzew (opisanego w odpowiedzi Joe). Ograniczony zestaw operacji pozwala na lepszą analizę niż O ( n lg mO(lg2n)jeden. O(nlgmn)
jbapple

1
Ulepszona analiza wynika z amortyzacji, a nie ograniczenia dozwolonych operacji. Insercje i delecje mogą być obsługiwane pęknięć i łączy (faktycznie „łączy się”), w tym samym amortyzowana razem złączone. O(logn)
Jeffε

Z ciekawości, czy czas zostaje zmieniony, jeśli drzewa są przechowywane w tablicach zamiast w listach połączonych (co, jak zakładam, miałeś na myśli mówiąc „zmieniając ... wskaźniki ”)? Ω(n)
mtahmed

Domyślnie „drzewa wyszukiwania binarnego” są strukturami opartymi na wskaźnikach (a nie „listach połączonych”); każdy węzeł wskazuje na dwoje dzieci i prawdopodobnie na jego rodzica. Ale dolna granica nie zależy od dokładnej reprezentacji. Są sposoby scalania dwóchdrzewek wyszukiwania binarnegon-węzłowego, więc każdy algorytm porównawczy wymaga co najmniejlog2 ( 2n(2nn)nporównania, aby wybrać właściwe. log2(2nn)2nO(logn)
Jeffε

1
@ Jɛ ff E: Zgadzam się, że podziały i złączenia są obsługiwane, ale nie sądzę, że tworzenie lub niszczenie drzew jest. Na przykład, jeśli chcę usunąć „x” z alfabetu, nie otrzymuję tylko „a..wyz”, ale także „x”. Rozmiar wszechświata (który jest , patrz sekcja 2.1) nie zmienia się. Również wstęp do sekcji 1 zauważa, że ​​zestawy muszą podzielić wszechświat, co interpretuję (być może niepoprawnie), aby oznaczać, że każdy element we wszechświecie znajduje się w jakimś drzewie. Tak więc, jak go czytam, ta konstrukcja nie działa na nieograniczonych wszechświatach. Tak powinienem napisać mój komentarz powyżej. n
jbapple

9

Pomocne może okazać się to odniesienie: Brown and Tarjan, A Fast Merging Algorytm , w którym autorzy pokazują, jak scalać zrównoważone drzewa binarne (AVL) w który jest optymalny (dla algorytmów porównawczych). minsą długościami posortowanych list reprezentowanych przez przeszukiwanie binarne drzew, i zakłada się, żemn.O(nlogmn)mnmn

Dyskusję na temat różnych technik łączenia uporządkowanych zestawów można również znaleźć w sekcji 11.5 tego artykułu na drzewach wyszukiwania palcami


2
O(nlogmn)mn

Myślałem, że wynika to z upływu czasu, ale zredagowałem pytanie, aby było jasne.
Joe

0

1
Ich struktura danych obsługuje łączenie w czasie zamortyzowanym O (1), a nie scalanie. Wszystkie elementy w jednym drzewie muszą być mniejsze niż wszystkie elementy w drugim.
Jeffε

TiTjTiTjTjTiw(Ti)=w(Tj)TjTiTiTjTi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.