1
Phần 2: Các giải thuật nâng cao
Chương 3: Cây cân bằng
Balanced trees
PGS. TS. TRẦN CAO ĐỆ
Đại Học Cần Thơ
2013
2
Cây tìm kiếm nhị phân
binary search tree
Cây tìm kiếm nhị phân
(TKNP) là cây nhị phân mà
khoá tại mỗi nút lớn hơn
khoá của tất cả các nút
thuộc cây con bên trái và
nhỏ hơn khoá của tất cả các
nút thuộc cây con bên phải.
typedef <kiểu dữ liệu của khoá> KeyType;
typedef struct Node{
KeyType Key;
Node* Left;
Node* Right;
};
typedef Node* Tree;
20
10
175
15
35
22 42
37
3
thêm một khoá vào cây TKNP
void InsertNode(KeyType x,Tree& Root ){
/* thêm nút mới chứa khoá x */
if (Root == NULL){
Root=(Node*)malloc(sizeof(Node));
Root->Key = x;
Root->Left = NULL;
Root->Right = NULL;
}
else
if (x < Root->Key) InsertNode(x,Root->Left);
else if (x>Root->Key)InsertNode(x,Root->Right);
}
19
20
10
175
15
35
22 42
37
Xóa nút 35
Xóa nút 17
Xóa nút 20
Xóa một nút trên cây TKNP
20
10
175
22
35
25 42
24
20
10 35NULL
10
175
15
5
Xóa một nút trên cây TKNP
KeyType DeleteMin (Tree& Root ){
KeyType k;
if (Root->Left == NULL){
k=Root->Key; Root = Root->Right;
return k;
}
else return DeleteMin(Root->Left);
}
void DeleteNode(KeyType x,Tree& Root){
if (Root!=NULL)
if (x < Root->Key) DeleteNode(x,Root->Left);
else if (x > Root->Key) DeleteNode(x,Root->Right);
else if ((Root->Left==NULL) && (Root->Right==NULL)) Root=NULL;
else
if (Root->Left == NULL) Root = Root->Right;
else if (Root->Right==NULL) Root = Root->Left;
else Root->Key = DeleteMin(Root->Right);
}
6
Phân tích BST
Tìm kiếm một nút trên cây TKNP
–
Mất O(1) duyệt trên mỗi nút
–
Mỗi lần duyệt đi sâu xuống một mức
–
Vậy thời gian tìm kiếm là O(h) với h là chiều cao của cây
Thời gian tìm kiếm 1 nút, thêm một nút, xóa một nút
trên cây TKNP là O(h), với h là chiều cao của cây
TKNP
Chiều cao của cây TKNP có n nút: Logn ≤ h ≤ n
7
Cây AVL
Trong trường hợp xấu nhất
thời gian thực hiện các phép
toán trên BST là O(n)
Cân bằng AVL
–
Do Adelson Velski và
Landis
–
AVL: Cây TKNP mà chiều
cao của hai cây con của
mọi nút chênh lệch nhiều
nhất là 1.
Trên cây AVL các phép tìm
kiếm, thêm, xoa một nút là
O(log n), n là số nút
Chứng minh
Gọi N
h
số nút cây AVL có chiều cao h.
N
h
≥ N
h-1
+ N
h-2
+ 1
≥ 2N
h-2
+ 1
≥ 1 + 2(1 + 2N
h-4
)
= 1 + 2 + 2
2
N
h-4
≥ 1 + 2 + 2
2
+ 2
3
N
h-6
…
≥ 1 + 2 + 2
2
+ 2
3
+ + 2
h/2
= 2
h/2+1
– 1
Vậy
2
h/2+1
– 1 < n
h/2 +1 < log
2
(n + 1)
h < 2 log
2
(n + 1)
Phân tích sâu sắc theo số Fibonacci,
giới hạn trên là 1.44 log(n + 2).
8
Thêm một nút vào cây AVL
Đầu tiên thêm một nút vào cây TKNP. Cây có thể
mất cân bằng.
Cân bằng lại
–
Xét cây AVL: tree T=(r,Tl,Tr) trong đó Tl có chiều cao hl và
Tr có chiều cao hr
–
Giả sử nút thêm vào trên Tr.
Nếu hl=hr+1: sau khi thêm vẫn cân bằng
Nếu hl=hr : sau khi thêm vẫn cân bằng
Nếu hl=hr-1 thì sau khi thêm sẽ mất cân bằngcân bằng lại.
–
Tương tự nếu thêm nút vào Tl
9
Single Rotation-RR
RR rotation
10
Single rotation
LL
LL
11
Double rotation-LR
LR
12
Double rotation-RL
RL
13
Các định lý
4 phép quay LL, RR, LR, và RL phủ toàn bộ các trường hợp
cần phải cân bằng lại
Trường hợp cây AVL trở nên mất cân bằng khi thêm một nút
chỉ cần một phép quay để làm cho cây cân bằng lại.
Trường hợp cây AVL trở nên mất cân bằng khi Xóa một nút có
thể cần tới O(log n) phép quay để làm cho cây cân bằng lại (từ
nút mất cân bằng đến gốc).
14
Ví dụ thêm 1 khóa
Thêm khóa 1
Thêm khóa 32
LL
Xóa nút 4
4
RR rotation LL rotation
16
AVL Trees Implementation in java
See 3.6.1 chapter 3, Algorithm design, Goodrich
17
d-cây
Cây đa phân: là cây mỗi nút có
từ hai con trở lên.
Cây có thứ tự: các nút có tt
Nút v là d-nút: V có d≥2 nút con
Cây tìm kiếm đa phân (multi-
way search tree) là cây có thứ
tự với các tính chất sau:
–
Mỗi nút trong là một d-nút có ít
nhất 2 nút con.
–
Mỗi nút lưu trữ một tập hợp
các phần tử dạng (k,x),
k là khóa
x là giá trị kết hợp với khóa
Mỗi d-nút (có các nút con
v
1
, ,v
d
) sẽ lưu d-1 phần tử
dạng (k
1
,x
1
), …, (k
d-1
,x
d-1
) và
mỗi phần tử (k,x) lưu trong
cây con gốc v
i
phải thỏa
mãn: k
i-1
≤ k < k
i
( k
0
= -∞ còn k
d
= +∞)
Định lý: cây tìm kiếm đa
phân chứa n phần tử
có (n+1) nút ngoài
18
Ví dụ: 3-cây
22
5 10
25
3 4 6 8 14 23 24 27
11 13 17
Xem thêm các giải thuật
B-Cây trong giáo trình GT
của Nguyễn Văn Linh
19
Cây 2-3-4 hoặc cây (2,4)
Cây (2,4) là 4-cây cân
bằng:
–
Mỗi nút có tối đa 4 nút
con
–
Các nút lá cùng một độ
sâu
Định lý:
Cây (2,4) chứa n phần tử
có chiều cao Θ(logn)
25
5 15
50
0 3 6 7 9 17 19 20
40 70
20
Thêm 1 phần tử vào cây (2,4)
thêm 4,6,12,15,3,5,10,8
4
4, 6
4, 6, 12
4, 6, 12, 15
split
4, 6
12
15
3, 4, 6
12
15
3, 4, 5, 6
12
15
3, 4
5, 12
15
6
split
3, 4
5, 12
15
6,10
3, 4
5, 12
15
6, 8, 10
SỐ lần split khi thêm
1 phần tử là O(logn)
21
Xóa một phần tử trong cây (2,4)
Xóa một phần tử có khóa k
–
Tìm kiếm nút chứa khóa k
–
Xóa phần tử.
Ta luôn có thể giả sử phần tử bị xóa nằm tại nút v là lá.
Nếu phần tử bị xóa là pt thứ i của nút z, tức là (k
i
,x
i
), là nút
trong, ta đổi (k
i
,x
i
) với một phần tử thích hợp:
–
Tìm nút cực phải trên cây con thứ i của z, gọi đó là nút v
–
Đổi chổ (k
i
,x
i
) với phần tử cuối cùng của v.
Việc xóa như trên:
–
bảo toàn độ sâu
–
Không bảo toàn điều kiện về số phần tử
chuyển phần tử từ anh em (3-nút, 4-nút) sang, hoặc
Kết hợp 2 nút
12
5, 10 15
4 6 8 11 13 14 174
12
6 10 15
5 8 11 13 14 17
1211
11
6 15
5 8 10 13 14 1713 14
11
6 15
5 8 10 14 17
11
6 15
5 8 10 14 171415
6 11
15 175 8 10
24
Hiệu quả của cây (2,4)
Thêm, xóa, tìm một phần tử với thời gian O(logn)
25
Cây đỏ-đen
red – black trees
Cây đỏ đen là cây TKNP với
các nút được tô màu
đỏ/đen:
–
Gốc: đen
–
Nút ngoài: đen
–
Con nút đỏ là nút đen
–
Tất cả các nút ngoài (NIL)
có cùng độ sâu đen (cùng
số nút đen tiền bối)
Định lý: Cây đỏ-đen chứa n
nút sẽ có độ cao O(Logn)
–
CM: Tr172