Sự khác biệt giữa cây B và cây B + là gì?


293

Trong cây b, bạn có thể lưu trữ cả khóa và dữ liệu trong các nút bên trong và nút lá , nhưng trong cây b + bạn chỉ phải lưu trữ dữ liệu trong các nút lá .

Có bất kỳ lợi thế của việc làm ở trên trong một cây b +?

Tại sao không sử dụng cây b thay vì cây b + ở mọi nơi, vì theo trực giác chúng có vẻ nhanh hơn nhiều?

Ý tôi là, tại sao bạn cần sao chép khóa (dữ liệu) trong cây b +?


37
Tôi nghĩ những gì họ nói là "B-Tree" so với B + -Tree. Chúng có nghĩa là một dấu gạch nối, không phải là một dấu trừ.
stu

Câu trả lời:


421

Hình ảnh dưới đây giúp hiển thị sự khác biệt giữa cây B + và cây B.

Ưu điểm của cây B +:

  • Vì cây B + không có dữ liệu liên quan đến các nút bên trong, nên nhiều khóa có thể vừa với một trang của bộ nhớ. Do đó, nó sẽ yêu cầu ít bộ nhớ cache hơn để truy cập dữ liệu trên một nút lá.
  • Các nút lá của cây B + được liên kết, do đó, việc quét toàn bộ tất cả các đối tượng trong cây chỉ cần một tuyến tính đi qua tất cả các nút lá. Cây AB, mặt khác, sẽ yêu cầu di chuyển ngang qua mọi cấp độ trong cây. Truyền tải toàn cây này có thể sẽ liên quan đến việc bỏ lỡ bộ nhớ cache nhiều hơn so với truyền tải tuyến tính của lá B +.

Ưu điểm của cây B:

  • Vì cây B chứa dữ liệu với mỗi khóa, các nút được truy cập thường xuyên có thể nằm gần gốc hơn và do đó có thể được truy cập nhanh hơn.

Cây B và B +


2
Là bất kỳ ràng buộc của họ về số lượng các mục trong nút lá ??
TLE

38
@TLE Câu hỏi hay! Đúng. Một ổ cứng truy cập tối thiểu một trang bộ nhớ tại một thời điểm, vì vậy chúng tôi muốn phù hợp với tất cả các con trỏ trong một trang bộ nhớ. Chúng tôi muốn chỉ yêu cầu một đĩa đọc trên mỗi lần truy cập lá, vì vậy chúng tôi không muốn chỉ định nhiều hơn một kích thước trang của con trỏ cho một lá. Nếu chúng ta điền vào một chiếc lá với kích thước trang của con trỏ, và sau đó chúng ta muốn thêm một con trỏ khác vào chiếc lá này, chúng ta tạo hai con của nút này và đưa một nửa con trỏ của lá cho mỗi đứa trẻ mới. Tất nhiên, có thể có một số chia sẻ lại để đảm bảo chiều cao của cây được giữ ở mức tối thiểu. Không giúp đỡ à?
Rose Perrone

con trỏ cuối cùng của mỗi nút lá của cây B nên trỏ đến nút lá tiếp theo, phải không?
camino

8
Rất xin lỗi vì đã làm hỏng một chủ đề cũ như vậy, nhưng nhận xét của @ Babyburg về cách nhận xét của camino là không thực sự đúng; Trên thực tế, một B-Tree không có các nút lá được kết nối. A B +, chắc chắn.
Jason

Cảm ơn câu trả lời xuất sắc, trường hợp sử dụng là gì khi cần quét toàn bộ đối tượng trong cây B / B + trong ngữ cảnh cơ sở dữ liệu? Vì nó chủ yếu được sử dụng để lập chỉ mục, nên các tìm kiếm hầu như không cần phải quét toàn bộ cây phải và thay vào đó đi qua đường dẫn chỉ mục, điều đó có đúng không?
Siddhartha

113

Ưu điểm chính của cây B + so với cây B là chúng cho phép bạn đóng gói nhiều con trỏ hơn đến các nút khác bằng cách loại bỏ con trỏ vào dữ liệu, do đó làm tăng fanout và có khả năng giảm độ sâu của cây.

Nhược điểm là không có sự xuất hiện sớm khi bạn có thể tìm thấy sự trùng khớp trong một nút bên trong. Nhưng vì cả hai cấu trúc dữ liệu đều có các fanout khổng lồ, nên phần lớn các trận đấu của bạn sẽ nằm trên các nút lá, làm cho trung bình cây B + hiệu quả hơn.


1
Tôi thích câu trả lời của Jeff, vì nó nhấn mạnh sự khác biệt về hiệu quả khi thực hiện quét toàn bộ.
Rose Perrone

Tôi thực sự bối rối vì đi ngang qua cây b bằng cách sử dụng giao dịch theo thứ tự sẽ đọc tất cả các giá trị theo thứ tự được sắp xếp trong thời gian O (n). Nếu mỗi nút cây có kích thước tối ưu cho kích thước trang vật lý, có vẻ như mọi thứ không còn tối ưu hơn nữa. Ngược lại, chi phí để có được giá trị đầu tiên (nhỏ nhất) trong cây b + là O (log n) và sau đó đi qua mỗi lá là O (n) nên tổng chi phí là O (log n + n). Đây là công việc nhiều hơn và đọc nhiều đĩa hơn có ý nghĩa bởi vì cây có tất cả dữ liệu bổ sung này trong đó. Tôi không hiểu
Eric

Điều gì sẽ là một từ khác cho 'fanout' trong câu trên?
Jorge Bucaran

3
@JorgeBucaran fanout = số cạnh xuất phát từ một nút
bantmen

33

B + Cây dễ dàng hơn và hiệu suất cao hơn để thực hiện quét toàn bộ, vì khi xem xét mọi phần dữ liệu mà cây lập chỉ mục, vì các nút đầu cuối tạo thành một danh sách được liên kết. Để thực hiện quét toàn bộ với B-Tree, bạn cần thực hiện duyệt toàn bộ cây để tìm tất cả dữ liệu.

Mặt khác, cây B có thể nhanh hơn khi bạn thực hiện tìm kiếm (tìm kiếm một phần dữ liệu cụ thể bằng phím), đặc biệt là khi cây nằm trong RAM hoặc bộ lưu trữ không chặn khác. Vì bạn có thể nâng các nút thường được sử dụng trong cây, nên có ít so sánh hơn để có được dữ liệu.


1
Bạn có đồng ý sau đó một cây B + sẽ được sử dụng cho các tình huống trong đó có thể có một lần đọc tuần tự trên tất cả các dữ liệu do đó có thể đi qua các lá. Trong khi đó cây B sẽ là lý tưởng cho các tình huống Truy cập ngẫu nhiên?
JDPeckham

31
  1. Trong cây B khóa tìm kiếm và dữ liệu được lưu trữ trong các nút bên trong hoặc lá. Nhưng trong dữ liệu B + -tree chỉ được lưu trữ trong các nút lá.
  2. Quét toàn bộ cây B + rất dễ dàng vì tất cả dữ liệu được tìm thấy trong các nút lá. Quét toàn bộ cây B yêu cầu truyền tải đầy đủ.
  3. Trong cây B, dữ liệu có thể được tìm thấy trong các nút lá hoặc nút nội bộ. Xóa các nút nội bộ là rất phức tạp. Trong cây B +, dữ liệu chỉ được tìm thấy trong các nút lá. Xóa các nút lá là dễ dàng.
  4. Chèn vào cây B phức tạp hơn cây B +.
  5. Cây B + lưu trữ khóa tìm kiếm dự phòng nhưng cây B không có giá trị dự phòng.
  6. Trong cây B +, dữ liệu nút lá được sắp xếp theo danh sách liên kết tuần tự nhưng trong cây B, nút lá không thể được lưu trữ bằng danh sách được liên kết. Việc triển khai của nhiều hệ thống cơ sở dữ liệu thích sự đơn giản về cấu trúc của cây B +.

15

Ví dụ từ khái niệm hệ thống cơ sở dữ liệu 5

B + -tree Cây B +

cây B tương ứng Btree


5
Tôi không nghĩ B-Tree có liên kết đến con của nút. Ví dụ, hình thức Clearview bucketđến Mianus Bucket. Dù sao đi nữa cũng sẽ không có ý nghĩa gì vì ở giữa hai bạn có Downtown bucketnhiều thứ được tìm kiếm trong trường hợp bạn muốn thực hiện Quét chỉ mục trong cây B (yêu cầu quay lại). Bạn đã lấy cái này ở đâu vậy?
Evan Carroll

1
@EvanCarroll Khái niệm hệ thống cơ sở dữ liệu thứ 5, có thể bạn cần xác nhận với tác giả :)
camino

11

Xác định "nhanh hơn nhiều". Không có triệu chứng họ giống nhau. Sự khác biệt nằm ở cách họ sử dụng lưu trữ thứ cấp. Các bài viết trên Wikipedia về cây Bcây B + trông khá đáng tin cậy.


2
Tôi đồng ý với Charlie. Vì một nút của B-Tree đại diện cho một trang hoặc khối bộ nhớ thứ cấp, nên việc chuyển từ nút này sang nút khác đòi hỏi phải thay đổi trang tốn thời gian.

11

Adegoke A, Amit

Tôi đoán một điểm quan trọng mà mọi người đang thiếu là sự khác biệt giữa dữ liệu và con trỏ như được giải thích trong phần này.

Con trỏ: con trỏ đến các nút khác.

Dữ liệu: - Trong ngữ cảnh của các chỉ mục cơ sở dữ liệu, dữ liệu chỉ là một con trỏ khác đến dữ liệu thực (hàng) nằm ở một nơi khác.

Do đó, trong trường hợp cây B, mỗi nút có ba khóa thông tin, con trỏ tới dữ liệu được liên kết với các khóa và con trỏ tới các nút con.

Trong nút bên trong cây B + giữ các khóa và con trỏ tới nút con trong khi nút lá giữ các khóa và con trỏ tới dữ liệu liên quan. Điều này cho phép số lượng khóa nhiều hơn cho một kích thước nút nhất định. Kích thước của nút được xác định chủ yếu bởi kích thước khối.

Lợi thế của việc có nhiều khóa hơn cho mỗi nút được giải thích rõ ở trên vì vậy tôi sẽ tiết kiệm công sức gõ của mình.


10

B + Cây đặc biệt tốt trong lưu trữ dựa trên khối (ví dụ: đĩa cứng). với ý nghĩ này, bạn sẽ nhận được một số lợi thế, ví dụ (từ đỉnh đầu của tôi):

  • fanout cao / độ sâu thấp: điều đó có nghĩa là bạn phải lấy ít khối hơn để lấy dữ liệu. với dữ liệu xen kẽ với các con trỏ, mỗi lần đọc sẽ nhận được ít con trỏ hơn, do đó bạn cần nhiều tìm kiếm hơn để truy cập dữ liệu

  • lưu trữ khối đơn giản và nhất quán: một nút bên trong có N con trỏ, không có gì khác, một nút lá có dữ liệu, không có gì khác. điều đó làm cho nó dễ dàng phân tích, gỡ lỗi và thậm chí xây dựng lại.

  • mật độ khóa cao có nghĩa là các nút trên cùng gần như chắc chắn trên bộ đệm, trong nhiều trường hợp tất cả các nút bên trong được lưu trữ nhanh chóng, do đó chỉ có quyền truy cập dữ liệu phải vào đĩa.


2
Chủ yếu là cho cây trong bộ nhớ; nhưng có những lựa chọn phổ biến khác, như cây đỏ đen, danh sách bỏ qua, v.v.
Javier

Cây B cũng được thiết kế để lưu trữ dựa trên khối hiệu quả, hạn chế số lượng truy cập nút không triệu chứng. Mặt khác, nếu sử dụng phương tiện lưu trữ giống như bộ nhớ với quyền truy cập ngẫu nhiên, người ta có thể sử dụng cây nhị phân tự cân bằng như cây đỏ-đen để đạt được kết quả tốt hơn.
dionyziz

điểm đầu tiên của bạn không nên nói "ít tìm kiếm" hơn là "tìm kiếm nhiều hơn". Độ sâu nhỏ hơn -> ít tìm kiếm hơn
Jesse

1
@Jlie: fanout cao => độ sâu thấp => ít tìm kiếm, nhưng trộn dữ liệu và con trỏ có nghĩa là ít con trỏ hơn => fanout thấp => sâu hơn => tìm kiếm nhiều hơn
Javier

1
@AdegokeA: cây B + có hai loại nút: nút bên trong chỉ có khóa và con trỏ, không có dữ liệu; và các nút lá, với dữ liệu và không có con trỏ. cho phép số lượng khóa tối đa trên mỗi nút bên trong. nếu bạn lưu trữ dữ liệu trên một nút bên trong, thì bạn có thể phù hợp với ít con trỏ hơn và cây của bạn sẽ cao hơn.
Javier

5

Trong B + Tree, do chỉ các con trỏ được lưu trữ trong các nút bên trong, kích thước của chúng trở nên nhỏ hơn đáng kể so với các nút bên trong của cây B (lưu trữ cả dữ liệu + khóa). Do đó, các chỉ mục của cây B + có thể được tìm nạp từ bộ lưu trữ ngoài trong một đĩa đọc, được xử lý để tìm vị trí của mục tiêu. Nếu nó là cây B, thì cần phải đọc đĩa cho mỗi quá trình ra quyết định. Hy vọng tôi đã làm rõ quan điểm của mình! :)


4

**

Nhược điểm chính của B-Tree là khó khăn khi di chuyển các phím một cách tuần tự. Cây B + giữ lại thuộc tính truy cập ngẫu nhiên nhanh chóng của B-Tree đồng thời cho phép truy cập tuần tự nhanh chóng

** ref: Cấu trúc dữ liệu bằng C // Tác giả: Aaro M Tenenbaum

http://books.google.co.in/books?id=X0Cd1Pr2W0gC&pg=PA456&lpg=PA456&dq=drawback+of+B-Tree+is+the+diff Khóy + of + Giao dịch trên + F9MY7zEXYAMVKl_Sg4W-0LTRor8 & hl = en & sa = X & ei = n


1
Đây nên là câu trả lời chính xác. Tóm lại: Địa phương tham khảo.
Theodore Zographos

2

Lấy một ví dụ - bạn có một bảng với dữ liệu khổng lồ trên mỗi hàng. Điều đó có nghĩa là mọi trường hợp của đối tượng là Big.

Nếu bạn sử dụng cây B ở đây thì phần lớn thời gian dành cho việc quét các trang có dữ liệu - không có ích gì. Trong cơ sở dữ liệu đó là lý do sử dụng B + Cây để tránh quét dữ liệu đối tượng.

B + Cây tách các khóa khỏi dữ liệu.

Nhưng nếu kích thước dữ liệu của bạn ít hơn thì bạn có thể lưu trữ chúng bằng khóa, đó là những gì cây B làm.


1
"Nếu bạn sử dụng cây B ở đây thì phần lớn thời gian được dành để quét các trang có dữ liệu" - không cần thiết. Các nút cây B chỉ có thể giữ "con trỏ" cho dữ liệu trên đĩa chứ không phải dữ liệu.
TT_

2

Sự khác biệt chính giữa cây B và cây B + là cây B loại bỏ việc lưu trữ các giá trị khóa tìm kiếm dư thừa. Các khóa tìm kiếm không được lặp lại trong cây B, chúng ta có thể không lưu trữ được chỉ mục bằng cách sử dụng ít nút cây hơn so với chỉ số cây B + tương ứng. Tuy nhiên, do khóa tìm kiếm xuất hiện trong các nút không có lá xuất hiện ở nơi nào khác trong cây B, chúng tôi buộc phải đưa vào một trường con trỏ bổ sung cho mỗi khóa tìm kiếm trong một nút không có lá. Chúng là những lợi thế về không gian cho cây B, vì sự lặp lại không xảy ra và có thể được sử dụng cho các chỉ số lớn.


1
Thật thú vị, những suy nghĩ về sự lặp lại là duy nhất trong số các câu trả lời ở đây và có ý nghĩa hơn so với việc truyền theo thứ tự của cây b + hiệu quả hơn so với việc truyền theo thứ tự của cây b. Theo như tôi có thể nói, điều đó không hoàn toàn đúng hoặc không phải là toàn bộ câu chuyện theo thứ tự của cây b là O (n) và tìm nút nhỏ nhất trong cây b + là O (log n) và sau đó đi qua mỗi lá là O (n) ngoài ra. Tuy nhiên, nếu bạn đã lập chỉ mục một cái gì đó với một phạm vi giá trị nhỏ, như trường boolean, cây b + có ý nghĩa hơn nhiều so với cây b vì cách xử lý trùng lặp của nó.
Eric

1

Cây B + là một cây cân bằng, trong đó mọi đường đi từ gốc của cây đến lá có cùng chiều dài và mỗi nút không bịt của cây có giữa [n / 2] và [n] con, trong đó n là cố định cho một cây cụ thể. Nó chứa các trang chỉ mục và các trang dữ liệu. Cây nhị phân chỉ có hai con trên mỗi nút cha, cây B + có thể có số lượng con khác nhau cho mỗi nút cha


1
Nói rõ hơn, cây B không phải là cây nhị phân. Trên thực tế, cây B và cây B + gần nhau hơn trong xây dựng và sử dụng so với cây nhị phân. Các bài viết wiki có thể giúp xóa các định nghĩa - B + Tree , B TreeBinary Tree
uutsav

1

Một cách sử dụng cây B + có thể là nó phù hợp với các tình huống cây phát triển quá lớn đến nỗi nó không phù hợp với bộ nhớ khả dụng. Do đó, bạn thường mong muốn được thực hiện nhiều I / O.
Điều thường xảy ra là cây B + được sử dụng ngay cả khi thực tế nó phù hợp với bộ nhớ, và sau đó trình quản lý bộ đệm của bạn có thể giữ nó ở đó vĩnh viễn. Nhưng đây là trường hợp đặc biệt, không phải là trường hợp chung và chính sách bộ nhớ đệm tách biệt với bảo trì cây B + như vậy.

Ngoài ra, trong cây B +, các trang lá được liên kết với nhau trong danh sách được liên kết (hoặc danh sách liên kết đôi), giúp tối ưu hóa các giao dịch (cho tìm kiếm phạm vi, sắp xếp, v.v.). Vì vậy, số lượng con trỏ là một hàm của thuật toán cụ thể được sử dụng.


Đây là câu trả lời cho câu hỏi tại sao chúng ta không nên sử dụng cây B thay vì cây B + ở mọi nơi :)
lập trình viên stack

3
Nhưng bạn chỉ mô tả một mặt, theo như chúng tôi biết, với câu trả lời của bạn b-cây có thể hoạt động chính xác theo cùng một cách. OP yêu cầu giải thích sự khác biệt và bạn chỉ nói về cái này chứ không phải cái khác. Bạn không thể có một sơ đồ venn với một vòng tròn!
Malfist
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.