Các tính chất của cây đỏ đ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
Trang 1TRƯỜ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:
Giảng viên hướng dẫn: TS HOÀNG QUANG Nhóm 3 – KHMT 2009:
Trang 2L I N Ó I Đ U ỜI NÓI ĐẦU Ầ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
Trang 3kiế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ớnnhấ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ựchiệ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áccây đỏ đen là một trong số nhiều lược đồ cây tìm kiếm "cân bằng" để đảm bảocá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ợpxấu nhất.
13.1 Các tính chất của cây đỏ đ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 đảmbả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útkhông tồn tại, trường biến trỏ tương ứng của nút chứa giá trị NIL Ta sẽ xemcá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ìmkiếm và cây thường, các nút mang khóa bình thường xem như là các nút trongcủ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ínhchấ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ứacù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.
Trang 4Hì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ớitrong 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
1 7
2 0
10
1 5 3
3 0
3 5
3 9
2 6
4 1 1
1 1 9
2 3
1 6
2
4 7 2
8
3 8
NIL NIL NIL NIL
NIL NIL NIL
NIL NIL
Trang 5tả NIL Cho một cây đỏ đen T, cờ hiệu nil[T] là một đối tượng với các trườnggiống như một nút bình thường trong cây Trường color của nó là đen, và cáctrường khác - p, left, right và key có thể được gán giá trị bất kỳ Như trong hình13.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útbì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áchnà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áctrườ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úngta
Thông thường ta giữ sự quan tâm của chúng ta đối với các nút trong củamộ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ươngnà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ưngkhô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 địnhnghĩ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
Trang 6Chứ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 ítnhất 2bh(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 2bh(x) - 1= 20 - 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úttrong có 2 con, mỗi con có một chiều cao đen là bh(x) hoặc bh(x)-1, tùy thuộcvà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 concủ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 2bh(x)-1 - 1 nút trong
Như vậy cây con có gốc tại x chứa ít nhất (2bh(x)-1 - 1) + ( 2bh(x)-1 -1 ) + 1
=2bh(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 Theotí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ảnbấ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ủagốc phải ít nhất là h/2; như vậy n >= 2h/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 ralg(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 độngSEARCH, 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ộtcâ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 NILtrong 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 12chạy trong O(lg(n)) thời gian khi cho một cây đỏ đen là giá trị vào Nhưngchú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 Tuynhiê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
Trang 7Ta 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}
Trang 8Mộ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ệntrong O(h) thời gian, với h là chiều cao của cây
i) Thao tác tìm kiếm nút có giá trị khóa k:
Function SEARCH (T: TRBNodeP, k: bye): TRBNodeP;
ii) Thao tác tìm kiếm nút có giá trị nhỏ nhất (Min), lớn nhất (Max):
Function Min(T: TRBNodeP): TRBNodeP;
Trang 9iii) Nút kế trước (Predecessor) của x:
Giải thuật: Predecessor (x)
Function Predecessor ( x: TRBNodeP): TRBNodeP;
iv) Nút kế sau (SUCCESSOR) của x:
Giải thuật: SUCCESSOR(x)
Trang 10Function Successor (x: TRBNodeP): TRBNodeP;
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 3cá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
1
2
1 1
1
1 1
1 1
Trang 11Trường hợp chiều cao đen của cây là 3.
Trường hợp chiều cao đen của cây là 4
13.1-2: Vẽ cây đỏ đen mà kết quả của nó là sau khi thủ tục TREE-INSERT
được gọi trên cây trong hình 13.1 đối với khóa 36 Nếu nút đượ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útchèn vào có màu đen?
NIL NIL NIL NIL
NIL NIL NIL
NIL NIL
Trang 12Gợi ý: Với cây đỏ đen ở trên, nút với khóa 36 sẽ được chèn vào ở vị trí con phải
của nút có khóa 35
+ Nếu nút đượ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ủathủ 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 kiếm mà nó thỏa mãn các tính chất chất đỏ đen 1, 3, 4 và 5 Nói cáchkhá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ủacha đen (bỏ qua điều xảy ra với các khóa) Cấp của một nút đen có thể là gì saukhi tất cả các con đỏ của nó được chú ý Có thể nói điều gì với độ sâu của cácnút lá của cây kết quả?
Gợi ý:
Sau khi tất cả các con đỏ của nó được chú ý, mức độ của mỗi nút màuđen nút là:
+ 2, nếu cả hai nút con là màu đen,
+ 3, nếu một con là màu đen và một là màu đỏ, hoặc
+ 4, nếu cả hai con là màu đỏ
Tất cả các lá của cây kết quả có độ sâu như nhau
13.1.5: Chứng tỏ rằng đường đi đơn giản dài nhất từ một nút x trong một cây đỏ
đen đến một lá hậu duệ có chiều dài tối đa gấp đôi so với đường đi đơn giảnngắn nhất từ nút x đến một lá hậu duệ
Gợi ý:
Trong đường đi dài nhất, ít nhất mọi nút khác là màu đen Trong đường
đi ngắn nhất, nhiều nhất mọi nút là màu đen Từ đó hai đường đi chứa cùng sốlượng các nút đen, chiều dài của đường đi dài nhất gấp tối đa hai lần chiều dàicủa đường đi ngắn nhất
Chúng ta có thể nói chính xác hơn điều này như sau:
Vì mọi đường đi chứa cùng số lượng bh(x) nút đen, ngay cả đường đi ngắn nhất
từ nút x tới các lá hậu duệ có độ dài tối thiểu là bh(x) Theo định nghĩa, đường
đi dài nhất từ nút x tới lá hậu duệ có chiều dài là height(x) Vì đường đi dài nhất
Trang 13chứa bh(x) nút đen và có ít nhất một nửa số nút trên đường đi dài nhất là nútđen (theo tính chất 4), tức là bh(x) >= height(x)/2 Bởi vậy, độ dài đường đi dàinhất = height(x) <=2*bh(x) <= 2 lần độ dài đường đi ngắn nhất.
Ta thay đổi cấu trúc biến trỏ thông qua phép quay, mà nó là phép quaycục bộ trong một cây tìm kiếm để bảo vệ các tính chất của cây nhị phân tìmkiếm Hình 13.2 chỉ ra hai loại phép quay; phép quay trái và phép quay phải.Khi chúng ta thực hiện phép quay trái trên một nút x, ta thừa nhận rằng conphải y của nó không phải là nil[T]; x có thể là một nút bất kỳ trong cây mà conphải của nó không phải là nil[T] Phép quay trái quay quanh đường nối từ x tới
y Nó làm y trở thành nút gốc của cây con mới, với x thành con trái của y, contrái của y thành con phải của x Mã giải cho LEFT-RORATE thừa nhận rằngright[x] nil[T] và cha của gốc là nil[T]
Hình 13.2: Các phép toán quay trên một cây nhị phân tìm kiếm Phép toán
LEFT-RORATE(T, x) biến đổi cấu hình của hai nút bên trái thành cấu hình bên phải bằng cách thay đổi một số biến trỏ bất biến Cấu hình bên phải có thể được biến đổi thành cấu hình bên trái bằng phép toán nghịch đảo RIGHT- RORATE(T, y) Các mẫu tự , , và biểu thị cho các cây con tùy ý Một phép quay bảo toàn các tính chất của cây nhị phân tìm kiếm: các khóa trong
đứng trước key(x), key(x) đứng trước các khóa trong , các khóa trong đứng trước key(y), key(y) lại đứng trước các khóa trong.
Trang 14LEFT-ROTATE(T, x)
1 y ← right[x] (*Đặt y là cây con phải của x*)
2 right[x] ← left[y] (*Quay nút con trái của y thành nút con phải của x*)
RIGHT-Hình 13.3 Một ví dụ về cách thức mà thủ tục LEFT-RORATE(T, x) sửa một cây nhị phân tìm kiếm Cây xuất hiện ở giá trị vào và cây đã sửa đổi đem lại danh sách giá trị khóa giống nhau.
4
7
1 1 3
9 2
1 8 1 9
1 4 6
1
2 0
4
7
1 8 3
1 1 2
9
1 9 1
4 6
1
2 2 2 0 LEFT-ROTATE(T,x)
Trang 15Bài tập:
13.2-1: Viết mã giải cho RIGHT-RORATE.
RIGHT-ROTATE(T, x)
1 y ← left[x] (*Đặt y là cây con trái của x*)
2 left[x] ← right[y] (*Quay nút con phải của y thành nút con trái của x*)
Gợi ý: Chúng ta chuyển chiều sâu của các nút a, b, c trong cây sang khái niệm
chiều cao đen của chúng (giả sử chiều cao đen của các nút a, b, c trước khi thựchiện phép quay trái là k) Khi thực hiện một phép quay trái trên nút x, chiều caođen của chúng sẽ không bị thay đổi (được bảo toàn)
Vấn đề này sẽ được thể hiện rõ hơn trong các bài tập của nội dung phép chèn
13.2-4: Chỉ ra rằng có thể dùng O(n) phép quay để biến đổi bất kỳ cây tìm kiếm
nhị phân n- nút tùy ý thành một cây tìm kiếm nhị phân n-nút tùy ý bất kỳ khác
Gợi ý: Trước tiên chứng tỏ rằng tối đa n-1 phép quay phải là đủ để biến đổi một
cây bất kỳ thành một chuỗi xích tiến phải
Trang 1613.2-5: Ta nói rằng một cây tìm kiếm nhị phân T1 có thể được biến đổi phảithành cây tìm kiếm nhị phân T2 nếu nó có thể thu được T2 từ T1 thông qua mộtchuỗi lời gọi RIGHT-RORATE Đưa một ví dụ hai cây T1 và T2 sao cho T1
không thể được biến đổi phải thành T2 Khi đó chỉ ra rằng nếu một cây T1 có thểđược biến đổi phải thành T2, nó có thể biến đổi phải dùng O(n2) lời gọi RIGHT-RORATE
13.3 Phép chèn
Có thể thực hiện phép chèn một nút vào một cây đỏ đen n-núttrong O(lg n) thời gian Ta dùng một thủ tục mà nó là một sự sửa đổi khôngđáng kể của thủ tục TREE-INSERT (đoạn 12.3) để chèn nút z 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àncá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úngtôi đưa ra một ví dụ sau:
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
Trang 18Trong RB-INSERT chúng ta đặt left[z] và right[z] bằng nil[T] trong dòng 14-15
để duy trì đúng cấu trúc cây Thứ 3, chúng ta tô đỏ cho z ở dòng 16, Thứ 4 vìmàu của z là đỏ nên có thể gây nên sự vi phạm một trong những tính chất củacây đỏ đen Chúng ta gọi thủ tục RB-INSERT-FIXUP(T,z) trong dòng 17 củathủ tục RB-INSERT để khôi phục các tính chất của cây đỏ đen
Để hiểu cách thủ tục RB-INSERT-FIXUP làm việc như thế nào, chúng ta
sẽ xem xét mã của nó theo 3 bước chính Trước hết, ta sẽ xác định sự vi phạmcác tính chất cây đỏ đen trong thủ tục RB-INSERT khi nút z được chèn và được
tô đỏ Thứ hai ta xem xét mục tiêu chung của vòng lặp While trong các dòng từ1-15 Cuối cùng chúng ta khảo sát mỗi trong số 3 trường hợp mà vòng lặpWhile dừng và xem cách chúng hoàn thành mục tiêu như thế nào, hình 13.4 nêucách hoạt động của RB-INSERT trên một cây đen đỏ mẫu
Thứ nhất: Tính chất đỏ đen nào có thể bị vi phạm khi gọi đến RB-INSERT-FIXUP?
Tính chất 1, 3 hiển nhiên đúng, vì hai con của nút đỏ mới chèn vào đềuđược gán là nil[T] Tính chất 5 nói rằng số lượng các nút đen là giống nhau trênmọi đường đi từ một nút đã cho và nó cũng được thỏa mãn, bởi vì nút z thay thếcho một nil[T] (đen) và nút z là đỏ với hai con nil[T] Như vậy tính chất đángxem xét nhất có thể bị vi phạm là tính chất 2 đó là nút gốc phải là đen và tínhchất 4 là một nút đỏ không thể có 1 con đỏ Cả 2 tính chất này có thể bị vi phạm
là do z được tô màu đỏ Tính chất 2 bị vi phạm nếu z là gốc, và tính chất 4 bị viphạm nếu cha của z là đỏ Hình 13.4 (a) chỉ ra 1 sự vi phạm tính chất 4 sau khinút z được thêm vào
Trang 19Vi phạm tính chất 2:
Vi phạm tính chất 4:
Thứ 2: mục tiêu chung của vòng lặp While trong các dòng từ 1-15?
Vòng lặp While ở dòng 1-15 đảm bảo cho 3 phần sau không thay đổi: Tại lúcbắt đầu của mỗi lần lặp của vòng lặp:
a) Nút z là đỏ
b) Nếu p[z] là gốc thì p[z] là đen
c) Nếu có một vi phạm tính chất cây đen đỏ, đó chỉ có thể là tính chất 2hoặc là tính chất 4 Tính chất 2 vi phạm khi z là gốc và đỏ, tính chất 4 viphạm khi z và p[z] là đỏ
Nói cách khác, mục tiêu chung của vòng lặp While là dời vi phạm đối vớitính chất 4 lên phía trên cây trong khi đó duy trì tính chất 5 dưới dạng mộtbất biến
Để giải quyết những vi phạm tính chất của cây đỏ đen, ta tập trung nhiềuhơn đến việc chỉ ra rằng thủ tục RB-INSERT FIXUP phục hồi các tính chất củacây đỏ đen Chúng ta sẽ tập trung vào nút z và những nút kề nó trong cây Vìnút z là đỏ Chúng ta chứng tỏ rằng nút p[p[z]] tồn tại khi chúng ta xem xét nó ởdòng 2,3,7,8,13,14
(a)
Trang 201 1
8
1 4
y z
2
1 5 5
4
1 1
8
1 4
4
1 1
8
1 4
5 4
1 1
4 1
7 Trường hợp 3
z
Trang 21Hình 13.4: Hoạt động của RB-INSERT-FIXUP (a) Một nút z sau khi chèn Vì z
và cha của nó p[z] cả hai đều là đỏ, một sự vi phạm đối với tính chất 4 xảy ra.
Do bác y của x là đỏ, ta có thể áp dụng trường hợp một trong mã Các nút được tô màu lại và biến trỏ z được dời lên cây, kết quả là cây được chỉ ra ở (b) Một lần nữa, z và cha của nó cả hai đều có màu đỏ, nhưng bác y của z là đen.
Do z là con phải của p[z] nên trường hợp 2 có thể được áp dụng Một phép quay trái được thực hiện và cây kết quả được nêu trong (c) Giờ đây z là con trái của cha nó, và trường hợp 3 có thể được áp dụng Một phép quay phải cho
ra cây trong (d), đúng là một cây đỏ đen.
Cuối cùng: khảo sát mỗi trong số 3 trường hợp mà vòng lặp While dừng và
xem cách chúng hoàn thành mục tiêu như thế nào?
Nhớ rằng chúng ta cần chỉ ra rằng một vòng lặp bất biến là đúng trướckhi lần lặp đầu tiên mà mỗi lần lặp duy trì vòng lặp bất biến và vòng lặp bấtbiến đó đưa ra cho chúng ta một tính chất quan trọng khi kết thúc vòng lặp
Đầu tiên chúng ta xem xét đầu và cuối vòng lặp sau đó chúng ta sẽ xemxét một cách chi tiết cách thân vòng lặp làm việc, chúng ta sẽ thấy rằng vònglặp duy trì tính bất biến trong mỗi lần lặp Bằng cách này chúng ta cũng sẽchứng tỏ rằng có hai kết quả trong mỗi vòng lặp: z di chuyển lên cây, hoặc làmột số phép quay được thực hiện và vòng lặp kết thúc
Đầu vòng lặp: Ưu tiên đối với vòng lặp đầu tiên, chúng ta bắt đầu với một cây
đen đỏ không có vi phạm, và chúng ta đã thêm vào một nút z đỏ Chúng tachứng tỏ rằng các tính bất biến được duy trì vào lúc RB-INSERT FIXUP được gọi.a) Khi RB-INSERT FIXUP được gọi, z là nút đỏ mà đã được thêm vào.b) Nếu p[z] là gốc thì p[z] là đen và không thay đổi trước khi gọi thủ tụcRB-INSERT - FIXUP
c) Chúng ta cũng thấy rằng tính chất 1,3, 5 được duy trì khi FIXUP được gọi
RB-INSERT-Nếu có vi phạm tính chất 2 khi đó nút gốc đỏ cần được thêm vào mới bởi nút z,
mà z là nút trong duy nhất trong cây Bởi vì cha và hai con của z đều là nil[T](đen), cũng không vi phạm tính chất 4 Như vậy trường hợp này chỉ vi phạmtính chất 2
Nếu có vi phạm tính chất 4 thì khi đó bởi vì con của z là nil[T] (đen) và câykhông bị vi phạm tính chất nào cả trước khi z được thêm vào, sự vi phạm này làcần thiết bởi vì cả z và p[z] là đỏ Hơn nữa không vi phạm tính chất đỏ đen nào khác
Cuối vòng lặp: Khi vòng lặp kết thúc nó thực hiện như vậy bởi vì p[z] là đen.
(Nếu z là gốc thì p[z] là nil[T] (đen)) Vì thế tính chất 4 không vi phạm ở cuốivòng lặp Chỉ tính chất 2 có thể vi phạm Dòng 16 phục hồi tính chất này để khithủ tục RB-INSERT-FIXUP kết thúc thì tất cả các tính chất đỏ đen được thõa mãn
Trang 22Duy trì vòng lặp: Thật ra có 6 trường hợp để xem xét trong vòng lặp While
nhưng 3 trong số chúng tương ứng với 3 cái còn lại phục thuộc vào việc liệucha của z là con trái hay con phải của ông của z được xác định ở dòng 2 Chúng
ta đã đưa ra mã giải chỉ cho tình huống p[z] là con trái Nút p[p[z]] tồn tại vìqua vòng lặp bất biến nếu p[z] là gốc thi khi đó p[z] là đen Một lần lặp đượcthực hiện khi p[z] là đỏ, chúng ta biết rằng p[z] không thể là gốc Vì thế p[p[z]] tồn tại.Trường hợp 1 được phân biệt với trường hợp 2, 3 bằng cách tô màu y (nút chúbác) Dòng 3 thực hiện y trỏ đến chú bác của z (right[p[p[z]]]) và việc kiểm trađược thực hiện ở dòng 4 Nếu y là đỏ thì trường hợp 1 được thực hiện Ngượclại, thực hiện trường hợp 2 và 3 Trong tất cả 3 trường hợp p[p[z]] là đen vì chacủa nó p[z] là đỏ và tính chất 4 bị vi phạm vì z và p[z] là đỏ
Trường hợp 1: Chú bác của z là đỏ Hình 13.5 chỉ ra tình huống cho trường
hợp 1 (dòng 5-8) Trường hợp 1 được thực hiện khi cả p[z] và y là đỏ Khip[p[z]] là đen thì chúng ta có thể tô màu cả p[z] và y là đen Bằng cách sửa màuthành đen của z và p[z] khi cả hai đều đang đỏ và màu của p[p[z]] từ đen thành
đỏ vì vậy thỏa mãn tính chất 5 Khi đó chúng ta lặp lại vòng lặp While vớip[p[z]] như là một nút z mới Con trỏ z di chuyển lên hai mức trong cây
Bây giờ chúng ta chứng tỏ rằng trường hợp 1 duy trì vòng lặp bất biến khi bắtđầu lần lặp kế tiếp Chúng ta sử dụng z để biểu thị nút z trong lần lặp hiện thời
và z'=p[p[z]] để biểu thị nút z tại bước kiểm tra ở dòng 1 trên lần lặp tiếp theo a) Bởi vì lần lặp này tô màu p[p[z]] đỏ, nút z' đỏ vào lúc bắt đầu lần lặp kế tiếp b) Nút p[z'] là p[p[p[z]]] trong lần lặp này và màu của nút này không thayđổi Nếu nút này là gốc thì nó là đen đối với lần lặp này và nó vẫn đen tạilúc bắt đầu của lần lặp kế tiếp
c) Chúng ta cũng đã chứng tỏ rằng trường hợp 1 thõa mãn tính chất 1,3,5 Nếu nút z' là gốc khi bắt đầu lần lặp kế tiếp thì khi đó trường hợp 1 làm thỏamãn tính chất 4 Khi z' là đỏ và là gốc thì tính chất 2 là tính chất duy nhất bị viphạm và vi phạm này liên quan đến z'
new z
Trang 23Hình 13.5 Trường hợp 1 của thủ tục RB-INSERT Tính chất 4 bị vi phạm vì z và cha của z đều là đỏ Cùng một hành động được thực hiện ở (a) z là con phải, hoặc ở (b) z là con trái Mỗi cây con , , , và đều có một gốc là đen và mỗi cây con đều có cùng chiều cao đen Mã của trường hợp 1 sẽ thay đổi các màu của vài nút, bảo toàn được tính chất 5: tất cả các lộ trình đi xuống từ một nút đến một lá đều có cùng số lượng nút đen Vòng lặp While tiếp tục với ông nội p[p[z]] của nút z làm z mới Mọi vi phạm đối với tính chất 4 giờ đây chỉ có thể xảy ra giữa z mới là đỏ và cha của nó nếu nó cùng màu đỏ.
Nếu nút z' không phải là nút gốc vào lúc bắt đầu của vòng lặp kế tiếp khi đótrường hợp 1 không tạo nên sự vi phạm tính chất 2 Trường hợp 1 khi đó là đúng và
nó chỉ vi phạm tính chất 4 và nó thoát khỏi lúc bắt đầu vòng lặp này Khi đó nó làmz' đỏ và con trái của p[z'] Nếu p[z'] là đen thì tính chất 4 không bị vi phạm Nếup[z'] là đỏ, màu z' đỏ tạo nên một sự vi phạm tính chất 4 giữa z' và p[z']
Trường hợp 2: Chú bác y của z là đen và z là con phải.
Trường hợp 3: Chú bác y của z là đen và z là con trái.
Trong trường hợp 2 và 3 màu của chú bác y của z là đen Hai trường hợpđược phân biệt bởi z hoặc là con trái hoặc là con phải của p[z] Dòng 10-11 tạonên trường hợp 2, mà nó được chỉ ra trong hình 13.6 cùng với trường hợp 3.Trong trường hợp 2 nút z là con phải của cha của nó Chúng ta dùng ngay phépquay trái để chuyển sang trường hợp 3 (dòng 12-14), lúc đó z là con trái Bởi vì
cả z và p[z] là đỏ, phép quay không ảnh hưởng đến chiều cao đen của nút cũngnhư tính chất 5
Chúng ta xem xét trường hợp 3 trực tiếp hay thông qua trường hợp 2, nútchú bác y của z là đen, thì khi đó mặt khác chúng ta cũng phải thực hiện trườnghợp 1.Thêm vào đó nút p[p[z]] tồn tại, khi đó chúng ta đã chứng tỏ rằng nút đãtồn tại lúc này ở dòng 2 và 3 được thực hiện, và sau khi di chuyển z lên mộtmức ở dòng 10 và xuống một mức ở dòng 11, sự đồng nhất của p[p[z]] vẫnkhông thay đổi Trong trường hợp 3 chúng ta thực hiện một vài phép đổi màu
và một phép quay phải mà nó vẫn bảo toàn tính chất 5 và khi ấy chúng ta không
B
A
D C
D C
Trang 24còn có hai nút đỏ trong một hàng Thân của vòng lặp While không thực hiệnthêm lần nữa vì p[z] bây giờ là đen.
Hình 13.6: Các trường hợp 2 và 3 của thủ tục RB-INSERT Như trong trường hợp 1, tính chất 4 bị vi phạm trong trường hợp 2 hoặc trường hợp 3 bởi z và cha p[z] của nó là đỏ Mỗi cây con , , , và đều có một gốc là đen và mỗi cây con đều có cùng chiều cao đen Trường hợp 2 được biến đổi thành trường hợp 3 bằng một phép quay trái để bảo toàn tính chất 5: tất cả các lộ trình đi xuống từ một nút đến một lá đều có cùng sô lượng nút đen Trường hợp 3 tạo nên vài thay đổi màu và một phép quay phải, cũng bảo toàn tính chất 5 Sau đó, vòng lặp While kết thúc, bởi tính chất 4 được thỏa: không còn hai nút đỏ trong một hàng.
Bây giờ chúng ta chỉ ra rằng thân của vòng lặp While duy trì một vòng lặpbất biến trong trường hợp 2 và 3.(Vì chúng ta đã chứng tỏ rằng p[z] sẽ là đenvào lúc kiểm tra tiếp theo ở dòng 1 và thân vòng lặp không được thực hiện lại)
a Trong trường hợp 2 con trỏ z trở thành p[z], nó là đỏ Không có sự thayđổi nào nữa đối với z và màu của nó xảy ra trong trường hợp 2 và 3
b Trường hợp 3 làm cho p[z] trở thành đen sao cho nếu nó là nút gốc vàolúc bắt đầu vòng lặp kế tiếp nó là đen
c Như trong trường hợp 1, tính chất 1,3 và 5 được bảo toàn trong trường hợp 2 và 3.Khi nút z không phải là nút gốc trong trường hợp 2 và 3, ta biết rằng không
có sự vi phạm tính chất 2 Trong trường hợp 2 và 3 không giới thiệu một sự viphạm tính chất 2 Khi đó chỉ một nút được tạo thành đỏ trở thành con của mộtnút đen bằng cách thực hiện phép quay trong trường hợp 3
Trường hợp 2 và 3 xác đinh chỉ một sự vi phạm tính chất 4 và không giớithiệu một sự vi phạm khác
Mỗi lần lặp của vòng lặp duy trì tính bất biến, ta đã chỉ ra rằng thủ tục INSERT-FIXUP phục hồi đúng các tính chất của cây đỏ đen
RB-Phân tích: RB-INSERT chạy trong thời gian gì? Khi chiều cao của một cây đỏ
đen trên n nút là O(lg n), dòng 1-16 của RB-INSERT mất O(lg n) thời gian.Trong RB-INSERT-FIXUP, vòng lặp While lặp lại nếu trường hợp 1 được thựchiện và khi đó con trỏ z di chuyển lên hai mức của cây Tổng số lượng thời giancủa vòng lặp While có thể được thực hiện do đó là O(lg n) Vì thế, RB-INSERT