Cum să fuzioneze două BST lui eficient?

voturi
23

Cum să fuzioneze doi copaci binar de căutare, menținând proprietatea BST?

Dacă decidem să ia fiecare element dintr - un copac și introduceți - l în altă parte, complexitatea acestei metode ar fi O(n1 * log(n2)), în cazul în care n1este numărul de noduri ale arborelui ( să zicem T1), pe care le - am septat, și n2este numărul de noduri de celălalt copac ( să zicem T2). După această operațiune doar un singur BST are n1 + n2noduri.

Întrebarea mea este: putem face mai bine decât O (log * n1 (n2))?

Întrebat 17/06/2009 la 18:35
sursa de către utilizator
În alte limbi...                            


6 răspunsuri

voturi
8

Ce zici de aplatizare ambele copaci în liste sortate, care fuzionează listele și apoi crearea unui nou copac?

Publicat 17/06/2009 la 18:43
sursa de către utilizator

voturi
18
  • Aplatizarea copaci în liste sortate.
  • Merge liste sortate.
  • Crearea copac din lista îmbinată.

IIRC, care este O (n1 + n2).

Publicat 17/06/2009 la 18:43
sursa de către utilizator

voturi
26

răspunsul Naaff lui cu un pic mai multe detalii:

  • Aplatizarea un BST într-o listă sortată este O (N)
    • Este doar iteratie „în ordine“ pe întreg copac.
    • Făcând aceasta pentru ambele este O (n1 + n2)
  • Fuzionarea două liste sortate este într-o singură listă sortată este O (n1 + n2).
    • Păstrați indicii la capetele celor două liste
    • Alege capul mai mic și în avans indicatorul său
    • Acesta este modul în care îmbinarea de lucrări de îmbinare-sortare
  • Crearea unui BST perfect echilibrat dintr-o listă sortată este O (N)
    • Valoarea la mijloc ar fi rădăcină, și recursiv.
    • În cazul nostru lista sortată este de dimensiuni n1 + n2. deci O (n1 + n2)
    • Arborele rezultat ar fi BST conceptual binar căutarea lista

Trei pași de O (n1 + n2) rezultat din O (n1 + n2)

Pentru n1 și n2 de același ordin de mărime, e mai bine decât O (n1 * log (n2))

Publicat 18/06/2009 la 01:14
sursa de către utilizator

voturi
1

Jonathan,

După sortare, avem o listă de lungime n1 + n2. Construirea unui arbore binar din ea va lua timp log (n1 + n2). Acest lucru este la fel ca un fel de îmbinare, doar că la fiecare pas recursiv avem obiceiul de un O (n1 + n2) termenul așa cum avem în algoritmul de sortare îmbinare. Deci, complexitatea de timp este log (n1 + n2).

Acum, complexitatea întregii probleme este O (n1 + n2).

De asemenea, aș spune că această abordare este bun, dacă două liste sunt dimensiuni comparabile. În cazul în care dimensiunile nu sunt comparabile, atunci cel mai bine este de a insera fiecare nod al arborelui mic într-un copac mare. Acest lucru ar lua O (n1 * log (n2)) timp. De exemplu, dacă avem doi copaci unul de dimensiune 10 și alta de dimensiune 1024. Aici n1 + n2 = 1,034 în cazul în care ca n1log (n2) = 10 * 10 = 100. Deci abordare trebuie să depindă de dimensiunile celor doi copaci.

Publicat 27/07/2010 la 22:08
sursa de către utilizator

voturi
0

O (n1 * log (n2)) este scenariul mediu de caz, chiar dacă avem 2 îmbinare orice listă nesortat într-un BST. Noi nu utilizează faptul că lista este sortată sau un BST.

Potrivit mi Să presupunem o BST are elemente n1 și alte elemente are n2. Acum converti un BST într-o matrice Sortate Lista L1 în O (n1).

BST contopit (BST, Array)

if (Array.size == 0) întoarcere BST if (Array.size == 1) se introduce elementul în BST. întoarce BST;

Găsiți indicele în matrice a cărui element de stânga <BST.rootnode și elementul dreapta> = BST.rootnode spune Index. if (BST.rootNode.leftNode == null) // adică nu nod stânga {inserați toate matrice de la Index la 0 în stânga și BST} else {BST fuzionată (BST.leftNode, Array {0 Index})}

în cazul în care (BST.rootNode.rightNode == null) // adică un nod dreapta {inserați toate matrice de la Index la Array.size în dreapta BST} else {fuzionată BST (BST.rightNode, Array {Index Array.size} )}

întoarce BST.

Acest algoritm va dura mult timp decât << O (n1 * log (n2)), ca de fiecare dată când ne partiționare matrice și BST să se ocupe de subproblema.


Publicat 30/08/2010 la 11:12
sursa de către utilizator

voturi
-1

Ideea este de a utiliza iterativ inorder traversal. Noi folosim două stive auxiliare pentru două BSTs. Din moment ce avem nevoie pentru a imprima elementele în formă de sortat, ori de câte ori vom obține un element mai mic de la oricare dintre copaci, am imprima. În cazul în care elementul este mai mare, atunci am împinge înapoi stiva pentru următoarea iterație.

Publicat 08/01/2013 la 07:04
sursa de către utilizator

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