Tài liệu Báo cáo - Cấu trúc dữ liệu - Cây đỏ đen doc

31 520 1
Tài liệu Báo cáo - Cấu trúc dữ liệu - Cây đỏ đen doc

Đ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 2 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áo cá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. 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 Cây Đỏ Đen 2 Mục lục: Lời nói đầu: . 1 Mục lục: . 2 I- Giới thiệu: 3 II- Định nghĩa: 5 III- Các thuật toán cơ bản của Black and Red Tree . 6 1- Thêm một Node mới . 6 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 3 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ây Đỏ Đen 4 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: đó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 đỏ đencâ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 Những node này tự sắp xếp thành một đường không phân nhánh. Bởi vì mỗi node l ớn hơn node đã được chèn vào trước đó, mỗi node là con phải. Khi ấy, cây bị mất cân bằng hoàn toàn. Nếu ta chèn những mục (item) theo thứ tự giảm dần, mỗi node sẽ là con trái của node cha của chúng - cây sẽ bị mất cân bằng về phía bên kia. * Độ phức tạp: Khi cây một nhánh, sẽ trở thành một danh sách liên kết, dữ liệu sẽ là một chiều thay vì hai chiều. Trong trường hợp này, thời gian truy xuất giảm về O(N), thay vì O(logN) đối với cây cân bằng. Để bảo đảm thời gian truy xuất nhanh O(logN) của cây, chúng ta cần phải bảo đảm cây luôn luôn cân bằng (ít ra cũng là cây gần cân bằng). Điều này có nghĩa là mỗi node trên cây phải có xấp xỉ số node con bên phải bằng số node con bên trái. Một cách tiếp cận giải quyết vấn đề cân bằng lại cây: đócây đỏ đen-là cây tìm kiếm nhị phân vì thế nó có các tính chất của cây tìm kiếm nhị phân ví dụ : node con trái nh ỏ hơn node cha, node cha nhỏ hơn node con phải, bên cạnh đó cây đỏ đen còn được bổ sung một số đắc điểm. Cây Tr o tử kh ô cân Cây Kh đen y Đỏ Đen 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 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 Số lượng n cao đen (b l là mọi đườn Bổ đề: Một cây đỏ â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 H ode đen trê lack height) ng dẫn từ g ỏ đen n-nod 5 ượ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. Hình 3.2. Mộ n một đườn ). Ta có thể gốc đến lá p de 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 ột ví dụ về c ng dẫn từ gố phát biểu q hải có cùng 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 ây đỏ đen ốc đếnđư quy tắc 4 th g chiều cao Khi thêm m có bị vi ph uôn luôn đư sau: (hình . ợng node đe -gọi là quy ược gọi là c eo một cách đen. một phần hạm hay ược giữ 3.2) en. y tắc đỏ chiều h khác Cây Đỏ Đen 6 Có: height <= 2 log(n+1) height : Chiều cao cây Tính chất: height <= 2 * bh(x) Thời gian tìm kiếm: O( log n ) Chứng Minh: 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ây · C · C 1. 1 Ph é đi t trị Tu y qua Để cầ n có no d Mộ tam nod Hìn y Đỏ Đen Các phép qu Các phép qu 1 Các p é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 uay khi node uay trên đườ phép lật m 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 e đã được c ờng đi xuốn àu trên đư đỏ đ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à 7 chèn. ng. ường đi xu 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 uống ê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. 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 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ọ hường: vào giá màu và àu khi de đen trừ khi ở đỉnh ọi hai Cây Đỏ Đen 8 Hình 3.4a. trước khi lật màu, Hình 3.4b sau khi lật màu. Chúng ta nhận thấy sau khi lật màu chiếu con đen của cây không đổi. Như vậy phép lật màu không vi phạm quy tắc 4. Mặc quy tắc 4 không bị vi phạm qua phép lật, nhưng quy tắc 3 (một node con và node cha không thể đồng màu đỏ) lại có khả năng bị vi phạm. Nếu node cha của P là đen, không có vấn đề vi phạm khi P chuyển từ đen sang đỏ, nhưng nếu node cha của P là đỏ , thì sau khi đổi màu, ta sẽ có hai node đỏ trên một hàng. Điều này cần phải được chuẩn bị truớc khi đi xuống theo cây để chèn node mới. Chúng ta có thể giải quyết trường hợp này bằng một phép quay. Đối với node gốc thì phép lật màu node gốc và hai node con của nó vẫn làm cho node gốc cũng như hai node con có màu đen. Điều này tránh sự vi phạm quy tắc 2 và quy tắc 3 (xung đột đỏ-đỏ). Trong trường hợp này, chiều cao đen trên mỗi đườ ng đi từ node gốc tăng lên 1, do đó quy tắc 4 cũng không bị vi phạm. 1.2 Các phép quay khi chèn node Thao tác chèn node mới có thể làm cho quy tắc đỏ-đen bị vi phạm. Do vậy sau khi chèn, cần phải kiểm tra xem có phạm quy tắc không và thực hiện những thao tác hợp lý. Như đã xét ở trên, node mới được chèn mà ta gọi là node X, luôn luôn đỏ. Node X có thể nằm ở những vị trí khác nhau đối với P và G, như trong hình 3.5. Cây Hì n X l Điề nod Ng Nế no d chá Tha và y Đỏ Đen 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 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ó. 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 9 ượ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 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 P và P cùn g à 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 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) cha G. và P là của G. việc node ode X Cây Hì n i) K ii) K iii) C h i) K P đ xun Do ii) K Nế th a cần y Đỏ Đen nh 3.6. Ba k Khả năng 1 Khả năng 2 Khả năng húng ta lần l Khả năng 1 đen là trườn ng khắc đỏ- o vậy, không Khả năng 2 u node P đỏ ay đổi về mà n phải làm m khả năng sa : P đen 2: P đỏ và X 3: P đỏ và X lượt xét các : P đen ng hợp đơn -đỏ (quy tắc g bị vi phạm 2: P đỏ và X ỏ và X là no àu. Bắt đầu một phép lậ au khi chèn X là cháu ng X là cháu n c khả năng c giản. Node c 3), và khô m quy tắc v X là cháu ng ode cháu ng u với giá trị ật màu trước 10 nú t goại của G nội của G cụ thể như s thêm vào l ông có việc ề màu. Th a goại của G goại, ta cần 50 tại nod e c khi chèn n sau: luôn đỏ. Nế cộng thêm ao tác chèn một phép q e gốc, và ch node 12. ếu node cha vào số nod đã hoàn tất quay đơn gi hèn các node a đen, không de đen (quy . iản và một v e 25, 75 và g có tắc 4). vài 12. Ta [...]... *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 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... 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 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; } }... ****************************/ 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 = 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 và y */ y->right = x; 17 Cây Đỏ Đen if (x != NIL) x->parent = y; } /*************************************... 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->left) { x = x->parent; 19 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 và thêm vào trên cây * ***********************************************/... node x vào cây đỏ đ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) { /* chú bác là RED */ x->parent->color = BLACK; y->color = BLACK; x->parent->parent->color... x = x->parent->parent; } else { /* chú bác là BLACK */ if (x == x->parent->right) { /* tạo ra x là con trái*/ 18 Cây Đỏ Đen 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... 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 = y; else x->parent->right = y; } else { root = y; } /* link x and y */ y->left = x; if (x != NIL) x->parent = y; 16 Cây Đỏ Đen } static void rotateRight(NodeType *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 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... BLACK; w->left->color = BLACK; rotateRight (x->parent); x = root; } } } x->color = BLACK; } StatusEnum erase(iterator z) { NodeType *x, *y; 24 Cây Đỏ Đen if (z->left == NIL || 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;... i bảo qui tắc của cây đỏ đen o a n IV- Th huật toá cài đ án đặt: typ pedef enum { STATUS_OK K, STATUS_ME EM_EXHAU USTED, STATUS_DU UPLICATE_ _KEY, STATUS_KE EY_NOT_FOUND }S StatusEnum m; 14 Cây Đỏ Đen typedef int KeyType; /* Kiểu dữ 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 dữ liêu */ typedef . BỘ MÔN CẤU TRÚC DỮ LIỆU 2 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ó. đắc điểm. Cây Tr o tử kh ô cân Cây Kh đen y Đỏ Đen 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 M đen, việc c

Ngày đăng: 12/12/2013, 18:15

Từ khóa liên quan

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

Tài liệu liên quan