Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 31 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
31
Dung lượng
576,2 KB
Nội dung
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 2 NGUYỄN HOÀI PHƯƠNG -0212234 NGUYỄN HỒNG PHÚ -0212226 BÀI BÁOCÁO MÔN CẤU TRÙC DỮ LIỆU 2 GVHD : Ths . Phạm Phạm Tuyết Trinh TP HCM , 2005 CâyĐỏĐen Tháng 6 năm 2005 Nguyễn Hoài Phương 2 Nguyễn Hồng Phú Lời nói đầu: Câyđỏđen là một trong những cấu trức dữ liệu hay, cùng với cây nhị phân tìm kiếm là những cấu trúc dữ liệu có điểm mạnh trong việc lưu trữ và tìm kiếm dữ liệu. Song câyđỏđen có những đặc tính riêng mà nhờ đó nó đã làm nổi bật những điểm mạnh củ a mình. Trong phạm vi bài báocáo này, chúng em xin trình bài về : khái quát câyđỏ đen, các thuật toán cơ bản, code cài đặt các thuật tóan cơ bản và có những nhận xét về cấu trúc câyđỏđen này. 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ú này. Dù hết sức cố gắng song vẫn không tránh được những sai xót nhất định chúng em mong được sư mong nhận được những đóng góp chân tình để bài làm trở nên hòan chỉnh hơ n. Nhóm thực hiện Sv: Nguyễn Hoài Phương MSSV: 0212234 Sv:Nguyễn Hồng Phú MSSV: 0212226 CâyĐỏĐen Tháng 6 năm 2005 Nguyễn Hoài Phương 3 Nguyễn Hồng Phú Mục lục: Lời nói đầu: . 2 Mục lục: . 3 I- Giới thiệu: 4 II- Định nghĩa: 5 III- Các thuật toán cơ bản của Black and Red Tree . 7 1- Thêm một Node mới . 7 2- Xóa một node: 14 IV- Thuật toán cài đặt: 14 V- Nhận xét : . 31 CâyĐỏĐen Tháng 6 năm 2005 Nguyễn Hoài Phương 4 Nguyễn Hồng Phú I- Giới thiệu: Câyđỏđen được ra giới thiệu bởi Rudolf Bayer trong quyển “Symmetric Binary B-Trees: Data Structure and maintenance Algorithms”, nhà xuất bản Acta Informatica, Tâp1, trang 290-306. Sau đó Leonidas J.Guibas và Robert Sedgewick đã thêm các đặc tính của câyđỏđen và đặt tên cho nó ( Tham khảo: Guibas, L. and Sedgewick R. “ A dichromatic Framwork for Balanced Trees”, in Proc. 19 th IEEE Symp. Foundations of Computer Science, trang 8-21, năm 1978). Ta đã biết cây tìm kiếm nhị phân thông thường có những thuận lợi lớn về mặt lưu trữ và truy xuất dữ liệu trong phép toán tìm kiếm thêm vào hay loại bỏ một phần tử. Do đó, cây tìm kiếm nhị phân xem ra là một cấu trúc lưu trữ dữ liệu tốt. Tuy nhiên trong một số trường hợp cây tìm kiếm nhị phân có một số hạn chế. Nó hoạt động tốt n ếu dữ liệu được chèn vào cây theo thứ tự ngẫu nhiên. Tuy nhiên, nếu dữ liệu được chèn vào theo thứ tự đã đuợc sắp xếp sẽ không hiệu quả. Khi các trị số cần chèn đã đuợc sắp xếp thì cây nhị phân trở nên không cân bằng. Khi cây không cân bằng, nó mất đi khả năng tìm kiếm nhanh (hoặc chèn hoặc xóa) một phần tử đã cho. Chúng ta khảo sát một cách giải quyết vấ n đề của cây không cân bằng: đó là câyđỏ đen, là cây tìm kiếm nhị phân có thêm một vài đặc điểm . Có nhiều cách tiếp cận khác để bảo đảm cho cây cân bằng: chẳng hạn cây 2-3-4. Tuy vậy, trong phần lớn trường hợp, câyđỏđen là cây cân bằng hiệu quả nhất, ít ra thì khi dữ liệu được lưu trữ trong bộ nhớ chứ không phải trong những tập tin. Trước khi khảo sát câyđỏ đen, hãy xem lại cây không cân b ằng được tạo ra như thế nào. Hình 3.1. Các node được chèn theo thứ tự tăng dần Cây Ng Nh hơn bằn con * Đ Kh hai đối Để lu ô cây Mộ nhị hơn sun Tro tử kh ô cân Cây Kh đen y ĐỏĐen guyễn Hoài hững node n n node đã đ ng hoàn toà n trái của no Độ phức tạp hi cây một n i chiều. Tro i với cây câ bảo đảm th ôn luôn cân y phải có xấ ột cách tiếp ị phân vì th n node cha, ng một số đ ong câyđỏ thì thủ tụ c ông. Nếu c n bằng. II- Đị y đỏđen là hi chèn (hay n. Nếu được Phương này tự sắp x được chèn àn. Nếu ta c ode cha của p: nhánh, sẽ tr ong trường ân bằng. hời gian tru bằng (ít ra ấp xỉ số nod cận giải qu hế nó có các , node cha đắc điểm. đen, việc c c chèn sẽ k ó, sẽ xây d ịnh ngh một cây nh Mọi node Node gốc Nếu một n Mọi đườn y xóa) một n c tuân thủ, c xếp thành m vào trước chèn những a chúng - câ ở thành mộ hợp này, t uy xuất nhan cũng là cây de con bên p uyết vấn đề c tính chất c nhỏ hơn no ân bằng đư kiểm tra xem dựng lại cấu hĩa: hị phân tìm phải là đỏ và các no d node là đỏ, ng dẫn từ gố node mới, c cây sẽ được 5 một đường đó, mỗi n o g mục (item ây sẽ bị mất ột danh sách thời gian tru nh O(logN) y gần cân bằ phải bằng s ề cân bằng l của cây tìm ode con phả ược thực thi m tính chấ u trúc cây. kiếm( BS T hoặc đen. de lá phải lu những nod ốc đến một cần phải tuâ c cân bằng. không phâ n ode là con m) theo thứ t cân bằng v h liên kết, d uy xuất giả ) của cây, ch ằng). Điều số node con lại cây: đó l m kiếm nhị p ải, bên cạnh trong khi c ất cân bằng Bằng cách T) tuân thủ c uôn luôn đen de con của n lá phải có c ân thủ các q Thá n Nguy n nhánh. Bở phải. Khi ấ ứ tự giảm dầ về phía bên dữ liệu sẽ là ảm về O(N húng ta cần này có ngh n bên trái. là câyđỏ đ phân ví dụ h đócâyđỏ chèn, xóa. K g của cây c này, cây lu các quy tắc n. nó phải đen cùng số lượ quy tắc trên ng 6 năm 20 yễn Hồng P ởi vì mỗi n ấy, cây bị m ần, mỗi no n kia. à một chiều ), thay vì O n phải bảo đ hĩa là mỗi no en-là cây tì : node con ỏ đen còn đ Khi thêm m có bị vi ph uôn luôn đư sau: (hình . ợng node đe -gọi là quy 005 Phú node lớn mất cân de sẽ là u thay vì O(logN) đảm cây ode trên ìm kiếm trái nhỏ được bổ một phần hạm hay ược giữ 3.2) en. y tắc đỏCây Ng y ĐỏĐen guyễn Hoài M Phương Số lượng n caođen (b l là mọi đườn Bổ đề: Một câyđỏ Có: height height : Tính chất Thời gia n Chứng Mi H ode đen trê lack height) ng dẫn từ g ỏ đen n-nod <= 2 log(n+ : Chiều cao : height <= n tìm kiếm: nh: 6 Hình 3.2. Mộ n một đườn ). Ta có thể gốc đến lá p de +1) cây 2 * bh(x) O( log n ) ột ví dụ về c ng dẫn từ gố phát biểu q hải có cùng Thán Nguy ây đỏđen ốc đến lá đư quy tắc 4 th g chiều cao ng 6 năm 20 yễn Hồng P ược gọi là c eo một cách đen. 005 Phú chiều h khác CâyĐỏĐen Tháng 6 năm 2005 Nguyễn Hoài Phương 7 Nguyễn Hồng Phú III- Các thuật toán cơ bản của Black and Red Tree 1- Thêm một Node mới Chúng ta sẽ xem xét việc mô tả qui trình chèn. Gọi X, P, và G để chỉ định nhãn những node liên quan. X là node vi phạm quy tắc ( X có thể là một node mới được chèn, hoặc node con khi node cha và node con xung đột đỏ-đỏ, nghĩa là có cùng màu đỏ). · X là một node cho trước. · P là node cha của X. · G là node ông bà của X (node cha của P). Trong quá trình thêm vào node mới có thể vi phạm các quy tắc của câyđỏ đen, chúng ta sẽ thực hiện các thao tác sau đây: · Các phép lật màu trên đường đi xuống. · Các phép quay khi node đã được chèn. · Các phép quay trên đường đi xuống. 1.1 Các phép lật màu trên đường đi xuống Cây Ng Phé đi t trị Tu y qua Để cầ n có no d Mộ tam nod Hìn Hìn Ch mà Mặ nod đen là đ y ĐỏĐen guyễn Hoài ép thêm vào theo một đư của khóa no y nhiên, tro ay. bảo đảm k n. Theo quy hai node co de cha là no ột phép lật m m giác, node de con trái v nh 3.4. Lật nh 3.4a. trư húng ta nhận àu không vi ặc dù quy tắ de cha khôn n, không có đỏ, thì sau k Phương o trong cây ường dẫn từ ode và khóa ong câyđỏ đ không vi phạ y tắc như sa on đỏ, chún ode gốc, nó màu ảnh hư e có màu đỏ và phải của màu ước khi lật m n thấy sau k phạm quy ắc 4 không b ng thể đồng ó vấn đề vi p khi đổi màu đỏđen bắt ừ node gốc đ a tìm kiếm. đen, đến đư ạm các quy au: nếu phép ng ta đổi các vẫn vẫn gi ưởng đến cá ỏ trước phép a P là X1 và màu, Hình 3 khi lật màu tắc 4. bị vi phạm g màu đỏ) lạ phạm khi P u, ta sẽ có h 8 t đầu như trê đến vị trí cầ ược điểm ch y tắc màu, c p thêm vào c node con t ữ màu là đe ác quy tắc đ p lật là P (P à X2. Xem h 3.4b sau khi chiếu con đ qua phép lậ ại có khả nă chuyển từ hai node đỏ ên cây tìm k ần chèn, đi hèn là phức ần phải tiế n làm xuất hi thành đen v en). đỏ-đen ra sa P thay cho n hình 3.4a. i lật màu. đen của cây ật, nhưng q ăng bị vi ph đen sang đỏ trên một hà Thán Nguy kiếm nhị ph qua phải ha tạp bởi các n hành các p iện tình trạn và node cha ao? chúng ta node cha). C y không đổi quy tắc 3 (m hạm. Nếu no ỏ, nhưng nế àng. ng 6 năm 20 yễn Hồng P hân thông th ay trái tùy v c phép lật m phép lật mà ng một nod a thành đỏ ( a gọi node ở Chúng ta gọ . Như vậy p một node con ode cha của ếu node cha 005 Phú hường: vào giá màu và àu khi de đen trừ khi ở đỉnh ọi hai phép lật n và a P là a của P Cây Ng Điề ta c Đố gốc 3 (x gốc 1.2 Tha chè lý. N h thể y ĐỏĐen guyễn Hoài ều này cần p có thể giải q ối với node g c cũng như xung đột đỏ c tăng lên 1 2 Các p ao tác chèn èn, cần phải hư đã xét ở t ể nằm ở nhữ Phương phải được c quyết trườn gốc thì phép hai node co ỏ-đỏ). Tron , dođó quy phép quay n node mới c i kiểm tra x trên, node m ững vị trí kh chuẩn bị tru ng hợp này b p lật màu n on có màu đ ng trường hợ y tắc 4 cũng khi chèn có thể làm c xem có phạm mới được ch hác nhau đố 9 uớc khi đi x bằng một p node gốc và đen. Điều n ợp này, chiề g không bị v node cho quy tắc m quy tắc k hèn mà ta g ối với P và G xuống theo c hép quay. hai node c o này tránh sự ều caođen t vi phạm. c đỏ-đen bị không và thự gọi là node X G, như tron Thán Nguy cây để chèn on của nó v ự vi phạm qu trên mỗi đư vi phạm. D ực hiện nhữ X, luôn luô ng hình 3.5. ng 6 năm 20 yễn Hồng P n node mới. vẫn làm cho uy tắc 2 và ường đi từ n Do vậy sau k ững thao tác ôn đỏ. Node 005 Phú . Chúng o node quy tắc node khi c hợp e X có Cây Ng Hìn X l Điề nod Ng Nế no d chá Tha và Hì n i) K ii) K iii) y ĐỏĐen guyễn Hoài nh 3.5. Các là một node ều này có n de con trái c gược lại, X l u X là node de P ở bên t áu nội. Bốn ao tác phục những bà c nh 3.6. Ba k Khả năng 1 Khả năng 2 Khả năng Phương biến dạng e cháu ngoạ nghĩa là, X l của G, hoặc là một node e cháu ngoạ trái hay bên n trường hợp c hồi quy tắc con của nó. khả năng sa : P đen 2: P đỏ và X 3: P đỏ và X của node đư ại nếu nó nằ là node cháu c nó là node e cháu nội. ại, nó có thể n phải node p này được c đỏ-đen đư Có 3 khả n au khi chèn X là cháu ng X là cháu n 10 ược chèn ằm cùng bên u ngoại nếu e con phải c ể hoặc bên t G. Có hai k trình bày tr ược xác địn năng xảy ra nú t goại của G nội của G n node cha u hoặc nó là của P và no trái hoặc bê khả năng tư rong hình 3 nh bởi các m được xem x Thán Nguy P và P cùng à node con t de P là nod ên phải của ương tự nếu .5. màu và cấu h xét như sau ng 6 năm 20 yễn Hồng P g bên node trái của P v de con phải P, tùy vào u X là một n hình của no u:(hình 3.6) 005 Phú cha G. và P là của G. việc node ode X [...]... = 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 6 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 6 năm 2005 w->color... Hồng Phú CâyĐỏĐen Tháng 6 năm 2005 x = x->parent; rotateLeft(x); } /* đổi màu và xoay */ x->parent->color = BLACK; x->parent->parent->color = RED; rotateRight(x->parent->parent); } } else { /* Tương tự như trên */ NodeType *y = x->parent->parent->left; if (y->color == RED) { /* chú bác là is RED */ x->parent->color = BLACK; y->color = BLACK; x->parent->parent->color = RED; x = x->parent->parent;... 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) { /* chú bác là RED */ x->parent->color = BLACK; y->color = BLACK; x->parent->parent->color = RED; x = x->parent->parent; } else { /* chú bác là BLACK */ if (x == x->parent->right) { /* tạo ra... 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 6 năm 2005 if (z->left... 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 và y */ y->right = x; Nguyễn Hoài Phương 17 Nguyễn Hồng Phú CâyĐỏĐen Tháng 6 năm 2005 if (x != NIL) x->parent = y; } /************************************* * Chương trình chính thêm node x vào câyđỏ đen* *************************************/... Hồng Phú CâyĐỏĐen Tháng 6 năm 2005 /************************** * Xoay tráI node x * **************************/ static void rotateLeft(NodeType *x) { NodeType *y = x->right; /* Thiết lập liên kết x->right */ x->right = y->left; if (y->left != NIL) y->left->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->left) x->parent->left =... z->right == NIL) { /* y có một node con là NIL */ y = z; } else { /* Tìm cây thay thế với node con NIL */ y = z->right; while (y->left != NIL) y = y->left; } /* y chỉ có một con */ 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. .. x->parent->parent; } else { /* chú bác là 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 6 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 và thêm vào trên cây * ***********************************************/... x->parent->right = y; } else { root = y; } /* link x and y */ y->left = x; if (x != NIL) x->parent = y; Nguyễn Hoài Phương 16 Nguyễn Hồng Phú CâyĐỏĐen Tháng 6 năm 2005 } 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->left = y->right; if (y->right != NIL) y->right->parent . if (y != NIL) y->parent = x->parent; if (x->parent) { if (x == x->parent->left) x->parent->left = y; else x->parent->right = y;. (y != NIL) y->parent = x->parent; if (x->parent) { if (x == x->parent->right) x->parent->right = y; else x->parent->left = y;