Unione di due alberi di ricerca binari


17

Sto cercando un algoritmo per unire due alberi binari di ricerca di dimensioni e intervallo arbitrari. Il modo ovvio in cui procederei per implementarlo sarebbe quello di trovare interi sottotitoli il cui intervallo può adattarsi a un nodo esterno arbitrario nell'altro albero. Tuttavia, il peggior tempo di esecuzione per questo tipo di algoritmo sembra essere nell'ordine di O(n+m)dove ne msono rispettivamente le dimensioni di ciascun albero.

Tuttavia, mi è stato detto che questo potrebbe essere fatto O(h), dov'è hl'altezza dell'albero con l'altezza maggiore. E mi sono completamente perso su come ciò sia possibile. Ho provato a sperimentare prima di ruotare uno degli alberi, ma ruotare un albero in una spina dorsale è già O (h).


Non so erick, ho anche la stessa domanda.

Ad essere sinceri, questa era una domanda posta nei compiti di Algorithms. Si scopre che O (h) è troppo rigoroso di un runtime, poiché la domanda si è dimenticata di fornire ulteriori informazioni necessarie: che tutte le chiavi di un albero erano più piccole di tutte le chiavi dell'albero giusto.
efritz,

Mi sto perdendo qualcosa, la fusione degli alberi binari non sarebbe facile O(log n)con una semplice funzione di spostamento del nodo?
AT

@AT Sì, ma non sapevamo che le chiavi di un BST si escludessero a vicenda dall'altra.
efritz

1
Questo è un albero rosso-nero, non un BST. Un nero rosso (così come alberi e cumuli AVL) sono tipi speciali di alberi che mantengono una proprietà legata all'altezza. I BST alla vaniglia possono essere una singola colonna vertebrale. Prova a inserire una serie di numeri non decrescente o non crescente in un BST e vedrai che l'altezza di questi alberi è effettivamente n. Solo gli alberi binari completi o completi hanno un'altezza logaritmica rispetto al numero totale di nodi.
Efritz,

Risposte:


24

In ArXiv: 1002.4248 , John Iacono e Özgür Özkan descrivono un algoritmo relativamente semplice per unire due alberi binari di ricerca in tempo ammortizzato ; l'analisi è la parte difficile. [ Aggiornamento: come osserva correttamente Joe nella sua risposta, questo algoritmo è dovuto a Brown e Tarjan.] Descrivono anche una struttura di dati del dizionario più complicata, basata su liste di salto distorte, che supporta le fusioni nel tempo ammortizzato .O(log2n) O(logn)

D'altra parte, un limite nel caso peggiore di è impossibile. Considera due alberi di ricerca binari con nodi, uno che memorizza gli interi pari tra e , l'altro che memorizza gli interi dispari tra e . L'unione dei due alberi crea un nuovo albero binario di ricerca che memorizza tutti i numeri interi tra e . In uno di questi alberi, una frazione costante dei nodi ha una parità diversa rispetto ai loro genitori. (Prova: il genitore di una foglia dispari deve essere pari.) Pertanto, la fusione degli alberi pari e dispari richiede la modifica di Ω ( n )O(logn)2 2 n 1 2 n - 1 1 2 nn22n12n112nΩ(n) puntatori.


Una nota: se ho letto correttamente la descrizione in questo documento, questi alberi non supportano l'inserimento e l'eliminazione. L' unione segue semplicemente la procedura per unire gli alberi di ricerca delle dita (descritta nella risposta di Joe). L'insieme limitato di operazioni consente un'analisi migliore di O ( n lg mO(lg2n)uno. O(nlgmn)
jbapple,

1
L'analisi migliorata è dovuta all'ammortamento, non a una limitazione delle operazioni consentite. Inserzioni ed eliminazioni possono essere supportate con suddivisioni e fusioni (in realtà "join") nello stesso tempo ammortizzato. O(logn)
Jeffε

Solo per curiosità, il tempo viene influenzato se gli alberi sono memorizzati in array anziché in elenchi collegati (che presumo sia ciò che intendevi quando hai detto "cambiare ... puntatori ")? Ω(n)
mtahmed,

Per impostazione predefinita, "alberi di ricerca binari" sono strutture basate su puntatori (non "elenchi collegati"); ogni nodo indica i suoi due figli e forse il suo genitore. Ma il limite inferiore non dipende dalla rappresentazione precisa. Ci sono modi per unire duealberi di ricerca binarin-nodo, quindi qualsiasi algoritmo basato sul confronto richiede almeno illog2 ( 2n(2nn)nconfronti per scegliere quello giusto. log2(2nn)2nO(logn)
Jeffε,

1
@ Jɛ ff E: sono d'accordo sul fatto che le divisioni e i join sono supportati, ma non credo che lo siano la creazione o la distruzione di alberi. Quindi, per esempio, se voglio eliminare "x" dall'alfabeto, non ottengo solo "a..wyz", ma anche "x". La dimensione dell'universo (che è , vedere la sezione 2.1) non cambia. Inoltre, l'introduzione alla sezione 1 osserva che gli insiemi devono partizionare l'universo, che interpreto (forse in modo errato) per indicare che ogni elemento nell'universo si trova in un albero. Quindi, per come la leggo, questa costruzione non funziona su universi illimitati. È così che dovrei scrivere il mio commento sopra. n
jbapple,

9

Questo riferimento può essere utile: Brown e Tarjan, un algoritmo di fusione rapida , in cui gli autori mostrano come unire alberi binari bilanciati (AVL) in che è ottimale (per algoritmi basati sul confronto). mensono le lunghezze degli elenchi ordinati rappresentati dagli alberi di ricerca binari e si presume chemn.O(nlogmn)mnmn

Puoi anche vedere una discussione sulle diverse tecniche per unire i set ordinati nella sezione 11.5 di questo documento sugli alberi di ricerca delle dita


2
Sia la limite di tempo e il limite inferiore corrispondente presuppongono chemn. O(nlogmn)mn
Jeffε,

Ho pensato che ciò fosse implicito nel tempo, ma ho modificato la domanda per renderlo esplicito.
Joe,

0

1
La loro struttura dati supporta l' unione nel tempo ammortizzato O (1), non l'unione. Tutti gli elementi in un albero devono essere più piccoli di tutti gli elementi nell'altro.
Jeffε,

TiTjTiTjTjTiw(Ti)=w(Tj)TjTiTiTjTi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.