Jak połączyć dwa BST na efektywnie?

głosy
23

Jak połączyć dwa drzewa binarne wyszukiwania utrzymania nieruchomości BST?

Jeśli zdecydujemy się podjąć każdy element z drzewa i włóż ją do drugiej, złożoność tej metody byłoby O(n1 * log(n2)), gdzie n1jest liczbą węzłów drzewa (powiedzmy T1), które mamy podzielony, a n2jest to liczba węzłów drugi drzewo (powiedzmy T2). Po tej operacji tylko jeden BST ma n1 + n2węzły.

Moje pytanie brzmi: co możemy zrobić lepiej niż wy (N1 * log (N2))?

Utwórz 17/06/2009 o 18:35
źródło użytkownik
W innych językach...                            


6 odpowiedzi

głosy
8

Co o spłaszczenie obu drzewach w posortowanych list, łączenie list, a następnie utworzenie nowego drzewa?

Odpowiedział 17/06/2009 o 18:43
źródło użytkownik

głosy
18
  • Spłaszczyć drzew język posortowanych list.
  • Scalanie posortowanych list.
  • Tworzenie drzewa z połączonego listy.

IIRC, że O (N1 + N2).

Odpowiedział 17/06/2009 o 18:43
źródło użytkownik

głosy
26

Odpowiedź Naaff za trochę więcej szczegółów:

  • Spłaszczenie BST w sortowanej listy O (N)
    • To jest po prostu iteracja na całym drzewie „na zamówienie”.
    • Robi to dla obu jest O (n1 + n2)
  • Scalanie dwóch posortowanych list jest w jednym posortowanej listy O (n1 + n2).
    • Utrzymać wskaźniki do głów obu listach
    • Wybrać mniejszą głowę i awansować swój wskaźnik
    • W ten sposób scalania robót merge-sort
  • Tworzenie doskonale wyważone BST z listy posortowanej wynosi O (N)
    • Wartość w środku będzie korzeniem i recurse.
    • W naszym przypadku lista posortowana jest od rozmiaru N1 + N2. tak O (N1 + N2)
    • Powstały drzewo byłoby koncepcyjne BST binarnego przeszukiwania listy

Trzy etapy O (n1 + n2) związku w o (N1 + N2)

Dla N1 i N2 tego samego rzędu wielkości, to lepiej niż O (n1 * log (n2))

Odpowiedział 18/06/2009 o 01:14
źródło użytkownik

głosy
1

Jonathan,

Po sortowaniu, mamy listę długość N1 + N2. Budowanie drzewa binarnego z nim odbędzie się zalogować (N1 + N2) czas. To samo jak łączenia rodzaju, tylko że w każdym rekurencyjnego kroku przyzwyczajenie się do O (n1 + n2) określenie jak już algorytm scalania sortowania. Tak więc złożoność czas jest log (N1 + N2).

Teraz złożoność całego problemu jest O (n1 + n2).

Również chciałbym powiedzieć, że to podejście jest dobre, jeśli dwie listy są porównywalnej wielkości. Jeżeli rozmiary nie są porównywalne to najlepiej wstawić każdy węzeł drzewa małego do dużego drzewa. To zajmie O (n1 * log (n2)) czas. Na przykład, jeśli mamy dwóch drzew jeden wielkości 10 i drugą wielkości 1024. Tutaj n1 + n2 = 1034 gdzie w n1log (n2) = 10 x 10 = 100. Zatem podejście do zależeć od rozmiarów dwóch drzew.

Odpowiedział 27/07/2010 o 22:08
źródło użytkownik

głosy
0

O (n1 * log (n2)) to średni scenariusz, nawet jeśli mamy 2 seryjnej dowolny nieposortowane listy do BST. Nie wykorzystują fakt, że lista jest posortowana lista lub BST.

Według mnie Pozwala zakładać jedną BST posiada elementy N1 i druga ma elementy N2. Teraz konwertować BST w posortowanej tablicy Lista L1 w O (N1).

Scalony BST (BST Array)

if (Array.size == 0) powrót BST if (Array.size == 1) wprowadzenia elementu w BST. powrotu BST;

Znajdź indeks w tablicy, której lewa Element <BST.rootnode i prawy element> = BST.rootnode powiedzieć Index. if (BST.rootNode.leftNode == null) // Nie znaczy lewy węzeł {wstawić całą tablicę z indeksu 0 w lewo BST i} else {Scalony BST (BST.leftNode, Array {0} do indeksu)}

if (BST.rootNode.rightNode == null) // Nie znaczy prawy węzeł {wstawić całą tablicę z indeksu do Array.size do prawej BST} else {Scalony BST (BST.rightNode, Array {Indeks Array.size} )}

powrót BST.

Algorytm ten odbędzie << czasu niż O (n1 * log (N2)), jak za każdym razem jesteśmy Partycjonowanie tablicy i BST do obsługi subproblem.


Odpowiedział 30/08/2010 o 11:12
źródło użytkownik

głosy
-1

Chodzi o to, aby wykorzystać iteracyjny Inorder przechodzenia. Używamy dwóch stosów pomocniczych dla dwóch BSTS. Ponieważ musimy wydrukować elementy w postaci posortowanej, gdy mamy mniejszy elementu z jednego z drzew, możemy go wydrukować. Jeśli element jest większy, wtedy wcisnąć go z powrotem do stosu do następnej iteracji.

Odpowiedział 08/01/2013 o 07:04
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more