Jakie są różnice między drzewami B i drzewami B +?

293

W drzewie b można przechowywać zarówno klucze, jak i dane w węzłach wewnętrznych i liściach , ale w drzewie b + dane należy przechowywać tylko w węzłach liści .

Czy jest jakaś zaleta robienia powyższego na drzewie b +?

Dlaczego nie używać wszędzie b-drzew zamiast b + drzew, ponieważ intuicyjnie wydają się one znacznie szybsze?

Mam na myśli, dlaczego musisz replikować klucz (dane) w drzewie b +?

simplfuzz
źródło
37
Myślę, że to, co mówią, to „B-Tree” vs. B + -Tree. Oznaczają łącznik, a nie znak minus.
stu

Odpowiedzi:

421

Poniższy obraz pomaga pokazać różnice między drzewami B + a drzewami B.

Zalety drzew B +:

  • Ponieważ drzewa B + nie mają danych powiązanych z węzłami wewnętrznymi, na stronie pamięci można zmieścić więcej kluczy. Dlatego będzie wymagało mniejszej liczby braków pamięci podręcznej, aby uzyskać dostęp do danych znajdujących się w węźle liścia.
  • Węzły liści drzew B + są połączone, więc wykonanie pełnego skanowania wszystkich obiektów w drzewie wymaga tylko jednego liniowego przejścia przez wszystkie węzły liści. Z kolei drzewo AB wymagałoby przejścia przez każdy poziom drzewa. To przejście przez pełne drzewo prawdopodobnie będzie wiązało się z większą liczbą braków w pamięci podręcznej niż przejście liniowe liści B +.

Zaleta drzewek B:

  • Ponieważ drzewa B zawierają dane dla każdego klucza, często używane węzły mogą leżeć bliżej katalogu głównego, a zatem można uzyskać do nich szybszy dostęp.

B i B + drzewo

Rose Perrone
źródło
2
Czy ma to jakikolwiek wpływ na liczbę wpisów w węźle liścia?
TLE
38
@TLE Dobre pytanie! Tak. Dysk twardy ma dostęp do minimum strony pamięci na raz, dlatego chcemy zmieścić wszystkie wskaźniki na jednej stronie pamięci. Chcemy wymagać tylko jednego odczytu dysku na dostęp do liścia, więc nie chcemy przypisywać liścia więcej niż wielkości strony wskaźników. Jeśli wypełnimy liść wskaźnikami wielkości strony, a następnie chcemy dodać kolejny wskaźnik do tego liścia, tworzymy dwa elementy potomne tego węzła i każdemu nowemu dziecku dajemy połowę wskaźników liścia. Oczywiście mogą wystąpić przetasowania, aby wysokość drzewa była ograniczona do minimum. czy to pomaga?
Rose Perrone
ostatni wskaźnik każdego węzła liścia B-drzewa powinien wskazywać na następny węzeł liścia, prawda?
camino
8
Tak mi przykro, że wpadłem na tak stary wątek, ale komentarz @ Babyburgera na temat poprawności komentarza Camino nie jest prawdą; B-Tree w rzeczywistości nie ma połączonych węzłów liści. A B +, jasne.
Jason
Dzięki za doskonałą odpowiedź, jaki jest przypadek użycia, gdy konieczne byłoby pełne skanowanie obiektów w drzewie B / B + w kontekście bazy danych? Ponieważ jest to głównie używane do indeksowania, wyszukiwania prawie nigdy nie będą musiały skanować całego drzewa i przechodzić przez ścieżkę indeksu, czy to prawda?
Siddhartha,
113

Główną zaletą drzew B + w porównaniu z drzewami B jest to, że pozwalają spakować więcej wskaźników do innych węzłów poprzez usunięcie wskaźników do danych, zwiększając w ten sposób rozłożenie i potencjalnie zmniejszając głębokość drzewa.

Wadą jest to, że nie ma wczesnych outów, gdy można było znaleźć dopasowanie w węźle wewnętrznym. Ale ponieważ obie struktury danych mają ogromne fanouty, zdecydowana większość twoich dopasowań i tak będzie na węzłach liści, co czyni średnio drzewo B + bardziej wydajnym.

Vic E.
źródło
1
Wolę odpowiedź Jeffa, ponieważ podkreśla różnicę w wydajności podczas wykonywania pełnego skanu.
Rose Perrone
Jestem naprawdę zdezorientowany, ponieważ przemierzanie drzewa b za pomocą przejścia w kolejności odczyta wszystkie wartości w posortowanej kolejności w czasie O (n). Jeśli każdy węzeł drzewa ma optymalny rozmiar do fizycznego rozmiaru strony, wydaje się, że nie ma już optymalnej wielkości. I odwrotnie, koszt dotarcia do pierwszej (najmniejszej) wartości w drzewie b + wynosi O (log n), a następnie przejście przez każdy liść to O (n), więc całkowity koszt to O (log n + n). Jest to więcej pracy i więcej odczytów dysku, co ma sens, ponieważ drzewo zawiera wszystkie te dodatkowe dane. Nie rozumiem
Eric
Jak brzmiałoby inne słowo „fanout” w powyższym zdaniu?
Jorge Bucaran
3
@JorgeBucaran fanout = liczba krawędzi wychodzących z węzła
bantmen
33

Drzewa B + są znacznie łatwiejsze i wydajniejsze, aby wykonać pełne skanowanie, jak w przypadku każdego kawałka danych, które indeksuje drzewo, ponieważ węzły końcowe tworzą listę połączoną. Aby wykonać pełne skanowanie za pomocą B-drzewa, musisz wykonać pełne przejście drzewa, aby znaleźć wszystkie dane.

Z drugiej strony B-Drzewa mogą być szybsze podczas wyszukiwania (szukania określonego fragmentu danych według klucza), szczególnie gdy drzewo znajduje się w pamięci RAM lub innej pamięci nieblokowanej. Ponieważ można podnieść często używane węzły w drzewie, do uzyskania dostępu do danych potrzeba mniej porównań.

Jeff Mc
źródło
1
Zgadzasz się, że drzewo B + będzie używane w sytuacjach, w których może istnieć sekwencyjny odczyt wszystkich danych, a zatem będą mogły przejść przez liście. Podczas gdy drzewo B byłoby idealne w przypadku dostępu losowego?
JDPeckham,
31
  1. W drzewie B klucze wyszukiwania i dane są przechowywane w węzłach wewnętrznych lub liściowych. Ale w drzewku B + dane są przechowywane tylko w węzłach liści.
  2. Pełne skanowanie drzewa B + jest bardzo łatwe, ponieważ wszystkie dane znajdują się w węzłach liści. Pełny skan drzewa B wymaga pełnego przejścia.
  3. W drzewie B dane można znaleźć w węzłach liści lub węzłach wewnętrznych. Usuwanie wewnętrznych węzłów jest bardzo skomplikowane. W drzewie B + dane znajdują się tylko w węzłach liści. Usunięcie węzłów liści jest łatwe.
  4. Wstawienie do drzewa B jest bardziej skomplikowane niż drzewo B +.
  5. Drzewa B + przechowują zbędne klucze wyszukiwania, ale drzewo B nie ma nadmiarowej wartości.
  6. W drzewie B + dane węzła liścia są uporządkowane jako sekwencyjna lista połączona, ale w drzewie B węzeł liścia nie może być przechowywany przy użyciu listy połączonych. Wdrożenia wielu systemów baz danych preferują prostotę strukturalną drzewa B +.
androidcodehunter
źródło
15

Przykład z koncepcji systemu baz danych 5

Drzewo B + B + drzewo

odpowiadające B-drzewo Btree

Camino
źródło
5
Nie sądzę, że B-Tree ma linki do dzieci węzła. Na przykład z formularza Clearview bucketdo Mianus Bucket. Zresztą nie miałoby to większego sensu, ponieważ pomiędzy nimi masz Downtown bucketwiele do przeszukania w przypadku, gdy chcesz wykonać skanowanie indeksu w drzewie B (wymaga cofnięcia). Skąd to masz?
Evan Carroll,
1
@EvanCarroll Database system koncepcja 5th, być może trzeba potwierdzić autora :)
camino
11

Zdefiniuj „znacznie szybciej”. Asymptotycznie są mniej więcej takie same. Różnice polegają na tym, w jaki sposób wykorzystują pamięć dodatkową. Artykuły w Wikipedii na temat drzewek B i drzewek B + wyglądają na całkiem godne zaufania.

Charlie Martin
źródło
2
Zgadzam się z Charliem. Ponieważ jeden węzeł B-drzewa reprezentuje jedną stronę lub blok pamięci dodatkowej, przejście z jednego węzła do drugiego wymaga czasochłonnej zmiany strony.
11

Adegoke A, Amit

Myślę, że jedną istotną kwestią, której brakuje ludziom, jest różnica między danymi a wskaźnikami, jak wyjaśniono w tej sekcji.

Wskaźnik: wskaźnik do innych węzłów.

Dane: - W kontekście indeksów baz danych dane są tylko kolejnym wskaźnikiem do rzeczywistych danych (wierszy), które znajdują się gdzie indziej.

Dlatego w przypadku drzewa B każdy węzeł ma trzy klucze informacyjne, wskaźniki do danych związanych z kluczami i wskaźnik do węzłów potomnych.

W drzewie wewnętrznym B + trzymaj klucze i wskaźniki do węzła potomnego, podczas gdy węzeł liścia przechowuj klucze i wskaźniki do powiązanych danych. Pozwala to na większą liczbę kluczy dla danego rozmiaru węzła. Rozmiar węzła zależy głównie od wielkości bloku.

Zaletę posiadania większej liczby kluczy na węzeł wyjaśniono powyżej, więc oszczędzę czasu na pisaniu.

Saket
źródło
10

Drzewa B + są szczególnie dobre w przypadku przechowywania blokowego (np .: dysk twardy). Mając to na uwadze, zyskujesz kilka zalet, na przykład (z góry mojej głowy):

  • wysoka wentylacja / niska głębokość: oznacza to, że musisz dostać mniej bloków, aby dostać się do danych. z danymi przeplecionymi ze wskaźnikami, każdy odczyt dostaje mniej wskaźników, więc potrzebujesz więcej prób, aby dostać się do danych

  • proste i spójne przechowywanie bloków: węzeł wewnętrzny ma N wskaźników, nic więcej, węzeł liścia ma dane, nic więcej. dzięki czemu łatwo parsować, debugować, a nawet rekonstruować.

  • wysoka gęstość klucza oznacza, że ​​górne węzły prawie na pewno znajdują się w pamięci podręcznej, w wielu przypadkach wszystkie węzły wewnętrzne są szybko buforowane, więc tylko dostęp do danych musi przejść na dysk.

Javier
źródło
2
głównie dla drzew w pamięci; ale są też inne popularne opcje, takie jak czerwono-czarne drzewa, listy pominięć i tym podobne.
Javier
B-drzewa są również zaprojektowane do wydajnego przechowywania w oparciu o bloki, ograniczając asymptotyczną liczbę dostępów do węzłów. W przeciwnym razie, jeśli użyjesz podobnego do pamięci nośnika pamięci z dostępem losowym, możesz użyć samowyrównującego się drzewa binarnego, takiego jak czerwono-czarne drzewo, aby uzyskać lepsze wyniki.
dionyziz
nie powinienem w pierwszej kolejności mówić „mniej szuka” niż „więcej szuka”. Mniejsza głębokość -> mniej szuka
Jesse
1
@Jesse: wysoki fanout => mała głębokość => mniej poszukiwań, ale mieszanie danych i wskaźników oznacza mniej wskaźników => niski fanout => więcej głębokości => więcej poszukiwań
Javier
1
@AdegokeA: drzewo B + ma dwa rodzaje węzłów: węzły wewnętrzne tylko z kluczami i wskaźnikami, bez danych; i węzły liści, bez danych i bez wskaźników. która pozwala na maksymalną liczbę kluczy w każdym węźle wewnętrznym. jeśli przechowujesz dane w węźle wewnętrznym, możesz zmieścić mniej wskaźników, a twoje drzewo będzie wyższe.
Javier
5

W B + Tree, ponieważ tylko wskaźniki są przechowywane w wewnętrznych węzłach, ich rozmiar staje się znacznie mniejszy niż wewnętrzne węzły drzewa B (które przechowują oba dane + klucz). Dlatego też indeksy drzewa B + można pobrać z pamięci zewnętrznej w jednym czytniku dysku, przetworzyć w celu znalezienia lokalizacji celu. Jeśli było to drzewo B, odczyt dysku jest wymagany dla każdego procesu decyzyjnego. Mam nadzieję, że wyjaśniłem swój punkt widzenia! :)

VS7
źródło
4

**

Główną wadą B-Tree jest trudność sekwencyjnego przemierzania kluczy. Drzewo B + zachowuje właściwości szybkiego dostępu losowego drzewa B, jednocześnie umożliwiając szybki dostęp sekwencyjny

** ref: Struktury danych przy użyciu C // Autor: Aaro M. Tenenbaum

http://books.google.co.in/books?id=X0Cd1Pr2W0gC&pg=PA456&lpg=PA456&dq=drawback+of+B-Tree+is+the+difficulty+of+Traversing+the+keys+ kolejno kolejno&source=bl&ots=pGcPQSEJMS&s F9MY7zEXYAMVKl_Sg4W-0LTRor8 & hl = en & sa = X & ei = nD5AUbeeH4zwrQe12oCYAQ & ved = 0CDsQ6AEwAg # v = on page & q = minus% 20of% 20B-Tree% 20ys% 20%% 20%% 20%% 20%

Kapil Kumar
źródło
1
To powinna być poprawna odpowiedź. W skrócie: lokalizacja odniesienia.
Theodore Zographos,
2

Weźmy przykład - masz tabelę z ogromną ilością danych na wiersz. Oznacza to, że każda instancja obiektu jest duża.

Jeśli użyjesz tutaj drzewa B, wówczas większość czasu spędza się na skanowaniu stron z danymi - co jest bezużyteczne. W bazach danych jest to powodem używania drzew B + do unikania skanowania danych obiektów.

B + Drzewa oddzielają klucze od danych.

Ale jeśli Twój rozmiar danych jest mniejszy, możesz przechowywać je z kluczem, co robi drzewo B.

Amit
źródło
1
„Jeśli użyjesz tutaj drzewa B, wówczas większość czasu zajmuje skanowanie stron z danymi” - nie jest to konieczne. Węzły B-drzewa mogą przechowywać tylko „wskaźniki” na danych na dysku, a nie same dane.
TT_
2

Podstawowa różnica między drzewem B i drzewem B + polega na tym, że drzewo B eliminuje zbędne przechowywanie wartości kluczy wyszukiwania. Ponieważ klucze wyszukiwania nie powtarzają się w drzewie B, może nie być możliwe przechowywanie indeksu przy użyciu mniejszej liczby węzłów drzewa niż w odpowiednim indeksie drzewa B +. Ponieważ jednak klucz wyszukiwania, który pojawia się w węzłach innych niż liście, nie pojawia się nigdzie indziej w drzewie B, jesteśmy zmuszeni dołączyć dodatkowe pole wskaźnika dla każdego klucza wyszukiwania w węźle innym niż liść. Są to zalety przestrzenne dla B-drzewa, ponieważ powtórzenie nie występuje i można je stosować dla dużych indeksów.

Mary
źródło
1
Co ciekawe, myśli o powtórzeniach są unikatowe wśród odpowiedzi tutaj i mają więcej sensu niż przechodzenie drzewa b + w kolejności, które jest bardziej wydajne niż przechodzenie drzewa b w kolejności. O ile mogę powiedzieć, to albo nie całkiem dobrze, albo nie cała historia, ponieważ w celu przejścia przez b-drzewo jest O (n), a znalezienie najmniejszego węzła w drzewie b + to O (log n), a następnie przemierzanie każdego liścia to dodatkowo O (n). Jeśli jednak indeksujesz coś z małym zakresem wartości, np. Pole boolowskie, drzewo b + ma o wiele więcej sensu niż drzewo b ze względu na jego zduplikowaną obsługę.
Eric
1

Drzewo B + jest zrównoważonym drzewem, w którym każda ścieżka od korzenia drzewa do liścia ma tę samą długość, a każdy nieleafowy węzeł drzewa ma między [n / 2] a [n] dziećmi, gdzie n jest naprawiono dla konkretnego drzewa. Zawiera strony indeksu i strony danych. Drzewa binarne mają tylko dwa elementy podrzędne na węzeł nadrzędny, drzewa B + mogą mieć zmienną liczbę elementów podrzędnych dla każdego węzła nadrzędnego

Vivek Rakholiya
źródło
1
Dla jasności drzewa B nie są drzewami podwójnymi. W rzeczywistości drzewa B i drzewa B + są bliżej siebie pod względem budowy i użytkowania niż drzewa binarne. Artykuły wiki mogą pomóc w usunięciu definicji - B + Tree , B Tree i Binary Tree
uutsav
1

Jednym z możliwych zastosowań drzew B + jest to, że nadaje się do sytuacji, w których drzewo rośnie tak duże, że nie mieści się w dostępnej pamięci. Dlatego ogólnie można oczekiwać, że będziesz wykonywać wiele operacji we / wy.
Często zdarza się, że drzewo B + jest używane nawet wtedy, gdy w rzeczywistości pasuje do pamięci, a następnie menedżer pamięci podręcznej może go tam przechowywać na stałe. Jest to jednak szczególny przypadek, nie ogólny, a zasady buforowania są odrębne od konserwacji drzewa B + jako takiej.

Ponadto w drzewie B + strony liści są połączone ze sobą na połączonej liście (lub podwójnie połączonej liście), co optymalizuje przechodzenie (dla przeszukiwania zakresu, sortowania itp.). Tak więc liczba wskaźników jest funkcją konkretnego algorytmu, który jest używany.

programator stosów
źródło
To odpowiedź na pytanie, dlaczego nie powinniśmy wszędzie używać drzew B zamiast drzew B + :)
programista stosów
3
Ale o ile nam wiadomo, opisałeś tylko jedną stronę, b-drzewa mogą funkcjonować dokładnie w ten sam sposób. OP poprosił o wyjaśnienie różnic, a ty mówiłeś tylko o jednym, a nie drugim. Nie możesz mieć schematu Venna z jednym okręgiem!
Malfist