Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 24 trang
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
Nội dung
Trương Hải Bằng – CấutrúcliệuCHƯƠNG - B-TREE Đối với nhị phân, node có mục liệu có hai node Nếu cho phép node có nhiều mục liệu nhiều node kết ta nhiều nhánh Cây 23-4 nhiều nhánh mà node có đến bốn node có mục liệu Để bước đầu làm quen với B-tree khảo sát 2-3-4 Cây 2-3-4 cân giống đỏ-đen Tuy nhiên, hiệu đỏ-đen ngược lại chúng lại dễ lập trình B-tree dạng nhiều nhánh, B-tree đặc biệt hữu dụng việc tổ chức liệu nhớ ngồi Một node B-tree có hàng chục chí hàng trăm node Chúng ta thảo luận nhớ B-tree phần CÂY 2-3-4 1.1 Giới thiệu 2-3-4 Chúng ta xem xét đặc tính 2-3-4 mối quan hệ gần gũi 2-3-4 đỏ-đen Hình 4.1 trình bày 2-3-4 đơn giản Mỗi node lưu trữ 1, mục liệu Hình 4.1 2-3-4 Các số 2, cụm từ 2-3-4 có ý nghĩa khả có liên kết đến node có node cho trước Đối với node khơng phải lá, có cách xếp sau: Một node với mục liệu ln ln có Một node với hai mục liệu ln ln có Một node với ba mục liệu ln ln có Như vậy, node khơng phải phải ln ln có số node nhiều so với số mục liệu Nói cách khác, node với số l số mục liệu d, : l = d +1 Chương 4: B-Tree Trang Trương Hải Bằng – Cấutrúcliệu Hình 4.2 trường hợp 2-3-4 Với node khơng có node chứa 1, mục liệu, khơng có node rỗng Một 2-3-4 có đến nên gọi nhiều nhánh bậc Trong 2-3-4 node có liên kết ,trừ lnode (node khơng có liên kết nào) Hình 4.2 trình bày trường hợp 2-3-4 Một node với liên kết gọi 2-node, node với liên kết gọi 3-node, node với liên kết gọi 4-node, khơng có loại node 1-node 1.2 Tổ chức 2-3-4 Các mục liệu node xếp theo thứ tự tăng dần từ trái sang phải (sắp xếp từ thấp đến cao) Một đặc tính quan trọng cấutrúc mối liên hệ liên kết với giá trị khóa mục liệu Trong tìm kiếm nhị phân, tất node bên trái có khố nhỏ khóa node xét tất node bên phải có khố lớn khóa node xét Trong 2-3-4 nguyên tắc giống trên, có thêm số điểm sau: Tất node có gốc node thứ có giá trị khoá nhỏ khoá Tất node có gốc node thứ có giá trị khố lớn khố nhỏ khoá Tất node có gốc node thứ có giá trị khố lớn khố nhỏ khoá Chương 4: B-Tree Trang Trương Hải Bằng – Cấutrúcliệu Tất node có gốc node thứ có giá trị khố lớn khoá Trong tất 2-3-4, nằm mức Các node mức thường khơng đầy đủ, nghĩa chúng chứa mục liệu thay mục Lưu ý 2-3-4 cân Nó giữ cân thêm vào phần tử có thứ tự (tăng dần giảm dần) 1.3 Tìm kiếm Thao tác tìm kiếm 2-3-4 tương tự thủ tục tìm kiếm nhị phân việc tìm kiếm node gốc chọn liên kết dẫn đến với phạm vi giá trị phù hợp Ví dụ, để tìm kiếm mục liệu với khố 64 hình 4.1, bạn gốc Tại node gốc khơng tìm thấy mục khố Bởi 64 lớn 50, đến node 1, (60/70/80)(lưu ý node nằm bên phải, việc đánh số node liên kết bắt đầu từ bên trái) Tại vị trí khơng tìm thấy mục liệu, phải đến node Tại 64 lớn 60 nhỏ 70 nên tiếp đến node Tại thời điểm tìm mục liệu cho với liên kết 62/64/66 1.4 Thêm vào Các mục liệu luôn chèn vào node Nếu mục liệu thêm vào node mà có node con, số lượng node cần thiết phải chuyển đổi để trì cấutrúc cho cây, lý phải có số node nhiều so với mục liệu nút Việc thêm vào 2-3-4 trường hợp trình bắt đầu cách tìm kiếm node phù hợp Nếu khơng có node đầy (node có đủ mục liệu) bắt gặp trình tìm kiếm, việc chèn vào dễ dàng Khi node phù hợp tìm thấy, mục liệu đơn giản thêm vào Hình 4.3 trình bày mục liệu với khố 18 thêm vào 2-3-4 Việc chèn vào dẫn đến phải di chuyển hai mục liệu node khố nằm với trật tự sau mục liệu thêm vào Trong ví dụ số 23 phải đẩy sang phải để nhường chỗ cho 18 Chương 4: B-Tree Trang Trương Hải Bằng – Cấutrúcliệu Hình 4.3 Chèn vào khơng làm tách (i) trước chèn vào (ii) sau chèn vào Tách nút Việc thêm vào trở nên phức tạp gặp phải node đầy (node có số mục liệu đầy đủ) nhánh dẫn đến điểm thêm vào Khi điều xảy ra, node cần thiết phải tách Quá trình tách nhằm giữ cho cân Loại 2-3-4 mà đề cập thường gọi 2-3-4 top-down node tách theo hướng xuống điểm chèn Giả sử ta đặt tên mục liệu node bị phân chia A, B C Sau tiến trình tách (chúng ta giả sử node bị tách node gốc; kiểm tra việc tách node gốc sau này): Một node rỗng tạo Nó anh em với node tách đưa vào bên phải Mục liệu C chuyển vào node Mục liệu B chuyển vào node cha node tách Mục liệu A không thay đổi Hai node bên phải bị hủy kết nối từ node tách kết nối đến node Một ví dụ việc tách node trình bày hình 4.4 Một cách khác để mô tả tách node 4-node chuyển đổi sang hai 2-nút Chương 4: B-Tree Trang Trương Hải Bằng – Cấutrúcliệu Chú ý ảnh hưởng tách node dịch chuyển liệu lên bên phải Sự xếp lại nhằm mục đích giữ cho cân Hình 4.4: Tách nút (i ) Trước chèn vào (ii) Sau chèn vào Tách node gốc Khi gặp phải node gốc đầy thời điểm bắt đầu tìm kiếm điểm chèn, kết việc tách thực sau: Node tạo để trở thành gốc cha node tách Node thứ hai tạo để trở thành anh em với node tách Mục liệu C dịch chuyển sang node anh em Mục liệu B dịch chuyển sang node gốc Mục liệu A không đổi Hai node bên phải node phân chia bị hủy kết nối khỏi kết nối đến node bên phải Chương 4: B-Tree Trang Trương Hải Bằng – Cấutrúcliệu Hình 4.5 Tách node gốc i) Trước thêm vào ii) Sau thêm vào Hình 4.5 việc tách node gốc Tiến trình tạo node gốc mức cao mức node gốc cũ Kết chiều cao tổng thể tăng lên Đi theo node tách này, việc tìm kiếm điểm chèn tiếp tục xuống phía Trong hình 4.5 mục liệu với khố 41 thêm vào phù hợp Tách theo hướng xuống Chú ý rằng, tất node đầy tách đường xuống nên việc tách node không gây ảnh hưởng phải ngược lên Node cha node bị tách phải đảm bảo node đầy, để đảm bảo node cha chấp nhận mục liệu B mà khơng cần thiết phải tách Tất nhiên node cha có hai node bị tách, trở thành node đầy Tuy nhiên điều có nghĩa bị tách lần tìm kiếm gặp Hình 4.6 trình bày loạt thao tác chèn vào rỗng Có node tách, node gốc node Thêm vào 70, 30, 50 Thêm 40 Chương 4: B-Tree Trang Trương Hải Bằng – Cấutrúcliệu 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 node vào 2-3-4 1.5 Cây 2-3-4 Đỏ-Đen Cây 2-3-4 đỏ-đen thực thể khác hoàn toàn Tuy nhiên, ngữ cảnh chúng có tương đương với Cây chuyển sang khác chương trình với số quy tắc đơn giản, chí thao tác để giữ cho chúng cân tương đương Các nhà tốn học gọi chúng đồng đẳng Bạn không cần chuyển đổi 2-3-4 sang đỏ-đen, tương đương cấutrúc đưa thêm quan niệm thao tác chúng điều hữu dụng việc phân tích tính hiệu chúng Trong lịch sử 2-3-4 phát triển trước; Sau đỏ-đen suy từ 1.6 Chuyển từ 2-3-4 sang Đỏ-Đen Một 2-3-4 chuyển sang đỏ-đen cách áp dụng luật sau: Chuyển đổi 2-node 2-3-4 sang node đen đỏ-đen Chương 4: B-Tree Trang Trương Hải Bằng – Cấutrúcliệu Chuyển đổi 3-node sang node C (với hai nó) node cha P (với node C node khác) Khơng có vấn đề mục trở thành node mục khác thành node cha C tô màu đỏ P tô màu đen Chuyển đổi 4-node sang node cha P hai node C1, C2 màu đỏ Hình 4.7 trình bày chuyển đổi Các node tô màu đỏ; tất node khác tô màu đen Hình 4.8 trình bày 2-3-4 đỏ-đen tương ứng với cách áp dụng chuyển đổi Các đường chấm xung quanh tạo từ 3-node 4-nút Các luật đỏ-đen tự động thoả mãn với chuyển đổi Kiểm tra rằng: Hai node đỏ không kết nối, số lượng node đen đường dẫn từ gốc đến (hoặc node null) Bạn nghĩ 3-node 2-3-4 tương đương với node cha có node màu đỏ đỏ-đen, 4-node tương đương với node cha có hai node đỏ Điều nghĩa node cha màu đen với node đen đỏ-đen không biểu diễn 3-node 23-4; biểu diễn 2-node với node 2-node khác Tương tự, node cha màu đen với màu đen không biểu diễn cho 4-nút Hình 4.7 Chuyển đổi từ 2-3-4 sang đỏ-đen Chương 4: B-Tree Trang Trương Hải Bằng – Cấutrúcliệu Hình 4.8 Cây 2-3-4 đỏ-đen tương ứng Sự tương đương Không cấutrúc đỏ-đen phù hợp với 2-3-4, mà thao tác hoạt động hai loại tương đương Trong 2-3-4 giữ cân bằng việc tách nút Trong đỏ-đen hai phương thức cân lật quay màu Việc tách 4-node lật màu Trong 2-3-4 bạn tìm xuống điểm chèn cho node mới, bạn tách 4-node thành hai 2-nút Trong đỏ-đen bạn thực việc lật màu Làm mà thao tác tương đương với nhau? Chương 4: B-Tree Trang Trương Hải Bằng – Cấutrúcliệu Hình 4.9 Tách 4-node lật màu Trong hình 4.9.i trình bày 4-node 2-3-4 trước bị tách nút; Hình 4.9.ii trình bày tình trạng sau tách nút 2-node (là cha 4-nút) trở thành 3-nút Trong hình 4.9.iii trình bày đỏ-đen tương đương với 2-3-4 hình 4.9.i, Đường chấm viền quanh tương đương 4-nút Lật màu đưa đến kết đỏ-đen hình 4.9.iv Bây node 40 60 màu đen 50 màu đỏ Kết 50 node cha hình thành tương đương với 3-nút, trình bày đường chấm Điều tương tự 3-node định dạng việc tách node hình 4.9.ii Kết thấy việc tách 4-node trình chèn 2-3-4 tương đương với việc thực lật màu trình chèn đỏ-đen Tách 3-node quay Khi 3-node 2-3-4 chuyển sang đỏ-đen tương đương nó, có hai xếp, trình bày hình 4.8 Cả hai mục liệu trở thành node cha Tùy thuộc vào node chọn, node node bên trái node bên phải, độ dốc đường thẳng nối node cha node bên trái bên phải Cả hai xếp hợp lệ; Tuy nhiên, chúng không tham gia để cân Chúng ta xem xét tình ngữ cảnh lớn Hình 4.10-i trình bày 2-3-4 hình 4.10-ii, 4.10-iii trình bày đỏ-đen tương đương suy từ 2-3-4 cách áp dụng luật chuyển đổi Sự khác chúng cách lựa chọn hai mục liệu 3-node để tạo node cha; Trong hình ii, 80 node cha, hình iii, 70 node cha Mặc dù cách xếp hợp lệ, bạn thấy hình ii khơng cân trong hình iii cân Với đỏ-đen cho hình ii, Chương 4: B-Tree Trang 10 Trương Hải Bằng – Cấutrúcliệu quay sang phải (và thực việc chuyển đổi hai màu) để cân Điều đ�ng ngạc nhiên quay cho kết xác giống hình iii Hình 4.10: 3-node phép quay Kết thấy tương đương phép quay đỏ-đen lựa chọn node node cha chuyển đổi 2-3-4 sang đỏ-đen Mặc dù không điều này, tương đương tương tự nhận thấy cần thiết quay hai lần bên node cháu 1.7 Tính hiệu 2-3-4 Tốc độ Trong đỏ-đen node mức phải duyệt trình tìm kiếm, tìm kiếm node tồn chèn vào node Số lượng mức đỏ-đen (cây nhị phân cân bằng) log 2(N+1), thời gian tìm kiếm tỷ lệ với giá trị Chương 4: B-Tree Trang 11 Trương Hải Bằng – Cấutrúcliệu Một node phải duyệt 2-3-4, 2-3-4 ngắn (có mức hơn) so với đỏ-đen số lượng mục liệu Xem hình 4.8, 2-3-4 có ba mức đỏ-đen có năm mức Cụ thể hơn, 2-3-4 có đến nút Nếu node đầy, chiều cao phải tỷ lệ với log4(N) Logarith với số số khác thừa số Kết quả, chiều cao 2-3-4 thấp nửa so với chiều cao đỏ-đen, miễn tất node đầy Bởi tất chúng khơng đầy, chiều cao 2-3-4 nằm khoảng log2(N+1) log2(N+1)/2 Kết việc giảm chiều cao 2-3-4 dẫn đến việc giảm thời gian tìm kiếm so với đỏ-đen Mặt khác, có nhiều mục liệu để kiểm tra nút, điều tăng thời gian tìm kiếm Bởi mục liệu node kiểm tra sử dụng tìm tuyến tính, điều nhân thời gian tìm kiếm với số lượng tỷ lệ với M, số lượng trung bình mục liệu nút Kết thời gian tìm kiếm xấp xỉ M*log4(N) Một vài node chứa mục liệu, vài node chứa 2, vài node chứa Nếu ước lượng trung bình 2, thời gian tìm kiếm xấp xỉ 2*log 4(N) Đây số nhỏ bỏ qua biễu diễn độ phức tạp theo ký hiệu Big-O Kết quả, với 2-3-4 số lượng tăng lên mục liệu node dẫn đến việc hủy chiều cao giảm xuống Thời gian tìm kiếm 2-3-4 nhị phân cân đỏ-đen xấp xỉ nhau, hai O (log(N)) Yêu cầu lưu trữ Mỗi node 2-3-4 lưu trữ tham chiếu đến mục liệu tham chiếu đến node Khơng gian lưu trữ định dạng mảng Không phải tất không gian lưu trữ sử dụng Một node với mục liệu bỏ trống 2/3 không gian lưu trữ liệu nửa không gian node Một node với hai mục liệu bỏ trống 1/3 không gian lưu trữ liệu 1/4 không gian node con; hay nói cách khác sử dụng 5/7 khơng gian có sẵn Nếu lấy trung bình mục liệu nút, khoảng 2/7 khơng gian lưu trữ bị bỏ Có thể sử dụng danh sách liên kết thay sử dụng mảng để lưu trữ tham chiếu đến node liệu, tổng chi phí danh sách liên kết so với mảng (với ba bốn mục) khơng làm tăng hiệu cách đáng kể Cây đỏ-đen có vài node có node con, hầu hết tất không gian lưu trữ cho tham chiếu node sử dụng Ngoài ra, số mục liệu mà node chứa đựng lớn mục liệu Điều làm cho đỏ-đen hiệu 2-3-4 vấn đề sử dụng nhớ Trong C++, Java node lưu trữ tham chiếu đến đối tượng thay lưu trữ đối tượng đó, khác biệt lưu trữ 2-3-4 đỏ-đen khơng quan trọng, việc lập trình mặt đơn giản 2-3-4 Tuy nhiên, ngôn ngữ không sử dụng cách tham chiếu này, khác biệt hiệu lưu trữ đỏ-đen 2-3-4 đáng kể B-TREE Chương 4: B-Tree Trang 12 Trương Hải Bằng – Cấutrúcliệu Cây 2-3-4 ví dụ nhiều nhánh, nhiều nhánh node có nhiều hai node nhiều mục liệu Một loại khác nhiều nhánh B-tree, hiệu liệu nằm nhớ Bộ lưu trữ tiêu biểu loại hệ thống đĩa đĩa cứng mà ta nhìn thấy hầu hết máy tính cá nhân máy máy chủ Trong phần bắt đầu với việc mơ tả khía cạnh khác việc xử lý tập tin Chúng ta xem xét cách tiếp cận đơn giản để tổ chức liệu bên ngoài: thứ tự Cuối cùng, thảo luận B-tree vấn đề lưu trữ liệu nhớ Kết thúc chương cách tiếp cận khác lưu trữ ngoài: đánh số (indexing), cách tiếp cận áp dụng riênge3 kết hợp với B-tree Một cách tiếp cận khác với khía cạnh khác lưu trữ ngồi, chẳng hạn kỹ thuật tìm kiếm phép băm (hashing) trình bày chương Chi tiết kỹ thuật lưu trữ phụ thuộc vào hệ điều hành, ngôn ngữ, chí phần cứng sử dụng việc cài đặt cụ thể Trong phần chúng thảo luận cách tổng quát so với hầu hết chủ đề sách 2.1.Truy xuất liệu nhớ Các cấutrúcliệu mà thảo luận từ trước đến đa số dựa lưu trữ liệu nhớ (thường gọi RAM, viết tắt Random Access Memory) Tuy nhiên, vài tình huống, số lượng liệu xử lý lớn để lúc đưa vào nhớ Trong trường hợp kiểu lưu trữ khác cần thiết Thường tập tin đĩa có dung lượng lớn nhiều so với nhớ chính; điều giá thành rẻ chúng đơn vị lưu trữ Tất nhiên, tập tin đĩa có thuận lợi khác: khả lưu trữ lâu dài chúng Khi bạn tắt máy (hoặc nguồn điện bị hư), liệu nhớ bị Các tập tin đĩa lưu lại liệu vơ thời hạn nguồn điện bị tắt Tuy nhiên, khác biệt chủ yếu kích cỡ mà cần lưu ý Bất lợi việc lưu trữ truy xuất chậm so với nhớ Sự khác biệt tốc độ giải kỹ thuật khác để làm tăng tính tính hiệu chúng Một ví dụ việc lưu trữ ngồi giả sử bạn viết chương trình sở liệu để xử lý liệu danh bạ điện thoại 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, liệu khác mà công ty điện thoại thường sử dụng Giả sử mục lưu trữ mẫu tin với kích thước 512 byte Kết kích tập tin 500,000*512=256,000,000 byte, vào khoảng 256 mêgabyte Chúng ta giả sử với lượng liệu lớn so với nhớ máy tính đó, trở nên nhỏ để lưu trữ ổ đĩa Kết bạn có số lượng lớn liệu đĩa Làm bạn cấutrúc để thực tính thơng dụng mong muốn: tìm kiếm, chèn, xố nhanh? Có vấn đề cần xem xét: Việc truy cập liệu đĩa chậm nhiều so với truy cập nhớ Thứ hai việc truy cập nhiều mẫu tin lúc Truy xuất chậm Chương 4: B-Tree Trang 13 Trương Hải Bằng – Cấutrúcliệu Bộ nhớ máy tính làm việc với tín hiệu điện tử Bất kỳ byte truy cập nhanh byte khác, với phần nhỏ micro giây (bằng 1/1,000,000 giây) Để truy cập phần cụ thể liệu ổ đĩa, đầu đọc/ghi trước tiên phải dịch chuyển đến rãnh phù hợp Điều thực mô tơ, thiết bị tương tự: hoạt động khí chiếm vài milli giây (bằng 1/1,000 giây) Kết là, thời gian truy cập ổ đĩa thường vào khoảng 10 milli giây Điều có nghĩa chậm 10,000 lần so với truy cập nhớ Sự phát triển kỹ thuật giảm thời gian truy xuất đĩa theo thời gian, thời gian truy xuất nhớ giảm xuống nhanh so với truy cập đĩa, chênh lệch thời gian truy xuất ổ đĩa ngày lớn tương lai Truy xuất khối (block) Một định vị vị trí tiến trình đọc (ghi) bắt đầu, ổ đĩa chuyển lượng lớn liệu vào nhớ cách nhanh chóng xác Để làm việc nhằm đơn giản chế điều khiển ổ đĩa, liệu lưu trữ đĩa thành nhóm gọi block, pages, allocation units, vài tên gọi khác tuỳ thuộc vào hệ điều hành gọi chúng khối (block) Kích cỡ khối biến đổi tuỳ thuộc vào hệ điều hành Kích thước ổ đĩa với yếu tố khác, thường luỹ thừa Đối với ví dụ danh bạ điện thoại nêu trước, giả sử khối có kích thước 8,192 byte (2 13) Kết sở liệu danh bạ điện thoại cần 256,000,000 byte chia cho 8,192 byte khối, nghĩa có 31,250 khối Chương trình hiệu yêu cầu thao tác đọc ghi với kích thước bội số kích thước khối Nếu muốn đọc 100 byte, hệ thống đọc khối 8,192 byte lấy 100 byte, số lại khơng dùng đến Hoặc muốn đọc 8,200 byte, hệ thống đọc khối hay 16,384 byte lấy nửa số byte (8,200) Vì bạn phải tổ chức chương trình cho thời điểm làm việc khối liệu, điều làm tối ưu truy xuất Giả sử kích thước mẫu tin danh bạ điện thoại 512 byte, bạn lưu 16 mẫu tin thành khối (8,192 chia cho 512), trình bày hình 4.11 Vì thế, để tính hiệu đạt đến mức tối đa bạn phải đọc 16 mẫu tin thời điểm (hoặc bội số 16) Kích thước mẫu tin thường bội số Điều làm cho số lượng tồn chúng ln ln vừa với khối Kích thước trình bày ví dụ danh bạ điện thoại mẫu tin, khối, minh họa; Chúng biến đổi phụ thuộc vào số lượng kích thước mẫu tin ràng buộc phần cứng phần mềm khác Khối thường chứa đựng hàng trăm mẫu tin, mẫu tin lớn nhỏ 512 byte Một đầu đọc/ghi định vị vị trí (như trình bày trên), việc đọc khối nhanh, tốn vài milli giây Vì thế, việc truy cập ổ đĩa để đọc ghi khối khơng phụ thuộc vào kích thước khối Điều có nghĩa khối lớn có hiệu bạn đọc viết mẫu tin đơn (giả sử bạn sử dụng tất mẫu tin khối) Chương 4: B-Tree Trang 14 Trương Hải Bằng – Cấutrúcliệu Thứ tự Có cách để xếp liệu danh bạ điện thoại tập tin đĩa xếp tất mẫu tin theo vài khóa đó, giả sử theo thứ tự alpha họ Nếu mẫu tin Joseph Aardvark mẫu tin đầu tiên, v.v Điều trình bày hình 4.12 Tìm kiếm Để tìm kiếm tập tin có thứ tự theo họ, cụ thể Smith, bạn sử dụng thuật tốn tìm kiếm nhị phân Bạn bắt đầu việc đọc khối mẫu tin từ tập tin 16 mẫu tin khối đọc lúc vào vùng đệm có kích thước 8,192 byte nhớ Hình 4.11 Khối mẫu tin Hình 4.12 Thứ tự Chương 4: B-Tree Trang 15 Trương Hải Bằng – Cấutrúcliệu Chúng ta biết, tìm kiếm nhị phân nhớ cần khoảng log 2N lần so sánh, với 500,000 mục cần khoảng 19 lần Nếu lần so sánh, giả sử chiếm khoảng 10 micro giây việc tìm kiếm chiếm 190 micro giây, hay 2/10,000 giây Tuy nhiên, xử lý liệu lưu đĩa Bởi lần truy cập đĩa tốn thời gian, nên quan trọng để tập trung vào giải câu hỏi cần thiết phải truy cập ổ đĩa lần câu hỏi có mẫu tin lưu Thời gian để đọc khối mẫu tin lớn nhiều so với thời gian để tìm kiếm 16 mẫu tin khối nhớ Việc truy xuất đĩa chậm nhiều so với truy cập nhớ, thời điểm truy cập khối, có vài khối xa mẫu tin Trong ví dụ có 31,250 khối Log2 số vào khoảng 15, theo lý thuyết cần thiết phải truy cập đĩa 15 lần để tìm kiếm mẫu tin ta muốn Trong thực tế số giảm xuống đọc 16 mẫu tin lần Trong giai đoạn đầu việc tìm kiếm nhị phân khơng giúp cho ta có nhiều mẫu tin nhớ việc truy cập đoạn xa tập tin Tuy nhiên, tìm gần tới mẫu tin mong muốn, mẫu tin mà cần nằm nhớ phần nằm khối gồm 16 mẫu tin Điều giảm số lần so sánh xuống lần nhiều lần Kết cần khoảng 13 lần truy cập đĩa (15-2), 10 milli giây lần truy cập chiếm khoảng 130 milli giây, hay 1/7 giây Điều chậm nhiều so với việc truy cập nhớ, khơng q tồi Thao tác thêm vào loại bỏ Việc thêm vào loại bỏ mục liệu từ tập tin có thứ tự khơng hiệu Vì liệu có thứ tự, thao tác yêu cầu dịch chuyển trung bình khoảng mẫu tin, dẫn đến dịch chuyển khối Dịch chuyển khối đòi hỏi cần phải có lần truy cập đĩa, lần dùng để đọc lần dùng để ghi Một điểm cần chèn tìm thấy, khối chứa đựng điểm đọc vào buffer nhớ Mẫu tin trước khối lưu lại, lượng mẫu tin thích hợp đẩy lên để nhường chổ cho mẫu tin cần chèn vào Sau đó, nội dung vùng đệm ghi lại đĩa Kế đó, khối thứ đọc vào vùng đệm Mẫu tin trước lưu lại, tất mẫu tin khác đẩy lên, mẫu tin khối trước chèn vào phần đầu vùng đệm Sau đó, nội dung vùng đệm ghi trở lại đĩa Tiến trình tiếp tục tất khối mà vượt điểm chèn ghi lại hết Giả sử có 31,250 khối, phải đọc ghi chúng (trung bình khoảng) 15,625 lần, mà lần đọc ghi chiếm khoảng 10 mili giây, đòi hỏi nhiều phút để thực việc chèn đầu vào đơn giản Điều thực thi có hàng ngàn tên để thêm vào danh bạ điện thoại Một rắc rối khác thứ tự làm việc nhanh với khóa Tập tin xếp tên Nhưng giả sử muốn tìm kiếm số điện thoại cụ thể, sử dụng thuật tốn tìm kiếm nhị phân, liệu xếp trường tên Điều dẫn đến phải duyệt toàn thể tập tin, khối một, sử dụng truy cập Điều yêu cầu đọc đĩa trung bình khoảng khối, chiếm khoảng 2.5 phút, hiệu suất thật chấp nhận Chương 4: B-Tree Trang 16 Trương Hải Bằng – Cấutrúcliệu tìm kiếm đơn giản Cần thiết phải có phương pháp tổ chức lưu liệu đĩa hiệu 2.2 B-TREE Chúng ta biết cách tiếp cận hoàn chỉnh để tổ chức liệu nhớ Như có làm việc tốt với hệ thống tập tin hay không? B-tree cấutrúcliệu phù hợp cho việc lưu trữ R.Bayer E.M.McCreight đưa năm 1972 Bên nút, liệu xếp thứ tự cách khoá, 2-3-4 Thực ra, cấutrúc B-tree tương tự 2-3-4, ngoại trừ có nhiều mục liệu node nhiều liên kết đến node Bậc B-tree số node mà node có 2.2.1 Định nghĩa B-Tree: Một B-tree bậc n có đặc tính sau: i) Mỗi node có tối đa 2*n khố ii) Mỗi node ( khơng node gốc) co n khố iii) Mỗi node node có m+1 node (m số khố trang này) Ví dụ: Hình 4.13 B-tree bậc có mức Khai báo: typedef struct { int numtree; // số node hành int Key[Order]; // mảng lưu trữ khoá node int Branch[Order]; // trỏ đến node } NodeType; typedef struct Nodetype *NODEPTR // trỏ node NODEPTR *Root // tro node goc 2.2.2 Các phép tốn B-Tree � Tìm kiếm Chương 4: B-Tree Trang 17 Trương Hải Bằng – Cấutrúcliệu Hình 4.14 Xét node hình 4.14, khố cần tìm X Giả sử nội dung node nằm nhớ Với m đủ lớn ta sử dụng phương pháp tìm kiếm nhị phân, m nhỏ ta sử dụng phuơng pháp tìm kiếm Nừu X khơng tìm thấy có trường hợp sau xảy ra: i) Ki < X < Ki+1 Tiếp tục tìm kiếm trân Ci ii) Km < X Tiếp tục tìm kiếm Cm iii) X < K1 tiếp tục tìm kiếm C0 Quá trình tiếp tục node đ�ng tìm thấy Nếu đến node mà khơng tìm thấy khố, việc tìm kiếm thất bại � Phép tốn NODESEARCH Trả vị trí nhỏ khóa nút p bắt đầu lớn hay k Trường hợp k lớn tất khóa nút p trả vị trí p-> numtrees-1 int nodesearch (NODEPTR p, int k) { int i; for(i=0; i< p->numtrees �1 && p->key[i] < k; i++); return (i); } Phép tốn nodesearch dùng để tìm khóa k có nút p hay khơng Nếu khóa k khơng có nút p phép tốn trả vị trí giúp chọn nút phù hợp p để tiếp tục tìm khóa k nút � Phép tốn SEARCH: Tìm khóa k B-Tree Con trỏ p xuất phát từ gốc xuống c �c nh�nh c �y phù hợp để tìm khóa k có nút p hay khơng Nếu có khóa k nút p cây: �Biến found tra giá trị TRUE �Hàm search() trả trỏ nút p có chứa khóa k �Biến position trả vị trí khóa k có nút p Nếu khơng có khóa k cây: lúc p=NULL q(nút cha p) nút thêm khóa k vào nút �Biến found trả giá trị FALSE �Hàm search() trả trỏ q nút có thêm nút k vào �Biến position trả vị trí chèn khóa k vào nút q NODEPTR search(int k, int *pposition, int *pfound) Chương 4: B-Tree Trang 18 Trương Hải Bằng – Cấutrúcliệu { } int i; NODEPTR p, q; q = NULL; p = Root; while (p !=NULL) { i = nodesearch (p, k); if(i< p->numtress�1 && k == p->key[i]) //tim thay { *pfound = TRUE; *pposition = i; // vi trí tìm thay khoa k return(p); // node co chua khoa k } q = p; p = p ->Branch[i]; } /*Khi thoat khoi vong lap tren la khong tim thay, luc p=NULL, q la node la co the them khoa k vao node nay, position la vi tri co the chen khoa k*/ *pfound = FALSE; *pposition = i; return (q); //tra ve node la � Phép Duyệt: Duyệt khóa B-Tree theo thứ tự từ nhỏ đến lớn-bằng phương pháp đệ qui void traverse(NODEPTR proot) { int i; if(proot == NULL) //dieu kien dung return; else // de qui { /* vong lap duyet nhanh cay Branch[i] va key[i] cua node proo*/ for(i = 0; i < proot -> numtress-1; i++) { traverse (proot ->Branch[i]); printf ("%8d", proot -> key[i]); } //duyet nhanh cay cuoi cung cua node proot traverse (proot -> Branch[proot -> numtrees-1]); } } in khoa � Thêm vào : Trước đưa giải thuật thêm phần tử vào B-Tree, ta xem tình cụ thể qua ví dụ sau : Ví dụ 1: - Thêm x=22 vào B-Tree hình 4.15a Khóa 22 chưa có Nhưng khơng thể thêm vào node C node C đầy -Do tách node C thành hai node : node D cấp phát m+1 khóa chia cho node C D, khóa chuyển lên node cha A : Hình 4.15b Chương 4: B-Tree Trang 19 Trương Hải Bằng – Cấutrúcliệu Hình 4.15 a Hình 4.15 b Như vậy, việc thêm khóa vào B-Tree gây việc tách node việc tách node lan truyền ngược lên node cha, trường hợp đặc biệt lan truyền đến tận gốc B-Tree Ví dụ : Xem trình tạo B-Tree từ dãy khóa sau : 20; 40 10 30 15; 35 26 18 22; 5; 13 46 27 32; 38 24 45 25 Sau thêm vào khóa 30 : Hình 4.16 a Khi thêm vào 15 node bị đầy, trường hợp tạo thành node : phần tử 20 bị đẩy lên tạo thành node mới, phần tử lại chia cho node : node cũ chứa 10, 15 node thứ chứa 30,40 Hình 4.16 b Thêm vào khóa 35, 7,26 18 Đến thêm khóa 22 có đầy node dẫn đến việc tách node: Chương 4: B-Tree Trang 20 Trương Hải Bằng – Cấutrúcliệu Hình 4.16 c Thêm vào có đầy node (node chứa kh �a 7, 10, 15, 18) dẫn đến việc tách node : Hình 4.16 d Thêm vào khóa 42, 13, 46, 27 Đến thêm 32 có tách node : Hình 4.16 e Thêm vào 38, 24 va 45 Thêm 25 vào có tách node cho thấy lan truyền tách node ngược lên phía gốc : 25 thêm vào node (22, 24 26, 27) làm node bị tách 25 đưa lên node cha (10, 20, 30, 40) làm node bị tách thành node khoá 25 đưa lên thành node gốc Hình 4.16 f � Phép tốn INSERT Thêm khóa k vào vị trí position nút s (s position phép toán search() trả về) �Nếu nút s chưa đầy: gọi phép tốn insnode để chèn khóa k vào nút s �Nếu nút s đầy: tách nút thành nút nửa trái nửa phải void insert (NODEPRT s, int k, int position) { Chương 4: B-Tree NODEPRT nd, nd2, f, newnode; int pos, newkey, midkey; //khoi ñong cac tri truoc vao tron vong lap tach cac node day nd nd = s; Trang 21 Trương Hải Bằng – Cấutrúcliệu newkey = k; newnode = NULL; // vi nd la node la nen gan newnode la NULL pos = position; f = father (nd); // Vong lap tach cac node day nd while (f != NULL && nd -> nemtrees == ODER) { split(nd, newkey, newnode, pos, &nd2, &midkey); // Gan lai cac tri sau lan tach node truoc nd = f; newkey = midkey; newnode = nd2; pos = nedesearch (f, midkey); f = father (nd); } // Truong hop node nd chua day va nd khong phai la node goc if(nd - > numtrees < ORDER) { //chen newkey va newnode tai vi tri pos cua node nd insnode (nd, newkey, newnode, pos); return; } //Truong hop node nd la node goc bi day, tach node goc va tao node goc moi split (nd, newkey, newnode, pos, &nd2, &midkey); Root = makeroot (midkey); // tao node goc moi // Gan lai hai nhanh cay cua node goc moi la nd va nd2 Root -> Branch[0] = nd; Root -> Branch[1] = nd2; } Khi thêm khóa vào B-Tree viết sau: printf("\n Noi dung khoa moi: "); scanf("%d", &k); // truong hop B-Tree bi rong tao node goc if(Root == NULL) Root = makeroot(k); else { s = search(k, &pos, &timthay); if(timthay) printf("Bi trung khoa, khong them khoa %d vao B-Tree ñuoc", k); else insert (s, k, pos); } � Phép toán SPLIT: Tách node đầy nd, phép toán gọi phép toán INSERT �nd nút đầy bị tách, sau tách xong nút nd lại nửa số khóa bên trái �newkey, newnode pos khóa mới, nhánh vị trí chèn vào nút nd �Nút nd2 nút nửa phải có sau lần tách, nút nd2 chiếm nửa số khóa bên phải �Midkey khó chèn vào nút cha void split (NODEPTR nd, int newkey, NODEPTR newnode, int pos, NODEPTR *pnd2, int *pmidkey) Chương 4: B-Tree Trang 22 Trương Hải Bằng – Cấutrúcliệu { NODEPTR p; P = getnode(); //cap phat node nua phai /*truong hop chen newkey va newnode vao node nua phai*/ if(pos > Ndiv 2) { copy(nd, Ndiv 2+1, ORDER � 2, p); insnode (p, newkey, newnode, pos-Ndiv -1); nd->numtrees = Ndiv 2+1; /*so nhanh cay con lai cua node nua trai*/ *pmidkey = nd -> key[Ndiv2]; *pnd2 = p; return; } // truong hop newkey la midkey if(pos == Ndiv2) { copy(nd, Ndiv2, ORDER-2, p); nd->numtrees = Ndiv 2+1; /*so nhanh cay con lai cua node nua trai*/ /*Dieu chinh lai node dau tien cua node nua phai*/ p -> Branch[0] = newnode; *pmidkey = nd -> key[Ndiv2]; *pnd2 = p; return; } /* Truong hop chen newkey va newnode vao node nua trai*/ if(pos < Ndiv2) { copy(nd, Ndiv2, ORDER-2, p); nd->numtrees = Ndiv 2+1; /*so nhanh cay con lai cua node nua trai*/ *pmidkey = nd -> key[Ndiv2 - 1]; insnode(nd, newkey, newnode, pos); *pnd2 = p; return; } } � Phép tốn INSNODE Chèn khóa newkey vào vị trí pos nút chưa đầy p,và chèn nhánh newnode vào vị trí bên phải cuả khóa newkey void insnode (NODEPTR p, int newkey, NODEPTR newnode, int pos) { int i; /*doi cac nhanh cay va cac khoa tu vi tri pos tro ve sau xuong mot vi tri*/ for(i = p->numtress � 1; i >= pos+1; i ) { p -> Branch[i+1] = p -> Branch[i]; p -> key[i] = p -> key[i - 1]; } // gan khoa newkey vao vi tri pos p -> key[pos] = newkey; // Gan nhanh newnode la nhanh cay ben phai cua khoa newkey p -> Branch[pos + 1] = newnode; //tang so nhanh cay cua node p len p -> numtrees +=1; Chương 4: B-Tree Trang 23 Trương Hải Bằng – Cấutrúcliệu } � Phép toán COPY Chép khóa (và nhánh con) từ vị trí first đến vị trí fast nút nd (nút nửa trái) sang nút nd2 (nửa nút phải) Phép toán gọi phép toán split void copy(NODEPTR nd, int first, int last, NODPTR nd2) { int i; // copy cac khoa tu node nd qua node nd2 for(i = first; i < last, i++) nd2 -> key[i-first] = nd -> key[i]; // copy caùc nhanh cay tu node nd qu nd2 for(i = first; i < last+1, i++) nd2 -> con[i-first] = nd -> Branch[i]; nd2 ->numtrees = last - first +2 // so nhanh cay cua node nd2 } Chương 4: B-Tree Trang 24