Come unire due BST di efficienza?

voti
23

Come unire due alberi binari di ricerca mantenendo la proprietà della BST?

Se decidiamo di prendere ogni elemento da un albero e inserirlo nel l'altro, la complessità di questo metodo sarebbe O(n1 * log(n2)), in cui n1è il numero di nodi dell'albero (diciamo T1), che abbiamo a spacco, ed n2è il numero di nodi di l'altro albero (diciamo T2). Dopo questa operazione una sola BST ha n1 + n2nodi.

La mia domanda è: possiamo fare meglio di O (n1 * log (n2))?

È pubblicato 17/06/2009 alle 18:35
fonte dall'utente
In altre lingue...                            


6 risposte

voti
8

Che dire appiattimento entrambi gli alberi in liste ordinate, fondendo le liste e quindi la creazione di un nuovo albero?

Risposto il 17/06/2009 a 18:43
fonte dall'utente

voti
18
  • Appiattire alberi in liste ordinate.
  • Unire liste ordinate.
  • Crea l'albero di lista unito.

IIRC, che è O (n1 + n2).

Risposto il 17/06/2009 a 18:43
fonte dall'utente

voti
26

La risposta di Naaff con un po 'più particolari:

  • Appiattimento un BST in un elenco ordinato è O (N)
    • E 'solo l'iterazione "in ordine", a tutto l'albero.
    • Farlo per entrambi è O (n1 + n2)
  • Unire due liste ordinate è in una lista ordinata è O (n1 + n2).
    • Mantenere i puntatori ai capi di entrambe le liste
    • Scegli la testa più piccola e far progredire il suo puntatore
    • Questo è come l'unione di opere merge-ordinamento
  • Creazione di un BST perfettamente bilanciato da un elenco ordinato è O (N)
    • Il valore a metà sarebbe la radice, e si ripete.
    • Nel nostro caso la lista ordinata è di dimensione n1 + n2. quindi O (n1 + n2)
    • L'albero risultante sarebbe la BST concettuale del binario ricerca della lista

Tre passi di O (n1 + n2) risultato in O (n1 + n2)

Per n1 e n2 dello stesso ordine di grandezza, che è meglio di O (n1 * log (n2))

Risposto il 18/06/2009 a 01:14
fonte dall'utente

voti
1

Jonathan,

Dopo la cernita, abbiamo una lista di lunghezza n1 + n2. Costruire un albero binario fuori ci vorrà log (n1 + n2) tempo. Questo è lo stesso come merge sort, solo che ad ogni passo ricorsivo si voleva avere un O (n1 + n2) termine come abbiamo in algoritmo merge sort. Così la complessità temporale è log (n1 + n2).

Ora la complessità di tutto il problema è O (n1 + n2).

Inoltre direi che questo approccio è buono se due liste sono di dimensioni comparabili. Se le dimensioni non sono comparabili, allora è consigliabile inserire ogni nodo del piccolo albero in un grande albero. Questo richiederà O (n1 * log (n2)) tempo. Per esempio se abbiamo due alberi uno di dimensioni 10 e uno di dimensione 1024. Qui n1 + n2 = 1034 dove come n1log (n2) = 10 * 10 = 100. Quindi approccio deve dipendere dalle dimensioni dei due alberi.

Risposto il 27/07/2010 a 22:08
fonte dall'utente

voti
0

O (n1 * log (n2)) è lo scenario medio caso, anche se abbiamo 2 merge qualsiasi elenco non ordinato in un BST. Noi non stiamo utilizzando il fatto che la lista è lista ordinata o un BST.

Secondo me Consente di assumere un BST presenta elementi n1 e n2 altro ha elementi. Ora convertire un BST in un array ordinato elenco L1 a O (n1).

BST fusa (BST, Array)

if (Array.size == 0) return BST se (Array.size == 1) inserire l'elemento nel BST. tornare BST;

Trova l'indice nella matrice cui elemento sinistra <BST.rootnode ed elemento di destra> = BST.rootnode dicono Index. if (BST.rootNode.leftNode == null) // cioè n nodo fianco {inserire tutta la matrice da Index a 0 nella sinistra della BST e} else {BST Fusione (BST.leftNode, Array {0 all'indice})}

if (BST.rootNode.rightNode == null) // cioè n nodo destra {inserire tutta la matrice da indice per Array.size in destra di BST} else {Fusione BST (BST.rightNode, Array {N} per Array.size )}

tornare BST.

Questo algoritmo avrà << tempo di O (n1 * log (n2)) come ogni volta che ci troviamo di partizionamento della matrice e BST per gestire il sottoproblema.


Risposto il 30/08/2010 a 11:12
fonte dall'utente

voti
-1

L'idea è quella di utilizzare iterativa ordine simmetrico. Usiamo due pile ausiliari per due BST. Dal momento che abbiamo bisogno di stampare gli elementi in forma ordinata, ogni volta che si ottiene un elemento più piccolo da qualsiasi degli alberi, il risultato della stampa di esso. Se l'elemento è maggiore, allora spingerlo indietro per impilare per la successiva iterazione.

Risposto il 08/01/2013 a 07:04
fonte dall'utente

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