Creare un equilibrato albero binario di ricerca da un flusso di numeri interi

voti
10

Ho appena finito un colloquio di lavoro e mi è stato alle prese con questa domanda, che mi sembra come una domanda molto difficile per che dà su un colloquio di 15 minuti.

La domanda era: scrivere una funzione che dato un flusso di numeri interi (non ordinate), costruisce un albero di ricerca bilanciato. Ora, non si può aspettare che l'ingresso fino alla fine (si tratta di un corso d'acqua), quindi è necessario bilanciare l'albero al volo.

La mia prima risposta è stato quello di utilizzare un albero rosso-nero, che ovviamente fa il lavoro, ma devo supporre che non si aspettavano me per implementare un albero nero rosso in 15 minuti.

Quindi, c'è una soluzione semplice per questo problema io non sono a conoscenza?

Grazie,

Dave

È pubblicato 29/08/2011 alle 22:25
fonte dall'utente
In altre lingue...                            


3 risposte

voti
3

Gli alberi AA sono un po 'più semplice di alberi rosso-neri, ma non ho potuto realizzare uno al largo della parte superiore della mia testa.

Risposto il 29/08/2011 a 22:28
fonte dall'utente

voti
9

Personalmente ritengo che il modo migliore per farlo sarebbe quello di andare a fare un albero binario di ricerca randomizzato come un Treap . Questo non assolutamente garantire che l'albero sarà equilibrato, ma con alta probabilità l'albero avrà un buon fattore di equilibrio. Un Treap funziona aumentando ogni elemento di albero con un numero uniformemente casuale, quindi assicurando che l'albero è un albero binario di ricerca rispetto ai tasti e un mucchio rispetto ai valori casuali uniformi. L'inserimento in un Treap è estremamente facile:

  1. Scegliere un numero casuale da assegnare all'elemento appena aggiunto.
  2. Inserire l'elemento nella BST mediante inserimento BST standard.
  3. Mentre il tasto dell'elemento appena inserita è maggiore la chiave del suo genitore, eseguire una rotazione albero per portare il nuovo elemento di sopra del suo genitore.

Questo ultimo passo è quello unico davvero difficile, ma se si ha un po 'di tempo per lavorare fuori su una lavagna sono abbastanza sicuro che si potrebbe implementare questo on-the-fly in un'intervista.

Un'altra opzione che potrebbe funzionare sarebbe quella di utilizzare un albero splay . E 'un altro tipo di BST veloce che può essere implementato a patto di avere una funzione di inserimento BST standard e la capacità di fare le rotazioni degli alberi. È importante sottolineare che, albero splay sono estremamente veloci, in pratica, ed è noto che sono (a meno di un fattore costante) almeno buono come qualsiasi altra statica albero binario di ricerca.

A seconda di cosa si intende con "albero di ricerca," si potrebbe anche prendere in considerazione la memorizzazione dei numeri interi in qualche struttura ottimizzata per la ricerca di numeri interi. Ad esempio, è possibile utilizzare un trie bit a bit per memorizzare i numeri interi, che sostiene di ricerca in tempo proporzionale al numero di bit in una parola della macchina. Ciò può essere implementato abbastanza bene utilizzando una funzione ricorsiva di guardare oltre i bit, e non richiede alcun tipo di rotazioni. Se avete bisogno di fare saltare fuori un'implementazione in un quarto d'ora, e se l'intervistatore consente di deviare dal alberi binari di ricerca standard, allora questo potrebbe essere una grande soluzione.

Spero che questo ti aiuti!

Risposto il 29/08/2011 a 22:33
fonte dall'utente

voti
1

Uno dei più semplici equilibrata albero binario di ricerca è BB (α) -tree. Scegliete il α costante, che dice quanto squilibrato l'albero può ottenere. In tutti i tempi, #descendants(child) <= (1-α) × #descendants(node)devono essere in possesso. Lo trattano come normale albero binario di ricerca, ma quando la formula non si applica a qualche nodo più, basta ricostruire quella parte della struttura da zero, in modo che sia perfettamente equilibrato.

La complessità temporale ammortizzato per l'inserimento o la cancellazione è ancora O (log N), così come con altri alberi binari bilanciati.

Risposto il 29/08/2011 a 22:49
fonte dall'utente

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