BÀI BÁO CÁO MÔN CẤU TRÙC DỮ LIỆU 2 _cây đỏ đen

31 416 0
BÀI BÁO CÁO MÔN CẤU TRÙC DỮ LIỆU 2 _cây đỏ đen

Đ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

BÀI BÁO CÁO MÔN CẤU TRÙC DỮ LIỆU 2 _cây đỏ đen tài liệu, giáo án, bài giảng , luận văn, luận án, đồ án, bài tập lớn về t...

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN KHOA CÔNG NGHỆ THÔNG TIN BỘ MÔN CẤU TRÚC DỮ LIỆU NGUYỄN HOÀI PHƯƠNG -0212234 NGUYỄN HỒNG PHÚ -0212226 BÀI BÁO CÁO MÔN CẤU TRÙC DỮ LIỆU GVHD : Ths Phạm Phạm Tuyết Trinh TP HCM , 2005 Cây Đỏ Đen Tháng năm 2005 Lời nói đầu: Cây đỏ đen cấu trức liệu hay, với nhị phân tìm kiếm cấu trúc liệu có điểm mạnh việc lưu trữ tìm kiếm liệu Song đỏ đen có đặc tính riêng mà nhờ làm bật điểm mạnh Trong phạm vi báo cáo này, chúng em xin trình : khái quát đỏ đen, thuật toán bản, code cài đặt thuật tóan có nhận xét cấu trúc đỏ đen Chúng em chân thành cam ơn cô Phạm Phạm Tuyết Trinh tạo điều kiện cho chúng em tìm hiểu đề tài lý thú Dù cố gắng song khơng tránh sai xót định chúng em mong sư mong nhận đóng góp chân tình để làm trở nên hịan chỉnh Nhóm thực Sv: Nguyễn Hồi Phương MSSV: 0212234 Sv:Nguyễn Hồng Phú MSSV: 0212226 Nguyễn Hoài Phương Nguyễn Hồng Phú Cây Đỏ Đen Tháng năm 2005 Mục lục: I- Giới thiệu: Cây đỏ đen giới thiệu Rudolf Bayer “Symmetric Binary B-Trees: Data Structure and maintenance Algorithms”, nhà xuất Acta Informatica, Tâp1, trang 290-306 Sau Leonidas J.Guibas Robert Sedgewick thêm đặc tính đỏ đen đặt tên cho ( Tham khảo: Guibas, L and Sedgewick R “ A dichromatic Framwork for Balanced Trees”, in Proc 19th IEEE Symp Foundations of Computer Science, trang 8-21, năm 1978) Nguyễn Hoài Phương Nguyễn Hồng Phú Cây Đỏ Đen Tháng năm 2005 Ta biết tìm kiếm nhị phân thơng thường có thuận lợi lớn mặt lưu trữ truy xuất liệu phép tốn tìm kiếm thêm vào hay loại bỏ phần tử Do đó, tìm kiếm nhị phân xem cấu trúc lưu trữ liệu tốt Tuy nhiên số trường hợp tìm kiếm nhị phân có số hạn chế Nó hoạt động tốt liệu chèn vào theo thứ tự ngẫu nhiên Tuy nhiên, liệu chèn vào theo thứ tự đuợc xếp không hiệu Khi trị số cần chèn đuợc xếp nhị phân trở nên khơng cân Khi khơng cân bằng, khả tìm kiếm nhanh (hoặc chèn xóa) phần tử cho Chúng ta khảo sát cách giải vấn đề khơng cân bằng: đỏ đen, tìm kiếm nhị phân có thêm vài đặc điểm Có nhiều cách tiếp cận khác để bảo đảm cho cân bằng: chẳng hạn 2-3-4 Tuy vậy, phần lớn trường hợp, đỏ đen cân hiệu nhất, liệu lưu trữ nhớ tập tin Trước khảo sát đỏ đen, xem lại không cân tạo Hình 3.1 Các node chèn theo thứ tự tăng dần Những node tự xếp thành đường khơng phân nhánh Bởi node lớn node chèn vào trước đó, node phải Khi ấy, bị cân hoàn toàn Nếu ta chèn mục (item) theo thứ tự giảm dần, node trái node cha chúng - bị cân phía bên * Độ phức tạp: Khi nhánh, trở thành danh sách liên kết, liệu chiều thay hai chiều Trong trường hợp này, thời gian truy xuất giảm O(N), thay O(logN) cân Nguyễn Hồi Phương Nguyễn Hồng Phú Cây Đỏ Đen Tháng năm 2005 Để bảo đảm thời gian truy xuất nhanh O(logN) cây, cần phải bảo đảm ln ln cân (ít gần cân bằng) Điều có nghĩa node phải có xấp xỉ số node bên phải số node bên trái Một cách tiếp cận giải vấn đề cân lại cây: đỏ đen-là tìm kiếm nhị phân có tính chất tìm kiếm nhị phân ví dụ : node trái nhỏ node cha, node cha nhỏ node phải, bên cạnh đỏ đen cịn bổ sung số đắc điểm Trong đỏ đen, việc cân thực thi chèn, xóa Khi thêm phần tử thủ tục chèn kiểm tra xem tính chất cân có bị vi phạm hay khơng Nếu có, xây dựng lại cấu trúc Bằng cách này, luôn giữ cân II- Định nghĩa: Cây đỏ đen nhị phân tìm kiếm( BST) tuân thủ quy tắc sau: (hình 3.2) Mọi node phải đỏ đen Node gốc node phải luôn đen Nếu node đỏ, node phải đen Mọi đường dẫn từ gốc đến phải có số lượng node đen Khi chèn (hay xóa) node mới, cần phải tuân thủ quy tắc -gọi quy tắc đỏ đen Nếu tuân thủ, cân Hình 3.2 Một ví dụ đỏ đen Nguyễn Hoài Phương Nguyễn Hồng Phú Cây Đỏ Đen Tháng năm 2005 Số lượng node đen đường dẫn từ gốc đến gọi chiều cao đen (black height) Ta phát biểu quy tắc theo cách khác đường dẫn từ gốc đến phải có chiều cao đen Bổ đề: Một đỏ đen n-node Có: height left */ x->left = y->right; if (y->right != NIL) y->right->parent = x; /* Thiết lập liên kết y->parent */ if (y != NIL) y->parent = x->parent; if (x->parent) { if (x == x->parent->right) x->parent->right = y; else x->parent->left = y; } else { root = y; } /* liên kết x y */ y->right = x; Nguyễn Hoài Phương 17 Nguyễn Hồng Phú Cây Đỏ Đen Tháng năm 2005 if (x != NIL) x->parent = y; } /************************************* * Chương trình thêm node x vào đỏ đen* *************************************/ static void insertFixup(NodeType *x) { /* Kiểm tra thuộc tính đỏ đen */ while (x != root && x->parent->color == RED) { /* we have a violation */ if (x->parent == x->parent->parent->left) { NodeType *y = x->parent->parent->right; if (y->color == RED) { /* bác RED */ x->parent->color = BLACK; y->color = BLACK; x->parent->parent->color = RED; x = x->parent->parent; } else { /* bác BLACK */ if (x == x->parent->right) { /* tạo x trái*/ Nguyễn Hoài Phương 18 Nguyễn Hồng Phú Cây Đỏ Đen Tháng năm 2005 x = x->parent; rotateLeft(x); } /* đổi màu xoay */ x->parent->color = BLACK; x->parent->parent->color = RED; rotateRight(x->parent->parent); } } else { /* Tương tự */ NodeType *y = x->parent->parent->left; if (y->color == RED) { /* bác is RED */ x->parent->color = BLACK; y->color = BLACK; x->parent->parent->color = RED; x = x->parent->parent; } else { /* bác BLACK */ if (x == x->parent->left) { x = x->parent; Nguyễn Hoài Phương 19 Nguyễn Hồng Phú Cây Đỏ Đen Tháng năm 2005 rotateRight(x); } } x->parent->color = BLACK; x->parent->parent->color = RED; rotateLeft(x->parent->parent); } } root->color = BLACK; } /*********************************************** * Cấp phát thêm vào * ***********************************************/ StatusEnum insert(KeyType key, RecType *rec) { NodeType *current, *parent, *x; /Tìm cha mới*/ current = root; parent = 0; while (current != NIL) { if (compEQ(key, current->key)) return STATUS_DUPLICATE_KEY; Nguyễn Hoài Phương 20 Nguyễn Hồng Phú Cây Đỏ Đen Tháng năm 2005 parent = current; current = compLT(key, current->key) ? current->left : current->right; } /* Thiết lập node */ if ((x = malloc (sizeof(*x))) == 0) return STATUS_MEM_EXHAUSTED; x->parent = parent; x->left = NIL; x->right = NIL; x->color = RED; x->key = key; x->rec = *rec; /* Thêm node */ if(parent) { if(compLT(key, parent->key)) parent->left = x; else parent->right = x; } else { root = x; Nguyễn Hoài Phương 21 Nguyễn Hồng Phú Cây Đỏ Đen Tháng năm 2005 } insertFixup(x); return STATUS_OK; } /************************************* * Chương trình loại bỏ node x * *************************************/ void deleteFixup(NodeType *x) { while (x != root && x->color == BLACK) { if (x == x->parent->left) { NodeType *w = x->parent->right; if (w->color == RED) { w->color = BLACK; x->parent->color = RED; rotateLeft (x->parent); w = x->parent->right; } if (w->left->color == BLACK && w->right->color == BLACK) { w->color = RED; x = x->parent; } else { Nguyễn Hoài Phương 22 Nguyễn Hồng Phú Cây Đỏ Đen Tháng năm 2005 if (w->right->color == BLACK) { w->left->color = BLACK; w->color = RED; rotateRight (w); w = x->parent->right; } w->color = x->parent->color; x->parent->color = BLACK; w->right->color = BLACK; rotateLeft (x->parent); x = root; } } else { NodeType *w = x->parent->left; if (w->color == RED) { w->color = BLACK; x->parent->color = RED; rotateRight (x->parent); w = x->parent->left; } if (w->right->color == BLACK && w->left->color == BLACK) { Nguyễn Hoài Phương 23 Nguyễn Hồng Phú Cây Đỏ Đen Tháng năm 2005 w->color = RED; x = x->parent; } else { if (w->left->color == BLACK) { w->right->color = BLACK; w->color = RED; rotateLeft (w); w = x->parent->left; } w->color = x->parent->color; x->parent->color = BLACK; w->left->color = BLACK; rotateRight (x->parent); x = root; } } } x->color = BLACK; } StatusEnum erase(iterator z) { NodeType *x, *y; Nguyễn Hoài Phương 24 Nguyễn Hồng Phú Cây Đỏ Đen Tháng năm 2005 if (z->left == NIL || z->right == NIL) { /* y có node NIL */ y = z; } else { /* Tìm thay với node NIL */ y = z->right; while (y->left != NIL) y = y->left; } /* y có */ if (y->left != NIL) x = y->left; else x = y->right; /* Xoá y */ x->parent = y->parent; if (y->parent) if (y == y->parent->left) y->parent->left = x; else y->parent->right = x; else Nguyễn Hoài Phương 25 Nguyễn Hồng Phú Cây Đỏ Đen Tháng năm 2005 root = x; if (y != z) { z->key = y->key; z->rec = y->rec; } if (y->color == BLACK) deleteFixup (x); free (y); return STATUS_OK; } StatusEnum eraseKey(KeyType key) { NodeType *z; /* Tìm node */ z = root; while(z != NIL) { if(compEQ(key, z->key)) break; else z = compLT(key, z->key) ? z->left : z->right; } if (z == NIL) return STATUS_KEY_NOT_FOUND; Nguyễn Hoài Phương 26 Nguyễn Hồng Phú Cây Đỏ Đen Tháng năm 2005 return erase(z); } iterator next(iterator i) { if (i->right != NIL) { for (i = i->right; i->left != NIL; i = i->left); } else { iterator p = i->parent; while (p && i == p->right) { i = p; p = p->parent; } /* trả node "inorder" */ i = p; } return i; } iterator begin() { /* Trả trỏ đến giá trị */ iterator i; for (i = root; i->left != NIL; i = i->left); Nguyễn Hoài Phương 27 Nguyễn Hồng Phú Cây Đỏ Đen Tháng năm 2005 return i; } iterator end() { /* Trả trỏ đến giá trị cuối */ return NULL; } RecType value(iterator i) { return i->rec; } StatusEnum find(KeyType key, iterator *iter) { NodeType *current; current = root; while(current != NIL) { if(compEQ(key, current->key)) { *iter = current; return STATUS_OK; } else { current = compLT (key, current->key) ? current->left : current->right; } } Nguyễn Hoài Phương 28 Nguyễn Hồng Phú Cây Đỏ Đen Tháng năm 2005 return STATUS_KEY_NOT_FOUND; } int main(int argc, char **argv) { int maxnum, ct, n; RecType rec; KeyType key; StatusEnum status; /* Chạy dòng lệnh: * * rbt maxnum * * rbt 2000 * Xữ lý 2000 records * */ iterator iter; maxnum = atoi(argv[1]); printf("maxnum = %d\n", maxnum); for (ct = maxnum; ct; ct ) { key = rand() % 90 + 1; if ((status = find(key, &iter)) == STATUS_OK) { Nguyễn Hoài Phương 29 Nguyễn Hồng Phú Cây Đỏ Đen Tháng năm 2005 rec = value(iter); if (rec.stuff != key) printf("fail rec\n"); status = erase(iter); if (status) printf("fail: status = %d\n", status); } else { rec.stuff = key; status = insert(key, &rec); if (status) printf("fail: status = %d\n", status); } /* Hiễn thị node */ { iterator i; for (i = begin(); i != end(); i = next(i)) { RecType rec; rec = value(i); printf("%d\n", rec.stuff); } } return 0; Nguyễn Hoài Phương 30 Nguyễn Hồng Phú Cây Đỏ Đen Tháng năm 2005 V- Nhận xét : Giống tìm kiếm nhị phân thơng thường, đỏ đen cho phép việc tìm kiếm, chèn xóa thời gian O(log2N) Thời gian tìm kiếm gần hai loại cây, đặc điểm đỏ đen không sử dụng trình tìm kiếm Điều bất lợi việc lưu trữ cần cho node tăng chút để điều tiết màu đỏđen (một biến boolean) Đặc thù hơn, theo Sedgewick, thực tế tìm kiếm đỏ đen khoảng log2N phép so sánh, chứng minh khơng cần 2*log2N phép so sánh Thời gian chèn xóa tăng dần số việc phải thực thi phép lật màu quay đường xuống điểm chèn Trung bình phép chèn cần khoảng chừng phép quay Do đó, chèn hày cịn chiếm O(log2N) thời gian, lại chậm phép chèn nhị phân thường Bởi hầu hết ứng dụng, có nhiều thao tác tìm kiếm chèn xóa, có lẽ khơng có nhiều bất lợi thời gian dùng đỏ đen thay nhị phân thuờng Dĩ nhiên, điều thuận lợi đỏ đen, liệu xếp không làm giảm hiệu suất O(N) Nguyễn Hoài Phương 31 Nguyễn Hồng Phú ...Cây Đỏ Đen Tháng năm 20 05 Lời nói đầu: Cây đỏ đen cấu trức liệu hay, với nhị phân tìm kiếm cấu trúc liệu có điểm mạnh việc lưu trữ tìm kiếm liệu Song đỏ đen có đặc tính riêng... Sv: Nguyễn Hồi Phương MSSV: 021 223 4 Sv:Nguyễn Hồng Phú MSSV: 021 222 6 Nguyễn Hoài Phương Nguyễn Hồng Phú Cây Đỏ Đen Tháng năm 20 05 Mục lục: I- Giới thiệu: Cây đỏ đen giới thiệu Rudolf Bayer “Symmetric... node 50, 25 , 75, 12 18 (cần phải lật màu trước chèn node 12) Xem hình 3.8a Lưu ý node 18 node cháu nội Node node cha đỏ (cha đỏ) Nguyễn Hoài Phương 12 Nguyễn Hồng Phú Cây Đỏ Đen Tháng năm 20 05 hình

Ngày đăng: 22/05/2015, 15:23

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan