Đặt vấn đề:- Các thao tác trên cây nhị phân tìm kiếm có độ phức tạp là Oh.. Các tính chất của cây đỏ đen 1.Mọi nút là đỏ hoặc đen.. Với một nút, mọi đường đi từ nút đó đến nút lá hậu du
Trang 1Nhóm 3-KHMT-K2009
Nội dung:
CÂY ĐỎ ĐEN (Red-Black Trees)
CÁC THÀNH VIÊN NHÓM 3:
• Đinh Như Du (Trưởng nhóm)
• Trương Thị Mỹ Lê
• Nguyễn Thị Liên
• Lê Văn Trường
TIỂU LUẬN MÔN HỌC THIẾT KẾ & PHÂN TÍCH THUẬT TOÁN
Giảng viên hướng dẫn: TS Hoàng Quang
Trang 2NỘI DUNG BÁO CÁO:
Trang 3Đặt vấn đề:
- Các thao tác trên cây nhị phân tìm kiếm có độ phức tạp là O(h) Trong trong hợp xấu nhất, khi cây không cân bằng (lệch trái hoặc lệch phải) thì độ phức tạp là O(n)
Ví dụ: Các nút được chèn theo thứ tự tăng dần.
⇒ Một số biện pháp giữ cây cân bằng như: AVL Trees,
B – Trees, Red - Black Trees
Trang 413.1 Các tính chất của cây đỏ đen
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 Với một nút, mọi đường đi từ nút đó đến nút lá hậu duệ bất kỳ có cùng số lượng nút đen.
a Định nghĩa: Một cây nhị phân tìm kiếm (BST) là cây
đỏ đen nếu nó thỏa mãn các tính chất đỏ đen:
Trang 510/29/2009 Nhóm 3-KHMT-K2009
2 14 21 2 2 30 1 47
1 1
2 10 16 19 1 23 28 1 1 38 NIL NIL
1
1
1 7 1 12 1 15 NIL NIL 20 NIL NIL NIL NIL 35 39 1
1
NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL
3
NIL NIL
Các nút lá NIL có chiều cao đen=0
b Chiều cao đen (black height – bh(x))
là số nút đen trên đường đi từ nút x đến nút lá (không bao gồm x)
Trang 6Sử dụng cờ hiệu nil[T] để biểu thị cho nút lá NIL
và nút cha của gốc.
3
26
2 14 21 2 2 30 1 47
1 1
2 10 16 19 1 23 28 1 1 38
1
1
1 7 1 12 1 15 20 35 39 1
1
3
cờ hiệu nil(T)
Trang 7• Tính chất: h/2 ≤ bh(T), T: nút gốc
•Cây con có gốc tại một nút x bất kỳ sẽ
Bổ đề: Một cây đỏ đen với n nút trong có
chiều h ≤ 2lg(n+1)
Trang 8Nhận xét
- Hầu hết các thao tác như tìm kiếm, tìm nút có giá trị nhỏ nhất, nút có giá trị lớn nhất, tìm nút
kế sau, và nút kế trước, phép chèn, xóa 1 nút thực hiện trên cây đỏ đen với thời gian thực hiện là O(h) (h: là chiều cao của cây)
- h ≤ 2lg(n+1)
Vậy độ phức tạp các thuật toán nêu trên trên một cây đỏ đen với n nút là O(lg(n))
Trang 9c Khai báo:
TRBNode = record
key: byte;
left, right, parent: TRBNodeP;
end;
Parent: 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.
Trang 10d Một số thao tác cơ bản trên cây đỏ đen:
i) Thao tác tìm kiếm nút có giá trị khóa k:
Function SEARCH (T: TRBNodeP, k:bye): 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;
Giải thuật:
Ví dụ, tìm khóa k=13 trong cây, có đường tìm kiếm:
15 6 7 13 → 6 → 7 → 13 → 6 → 7 → 13 → 6 → 7 → 13 k=25Search=nil[T]
Trang 11ii) 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;
begin while (T^.left <> nil[T]) do
T := T^.left;
Min:=T;
end;
Nút nhỏ nhất có giá trị =2
Nút nhỏ nhất có giá trị =20
Function Max(T: TRBNodeP): TRBNodeP;
begin while (T^.right <> nil[T]) do
T := T^.right;
Max:=T;
end;
Trang 12iii) Nút kế trước (Predecessor) của x:
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
Giải thuật:
Nút kế trước của 13 là 9 Nút kế trước của 2 là nil[T]
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;
Trang 13iv) Nút kế sau (SUCCESSOR) của x:
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
Giải thuật:
Nút kế sau của 13 là 15 Nút kế sau của 20 là nil
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;
Trang 14Khi thực hiện các phép toán trên cây đỏ đen như Chèn/xóa 1 nút sẽ làm cho cây đỏ đen bị vi phạm một số tính chất
Để phục hồi các tính chất này, chúng ta có thể thực hiện các thao tác:
- Thay đổi màu.
- Cơ cấu lại các liên kết của cây thông qua phép quay.
Phải giữ được các tính chất của cây đỏ đen!
13.2 Phép quay
Trang 1510/29/2009 Nhóm 3-KHMT-K2009
Các phép quay (ROTATIONS):
Right_Rotato(T, Y) O(1) time
Left_Rotato(T, X)
Tính chất quan trọng: phép quay cho phép duy trì các tính chất của cây nhị phân tìm kiếm
Trang 1610/29/2009 Nhóm 3-KHMT-K2009
O(1) time
Left_Rotato(T, X )
Phép quay trái trên một nút x, y<>nil thực hiện việc:
x thành con trái của y.
con trái của y thành con phải của x
y trở thành nút gốc của cây con mới.
Trang 17Thiết kế giải thuật phép quay trái
Procedure Left_Rotato(T, x); (y<>nil)
Begin
con trái của y thành con phải của x
y trở thành nút gốc của cây con mới
x thành con trái của y
End;
Procedure Left_Rotato (var T, x: TRBNodeP);
var y: TRBNodeP;
begin
y := x^.right;
{con trái của y thành con phải của x } x^.right := y^.left;
if (y^.left <> nil) then
y^.left^.parent := x;
y^.parent := x^.parent;
if (x = root) then root := y;
else
if (x = x^.parent^.left) then x^.parent^.left := y;
else x^.parent^.right := y;
y^.left := x;
x^.parent := y;
end;
11
9
18
19
14
x y
Giải thuật:
Left_Rotato (T, X)
Thủ tục Left_Rotato(x)
11
9 18
19 14
x
y
Trang 1813.2.2 Phép quay phải (Right_rotate)
Procedure Right_Rotate(T, x); {y<>nil}
Begin
x thành con phải của y.
y trở thành nút gốc của cây con mới.
.
con phải của y thành con trái của x
End;
Procedure Right_Rotate(var T,x: TRBNodeP);
var y: TRBNodeP;
begin
y := x^.left;
x^.left := y^.right;
if (y^.right <> nil) then y^.right^.parent := x;
y^.parent := x^.parent;
if (x = root) then root := y;
else
if (x = x^.parent^.right) then
x^.parent^.right := y;
else x^.parent^.left := y;
y^.right := x;
x^.parent := y;
end;
Right_Rotate(T, X) 11
9 18
19 14
y
x 11
9
18
19
14
y
x
Giải thuật: Thủ tục Right_Rotato(T,
x)
Phép chèn
Trang 19Tính chất: h<= 2 * bh(T), T: nút gốc
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;
• Cây con có gốc tại một nút x bất kỳ sẽ chứa ít nhất
2bh(x) -1 nút trong.
* Thời gian tìm kiếm : O(log n)
Bổ đề: Một cây đỏ đen với n nút trong có chiều cao h ≤ 2lg(n+1)
Trang 20Chứng minh: h ≤ 2lg(n+1).
bh(T) ≥ h/2 mà n= 2 bh(T) -1 vậy n≥ 2h/2-1
⇒ h ≤ 2lg(n+1)
Trước tiên ta chứng tỏ cây con có gốc tại một nút x bất kỳ sẽ chứa ít nhất 2bh(x)-1 nút trong.
Ta có:
Ta cần chứng minh chiều cao của cây là 2bh(x)-1
Do đó, 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 (đpcm)