Podzakres drzewa czerwonego i czarnego


14

Próbując naprawić błąd w bibliotece, bezskutecznie szukałem artykułów na temat znajdowania podzakresów na czerwonych i czarnych drzewach. Zastanawiam się nad rozwiązaniem wykorzystującym zamki błyskawiczne i czymś podobnym do zwykłej operacji dołączania stosowanej w algorytmach usuwania niezmiennych struktur danych, ale wciąż zastanawiam się, czy istnieje lepsze podejście, którego nie udało mi się znaleźć, a nawet jakaś minimalna granica złożoności na takiej operacji?

Dla jasności mówię o algorytmie, który, biorąc pod uwagę czerwono-czarne drzewo i dwie granice, stworzy nowe czerwono-czarne drzewo ze wszystkimi elementami pierwszego drzewa, które należą do tych granic.

Oczywiście górną granicą złożoności byłaby złożoność przemierzania jednego drzewa i konstruowania drugiego przez dodawanie elementów.


3
@Radu: Wystąpił błąd w funkcji edycji komentarza. Jeśli użyjesz lateksu w komentarzu i edytujesz komentarz, zobaczysz dziwne zachowanie, takie jak powielanie itp.
Aryabhata

@Radu Dodałem kilka akapitów, aby lepiej wyjaśnić moje pytanie.
Daniel C. Sobral,

Czy drzewa są niezmienne?
Tsuyoshi Ito,

Czy miałeś na myśli górną granicę zamiast dolnej granicy w ostatnim akapicie?
Tsuyoshi Ito,

2
Wydaje się, że operację podziału na drzewach czerwono-czarnych można wykonać w najgorszym przypadku O (log n), gdzie n jest liczbą elementów w drzewie. Twierdzenie to można znaleźć we wprowadzeniu artykułu „Czysto funkcjonalne, posortowane listy sortowane w najgorszym przypadku o stałym czasie” Gertha Støltinga Brodala, Christosa Makrisa i Kostasa Tsichlasa, ESA 2006: cs.au.dk/~gerth/pub/esa06trees.html . Jak wspomniałem w poprzednim komentarzu, pozwala to na wykonanie operacji podzakresu w najgorszym przypadku O (log n).
Tsuyoshi Ito

Odpowiedzi:


10

Ta odpowiedź łączy niektóre moje komentarze do pytania i je rozszerza.

Operację podzakresu na drzewach czerwono-czarnych można wykonać w najgorszym przypadku O (log n), gdzie n jest liczbą elementów w oryginalnym drzewie. Ponieważ powstałe drzewo będzie dzielić niektóre węzły z oryginalnym drzewem, to podejście jest odpowiednie tylko wtedy, gdy drzewa są niezmienne (lub drzewa są zmienne, ale oryginalne drzewo nie jest już potrzebne).

Najpierw zauważ, że operacja podzakresu może być zaimplementowana przez dwie operacje podziału. Tutaj operacja podziału bierze czerwono-czarne drzewo T i klucz x i wytwarza dwa drzewa L i R tak, że L składa się ze wszystkich elementów T mniejszych niż x, a R elementów T większych niż x. Dlatego naszym celem jest teraz wdrożenie operacji podziału na drzewach czerwono-czarnych w najgorszym przypadku O (log n).

Jak wykonujemy operację podziału na drzewach czerwono-czarnych w czasie O (log n)? Okazało się, że istnieje dobrze znana metoda. (Nie wiedziałem o tym, ale nie jestem ekspertem od struktur danych.) Rozważmy operację łączenia , która bierze dwa drzewa L i R w taki sposób, że każda wartość w L jest mniejsza niż każda wartość w R i tworzy drzewo składające się ze wszystkich wartości w L i R. Operacja łączenia może być zaimplementowana w najgorszym przypadku O (| r L -r R | +1), gdzie r L i r Rsą odpowiednio rzędami L i R (to znaczy liczbą czarnych węzłów na ścieżce od korzenia do każdego liścia). Operację podziału można wykonać za pomocą operacji łączenia O (log n) razy, a całkowity czas najgorszego przypadku nadal wynosi O (log n), biorąc pod uwagę sumę teleskopową.

W sekcjach 4.1 i 4.2 książki [Tar83] autorstwa Tarjana opisano, jak wykonać operacje łączenia i podziału na drzewach czerwono-czarnych w najgorszym przypadku O (log n). Implementacje te niszczą oryginalne drzewa, ale łatwo je przekonwertować na niezmienne, funkcjonalne implementacje, kopiując węzły zamiast je modyfikując.

Na marginesie, moduły Set i Map Objectl Caml zapewniają operację podziału, a także inne standardowe operacje na (niezmiennych) zrównoważonych drzewach wyszukiwania binarnego. Chociaż nie używają drzewek czerwono-czarnych (używają zrównoważonych drzewek wyszukiwania binarnego z tym, że lewa wysokość i prawa wysokość różnią się co najwyżej o 2), warto również spojrzeć na ich implementacje. Oto implementacja modułu Set .

Bibliografia

[Tar83] Robert Endre Tarjan. Struktury danych i algorytmy sieciowe . Tom 44 CBMS-NSF Regional Conference Series in Applied Mathematics , SIAM, 1983.


@Radu GRIGore: Tak, chyba że czegoś mi brakuje.
Tsuyoshi Ito

@Radu GRIGore: A może nie, teraz nie jestem pewien. Ta implementacja operacji podziału przydziela O (log n) nowe węzły dla drzewa wyjściowego, ale myślę, że cała operacja może być prawdopodobnie zrealizowana w sposób rekurencyjny, wymagający tylko przestrzeni roboczej O (1). Jeśli jest to poprawne, odpowiedź na twoje pytanie zależeć będzie od tego, co rozumiesz przez „dodatkową przestrzeń”.
Tsuyoshi Ito,

@Radu GRIGore: W takim przypadku uważam, że dodatkowe miejsce to O (1), chociaż nie sprawdziłem go dokładnie.
Tsuyoshi Ito,

@Radu GRIGore: Nie widzę powodu, dla którego dba się o ilość miejsca do pracy bez dbania o ilość miejsca potrzebnego do przechowywania samego wyniku. W teorii złożoności problem zazwyczaj określa, jaki jest wynik, a zatem przestrzeń potrzebna do przechowywania wyniku nie zależy od algorytmów. Jednak w obecnym problemie istnieje wiele sposobów realizacji wymaganej operacji, a niektóre implementacje wymagają więcej miejsca do przechowywania wyniku niż inne. Jeśli zignorujesz różnicę między ilością miejsca, nie rozumiem, dlaczego zależy ci na tym, ile miejsca potrzebujemy.
Tsuyoshi Ito

Problem dla drzew niezmiennych jest inny niż dla drzew mutowalnych. Rozumiem różnicę, więc nie miałem o co pytać. Teraz, przybliżając jeden z dwóch problemów, trzeba omówić dwa aspekty --- pamięć i czas. Nie powiedziałeś, ile pamięci używasz i nie wydawało mi się oczywiste, jaka jest odpowiedź, więc zapytałem. Nie rozumiem, jak to sprawiło, że pomyślałeś, że ignoruję różnicę między tymi dwoma problemami.
Radu GRIGore,

8

Rozwiązaniem nie jest stosowanie czerwono-czarnych drzew. W drzewach splay i AVL kod do dzielenia i łączenia jest bardzo prosty. Odsyłam cię do następujących adresów URL z kodem Java dla drzew splay i drzew AVL, które to obsługują. Przejdź do następującego adresu URL i sprawdź Set.java (drzewa avl) i SplayTree.java (drzewa splay).

ftp://ftp.cs.cmu.edu/usr/ftp/usr/sleator/splaying/

--- Danny Sleator


5
Witaj na stronie, Danny!
Suresh Venkat

2
W jaki sposób pomoże to zmodyfikować implementację Scala Red Black w celu obsługi subrangacji w mniej niż O(n)? Nie pytałem, jakie drzewa mają proste implementacje podzakresów, ponieważ nie mam takiego problemu. Ta odpowiedź, choć dobrze zaplanowana, jest nie na temat i jest bezużyteczna w stosunku do problemu.
Daniel C. Sobral

6

(To ma być komentarz, ale jestem zbyt nowy, aby zostawić komentarz.)

Chciałbym jedynie zauważyć, że możesz być również zainteresowany operacją „wycięcia”, która zwraca podzakres jako nowe drzewo, a drzewo wejściowe bez podzakresu jako inne. Musisz jednak kontrolować podstawową reprezentację drzewa, ponieważ znana metoda opiera się na łączach poziomu. Wycięcie przebiega logarytmicznie w czasie do wielkości mniejszego drzewa, aczkolwiek w sensie zamortyzowanym („zamortyzowany” to „cyrk”, ponieważ nie mam już dostępu do papieru) Zobacz:

K. Hoffman, K. Mehlhorn, P. Rosenstiehl i RE Tarjan, Sortowanie sekwencji Jordana w czasie liniowym za pomocą drzew wyszukiwania powiązanego z poziomem, Informacja i kontrola, 68 (1986), 170–184

PS Powyższy cytat pochodzi z zapisu tref Seidela. Pułapki obsługują również wycięcie.


Ta metoda zakłada, że ​​ktoś ma już wskaźniki (lub „palce”) do dwóch granic.
jbapple

3

nm[a,b]

  1. O(lgn)aa
  2. O(m)
  3. O(m)

O(m+lgn)O(n+mlgm)

o(m)Ω(lgm)klgm

Nie wypracowałem szczegółów, więc nie jestem pewien, jak dodatkowe księgowanie wpływa na czas działania.

O(1)Ω(lgm)


Myśląc o tym, myślę, że mógłbym z grubsza liczyć O(logn), dzięki czemu mogłem uniknąć tymczasowej tablicy.
Daniel C. Sobral,

Liczbę można uzyskać w O (lg n), przechowując rozmiary poddrzewa w ich korzeniach.
Radu GRIGore

... ale przechowywanie rozmiarów w węzłach jest sprzeczne z wymogiem nieużywania przestrzeni pomocniczej, więc moja obserwacja nie odnosi się do twojego zainteresowania pamięcią.
Radu GRIGore,

1
Drzewa binarne można idealnie zbalansować, używając tylko STAŁEJ dodatkowej przestrzeni (oprócz samego drzewa): eecs.umich.edu/~qstout/abs/CACM86.html
Jeffε

O(m+lgn)O(1)
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.