Angenommen, wir implementieren einen B + -Baum im Speicher, Schlüssel befinden sich an den internen Knoten und Schlüssel-Daten-Paare befinden sich in den Blattknoten. Wenn B + Baum mit einem Fan-Out f, bedeutet dies, dass B + Baum eine Höhe von log_f N haben wird, wobei N die Anzahl der Schlüssel ist, während die entsprechende BST Höhe von log_2 N haben wird. Wenn wir nicht tun Disk liest und schreibt, kann die B + Baumsuchleistung besser sein als die Suchleistung der Binärsuche? Wie? Da für B + Baum an jedem internen Knoten haben wir eine Entscheidung über F viele Entscheidungen statt, wenn 1 für BST?Kann die B + Baumsuche besser abschneiden als die Binärsuchbaumsuche, bei der alle Schlüssel-Daten der Blattknoten im Speicher sind?
Antwort
Zumindest im Vergleich zum Cache hat der Hauptspeicher viele der gleichen Eigenschaften wie ein Festplattenlaufwerk - es hat eine ziemlich hohe Bandbreite, aber viel höhere Latenz als Cache. Es hat eine ziemlich große minimale Lese-Größe und gibt wesentlich höhere Bandbreite, wenn Lesevorgänge vorhersagbar sind (z.B. wenn Sie eine Anzahl einer Anzahl von Cache-Zeilen an zusammenhängenden Adressen lesen). Als solches profitiert es von den gleichen Optimierungsmöglichkeiten (obwohl die Details oft ein wenig variieren).
B-Bäume (und Varianten wie B * und B + Bäume) wurden explizit entworfen, um gut mit den Zugriffsmustern zu funktionieren, die von Laufwerken gut unterstützt werden. Da Sie sowieso eine ziemlich große Menge an Daten lesen müssen, können Sie die Daten genauso gut packen, um die Menge zu maximieren, die Sie aus dem Speicher, den Sie lesen müssen, erhalten. In beiden Fällen erhalten Sie auch häufig einen beträchtlichen Bandbreitengewinn, indem Sie ein Vielfaches des minimalen Lesewerts in einem vorhersagbaren Muster lesen (insbesondere eine Anzahl von aufeinanderfolgenden Lesevorgängen an aufeinanderfolgenden Adressen). Daher ist es oft sinnvoll, die Größe einer einzelnen Seite auf etwas zu erhöhen, das größer ist als das Minimum, das Sie gleichzeitig lesen können.
Ebenso können wir in beiden Fällen das Absteigen durch mehrere Ebenen von Knoten im Baum planen, bevor wir die Daten finden, die uns wirklich interessieren. Ähnlich wie beim Lesen von der Festplatte profitieren wir von der Maximierung der Dichte der Schlüssel in den Daten, die wir lesen, bis wir tatsächlich die Daten gefunden haben, die uns wichtig sind. Mit einem typischen binären Baum:
... lesen wir eine Reihe von Daten, für die wir keine wirkliche Verwendung haben Nur wenn wir den richtigen Schlüssel gefunden haben, möchten/wollen wir die zugehörigen Daten erhalten. In Fairness, können wir das mit einem binären Baum tun als auch mit nur einer relativ geringen Modifikationen an die Knotenstruktur:
template <class T, class U>
struct node {
T key;
U *data;
node *left;
node *right;
};
nun der Knoten enthält nur einen Zeiger auf die Daten, anstatt die Daten selbst. Dies wird nichts erreichen, wenn data
klein ist, aber kann viel erreichen, wenn es groß ist.
Zusammenfassung: aus dem Blickwinkel der CPU, Lesevorgänge aus dem Hauptspeicher haben die gleichen grundlegenden Eigenschaften wie liest von Festplatte; Eine Festplatte zeigt nur eine extremere Version dieser Eigenschaften. Daher gelten die meisten Entwurfsüberlegungen, die zum Entwurf von B-Bäumen (und Varianten) geführt haben, in ähnlicher Weise für Daten, die im Hauptspeicher gespeichert sind.
B-Bäume funktionieren gut und bieten oft erhebliche Vorteile, wenn sie für In-Memory-Speicher verwendet werden.
Vielen Dank für die Antwort. Aber in B + Baum außer der Wurzel können die internen Knoten mehr als zwei Kinder haben und annehmen, dass jeder Knoten bereits Daten speichert. Wir brauchen also keinen Zeiger auf Daten. Daten sind auch im Speicher. In diesem Fall frage ich mich, ob B + tree immer noch besser als der binäre Suchbaum sein kann? – burcak
- 1. XPath-Ausdruck für die Auswahl alle Blattknoten
- 2. BK - Baumsuche Alle
- 3. Inwieweit beeinflusst die Anzahl der Shader im Speicher die Leistung?
- 4. Ist die Suche im Goldenen Schnitt besser als die Binärsuche?
- 5. Die Reihenfolge der Daten im Speicher
- 6. MySQL alle Einträge auswählen, die älter als 10 Tage sind
- 7. Puffern der Prozessausgabe, die Abschneiden verursacht?
- 8. Sind Fälschungen besser als Mocks?
- 9. Gelöschte Datenbanken weiterhin im Blattknoten
- 10. Wie alle Musikdateien, die im internen Speicher und im externen Speicher in Android gespeichert sind, mit MediaStore abgerufen werden?
- 11. Wo sind globale Variablen, die im Speicher statisch gespeichert sind?
- 12. Was sind alle Aktionen, die der Merlin Agent machen kann?
- 13. Wie behandeln Datk-Datenrahmen Datensätze, die größer als der Speicher sind?
- 14. Kann Chronik-Karte Daten verarbeiten, die größer sind als der Speicher?
- 15. Anzahl der Simulationen pro Knoten in der Monte-Carlo-Baumsuche
- 16. Was sind die häufigsten Fehler bei der Magento-Konfiguration?
- 17. Holen Sie sich die Liste der Blattknoten in ausgefallenen Baum
- 18. JavaScript-Nummern, alle die gleiche Größe im Speicher?
- 19. rxjs Baumsuche
- 20. Was sind die besten Vorgehensweisen bei der Autorisierung von Ressourcenlisten?
- 21. A == B vs B == A, Was sind die Unterschiede
- 22. JTree zeigt Knoten an, die als Blattknoten erweiterbar sein sollten.
- 23. Welche der XORs sind in Haskell besser?
- 24. NetLogo: ein Patch-Set zum Ausschließen von Patches erhalten, die im Speicher der Schildkröte enthalten sind
- 25. In C++, ist A + = B besser als A = A + B in der gleichen Weise ++ A ist zu A ++?
- 26. Tabelle innerhalb der Transaktion abschneiden
- 27. Kann ein neuronales Netzwerk besser funktionieren als der markierte Trainingssatz?
- 28. Löscht der QList-Funktionsaufruf die Speicher dynamisch zugewiesener Objekte, die in der QList gespeichert sind?
- 29. Ich möchte ein Bild nur dann abschneiden, wenn die Breite größer ist als der Container
- 30. Wie sind Kotlin-Routinen besser als RxKotlin?
So ziemlich keine. Die ganze Anziehungskraft von B + -Bäumen besteht darin, die Suche nach Platten zu reduzieren, da der Plattenzugriff so langsam ist. Ich kann es auf Grund seiner Cachefreundlichkeit immer noch besser als ein naives BST sehen, aber es ist unwahrscheinlich, und in diesem Fall könnte die BST wahrscheinlich weitere Optimierung mit einer besseren Zuteilungsstrategie verwenden. –
Wenn B + tree vollständig im Speicher implementiert ist, konnte ich keinen Grund sehen, dass es besser funktioniert als BST. Aber warum denken Sie, dass B + tree Cache-Freundlichkeit hat und BST nicht? – burcak
Da es seine internen F-Tasten in Vektor oder etwas ansteckend setzen kann, dass abhängig von Ihrer Implementierung von, möglicherweise nicht der Fall für BST –