Xây dựng hệ thống tổ chức Đảng ở Nam Kỳ từ 1930 đến năm 1945

31 164 0
Xây dựng hệ thống tổ chức Đảng ở Nam Kỳ từ 1930 đến năm 1945

Đ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

http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN KHOA CƠNG NGHỆ THƠNG TIN OBO OK S CO M BỘ MƠN CẤU TRÚC DỮ LIỆU NGUYỄN HỒ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 KIL GVHD : Ths Phạm Phạm Tuyết Trinh TP HCM , 2005 http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng năm 2005 KIL OBO OKS CO M 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 qt đỏ đen, thuật tố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 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 Hồi Phương Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng năm 2005 Mục lục: KIL OBO OKS CO M Lời nói đầu: Mục lục: I- Giới thiệu: IIĐịnh nghĩa: III- Các thuật tốn Black and Red Tree 1- Thêm Node 2- Xóa node: 14 IV- Thuật tốn cài đặt: 14 VNhận xét : 31 Nguyễn Hồi Phương Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen I- Tháng năm 2005 Giới thiệu: KIL OBO OKS CO M 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ố 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ớ khơng phải 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 Nguyễn Hồi Phương Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng năm 2005 KIL OBO OKS CO M 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 hồn tồ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 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 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, ln ln giữ cân II- Định nghĩa: Cây đỏ đen nhị phân tìm kiếm( BST) tn thủ quy tắc sau: (hình 3.2) Mọi node phải đỏ đen Node gốc node phải ln ln đ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 tn thủ quy tắc -gọi quy tắc đỏ đen Nếu tn thủ, cân Nguyễn Hồi Phương Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen KIL OBO OKS CO M Tháng năm 2005 Hình 3.2 Một ví dụ đỏ đen 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 Hồi Phương 17 Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng năm 2005 if (x != NIL) x->parent = y; KIL OBO OKS CO M } /************************************* * 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 Hồi Phương 18 Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng năm 2005 x = x->parent; } KIL OBO OKS CO M 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 Hồi Phương 19 Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng năm 2005 rotateRight(x); } KIL OBO OKS CO M } 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 Hồi Phương 20 Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng năm 2005 parent = current; KIL OBO OKS CO M 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 Hồi Phương 21 Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng năm 2005 } KIL OBO OKS CO M 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 Hồi Phương 22 Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng năm 2005 if (w->right->color == BLACK) { KIL OBO OKS CO M 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 Hồi Phương 23 Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng năm 2005 w->color = RED; } else { KIL OBO OKS CO M x = x->parent; 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 Hồi Phương 24 Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng năm 2005 if (z->left == NIL || z->right == NIL) { y = z; } else { KIL OBO OKS CO M /* y có node NIL */ /* 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; /* Xố 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 Hồi Phương 25 Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng năm 2005 root = x; z->key = y->key; z->rec = y->rec; } KIL OBO OKS CO M if (y != z) { 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 Hồi Phương 26 Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng năm 2005 return erase(z); KIL OBO OKS CO M } 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 Hồi Phương 27 Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng năm 2005 return i; iterator end() { KIL OBO OKS CO M } /* 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 Hồi Phương 28 Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng năm 2005 return STATUS_KEY_NOT_FOUND; KIL OBO OKS CO M } 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 Hồi Phương 29 Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng năm 2005 rec = value(iter); KIL OBO OKS CO M 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 Hồi Phương 30 Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng năm 2005 V- Nhận xét : KIL OBO OKS CO M 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 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 Hồi Phương 31 Nguyễn Hồng Phú [...]... Cây Đỏ Đen KIL OBO OKS CO M Tháng 6 năm 2005 hình 3.8.c Hình 3.8 Khả năng 3: P đỏ và X là node cháu nội Chỉnh lại sự sắp xếp này cũng khá rắc rối hơn Nếu ta cố quay phải node ơng bà G (25) ở đỉnh, như ta đã làm trong khả năng 2, node cháu trong X (18) đi ngang hơn là đi lên, như thế cây sẽ khơng còn cân bằng như trước (Thử làm điều này, rồi quay trở lại, với node 12 ở đỉnh, để phục hồi cây nhu cũ) Phải... http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng 6 năm 2005 KIL OBO OKS CO M Thủ thuật cần dùng khi X là node cháu nội là tiến hành hai phép quay hơn là một phép Phép quay đầu biến X từ một node cháu nội thành node cháu ngoại, như trong hình 3.8b Bây giờ, trường hợp là tương tự như khả năng 1, và ta có thể áp dụng cùng một phép quay, với node ơng bà ở đỉnh, như đã làm trước đây Kết quả như trong hình... khơng quan trọng, nhưng nếu ta đợi đến khi sau khi quay mới tơ màu lại node thì khó mà biết phải gọi chúng như thế nào) Các bước là: Đổi màu node ơng bà của node X ( node 25) Đổi màu node X (khơng phải màu của node cha; node X đây là node 18) Quay với node P - node cha của X - ở đỉnh (khơng phải với node ơng bà; node cha đây là 12) Quay lần nữa với node ơng bà của X (25) ở đỉnh, về hướng nâng X lên (quay... Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen KIL OBO OKS CO M Tháng 6 năm 2005 Hình 3.7 Node P đỏ và X là node cháu ngoại iii) Khả năng 3: P đỏ và X là cháu nội của G Nếu node P đỏ và X là node cháu nội, chúng ta cần thực hiện hai phép quay và một vài phép đổi màu Cây đỏ đen được tạo thành từ các node 50, 25, 75, 12 và 18 (cần phải lật màu trước khi chèn node 12) Xem hình 3.8a Lưu... insert 1 phần tử vào cậy, và ở cây đỏ đen cũng vậy, thậm chí còn phức tạp hơn vì trong q trình thêm vào phải đảm bảo qui tắc của cây đỏ đen IV- Thuật tốn cài đặt: typedef enum { STATUS_OK, STATUS_MEM_EXHAUSTED, STATUS_DUPLICATE_KEY, STATUS_KEY_NOT_FOUND } StatusEnum; Nguyễn Hồi Phương 14 Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng 6 năm 2005 typedef int KeyType;... VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng 6 năm 2005 return erase(z); KIL OBO OKS CO M } 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ả về node "inorder" */ i = p; } return i; } iterator begin() { /* Trả về con trỏ đến giá trị đầu tiên */ iterator i; for (i... */ iterator i; for (i = root; i->left != NIL; i = i->left); Nguyễn Hồi Phương 27 Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng 6 năm 2005 return i; iterator end() { KIL OBO OKS CO M } /* Trả về con trỏ đến giá trị cuối cùng */ return NULL; } RecType value(iterator i) { return i->rec; } StatusEnum find(KeyType key, iterator *iter) { NodeType *current; current = root;... rằng nó khơng cần hơn 2*log2N phép so sánh Thời gian chèn và xóa tăng dần bởi một hằng số vì việc phải thực thi phép lật màu và quay trên đường đi xuống và tại những điểm chèn Trung bình một phép chèn cần khoảng chừng một phép quay Do đó, chèn hày còn chiếm O(log2N) thời gian, nhưng lại chậm hơn phép chèn trong cây nhị phân thường Bởi vì trong hầu hết các ứng dụng, có nhiều thao tác tìm kiếm hơn là chèn... x->parent->right = y; } else { root = y; } /* link x and y */ y->left = x; if (x != NIL) x->parent = y; Nguyễn Hồi Phương 16 Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng 6 năm 2005 } KIL OBO OKS CO M static void rotateRight(NodeType *x) { /**************************** * Xoay node x bên phải * ****************************/ NodeType *y = x->left; /* Thiết lập liên kết x->left... x->parent->right = y; else x->parent->left = y; } else { root = y; } /* liên kết x và y */ y->right = x; Nguyễn Hồi Phương 17 Nguyễn Hồng Phú http://kilobooks.com THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN Cây Đỏ Đen Tháng 6 năm 2005 if (x != NIL) x->parent = y; KIL OBO OKS CO M } /************************************* * Chương trình chính thêm node x vào cây đỏ đen* *************************************/ static void insertFixup(NodeType ... (w->right->color == BLACK) { KIL OBO OKS CO M 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... x->parent; 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;... && 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;

Ngày đăng: 02/12/2015, 12:27

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

Tài liệu liên quan