Tải bản đầy đủ (.ppt) (54 trang)

Bài giảng Phân tích và Thiết kế giải thuật nâng cao: Chương 3 PGS.TS. Trần Cao Đệ

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (365.55 KB, 54 trang )

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ằngcâ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

×