1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Báo cáo cấu trúc dữ liệu cây đỏ đen

31 2 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

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 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 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Cây Đỏ Đen Mục lục: Lời nói đầu: Mục lục: I- Giới thiệu: IIĐịnh nghĩa: III- Các thuật toán Black and Red Tree 1- Thêm Node 2- Xóa node: 14 IV- Thuật toán cài đặt: 14 VNhận xét : 31 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Cây Đỏ Đen 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) 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ố LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Cây Đỏ Đen 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 Để bảo đảm thời gian truy xuất nhanh O(logN) cây, cần phải bảo đảm luôn 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 bổ sung số đắc điểm LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Câyy Đỏ Đen Troong đỏ đen, việc cân đư ược thực thi chèn, c xóa Khi K thêm m phần tử thủ tụcc chèn kiểm k tra xem m tính chấất cân bằngg có c bị vi phhạm hay d lại cấuu trúc Bằng cách này, luuôn đư ược giữ khôông Nếu có, xây dựng cânn II- Địịnh ngh hĩa: Câyy đỏ đen nhhị phân tìm kiếm( BST T) tuân thủ c quy tắc sau: (hình 3.2) Mọi node phải đỏ đen Node gốc nodde phải luuôn đenn Nếu node n đỏ, nodde n phải đen Mọi đườnng dẫn từ gốốc đến phải có c số lượ ợng node đeen Khhi chèn (hay y xóa) node n mới, cần c phải tuâân thủ quy q tắc -gọi quyy tắc đỏ đenn Nếu đượcc tuân thủ, c đượcc cân H Hình 3.2 Mộột ví dụ đỏ đen Số lượng node đen đườnng dẫn từ gốốc đến đư ược gọi chiều c q tắc theo cáchh khác cao đen (bllack height)) Ta phát biểu quy đườnng dẫn từ gốc g đến phải có cùngg chiều cao đen Bổ đề: Một M đỏỏ đen n-nodde LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Cây Đỏ Đen 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; 17 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Cây Đỏ Đen 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*/ 18 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Cây Đỏ Đen 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; 19 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Cây Đỏ Đen 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; 20 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Cây Đỏ Đen 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; 21 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Cây Đỏ Đen } 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 { 22 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Cây Đỏ Đen 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) { 23 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Cây Đỏ Đen 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; 24 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Cây Đỏ Đen 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 25 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Cây Đỏ Đen 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; 26 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Cây Đỏ Đen 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); 27 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Cây Đỏ Đen 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; } } 28 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Cây Đỏ Đen 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) { 29 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Cây Đỏ Đen 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; 30 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Cây Đỏ Đen 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 q 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) 31 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com ... luanvanchat@agmail.com Cây Đỏ Đen typedef int KeyType; /* Kiểu liệu khoá */ /* Dữ liệu lưu trữ */ typedef struct { int stuff } RecType; #define compLT(a,b) (a < b) #define compEQ(a,b) (a == b) /* Khai báo cấu trúc. .. II- Địịnh ngh hĩa: Câyy đỏ đen nhhị phân tìm kiếm( BST T) tuân thủ c quy tắc sau: (hình 3.2) Mọi node phải đỏ đen Node gốc nodde phải luuôn đenn Nếu node n đỏ, nodde n phải đen Mọi đườnng dẫn... luanvanchat@agmail.com Cây Đỏ Đen 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

Ngày đăng: 01/11/2022, 15:05

Xem thêm: