Tiểu luận Phân tích và thiết kế thuật toán CÂY ĐỎ ĐEN (Red-Black Trees)

49 631 0
Tiểu luận Phân tích và thiết kế thuật toán CÂY ĐỎ ĐEN (Red-Black Trees)

Đ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

ĐẠI HỌC HUẾ TRƯỜNG ĐẠI HỌC KHOA HỌC KHOA CÔNG NGHỆ THÔNG TIN o0o TIỂU LUẬN THIẾT KẾ VÀ PHÂN TÍCH THUẬT TOÁN Đề tài: CÂY ĐỎ ĐEN (Red-Black Trees) Giảng viên hướng dẫn: TS. HOÀNG QUANG Nhóm 3 – KHMT 2009: 1. Đinh Như Du 2. Trương Thị Mỹ Lê 3. Nguyễn Thị Liên 4. Lê Văn Trường Huế, 11-2014 Chương 13. Cây đỏ đen L Ờ I N Ó I ĐẦU Trong môn Cấu trúc dữ liệu và giải thuật chúng ta đã biết một cây nhị phân tìm kiếm có chiều cao h có thể thực thi bất kỳ trong số các thao tác trên cây có độ phức tạp O(h) thời gian. Như vậy, các thao tác trên cây sẽ thực hiện nhanh nếu cây cân bằng; nhưng nếu nó có chiều cao lớn (ví dụ cây lệch trái, lệch phải,…) khả năng thực hiện của các phép toán có thể không tốt hơn so với một danh sách liên kết. Nhóm 3-Lớp KHMT-Khóa 2009-2011 đã may mắn được thầy TS Hoàng Quang giao cho đề tài: ”Cây đỏ đen” là một trong số nhiều dạng cây tìm kiếm "cân bằng" để đảm bảo các thao trên cây giảm độ phức tạp xuống là O(lgn). Muốn làm điều đó khi thực hiện các thao tác trên cây, phải giữ được tính chất của cây đỏ đen. Nhóm 3 xin chân thành cảm ơn các bạn học viên trong lớp đã góp ý cho đề tài, đặc biệt là thầy TS. Hoàng Quang đã tận tình hướng dẫn, góp ý để nhóm 3 có thể hoàn thành tốt đề tài khá mới mẻ này. Chương 12 đã chứng tỏ một cây nhị phân tìm kiếm có chiều cao h có thể thực thi bất kỳ trong số các phép toán tập hợp động căn bản như: SEARCH (tìm 1 Nhóm 3- KHMT 2009 Chương 13. Cây đỏ đen kiếm), PREDECESSOR (tìm nút kế trước), SUCCESOR (tìm nút kế sau), MINIMUM (tìm nút có khóa nhỏ nhất), MAXIMUM (tìm nút có khóa lớn nhất), INSERT (chèn nút) và DELETE (xóa nút) - trong O(h) thời gian. Như vậy, các phép toán tập hợp chạy nhanh nếu cây tìm kiếm có chiều cao nhỏ; nhưng nếu nó có chiều cao lớn (ví dụ cây lệch trái, lệch phải,…) khả năng thực hiện của các phép toán có thể không tốt hơn so với một danh sách liên kết. Các cây đỏ đen là một trong số nhiều lược đồ cây tìm kiếm "cân bằng" để đảm bảo các phép toán tập hợp động căn bản chiếm O(lg n) thời gian trong trường hợp xấu nhất. 13.1. Các tính ch 13.1. Các tính ch ấ ấ t c t c ủ ủ a cây đ a cây đ ỏ ỏ đen đen Một cây đỏ đen là một cây nhị phân tìm kiếm cộng thêm một bit lưu trữ cho mỗi nút gồm: màu của nó, có thể là đỏ hoặc đen. Nhờ ràng buộc cách thức tô màu các nút trên một đường đi bất kỳ từ gốc đến một lá, các cây đỏ đen đảm bảo không có đường đi nào dài hơn gấp đôi so với bất kỳ đường đi nào khác, sao cho cây xấp xỉ cân bằng. Mỗi nút của cây giờ đây chứa các trường: color (màu sắc), key (khóa), left (con trái), right (con phải), và p (cha). Nếu một con hoặc cha của một nút không tồn tại, trường biến trỏ tương ứng của nút chứa giá trị NIL. Ta sẽ xem các NIL này như là các biến trỏ đến các nút ngoài (các lá) của cây nhị phân tìm kiếm và cây thường, các nút mang khóa bình thường xem như là các nút trong của cây. Một cây nhị phân tìm kiếm là một cây đỏ đen nếu nó thỏa mãn các tính chất đỏ đen dưới đây: 1. Mọi nút là đỏ hoặc đen. 2. Nút gốc là đen. 3. Mọi nút lá (NIL) là đen. 4. Nếu một nút là đỏ, thì cả hai con của nó là đen. 5. Đối với mỗi nút, tất cả các đường đi từ nút đó tới các lá hậu duệ chứa cùng số lượng các nút đen. Hình 13.1(a) đưa ra một ví dụ của một cây đỏ đen. Một cây đỏ đen có các nút đen tô sẫm và các nút đỏ tô bóng. Mọi nút trong một cây đỏ đen là đỏ hoặc đen, mọi lá (nil) là đen, các con của một nút đỏ đều đen, và mọi đường đi đơn giản từ một nút đến một lá hậu duệ chứa cùng số lượng nút đen. 2 Nhóm 3- KHMT 2009 Chương 13. Cây đỏ đen Hình 13.1 (a) Mỗi nút lá xem như một nil là đen. Mỗi nút không nil được đánh dấu với chiều cao đen của nó; nút NIL có chiều cao đen bằng 0. Hình 13.1 (b) Giống với cây đỏ đen nhưng mỗi nút NIL được thay bằng cờ hiệu đơn giản nil[T], mà nó luôn luôn đen và chiều cao đen được bỏ qua. Cha của nút gốc cũng là cờ hiệu. Để tiện lợi trong việc giải quyết với các mệnh đề điều kiện ranh giới trong mã giải của cây đỏ đen, chúng tôi sử dụng một cờ hiệu đơn giản để miêu 3 Nhóm 3- KHMT 2009 1 7 2 0 10 1 5 3 3 0 3 5 3 9 2 6 4 1 1 4 2 1 1 9 2 3 1 6 7 1 2 4 7 2 8 3 8 14 nil[T] (b) 17 20 10 15 3 30 35 39 26 41 14 21 19 2316 7 12 47 28 38 NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NILNIL NIL 1 1 1 2 2 2 1 2 1 1 1 1 1 1 1 1 3 2 2 1 Chương 13. Cây đỏ đen tả NIL. Cho một cây đỏ đen T, cờ hiệu nil[T] là một đối tượng với các trường giống như một nút bình thường trong cây. Trường color của nó là đen, và các trường khác - p, left, right và key có thể được gán giá trị bất kỳ. Như trong hình 13.1 (b) chỉ ra, tất cả các con trỏ NIL được thay thế bằng cờ hiệu nil[T]. Ta dùng cờ hiệu để có thể xem một con NIL của một nút x như là một nút bình thường có cha là nút x. Mặc dù ta có thể thêm vào một nút cờ hiệu riêng đối với mỗi NIL trong cây, để cha của mỗi NIL được định nghĩa hợp lý, cách này sẽ gây lãng phí không gian (bộ nhớ). Thay vì ta dùng một cờ hiệu nil[T] để biểu thị cho tất cả các NIL của tất cả các lá và cha của gốc. Các giá trị của các trường p, left, right, và key của cờ hiệu là không quan trọng, mặc dù ta có thể thiết lập chúng trong suốt quá trình của một thủ tục cho sự thuận lợi của chúng ta. Thông thường ta giữ sự quan tâm của chúng ta đối với các nút trong của một cây đỏ đen, vì chúng chứa các giá trị khóa. Trong phần còn lại của chương này, ta bỏ qua các lá khi ta vẽ một cây đỏ đen, như trong hình 13.1(c). Hình 13.1 (c ) Giống với cây đỏ đen nhưng toàn bộ các lá và cha của gốc được bỏ qua. Chúng tôi sẽ dùng cách vẽ này trong phần còn lại của chương này. Ta gọi số lượng các nút đen trên bất kỳ đường đi nào từ một nút x (nhưng không bao gồm x) đến một lá là chiều cao đen của nút (black height) ký hiệu là bh(x). Theo tính chất 5, khái niệm của chiều cao đen được định nghĩa hợp lý, vì tất cả các đường đi xuống từ một nút đều có cùng số lượng các nút đen. Ta định nghĩa chiều cao đen của một cây đỏ đen là chiều cao đen của nút gốc. Bổ đề sau chỉ ra tại sao các cây đỏ đen tạo các cây tìm kiếm tốt. Bổ đề 13.1: Một cây đỏ đen với n nút trong có chiều cao tối đa 2lg(n+1). 4 Nhóm 3- KHMT 2009 17 20 10 15 3 30 35 39 26 41 14 21 19 2316 7 12 47 28 38 (c) Chương 13. Cây đỏ đen Chứng minh: Trước tiên ta chỉ ra rằng cây con có gốc tại một nút x bất kỳ sẽ chứa ít nhất 2 bh(x) - 1 nút trong. Ta chứng minh sự khẳng định định này bằng phương pháp quy nạp trên chiều cao của x. + Nếu chiều cao của x là 0, x phải là một lá (nil[T]) và như vậy cây con có gốc tại x chứa ít nhất 2 bh(x) - 1= 2 0 - 1=0 nút trong. + Với bước quy nạp, ta xét một nút x có chiều cao dương và là một nút trong có 2 con, mỗi con có một chiều cao đen là bh(x) hoặc bh(x)-1, tùy thuộc vào màu của nó là đỏ hoặc đen, theo thứ tự nêu trên. Bởi chiều cao của một con của x nhỏ hơn chiều cao của chính x, nên ta có thể áp dụng giả thiết quy nạp để kết luận rằng mỗi con có ít nhất 2 bh(x)-1 - 1 nút trong. Như vậy cây con có gốc tại x chứa ít nhất (2 bh(x)-1 - 1) + ( 2 bh(x)-1 -1 ) + 1 =2 bh(x) - 1 nút trong, điều phải chứng minh. Để hoàn chỉnh chứng minh của bổ đề cho h là chiều cao của cây. Theo tính chất 4 của các cây đỏ đen ít nhất phân nửa các nút trên đường đi đơn giản bất kỳ từ gốc đến một lá, không kể gốc phải là đen. Do vậy, chiều cao đen của gốc phải ít nhất là h/2; như vậy n >= 2 h/2 - 1. Việc dời 1 sang bên phía trái và lấy loga trên cả 2 phía sẽ cho ra lg(n+1)>=h/2 hoặc h <= 2lg(n+1) Một kết quả trực tiếp của bổ đề này đó là các phép toán tập hợp động SEARCH, PREDECESSOR, SUCCESOR, MINIMUM, MAXIMUM có thể được thực thi trong O(lg(n)) thời gian trên các cây đỏ đen, bởi chúng có thể được thực hiện để chạy trong O(h) thời gian trên một cây tìm kiếm có chiều cao h (như đã nêu trong chương 12) và bất kỳ cây đỏ đen nào có n nút đều là một cây tìm kiếm với chiều cao O(lg(n)). (tất nhiên những vấn đề liên quan đến NIL trong các thuật toán trong chương 12 phải được thay bằng nil[T]). Mặc dù các thuật toán TREE-INSERT và TREE-DELETE ở chương 12 chạy trong O(lg(n)) thời gian khi cho một cây đỏ đen là giá trị vào. Nhưng chúng không trực tiếp hỗ trợ các phép toán tập hợp động INSERT và DELETE, bởi chúng không đảm bảo cây nhị phân đã sửa đổi sẽ là một cây đỏ đen. Tuy nhiên như các phần 13.3 và 13.4 sẽ cho thấy 2 phép toán này có thể được hỗ trợ trong O(lg(n)) thời gian. 5 Nhóm 3- KHMT 2009 Chương 13. Cây đỏ đen Ta có khai báo cấu trúc cây đỏ đen như sau: TRBNode = record key: byte; left, right, p: TRBNodeP; color: String[5]; {Red, Black} end; Trong đó: P: Nút cha (cha của x thì ký hiệu p[x]). Root: Nút gốc. Color: Chứa giá trị màu của nút. 6 Nhóm 3- KHMT 2009 Chương 13. Cây đỏ đen Một số thao tác cơ bản trên cây đỏ đen: Tương tự như cây nhị phân tìm kiếm, phép toán phổ biến trên cây đỏ đen là tìm kiếm theo khóa được lưu trữ trong cây. Ngoài phép toán SEARCH, cây đỏ đen có thể được chứng minh rằng với các phép toán như tìm nút có giá trị nhỏ nhất, lớn nhất, nút kế trước nút x và nút kế sau nút x đều được thực hiện trong O(h) thời gian, với h là chiều cao của cây.  Function SEARCH ( TRBNodeP TRBNodeP; Begin if (T= nil[T]) or (k = T^.key) then SEARCH:=T else if k < T^.key then SEARCH:= SEARCH(T^.left, k) else SEARCH:= SEARCH(T^.right, k) End; Ví dụ, tìm khóa k=13 trong cây, có đường tìm kiếm: 15 → 6 → 7 → 13 k=25àSearch= nil[T]   Function Min(T: TRBNodeP): TRBNodeP; Begin while (T^.left <> nil[T]) do T := T^.left; Min:=T; End; Function Max(T: TRBNodeP): TRBNodeP; Begin while (T^.right <> nil[T]) do T := T^.right; Max:=T; End; Ví dụ: Với cây đỏ đen ở bên, + Nút nhỏ nhất có giá trị =2 + Nút lớn nhất có giá trị =20 7 Nhóm 3- KHMT 2009 Chương 13. Cây đỏ đen !"#$%%&  Giải thuật: Predecessor (x) 1 if left[x] ≠ nil[T] 2 then return Max(left[x]) 3 y ← p[x] 4 while (y ≠ nil[T]) and (x = left[y]) do 5 x ← y y ← p[y] 6 return y Hàm tương ứng: Function Predecessor ( x: TRBNodeP): TRBNodeP; var y: TRBNodeP; Begin if (x^.left<> nil[T]) then Predecessor:=Max(x^.left) else begin y := x^.parent; while (y<>nil[T]) and (x = y^.left) do begin x := y; y := y^.parent; end; Predecessor:=y; end; End; Ví dụ: với cây đỏ đen ở bên: + Nút kế trước của 2 là Nil[T] + Nút kế trước của 20 là 18 '!%()*++,)) &  Giải thuật: SUCCESSOR(x) 1 if right[x] ≠ nil[T] 2 then return Min(right[x]) 3 y ← p[x] 4 while (y ≠ nil[T]) and (x = right[y]) do 5 x ← y y ← p[y] 6 return y Hàm tương ứng: 8 Nhóm 3- KHMT 2009 Chương 13. Cây đỏ đen Function Successor (x: TRBNodeP): TRBNodeP; var y: TRBNodeP; begin if (x^.right<> nil[T]) then Successor :=Min(x^.right) else begin y := x^.parent; while (y<>nil[T]) and (x = y^.right) do begin x := y; y := y^.parent; end; Successor :=y; end; end; Ví dụ: Với cây đỏ đen như hình bên: + Nút kế sau của 13 là 15 + Nút kế sau của 20 là nil[T] Bài tập: 13.1-1: Trong mẫu hình 13.1 (a), vẽ cây nhị phân tìm kiếm hoàn chỉnh có chiều cao 3 trên các khóa {1,2, ,15}. Bổ sung các lá NIL và tô màu các nút theo 3 cách khác nhau sao cho các chiều cao đen của các cây đỏ đen kết quả là 2, 3 và 4. /01 + Trường hợp chiều cao đen của cây là 2. 9 Nhóm 3- KHMT 2009 4 1 10 8 12 2 6 5 73 14 9 11 13 15 NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL 2 2 1 1 1 1 2 11 1 1 1 11 1 1 [...]... chất đỏ đen 1, 3, 4 và 5 Nói cách khác, gốc có thể là đỏ hoặc đen Xét một cây đỏ đen yếu T, gốc của T là đỏ Nếu chúng ta tô màu đen cho gốc T nhưng không làm thay đổi T, kết quả cây có phải là cây đỏ đen không? Gợi ý: Kết quả cây vẫn là cây đỏ đen 13.1-4: Giả sử chúng ta quan tâm đến mọi nút đỏ trong một cây đỏ đen thành nút cha đen của nó, với mục đích là các con của nút đỏ trở thành các con của cha đen. .. được chèn vào là màu đỏ, cây sẽ bị vi phạm tính chất 4 Do đó nó không còn là cây đỏ đen + Nếu nút được chèn vào là màu đen, cây sẽ bị vi phạm tính chất 5 Do đó nó không còn là cây đỏ đen Qua đây chúng ta có nhận xét: nếu cho một cây đỏ đen là giá trị vào của thủ tục TREE-INSERT thì kết quả có thể không còn là cây đỏ đen 13.1-3: Chúng ta hãy đưa ra định nghĩa một cây đỏ đen yếu như một cây nhị phân tìm... nút trong cây đỏ đen có thể thực hiện tương tự như đối với cây nhị phân tìm kiếm, tuy nhiên sau khi xóa một nút thì có thể dẫn đến sự vi phạm các tính chất đỏ đen Ví dụ 7 11 2 5 1 14 8 15 4 − Khi xóa nút có khóa là 4 và màu là đỏ, ta được cây mới vẫn là cây đỏ đen (thỏa mãn các tính chất đỏ đen) 7 11 2 1 5 8 14 15 − Tương tự, nếu ta xóa nút màu đỏ có khóa là 15 thì cây thu được vẫn là cây đỏ đen − Nhưng... đối với tính chất 4 đã xẩy ra đối với cây, cây được phục hồi và được kết quả như hình sau 25 Nhóm 3- KHMT 2009 Chương 13 Cây đỏ đen Kết quả cây đỏ đen sau khi chèn các khóa 41, 38, 31, 12, 19, 8 vào một cây đỏ đen trống từ đầu 13.3.3: Giả sử chiều cao đen của mỗi cây con α , β , γ , δ , ε trong các hình 13.5 và 13.6 là k Gán nhãn mỗi nút trong mỗi hình với chiều cao đen của nó để xác minh tính chất 5... được chèn vào là màu đỏ, cây kết quả có phải là một cây đỏ đen không? kết quả là gì nếu nút chèn vào có màu đen? 3 26 2 17 2 41 2 14 2 21 2 10 1 1 NIL 7 1 12 NIL 3 1 16 NIL 1 15 NIL NIL NIL 1 19 NIL 1 23 1 20 NIL 2 30 NIL NIL NIL 1 28 NIL 1 47 NIL 1 38 NIL 1 39 1 35 NIL NIL NIL NIL NIL NIL 10 Nhóm 3- KHMT 2009 Chương 13 Cây đỏ đen Gợi ý: Với cây đỏ đen ở trên, nút với khóa 36 sẽ được chèn vào ở vị trí... bằng 15 vào cây Kết quả là trong cây có nút z và p[z] đều có màu đỏ ⇒ vi phạm tính chất 4 Gọi y là nút chú bác của z (y chỉ đến nút có khóa là 8 trong cây) Chúng ta tiến hành các phép lật màu và quay để sửa các vi phạm đối với cây đỏ đen này như sau: 1 Đổi màu p[z], y đỏ thành đen, p[p[z]] thành đỏ; di chuyển z lên vị trí p[p[z]] ⇒ tính chất 4 còn bị vi phạm 15 Nhóm 3- KHMT 2009 Chương 13 Cây đỏ đen 2... chúng vào z 16 if color[y] = BLACK 17 then RB-DELETE-FIXUP(T, x) 18 return y 32 Nhóm 3- KHMT 2009 Chương 13 Cây đỏ đen Phân tích: Việc xóa một nút y có thể là nút đỏ hoặc nút đen  Nếu ta xóa một nút đỏ, các tính chất đỏ- đen vẫn được duy trì, vì:  Chiều cao đen trong cây không thay đổi  Các nút đỏ không được tạo nên kề sát, và  Vì thế y không thể là nút gốc nếu nó là đỏ, nút gốc vẫn còn là đen ... KHMT 2009 Chương 13 Cây đỏ đen 27 Nhóm 3- KHMT 2009 Chương 13 Cây đỏ đen Gợi ý: Chiều cao đen của các nút A, B, D trước và sau khi biến đổi là k+1 Chiều cao đen của nút C trước khi biến đổi là k+1 (vì 2 con đỏ của nó có chiều cao đen là k+1), sau khi biến đổi là k+2 (vì 2 con đen của nó có chiều cao đen là k+1 Chiều cao đen của các nút A, B, D trước và sau khi biến đổi là k+1 Chiều cao đen của nút C trước... vào cây T như thể nó là một cây nhị phân tìm kiếm bình thường, sau đó ta tô đỏ z Để bảo toàn các tính chất đỏ- đen, ta gọi thủ tục RB-INSERT-FIXUP để tô màu lại các nút và thực hiện các phép quay Gọi thủ tục RB-INSERT(T,z) chèn nút z vào cây đỏ đen T, giá trị trường khóa của z được thừa nhận là đã được điền vào Trước khi trình bày cụ thể về phép chèn một nút z vào cây đỏ đen, chúng tôi đưa ra một ví... đối với tính chất 4 đã xẩy ra đối với cây, cây được phục hồi và được kết quả như hình sau + Sau khi chèn nút z =12, sự vi phạm đối với tính chất 4 đã xẩy ra đối với cây, cây được phục hồi và được kết quả như hình sau 24 Nhóm 3- KHMT 2009 Chương 13 Cây đỏ đen + Sau khi chèn nút z =19, sự vi phạm đối với tính chất 4 đã xẩy ra đối với cây, cây được phục hồi và được kết quả như hình sau + Sau khi chèn nút . các nút đen. Hình 13.1(a) đưa ra một ví dụ của một cây đỏ đen. Một cây đỏ đen có các nút đen tô sẫm và các nút đỏ tô bóng. Mọi nút trong một cây đỏ đen là đỏ hoặc đen, mọi lá (nil) là đen, các. đỏ hoặc đen. Xét một cây đỏ đen yếu T, gốc của T là đỏ. Nếu chúng ta tô màu đen cho gốc T nhưng không làm thay đổi T, kết quả cây có phải là cây đỏ đen không? /01 Kết quả cây vẫn là cây đỏ. 2009 Chương 13. Cây đỏ đen Một số thao tác cơ bản trên cây đỏ đen: Tương tự như cây nhị phân tìm kiếm, phép toán phổ biến trên cây đỏ đen là tìm kiếm theo khóa được lưu trữ trong cây. Ngoài phép toán SEARCH,

Ngày đăng: 11/04/2015, 22:09

Từ khóa liên quan

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

  • Đang cập nhật ...

Tài liệu liên quan