QNA > A > Ci Sono Librerie Che Implementano I Contenitori B-Tree Negli Standard Ansi C++?
Domanda

Ci sono librerie che implementano i contenitori B-tree negli standard ANSI C++?

Risposte
03/26/2022
Nieberg Farnum

Prima di tutto, un'osservazione: Anche se C++ era uno standard ANSI in passato (la A sta per Americano), ora è uno standard ISO (la I sta per Internazionale), ed è sviluppato attraverso la cooperazione tra l'ANSI e organismi di standard simili di molte altre nazioni. Quindi è più accurato riferirsi ad esso come standard ISO C++.

Dato che stiamo parlando di ISO C++, quindi, la risposta è no. Almeno, è possibile implementare un'implementazione pienamente conforme del C++ che non usa un B-tree.

La libreria C++ specifica molto raramente che i suoi contenitori devono essere implementati usando qualche particolare algoritmo o struttura dati. Piuttosto, gli standard sono stati sviluppati con particolari algoritmi in mente, e una serie di proprietà desiderabili da quell'algoritmo sono poi elencate nello standard (per esempio: si devono poter aggiungere elementi in tempo logaritmico, i riferimenti agli elementi devono rimanere stabili, e si deve essere in grado di iterare sugli elementi in ordine ordinato e in tempo lineare). Un implementatore C++ può quindi implementare la libreria usando qualsiasi algoritmo voglia, purché queste proprietà siano soddisfatte. Questo lascia spazio a ottimizzazioni interessanti e significa che qualcuno potrebbe potenzialmente usare un B-tree.

In pratica, però, non lo fanno. Il problema è che i B-trees hanno bisogno della capacità di dividere i loro nodi in sotto-nodi, e quando questo viene fatto, è molto difficile mantenere in modo efficiente la proprietà che i puntatori agli elementi dell'albero rimangano stabili. Ci sono diversi contenitori nella libreria che sono tipicamente implementati usando alberi (set, map, multi_set e multi_map sono quelli che ricordo), ma sono tipicamente implementati usando un albero rosso-nero.

L'altro problema è che i B-trees sono tipicamente usati per l'immagazzinamento di dati su una memoria esterna, come un disco rigido, un nastro magnetico o un drive di rete. Sono ottimizzati per ridurre il numero di letture di blocchi necessarie per trovare i dati. I contenitori C++ non sono facilmente adattabili per l'uso su storage esterno, quindi il caso d'uso principale per i B-trees non gioca bene con la libreria standard.

Ho paura che se volete usare i B-trees, avrete bisogno di trovare una buona libreria di terze parti. Ci sono un sacco di risultati su Google per tali librerie, ma non ho fatto abbastanza ricerche per capire quale sarebbe la migliore.

Dare una risposta
Come entrare nella coltivazione di alberi per soldi su larga scala :: Quanto è grande un contenitore per alberi da 30 galloni?
Link utili