Sto leggendo su B Trees e sembra che realizzino le operazioni con i set dinamici in O (lg n) time. Anche l'albero nero rosso (TreeMap in java) raggiunge la stessa operazione in modo asintotico nello stesso intervallo di tempo. Quindi vorrei sapere cosa rende gli alberi B più utili per database e file systemPerché abbiamo bisogno di un datastructure separato come B-Tree per database e file system?
risposta
Il motivo principale dell'esistenza di B-Trees è utilizzare al meglio il comportamento dei dispositivi che leggono e scrivono grandi blocchi di dati. Due proprietà sono importanti per rendere il B-Tree meglio di alberi binari, quando i dati devono essere memorizzati su disco:
- accesso al disco è molto lento (rispetto alla memoria o cache, accesso casuale ai dati sul disco è ordini di magnitudine più lenta); e
- Ogni singola lettura causa il caricamento di un intero settore dall'unità, presupponendo una dimensione di settore di 4K, ovvero 1000 interi o decine di oggetti più grandi che si stanno archiviando.
Quindi, possiamo utilizzare i pro del secondo fatto, riducendo al contempo anche il numero di accessi al disco.
Quindi, invece di archiviare un solo numero in ogni nodo che ci dice se dovremmo continuare a sinistra o a destra, possiamo creare un indice più grande che ci dice se dovremmo continuare con il primo 1/100 , al secondo o al 99 ° (immagina i libri in una libreria ordinati per la prima lettera, poi per il secondo e così via). Finché tutti questi dati si adattano a un singolo settore, verranno caricati comunque, quindi potremmo anche utilizzarlo completamente.
Questo risulta approssimativamente nel registro b N ricerche, dove N è il numero di record. Questo numero, pur essendo asintoticamente uguale al log N, è in realtà un paio di volte più piccolo con N e b sufficientemente grandi - e poiché si tratta di memorizzare dati su disco per l'utilizzo in database, ecc., La quantità di dati di solito è abbastanza grande da giustificare questo.
Il resto della decisione di progettazione viene fatto principalmente per rendere efficiente questo lavoro, poiché la modifica di un albero N-ary è più complicata di una binario.
Grazie! Ho almeno letto circa 50 articoli sull'utilizzo dell'albero B, ma nessuno ha menzionato il secondo cono di accesso al disco che l'albero B si trasforma in un professionista. – ernesto
Gli alberi di RB sono alberi di ricerca binari. Gli alberi B possono avere più di due nodi figlio. In effetti, il numero di nodi figli è variabile.
Quindi, è possibile variare il numero di nodi figlio in modo che la dimensione di un nodo sia sempre un multiplo della dimensione del blocco del filesystem. Ciò riduce gli sprechi durante la lettura: non puoi leggere meno di un blocco, devi sempre leggere il blocco completo, quindi potresti anche riempirlo di dati utili. Aumentando il numero di nodi figli sarà anche diminuire la profondità dell'albero, riducendo così il numero medio di "hop" (cioè letture del disco), che aumenta nuovamente le prestazioni.
Ricorda: alberi B sono di solito utilizzati per strutture di dati dei negozi che sono ordini di grandezza più grande della memoria, mentre gli alberi RB sono tipicamente utilizzati per strutture di dati dei negozi che sono ordini di grandezza più piccola della memoria. In effetti, gli alberi B sono specificamente progettati come una struttura di dati su disco rispetto a una struttura di dati in memoria.
Questa è la frase chiave dal Wikipedia article (sottolineatura mia):
il B-albero è ottimizzato per i sistemi che leggono e scrivono grandi blocchi di dati
Noi hanno bisogno di algoritmi diversi perché la velocità di accesso in memoria è molto più veloce che su disco. Un albero rosso/nero rende molti accessi alla memoria, quindi funziona bene con la velocità di accesso veloce della memoria. Un b-tree rende gli accessi meno numerosi perché il disco che accede è lento.
- 1. perché abbiamo bisogno di Hadoop per Hypertable
- 2. perché abbiamo bisogno di ClassMethods e InstanceMethods?
- 3. Perché abbiamo bisogno fibre
- 4. Perché abbiamo bisogno di un pool di connessioni per JDBC?
- 5. perché abbiamo bisogno di np.squeeze()?
- 6. Perché abbiamo bisogno di Control.Lens.Reified?
- 7. Perché abbiamo bisogno di un tag fieldset?
- 8. Perché abbiamo bisogno di WCF
- 9. Marshalling: cos'è e perché ne abbiamo bisogno?
- 10. Perché abbiamo bisogno di un quarto costruttore per Lollipop?
- 11. Perché abbiamo bisogno di scalaz.stream su iteratee?
- 12. Perché abbiamo bisogno di endianness qui?
- 13. perché abbiamo bisogno di zone_highmem su x86?
- 14. Perché abbiamo bisogno di altre lingue JVM
- 15. Perché abbiamo bisogno di JWT quando abbiamo sessioni client?
- 16. Perché abbiamo bisogno di Anaconda quando abbiamo pip?
- 17. Perché abbiamo ancora bisogno di un file .lib stub quando abbiamo l'effettiva implementazione .dll?
- 18. perché abbiamo bisogno di root e logger in log4j.xml
- 19. Perché abbiamo bisogno di questo speciale operatore ===?
- 20. Perché abbiamo bisogno di funcall in Lisp?
- 21. Perché abbiamo bisogno di costruttori statici?
- 22. Perché abbiamo bisogno di typename qui?
- 23. Perché abbiamo bisogno di ng-clic?
- 24. Ho bisogno di un widget per sfogliare il file system
- 25. Perché abbiamo bisogno di SocketOptions.SO_BROADCAST per abilitare la trasmissione?
- 26. Perché abbiamo bisogno di eccezioni globali e globali nei montanti?
- 27. Perché abbiamo bisogno, quali vantaggi usare mangusta
- 28. Perché abbiamo bisogno di pull per aggiornare l'app mobile?
- 29. Angular 2 quickstart perché abbiamo bisogno di System.import in index.html
- 30. Abbiamo veramente bisogno di "oauth_nonce"?
Wikipedia ha una descrizione abbastanza buona dei problemi risolti da un albero B: http://en.wikipedia.org/wiki/B-tree#The_database_problem. –
@IvanVergiliev Ti dispiacerebbe riassumere la sezione pertinente dalla wiki sotto forma di risposta in modo che io possa accettarla. – Geek