1. Trang chủ
  2. » Giáo án - Bài giảng

Bài giảng môn cấu trúc dữ liệu 2: Chương 4

24 171 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 24
Dung lượng 285,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Như vậy, một node không phải là lá phải luôn luôn có số node con nhiều hơn 1 so với số mục dữ liệu của nó... Nếu mục dữ liệu được thêm vàonode mà có node con, thì số lượng của các node c

Trang 1

CHƯƠNG 4 - B-TREE

Đối với cây nhị phân, mỗi node chỉ có một mục dữ liệu và có thể có hai node con Nếu chúng ta chophép một node có nhiều mục dữ liệu và nhiều node con thì kết quả là ta được cây nhiều nhánh Cây 2-3-4 là cây nhiều nhánh mà mỗi node của nó có thể có đến bốn node con và có 3 mục dữ liệu

Để bước đầu làm quen với B-tree chúng ta khảo sát cây 2-3-4 Cây 2-3-4 là cây cân bằng giống nhưcây đỏ-đen Tuy nhiên, ít hiệu quả hơn cây đỏ-đen nhưng ngược lại chúng lại dễ lập trình

B-tree là một dạng của cây nhiều nhánh, B-tree đặc biệt hữu dụng đối với việc tổ chức dữ liệu ở bộ nhớngoài Một node trong B-tree có thể có hàng chục thậm chí hàng trăm node con Chúng ta sẽ thảo luận

về bộ nhớ ngoài và B-tree trong phần tiếp theo

1 CÂY 2-3-4

1.1 Giới thiệu về cây 2-3-4

Chúng ta sẽ xem xét các đặc tính của cây 2-3-4 và mối quan hệ khá gần gũi giữa cây 2-3-4 vàcây đỏ-đen

Hình 4.1 trình bày một cây 2-3-4 đơn giản Mỗi node có thể lưu trữ 1, 2 hoặc 3 mục dữ liệu

Hình 4.1 cây 2-3-4

Các số 2, 3 và 4 trong cụm từ cây 2-3-4 có ý nghĩa là khả năng có bao nhiêu liên kết đến các

node con có thể có được trong một node cho trước Đối với các node không phải là lá, có thể có

3 cách sắp xếp sau:

Một node với một mục dữ liệu thì luôn luôn có 2 con

Một node với hai mục dữ liệu thì luôn luôn có 3 con

Một node với ba mục dữ liệu thì luôn luôn có 4 con

Như vậy, một node không phải là lá phải luôn luôn có số node con nhiều hơn 1 so với số mục

dữ liệu của nó Nói cách khác, đối với mọi node với số con là l và số mục dữ liệu là d, thì : l = d+ 1

Trang 2

Hình 4.2 các trường hợp của cây 2-3-4Với mọi node lá thì không có node con nhưng có thể chứa 1, 2 hoặc 3 mục dữ liệu, không cónode rỗng.

Một cây 2-3-4 có thể có đến 4 cây con nên được gọi là cây nhiều nhánh bậc 4

Trong cây 2-3-4 mỗi node có ít nhất là 2 liên kết ,trừ lnode lá (node không có liên kết nào).Hình 4.2 trình bày các trường hợp của cây 2-3-4 Một node với 2 liên kết gọi là một 2-node,một node với 3 liên kết gọi là một 3-node, và một node với 4 liên kết gọi là một 4-node, nhưng

ở đây không có loại node nào là 1-node

Tất cả các node con của cây con có gốc tại node con thứ 0 thì có các giá trị khoá nhỏhơn khoá 0

Tất cả các node con của cây con có gốc tại node con thứ 1 thì có các giá trị khoá lớnhơn khoá 0 và nhỏ hơn khoá 1

Tất cả các node con của cây con có gốc tại node con thứ 2 thì có các giá trị khoá lớnhơn khoá 1 và nhỏ hơn khoá 2

Trang 3

Tất cả các node con của cây con có gốc tại node con thứ 3 thì có các giá trị khoá lớnhơn khoá 2.

Trong tất cả cây 2-3-4, các lá đều nằm trên cùng một mức Các node ở mức trên thường khôngđầy đủ, nghĩa là chúng có thể chứa chỉ 1 hoặc 2 mục dữ liệu thay vì 3 mục

Lưu ý rằng cây 2-3-4 là cây cân bằng Nó vẫn giữ được sự cân bằng khi thêm vào các phần tử

có thứ tự (tăng dần hoặc giảm dần)

ta tìm được mục dữ liệu đã cho với liên kết là 62/64/66

1.4 Thêm vào

Các mục dữ liệu mới luôn luôn được chèn vào tại các node lá Nếu mục dữ liệu được thêm vàonode mà có node con, thì số lượng của các node con cần thiết phải được chuyển đổi để duy trìcấu trúc cho cây, đây là lý do tại sao phải có số node con nhiều hơn 1 so với các mục dữ liệutrong một nút

Việc thêm vào cây 2-3-4 trong bất cứ trường hợp nào thì quá trình cũng bắt đầu bằng cách tìmkiếm node lá phù hợp

Nếu không có node đầy nào (node có đủ 3 mục dữ liệu) được bắt gặp trong quá trình tìm kiếm,việc chèn vào khá là dễ dàng Khi node lá phù hợp được tìm thấy, mục dữ liệu mới đơn giản làthêm vào nó Hình 4.3 trình bày một mục dữ liệu với khoá 18 được thêm vào cây 2-3-4

Việc chèn vào có thể dẫn đến phải di chuyển một hoặc hai mục dữ liệu trong node vì thế cáckhoá sẽ nằm với trật tự đúng sau khi mục dữ liệu mới được thêm vào Trong ví dụ này số 23phải được đẩy sang phải để nhường chỗ cho 18

Trang 4

Hình 4.3 Chèn vào không làm tách cây

(i) trước khi chèn vào(ii) sau khi chèn vàoTách nút

Việc thêm vào sẽ trở nên phức tạp hơn nếu gặp phải một node đầy (node có số mục dữliệu đầy đủ) trên nhánh dẫn đến điểm thêm vào Khi điều này xảy ra, node này cần thiếtphải được tách ra Quá trình tách nhằm giữ cho cây cân bằng Loại cây 2-3-4 mà chúng

ta đề cập ở đây thường được gọi là cây 2-3-4 top-down bởi vì các node được tách ratheo hướng đi xuống điểm chèn

Giả sử ta đặt tên các mục dữ liệu trên node bị phân chia là A, B và C Sau đây là tiếntrình tách (chúng ta giả sử rằng node bị tách không phải là node gốc; chúng ta sẽ kiểmtra việc tách node gốc sau này):

Một node mới và rỗng được tạo Nó là anh em với node sẽ được tách và đượcđưa vào bên phải của nó

Mục dữ liệu C được chuyển vào node mới

Mục dữ liệu B được chuyển vào node cha của node được tách

Mục dữ liệu A không thay đổi

Hai node con bên phải nhất bị hủy kết nối từ node được tách và kết nối đếnnode mới

Một ví dụ về việc tách node trình bày trên hình 4.4 Một cách khác để mô tả sự táchnode là một 4-node được chuyển đổi sang hai 2-nút

Trang 5

Chú ý rằng ảnh hưởng của sự tách node là dịch chuyển dữ liệu đi lên về bên phải Sự sắpxếp lại này nhằm mục đích giữ cho cây cân bằng.

Hình 4.4: Tách một nút

(i ) Trước khi chèn vào(ii) Sau khi chèn vàoTách node gốc

Khi gặp phải node gốc đầy tại thời điểm bắt đầu tìm kiếm điểm chèn, kết quả của việctách thực hiện như sau:

Node mới được tạo ra để trở thành gốc mới và là cha của node được tách.Node mới thứ hai được tạo ra để trở thành anh em với node được tách

Mục dữ liệu C được dịch chuyển sang node anh em mới

Mục dữ liệu B được dịch chuyển sang node gốc mới

Mục dữ liệu A vẫn không đổi

Hai node con bên phải nhất của node được phân chia bị hủy kết nối khỏi nó vàkết nối đến node mới bên phải

Trang 6

Hình 4.5 Tách node gốc

i) Trước khi thêm vàoii) Sau khi thêm vàoHình 4.5 chỉ ra việc tách node gốc Tiến trình này tạo ra một node gốc mới ở mức caohơn mức của node gốc cũ Kết quả là chiều cao tổng thể của cây được tăng lên 1

Đi theo node được tách này, việc tìm kiếm điểm chèn tiếp tục đi xuống phía dưới củacây Trong hình 4.5 mục dữ liệu với khoá 41 được thêm vào lá phù hợp

Tách theo hướng đi xuống

Chú ý rằng, bởi vì tất cả các node đầy được tách trên đường đi xuống nên việc tách nodekhông gây ảnh hưởng gì khi phải đi ngược lên trên của cây Node cha của bất cứ nodenào bị tách phải đảm bảo rằng không phải là node đầy, để đảm bảo node cha này có thểchấp nhận mục dữ liệu B mà không cần thiết nó phải tách ra Tất nhiên nếu node chanày đã có hai con thì khi node con bị tách, nó sẽ trở thành node đầy Tuy nhiên điều nàychỉ có nghĩa là nó có thể sẽ bị tách ra khi lần tìm kiếm kế tiếp gặp nó

Hình 4.6 trình bày một loạt các thao tác chèn vào một cây rỗng Có 4 node được tách, 2node gốc và 2 node lá

Thêm vào 70, 30, 50

Thêm 40

Trang 7

Thêm vào 20, 80

Thêm vào 25, 90

Thêm vào 75

Thêm vào 10

Hình 4.6 Minh họa thêm một node vào cây 2-3-4

1.5 Cây 2-3-4 và cây Đỏ-Đen

Cây 2-3-4 và cây đỏ-đen hầu như là các thực thể khác nhau hoàn toàn Tuy nhiên, ở một ngữcảnh nào đó chúng có sự tương đương với nhau Cây này có thể chuyển sang cây khác bằng mộtchương trình với một số quy tắc đơn giản, và thậm chí các thao tác để giữ cho chúng cân bằng

cũng tương đương Các nhà toán học gọi chúng là đồng đẳng.

Bạn có thể sẽ không cần chuyển đổi một cây 2-3-4 sang cây đỏ-đen, nhưng sự tương đương củacác cấu trúc này đưa ra thêm một quan niệm trên thao tác của chúng và điều này cũng hữu dụngtrong việc phân tích tính hiệu quả của chúng

Trong lịch sử thì cây 2-3-4 phát triển trước; Sau đó cây đỏ-đen suy ra từ nó

1.6 Chuyển từ cây 2-3-4 sang cây Đỏ-Đen

Một cây 2-3-4 có thể được chuyển sang cây đỏ-đen bằng cách áp dụng các luật sau:

Chuyển đổi bất kỳ 2-node ở cây 2-3-4 sang node đen ở cây đỏ-đen

Trang 8

Chuyển đổi bất kỳ 3-node sang node con C (với hai con của chính nó) và node cha P(với các node con C và node con khác) Không có vấn đề gì ở đây khi một mục trở thànhnode con và mục khác thành node cha C được tô màu đỏ và P được tô màu đen.

Chuyển đổi bất kỳ 4-node sang node cha P và cả hai node con C1, C2 màu đỏ

Hình 4.7 trình bày các chuyển đổi này Các node con trong các cây con được tô màu đỏ; tất cảcác node khác được tô màu đen

Hình 4.8 trình bày cây 2-3-4 và cây đỏ-đen tương ứng với nó bằng cách áp dụng các chuyển đổinày Các đường chấm xung quanh các cây con được tạo ra từ 3-node và 4-nút Các luật của câyđỏ-đen tự động thoả mãn với sự chuyển đổi này Kiểm tra rằng: Hai node đỏ không bao giờđược kết nối, và số lượng các node đen là như nhau ở mọi đường dẫn từ gốc đến lá (hoặc nodecon null)

Bạn có thể nghĩ rằng một 3-node ở cây 2-3-4 là tương đương với node cha có một node conmàu đỏ ở cây đỏ-đen, và một 4-node là tương đương với node cha có hai node con đỏ Điều nàynghĩa là node cha màu đen với node con đen ở cây đỏ-đen không biểu diễn một 3-node ở cây 2-3-4; nó chỉ biểu diễn một 2-node với node con 2-node khác Tương tự, một node cha màu đenvới 2 con màu đen không biểu diễn cho 4-nút

Hình 4.7 Chuyển đổi từ cây 2-3-4 sang cây đỏ-đen

Trang 9

Hình 4.8 Cây 2-3-4 và cây đỏ-đen tương ứng

Sự tương đương

Không những cấu trúc của cây đỏ-đen phù hợp với cây 2-3-4, mà các thao tác hoạt độngcủa hai loại cây này cũng tương đương nhau Trong cây 2-3-4 nó được giữ cân bằngbằng việc tách nút Trong cây đỏ-đen hai phương thức cân bằng là sự lật và quay màu

Việc tách 4-node và lật màu

Trong cây 2-3-4 khi bạn tìm xuống điểm chèn cho node mới, bạn tách mỗi 4-node thànhhai 2-nút Trong cây đỏ-đen bạn thực hiện việc lật màu Làm thế nào mà các thao tácnày là tương đương với nhau?

Trang 10

Kết quả chúng ta thấy rằng việc tách một 4-node trong quá trình chèn ở cây 2-3-4 làtương đương với việc thực hiện lật màu trong quá trình chèn ở cây đỏ-đen

Tách 3-node và quay

Khi một 3-node ở cây 2-3-4 được chuyển sang cây đỏ-đen tương đương của nó, có thể

có hai sự sắp xếp, như trình bày trong hình 4.8 Cả hai mục dữ liệu có thể trở thành nodecha Tùy thuộc vào node nào được chọn, node con sẽ là node con bên trái hoặc node conbên phải, và độ dốc của đường thẳng nối node cha và node con sẽ ở bên trái hoặc bênphải

Cả hai sự sắp xếp là hợp lệ; Tuy nhiên, chúng không tham gia để cân bằng cây Chúng tahãy xem xét tình huống trong ngữ cảnh lớn hơn

Hình 4.10-i trình bày cây 2-3-4 còn hình 4.10-ii, và 4.10-iii trình bày các cây đỏ-đentương đương được suy ra từ cây 2-3-4 bằng cách áp dụng các luật chuyển đổi ở trên Sựkhác nhau giữa chúng là cách lựa chọn hai mục dữ liệu nào trong 3-node để tạo nodecha; Trong hình ii, 80 là node cha, trong hình iii, 70 là node cha

Mặc dù cách sắp xếp này là hợp lệ, bạn có thể thấy rằng cây trong hình ii là không cânbằng trong khi cây trong hình iii là cân bằng Với cây đỏ-đen được cho trong hình ii,

Trang 11

chúng ta sẽ quay nó sang phải (và thực hiện việc chuyển đổi hai màu) để cân bằng nó.Điều đ ng ngạc nhiên sự quay này cho kết quả chính xác giống như cây trong hình iii.�

Trang 12

Một node cũng phải được duyệt trong cây 2-3-4, nhưng cây 2-3-4 thì ngắn hơn (có ítmức hơn) so với cây đỏ-đen khi số lượng các mục dữ liệu như nhau Xem hình 4.8, ởđây cây 2-3-4 có ba mức còn cây đỏ-đen có năm mức.

Cụ thể hơn, trong cây 2-3-4 có đến 4 con trên một nút Nếu mỗi node là đầy, chiều caocủa cây phải tỷ lệ với log4(N) Logarith với cơ số 2 và cơ số 4 khác nhau bởi một thừa sốhằng của 2 Kết quả, chiều cao của cây 2-3-4 sẽ thấp hơn một nửa so với chiều cao củacây đỏ-đen, miễn là tất cả các node là đầy Bởi vì tất cả chúng là không đầy, chiều caocủa cây 2-3-4 nằm trong khoảng log2(N+1) và log2(N+1)/2

Kết quả là việc giảm chiều cao của cây 2-3-4 sẽ dẫn đến việc giảm một ít thời gian tìmkiếm so với cây đỏ-đen

Mặt khác, có nhiều mục dữ liệu để kiểm tra trong mỗi nút, điều này sẽ tăng thời gian tìmkiếm Bởi vì các mục dữ liệu trong mỗi node được kiểm tra sử dụng tìm tuyến tính, điềunày sẽ nhân thời gian tìm kiếm hơn với một số lượng tỷ lệ với M, số lượng trung bìnhcủa các mục dữ liệu trên một nút Kết quả là thời gian tìm kiếm xấp xỉ M*log4(N).Một vài node chỉ chứa 1 mục dữ liệu, một vài node chứa 2, và một vài node chứa 3 Nếuchúng ta ước lượng trung bình là 2, thời gian tìm kiếm sẽ xấp xỉ là 2*log4(N) Đây làhằng số nhỏ có thể bỏ qua trong biễu diễn độ phức tạp theo ký hiệu Big-O

Kết quả, với cây 2-3-4 số lượng tăng lên của các mục dữ liệu trên node dẫn đến việc hủychiều cao giảm xuống của cây Thời gian tìm kiếm của cây 2-3-4 và cây nhị phân cânbằng như cây đỏ-đen là xấp xỉ bằng nhau, và cả hai đều bằng O (log(N))

Yêu cầu lưu trữ

Mỗi node trong cây 2-3-4 lưu trữ 3 tham chiếu đến các mục dữ liệu và 4 tham chiếu đếncác node con của nó Không gian lưu trữ này có thể được định dạng trong các mảng.Không phải tất cả không gian lưu trữ này đều được sử dụng Một node với chỉ một mục

dữ liệu sẽ bỏ trống 2/3 không gian lưu trữ dữ liệu và một nửa không gian đối với cácnode con Một node với hai mục dữ liệu sẽ bỏ trống 1/3 không gian lưu trữ dữ liệu và1/4 không gian đối với các node con; hay nói cách khác nó sẽ sử dụng 5/7 của khônggian có sẵn

Nếu chúng ta chỉ lấy trung bình 2 mục dữ liệu trên một nút, khoảng 2/7 không gian lưutrữ bị bỏ

Có thể sử dụng danh sách liên kết thay vì các sử dụng các mảng để lưu trữ các thamchiếu đến node con và dữ liệu, nhưng tổng chi phí của danh sách liên kết so với mảng(với chỉ ba hoặc bốn mục) có thể sẽ không làm tăng hiệu quả một cách đáng kể

Cây đỏ-đen chỉ có một vài node có một node con, vì thế hầu hết tất cả các không gianlưu trữ cho các tham chiếu của node con đều được sử dụng Ngoài ra, số mục dữ liệu màmỗi node chứa đựng lớn nhất chỉ là một mục dữ liệu Điều này sẽ làm cho cây đỏ-đenhiệu quả hơn cây 2-3-4 trong vấn đề sử dụng bộ nhớ

Trong C++, Java mỗi node lưu trữ các tham chiếu đến các đối tượng thay vì lưu trữchính đối tượng đó, sự khác biệt trong lưu trữ giữa cây 2-3-4 và cây đỏ-đen có thểkhông quan trọng, và việc lập trình về mặt nào đó là đơn giản đối với cây 2-3-4 Tuynhiên, trong các ngôn ngữ không sử dụng cách tham chiếu này, sự khác biệt trong hiệuquả lưu trữ giữa cây đỏ-đen và cây 2-3-4 là đáng kể

2 B-TREE

Trang 13

Cây 2-3-4 là một ví dụ về cây nhiều nhánh, trong cây nhiều nhánh mỗi node sẽ có nhiều hơn hai nodecon và nhiều hơn một mục dữ liệu Một loại khác của cây nhiều nhánh là B-tree, là cây rất hiệu quả khi

dữ liệu nằm trong bộ nhớ ngoài Bộ lưu trữ ngoài tiêu biểu là loại hệ thống đĩa như đĩa cứng mà ta cóthể nhìn thấy trên hầu hết các máy tính cá nhân hoặc máy máy chủ

Trong phần này chúng ta sẽ bắt đầu với việc mô tả các khía cạnh khác nhau trong việc xử lý tập tin.Chúng ta sẽ xem xét cách tiếp cận đơn giản để tổ chức dữ liệu bên ngoài: thứ tự tuần tự Cuối cùng,chúng ta sẽ thảo luận về B-tree và vấn đề lưu trữ dữ liệu trên bộ nhớ ngoài Kết thúc chương này làcách tiếp cận khác của lưu trữ ngoài: đánh chỉ số (indexing), đây là cách tiếp cận có thể áp dụngriênge3 hoặc kết hợp nó với B-tree

Một cách tiếp cận khác với các khía cạnh khác của lưu trữ ngoài, chẳng hạn như các kỹ thuật tìm kiếm

đó là phép băm (hashing) trình bày ở chương 2

Chi tiết của các kỹ thuật lưu trữ ngoài phụ thuộc vào từng hệ điều hành, từng ngôn ngữ, và thậm chí cả

về phần cứng sử dụng trong từng việc cài đặt cụ thể Trong phần này chúng sẽ thảo luận một cách tổngquát hơn so với hầu hết các chủ đề trong cuốn sách này

2.1.Truy xuất dữ liệu trên bộ nhớ ngoài

Các cấu trúc dữ liệu mà chúng ta đã thảo luận từ trước đến giờ đa số dựa trên lưu trữ dữ liệutrong bộ nhớ chính (thường gọi là RAM, viết tắt của Random Access Memory) Tuy nhiên,trong một vài tình huống, số lượng dữ liệu được xử lý là quá lớn để cùng một lúc đưa vào bộnhớ chính Trong trường hợp này các kiểu lưu trữ khác nhau là cần thiết Thường các tập tintrên đĩa có dung lượng lớn hơn nhiều so với bộ nhớ chính; điều này là đúng bởi vì giá thành khá

rẻ của chúng trên một đơn vị lưu trữ

Tất nhiên, các tập tin trên đĩa cũng có thuận lợi khác: đó là khả năng lưu trữ lâu dài của chúng.Khi bạn tắt máy (hoặc nguồn điện bị hư), dữ liệu trong bộ nhớ chính sẽ bị mất Các tập tin trênđĩa có thể lưu lại dữ liệu vô thời hạn khi nguồn điện bị tắt Tuy nhiên, sự khác biệt chủ yếu là vềkích cỡ mà chúng ta cần lưu ý ở đây

Bất lợi của việc lưu trữ ngoài là sự truy xuất chậm hơn so với bộ nhớ chính Sự khác biệt về tốc

độ này có thể được giải quyết bằng các kỹ thuật khác nhau để làm tăng tính tính hiệu quả củachúng

Một ví dụ trong việc lưu trữ ngoài đó là giả sử bạn viết một chương trình cơ sở dữ liệu để xử lý

dữ liệu trong danh bạ điện thoại của một thành phố có kích thước trung bình; cỡ 500,000 mục.Mỗi mục bao gồm tên, địa chỉ, số điện thoại, và các dữ liệu khác mà một công ty điện thoạithường sử dụng Giả sử mỗi mục được lưu trữ như là một mẫu tin với kích thước 512 byte Kếtquả kích của tập tin là 500,000*512=256,000,000 byte, vào khoảng 256 mêgabyte Chúng ta giả

sử rằng với lượng dữ liệu này là quá lớn so với bộ nhớ chính của một máy tính nào đó, nhưng

sẽ trở nên rất nhỏ để lưu trữ trên ổ đĩa

Kết quả là bạn có một số lượng lớn dữ liệu trên đĩa Làm thế nào bạn cấu trúc nó để thực hiệncác tính năng thông dụng mong muốn: tìm kiếm, chèn, xoá nhanh?

Có 2 vấn đề cần xem xét:

Việc truy cập dữ liệu trên đĩa chậm hơn nhiều so với truy cập trên bộ nhớ chính

Thứ hai là việc truy cập nhiều mẫu tin cùng một lúc

Truy xuất chậm

Ngày đăng: 08/06/2018, 12:21

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w