Miglior BST auto-bilanciamento per un rapido inserimento di un gran numero di nodi

voti
8

Sono stato in grado di trovare i dettagli su più auto-bilanciamento BSTs attraverso diverse fonti, ma non ho trovato alcun buone descrizioni in dettaglio qual è il migliore da utilizzare in situazioni diverse (o se davvero non importa).

Voglio una BSTche è ottimale per l'archiviazione di oltre dieci milioni di nodi. L'ordine di inserimento dei nodi è sostanzialmente casuale e io non avrà mai bisogno di eliminare i nodi, quindi il tempo di inserimento è l'unica cosa che avrebbe bisogno di essere ottimizzato.

Ho intenzione di utilizzare per memorizzare gli stati del gioco precedentemente visitati in un gioco di puzzle, in modo che posso controllare velocemente se è già stato incontrato una configurazione precedente.

È pubblicato 05/08/2008 alle 16:40
fonte dall'utente
In altre lingue...                            


4 risposte

voti
0

Le due auto-bilanciamento BSTs cui sono più familiarità con sono rosso-nero e AVL, quindi non posso dire per certo se eventuali altre soluzioni sono migliori, ma mi sembra di ricordare, rosso-nero ha inserimento più veloce e più lento recupero rispetto al AVL.

Quindi, se l'inserimento è una priorità maggiore rispetto recupero, rosso-nero può essere una soluzione migliore.

Risposto il 05/08/2008 a 16:50
fonte dall'utente

voti
3

Red-nero è meglio di AVL per applicazioni di inserimento-pesante. Se si prevede relativamente uniforme look-up, poi rosso-nero è la strada da percorrere. Se si prevede un tempo relativamente sbilanciata look-up dove gli elementi visualizzati più di recente hanno maggiori probabilità di essere visti ancora una volta, si desidera utilizzare albero splay .

Risposto il 05/08/2008 a 16:59
fonte dall'utente

voti
3

Perché usare un BSTa tutti? Dalla tua descrizione di un dizionario funziona altrettanto bene, se non meglio.

L'unica ragione per usare una BSTsarebbe se si voleva elencare il contenuto del contenitore per chiave. Certamente non suona come si vuole farlo, nel qual caso vanno per la tabella di hash. O(1)inserimento e di ricerca, nessuna preoccupazione per la cancellazione, cosa c'è di meglio?

Risposto il 29/08/2008 a 01:10
fonte dall'utente

voti
-2

[Tabelle hash avere] O (1) l'inserimento e la ricerca

Penso che questo è sbagliato.

Prima di tutto, se si limita lo spazio delle chiavi di essere finito, è possibile memorizzare gli elementi di un array e fare un O (1) scansione lineare. Oppure si potrebbe shufflesort l'array e poi fare una scansione lineare O (1) tempo previsto. Quando roba è finita, roba è facilmente O (1).

Quindi diciamo che la vostra tabella di hash memorizzerà qualsiasi stringa di bit arbitraria; essa non ha molta importanza, purché ci sia un insieme infinito di chiavi, ciascuna delle quali sono finite. Poi si deve leggere tutti i bit di qualsiasi ingresso query e inserimento, altro che inserire y0 in un hash vuoto e interrogare y1, dove y0 e y1 differiscono in un'unica posizione di bit che non si guarda.

Ma diciamo che le lunghezze delle chiavi non sono un parametro. Se il vostro inserimento e ricerca prendono O (1), in particolare hashing prende O (1) tempo, il che significa che si guarda solo al una quantità finita di uscita dalla funzione di hash (da cui non c'è probabilità di essere solo un'uscita finita, concesso ).

Ciò significa che con un numero finito di secchi, ci deve essere un insieme infinito di stringhe che hanno tutti lo stesso valore di hash. Supponiamo che io inserisco un sacco, cioè ω (1), di quelli, e iniziare l'esecuzione di query. Ciò significa che la vostra tabella di hash deve ripiegare su qualche altro O (1) meccanismo di inserimento / ricerca per rispondere alle mie domande. Quale, e perché non basta usare che direttamente?

Risposto il 01/02/2009 a 13:49
fonte dall'utente

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