Bài giảng Cấu trúc dữ liệu và giải thuật 1: Chương 8
lượt xem 4
download
Bài giảng Cấu trúc dữ liệu và giải thuật 1: Chương 8 trình bày các nội dung chính sau: Cây B-tree, cây nhiều nhánh tìm kiếm, thêm node mới, tách node,... Mời các bạn cùng tham khảo để nắm nội dung chi tiết.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Cấu trúc dữ liệu và giải thuật 1: Chương 8
- CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1 1 CÂY B-TREE
- Giới thiệu Cây là một cách tiếp cận hoàn chỉnh để tổ chức dữ liệu trong bộ nhớ. Vậy cây có thể làm việc tốt với hệ thống tập tin hay không? CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1 B-tree là cấu trúc dữ liệu phù hợp cho việc lưu trữ ngoài do R.Bayer và E.M.McCreight đưa ra năm 1972. 2
- Cây nhiều nhánh tìm kiếm Một cây nhiều nhánh bậc m là cây mà mỗi node có nhiều nhất m cây con. Gọi count (count
- Cây nhiều nhánh tìm kiếm Tất cả các node con của cây con có gốc tại node con thứ i thì có các giá trị khoá lớn hơn khoá key[i-1] và nhỏ hơn khoá key[i] (0
- CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1 Cây nhiều nhánh tìm kiếm Cây nhiều nhánh tìm kiếm (Multiway Search Trees) bậc 5 5
- Định nghĩa B-tree Định nghĩa Một B-tree bậc m là cây nhiều nhánh tìm kiếm thỏa các điều kiện sau: (i) Tất cả các node lá cùng mức. (ii) Tất cả các node trung gian (trừ node gốc) có nhiều nhất m cây con và có ít nhất m/2 cây con (khác rỗng). (iii) Mỗi node hoặc là node lá hoặc có k+1 cây con (k là CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1 số khoá của node này). (iv) Node gốc có nhiều nhất m cây con hoặc có thể có 2 cây con (Node gốc có 1 khoá và không phải là node lá) hoặc không chứa cây con nào(node gốc có 1 khoá và cũng là node lá). 6
- CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1 Định nghĩa B-tree B-tree bậc 5 có 3 mức 7
- Khai báo Khai báo: typedef struct { int count; // số khoá của node hiện hành int Key[Order-1];// mảng lưu trữ các khoá của node CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1 int *Branch[Order]; /* các con trỏ chỉ đến các cây con, Order-Bậc của cây*/ } BNode; //Kiểu dữ liệu của node typedef struct BNode *pBNode // con trỏ node pBNode Root // con tro node goc 8
- Các Phép toán C0, K1, C2, K2, …, Cm-1, Km, Cm Các trường hợp xảy ra khi tìm 1 node X. Nếu X không tìm thấy sẽ có 3 trường hợp sau xảy ra: Ki < X < Ki+1. Tiếp tục tìm kiếm trân cây con Ci CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1 Km < X. Tiếp tục tìm kiếm trên Cm X < K1. tiếp tục tìm kiếm trên C0 Quá trình này tiếp tục cho đến khi node được tìm thấy. Nếu đã đi đến node lá mà vẫn không tìm thấy khoá, việc tìm kiếm là thất bại. 9
- Các Phép toán Phép toán tìm kiếm Trả về vị trí nhỏ nhất của khóa trong nút hiện tại bắt đầu lớn hơn hay bằng k. int nodesearch (pBNode current, int k) { int i; CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1 for(i=0;icount && current->key[i] < k; i++); return i; } 10
- Các Phép toán Tìm khóa k trên B-Tree. Con trỏ current xuất phát từ gốc và đi xuống các nhánh cây con phù hợp để tìm khóa k có trong một nút current hay không. Nếu có khóa k tại nút current trên cây: Biến found trả về giá trị TRUE CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1 Hàm search() trả về con trỏ chỉ nút current có chứa khóa k Biến position trả về vị trí của khóa k có trong nút current này 11
- Các Phép toán Nếu không có khóa k trên cây: Lúc này current=NULL và q (nút cha của current) chỉ nút lá có thể thêm khóa k vào nút này được. Biến found trả về giá trị FALSE CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1 Hàm search() trả về con trỏ q là nút lá có thêm nút k vào Biến position trả về vị trí có thể chèn khóa k vào nút lá q này 12
- Các Phép toán pBNode search(int k, int &position, int &found) { int i; pBNode current, q; q = NULL; current = Root; while (current !=NULL){ i = nodesearch (current, k); if(i< current->count && k == current->key[i]) { CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1 found = TRUE; position = i; // vi trí tìm thấy khóa k return(current); } q = current; current = current ->Branch[i]; } found = FALSE; position = i; return q; } 13
- Duyệt cây void Traverse(pBNode proot) { if (proot == NULL) return; else { for(i = 0; i < proot -> count; i++) { CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1 traverse (proot ->Branch[i]); printf (“%8d”, proot -> key[i]); } traverse (proot -> Branch[proot -> count]); } } 14
- Thêm node mới Quá trình thêm một khoá mới (newkey) vào B- tree có thể được mô tả như sau: Tìm node newkey nếu có trên cây thì kết thúc công việc này tại node lá (không thêm vào nữa) CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1 Thêm newkey vào node lá, nếu chưa đầy thì thực hiện thêm vào và kết thúc Node đầy là node có số khoá = (bậc của cây)-1 15
- Thêm node mới Khi node được thêm vào bị đầy, node này sẽ được tách thành 2 node cùng mức, khoá median sẽ được đưa vào node mới Khi tách node, khoá median sẽ được dời lên node cha, quá trình này có thể lan truyền đến node gốc CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1 Trong trường hợp node gốc bị đầy, node gốc sẽ bị tách và dẫn đến việc tăng trưởng chiều cao của cây. 16
- CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1 17
- CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1 Thêm node mới 18
- Thêm node mới Khi thêm một khóa vào B-Tree chúng ta có thể viết như sau: if(Root == NULL) Root = makeroot(k); else { CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1 s = search(k, &position, &timthay); if (s!=NULL) cout
- Thêm node mới Thêm khóa k vào vị trí position của nút lá s (s và position do phép toán search() trả về) Nếu nút lá s chưa đầy: gọi phép toán insnode để chèn khóa k vào nút s Nếu nút lá s đã đầy: tách nút lá này thành 2 CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1 nút nửa trái và nửa phải void insert (pBNode s, int k, int position); 20
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Cấu trúc dữ liệu - Bài 1:Tổng quan về cấu trúc dữ liệu và giải thuật
47 p | 174 | 17
-
Bài giảng Cấu trúc dữ liệu 1: Chương 1 - Lương Trần Hy Hiến
7 p | 162 | 9
-
Bài giảng Cấu trúc dữ liệu và giải thuật trong C++ - Bài 8: Cấu trúc dữ liệu ngăn xếp
28 p | 77 | 9
-
Bài giảng Cấu trúc dữ liệu giải thuật: Các kiểu dữ liệu trừu tượng cơ bản - Cấu trúc dữ liệu tuyến tính
92 p | 116 | 9
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Cấu trúc dữ liệu cây đỏ đen - Bùi Tiến Lên
25 p | 79 | 8
-
Bài giảng Cấu trúc dữ liệu và giải thuật – Bài 17: Cấu trúc dữ liệu dạng cây
21 p | 77 | 8
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Các cấu trúc dữ liệu
193 p | 57 | 7
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 1 - Trần Minh Thái (2016)
62 p | 94 | 6
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 1 - Trần Minh Thái (Trường Đại học Hồng Bàng )
62 p | 158 | 6
-
Bài giảng Cấu trúc dữ liệu - Chương 3: Cấu trúc cây
65 p | 58 | 6
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Cấu trúc dữ liệu cây AA - Bùi Tiến Lên
30 p | 35 | 6
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 1 – Trần Minh Thái (2017)
67 p | 106 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Cấu trúc dữ liệu cây - Bùi Tiến Lên
68 p | 40 | 4
-
Bài giảng Cấu trúc dữ liệu: Chương 1 - ThS. Thiều Quang Trung (2018)
44 p | 43 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Cấu trúc dữ liệu cây AVL - Bùi Tiến Lên
38 p | 47 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 5 - Ngô Quang Thạch
24 p | 58 | 3
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 2 - Th.S Thiều Quang Trung
41 p | 68 | 3
-
Bài giảng Cấu trúc dữ liệu giải thuật: Cấu trúc dữ liệu
17 p | 50 | 2
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn