Bài tập lớn Cấu trúc dữ liệu và giải thuật Cây AVL MỤC LỤC MỞ ĐẦU 1 NỘI DUNG 2 I.Định nghĩa 2 1. Định nghĩa 2 2. Ví dụ về cây cân bằng 2 3. Ưu nhược điểm của cây AVL 3 II. Cấu trúc dữ liệu cây AVL 3 III. Cân bằng 4 1. Các trường hợp mất cân bằng 4 2. Xử lý mất cân bằng cây 6 IV. Các thao tác cơ bản trên cây AVL 11 1. Thêm một phần tử 11 2. Xóa một phần tử 14 3.Tìm kiếm một phần tử 15 4. Các phép duyệt cây 17 V. Ứng dụng 20 VI. Độ phức tạp giải thuật 20 KẾT LUẬN 22 TÀI LIỆU THAM KHẢO 23
Trang 1HỌC VIỆN NGÂN HÀNG KHOA HỆ THỐNG THÔNG TIN QUẢN LÝ
BÀI TẬP LỚN CẤU TRÚC DỮ LIỆU & GIẢI THUẬT
ĐỀ TÀI: CÂY AVL – AVL TREE
Giảng viên: Giang Thị Thu Huyền
Hà nội, tháng 10 năm 2021
Trang 2Nhóm thực hiện: Nhóm 6
thành
2 Lê Thị Hiền Lương 23A4040080 20.25%
3 Phạm Thùy Linh 23A4040071 19.75%
Trang 3NHẬN XÉT CỦA GIẢNG VIÊN
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
Trang 4LỜI CẢM ƠN
Lời đầu tiên cho phép nhóm em xin gửi lời cảm ơn chânthành nhất đến Giảng viên Giang Thị Thu Huyền Trong quátrình học tập một môn rất quan trọng là Cấu trúc dữ liệu và giảithuật, nhóm đã được cô quan tâm và giúp đỡ tận tình Bọn em
đã tích lũy thêm được rất nhiều kiến thức để có thể có cái nhìnsâu sắc và hoàn thiện hơn về bộ môn này Thông qua bài tậplớn lần này, nhóm muốn trình bày lại những gì mà bọn em đãtìm hiểu trong thời gian qua
Vì một lý do là kiến thức thì vô hạn, nên mỗi người đều tồntại những hạn chế nhất định Chính vì thế trong quá trình hoànthành bài tập lớn lần này, bọn em sẽ không thể tránh khỏinhững sai sót Cả nhóm hy vọng sẽ nhận được những lời góp ý
từ cô để bài của bọn em được hoàn thiện hơn
Trang 5DANH MỤC TỪ VIẾT TẮT
CTDL> Cấu trúc dữ liệu và giải thuật
DANH MỤC HÌNH ẢNH
Hình 1: Ví dụ về cây cân bằng 2
Hình 2: mất cân bằng phải-phải 4
Hình 3:Mất cân bằng phải-trái 5
Hình 4: mất cân bằng trái-trái 5
Hình 5:mất cân bằng trái-phải 6
Hình 6: Xử lý mất cân bằng, bằng phép quay 7
Hình 7: Phép quay trái 7
Hình 8: Phép quay phải 8
Hình 9: Phép quay trái - phải 9
Hình 10: Phép quay phải – trái 11
Hình 11: Chiều cao của cây thay đổi nhưng cây chưa mất cân bằng 12
Hình 12: Thay đổi chiều cao và làm mất độ cân bằng 13
Hình 13: Xóa node và cân bằng lại cây 15
Hình 14:Tìm kiếm 16
Hình 15: Duyệt trước 17
Hình 16: duyệt giữa 18
Hình 17:duyệt sau 19
Trang 6MỤC LỤC
MỞ ĐẦU 1
NỘI DUNG 2
I.Định nghĩa 2
1 Định nghĩa 2
2 Ví dụ về cây cân bằng 2
3 Ưu nhược điểm của cây AVL 3
II Cấu trúc dữ liệu cây AVL 3
III Cân bằng 4
1 Các trường hợp mất cân bằng 4
2 Xử lý mất cân bằng cây 6
IV Các thao tác cơ bản trên cây AVL 11
1 Thêm một phần tử 11
2 Xóa một phần tử 14
3.Tìm kiếm một phần tử 15
4 Các phép duyệt cây 17
V Ứng dụng 20
VI Độ phức tạp giải thuật 20
KẾT LUẬN 22
TÀI LIỆU THAM KHẢO 23
Trang 7MỞ ĐẦU
Định dạng của một cấu trúc cây thay đổi phụ thuộc vàothứ tự chèn dữ liệu của nó Trong trường hợp xấu nhất, nó cóthể có dạng đường tuyến tính (giống với danh sách liên kết), khi
đó các thao tác trên cây có hiệu quả thấp nhất Trong cáctrường hợp trung bình ta có độ phức tạp thời gian của các thaotác chèn, xóa, và tìm kiếm phần tử trên cây là O(logn), và trongtrường hợp xấu nhất là O(n)
Năm 1962, P.M Adelson-Velski E.M Landis đã mở đầuphương hướng giải quyết này bảng cách đưa ra một dạng câycân đối mới mà sau này được mang tên họ, đó là cây nhị phântìm kiếm cân bằng AVL (ta gọi là cây AVL cho gọn)
Một cây áp dụng các thuật toán giúp định dạng của câyđược cân bằng Được gọi là cây cân bằng Ta sẽ đi vào tìm hiểu
kỹ hơn về cây cân bằng và các thuật toán giúp cây cân bằngngay dưới đây
Trang 8NỘI DUNGI.Định nghĩa
2 Ví dụ về cây cân bằng
Dưới đây là hình ví dụ minh họa ba cây, trong đó cây đầutiên là cân bằng, cây thứ hai và thứ ba là không cân bằng
Hình 1: Ví dụ về cây cân bằng
Trong cây thứ hai, cây con bên trái của C có độ cao là 2 vàcây con bên phải có độ cao là 0, do đó hiệu số là 2 Trong câythứ ba, cây con bên phải của A có độ cao là 2 và cây con bêntrái có độ cao là 0, do đó hiệu số cũng là 2 Trong khi cây AVLchỉ chấp nhận hiệu số (hay Nhân tố cân bằng) là 1
Trang 9Nếu hiệu số giữa độ cao của các cây con bên trái và câycon bên phải là lớn hơn 1 thì cây được cân bằng bởi sử dụngmột số kỹ thuật quay AVL được trình bày dưới đây.
Để làm cho cây tự cân bằng, một cây AVL có thể thực hiện
4 loại kỹ thuật quay sau:
+ Kỹ thuật quay trái
+ Kỹ thuật quay phải
+ Kỹ thuật quay trái-phải
+ Kỹ thuật quay phải-trái
Hai kỹ thuật quay đầu tiên là các kỹ thuật quay đơn và hai
kỹ thuật quay còn lại là các kỹ thuật quay ghép
3 Ưu nhược điểm của cây AVL
a Ưu điểm: Hiệu năng tìm kiếm luôn được đảm bảo kể cả trong
trường hợp xấu nhất (bằng O(logN))
b Nhược điểm: Khi chèn phần tử hoặc xoá phần tử khỏi cây thì
cần thêm một thao tác đó là giữ cho cây cân bằng
II Cấu trúc dữ liệu cây AVL
Chỉ số cân bằng là độ lệch giữa chiều cao cây trái và chiềucao cây phải của một nút:
Trang 10+ CSCB(p) = -1 - Độ cao cây trái (p) > Độ cao câyphải (p)
Để dễ trình bày, các giá trị trên được định nghĩa dưới dạng nhưsau:
+ #define LH -1 //cây con trái cao hơn
+ #define EH 0 //cây con trái bằng cây con phải
+ #define RH 1 //cây con phải cao hơn
typedef struct tagAVLNode
{ char balFactor; //chỉ số cân bằng
Data key;
struct tagAVLNode* pLeft;
struct tagAVLNode* pRight;
Trang 11Hình 2: mất cân bằng phải-phải
+ Tại nút 18: hL=0, hR=2
=>Lệch phải+ Tại nút 22: hL=0, hR=1
=>Lệch phải
=> Tại nút 18 cây lệch phải phải
TH2: Mất cân bằng phải trái (R-L)
Hình 3:Mất cân bằng phải-trái
+ Tại nút 18: hL=0, hR=2
=>lệch phải
Trang 12+ Tại nút 22: hL=1, hR=0
=> lệch trái
=>Tại nút 18 cây lệch phải trái
TH3: Mất cân bằng trái trái(L-L)
Hình 4: mất cân bằng trái-trái
+ Tại nút 8: hL=2, hR=0
=>Lệch trái+ Tại nút 5: hL=1, hR=0
=>lệch trái
=> tại nút 8 cây lệch trái trái
TH4: mất cân bằng trái phải(L-R)
Trang 13Hình 5:mất cân bằng trái-phải
+ Tại nút 8: hL=2, hR=0
=>Lệch trái+ Tại nút 5: hL=0, hR=1
=>lệch phải
=> tại nút 8 cây lệch trái phải
2 Xử lý mất cân bằng cây
Biến 1 cây nhị phân tìm kiếm thành cây cân bằng AVL tại
vị trí bị mất cân bằng bằng cách xử dụng phép quay cây
Xử lý cụ thể cho các trường hợp mất cân bằng như sau:
Hình 6: Xử lý mất cân bằng, bằng phép quay
Trang 14a Xoay trái
Trong trường hợp cây ở trạng thái không cân bằng khi mộtnode được chèn vào làm con phải của một cây có một node gốc
và một node con phải Lúc này ta phải thực hiện phép quay trái
để đưa cây trở lại trạng thái cân bằng
Hình 7: Phép quay trái
Ở ví dụ trên, node A trở thành node không cân bằng khi cómột node chèn vào cây con bên phải của nó Chúng ta thựchiện phép quay trái bởi đưa node A trở thành con trái của node
B, để đưa cây về trạng thái cân bằng
b Xoay phải
Trong trường hợp cây ở trạng thái không cân bằng khi mộtnode được chèn vào làm con trái của một cây có một node gốc
và một node con trái Lúc này ta phải thực hiện phép quay phải
để đưa cây trở lại trạng thái cân bằng
Trang 15Hình 8: Phép quay phải
Ở ví dụ trên, khi thực hiện phép quay phải ta đưa node A(node mất cân bằng) trở thành con phải của node B
c
Phép quay trái - phải
Phép quay kết hợp có đôi chút phức tạp hơn so với cácphép quay trái và quay phải ở trên Với phép quay trái-phải, ta
sẽ thực hiện việc quay trái trước và quay phải sau đó
Khi một node được chèn vàolàm con phải của cây con trái.Điều này làm cho node C bịmất cân bằng Trong tìnhhuống như vậy ta phải thựchiện phép quay kết hợp trái -phải, để đưa cây trở về trạngthái cân bằng
Đầu tiên, trên cây con trái củanode C, ta sẽ thực hiện phépquay trái để khiến A trở thànhcon trái của B
Trang 16Sau khi thực hiện xong mộtphép quay trái, cây vẫn chưa
ở trạng thái cân bằng Để đưacây trở về trạng thái cânbằng, ta cần tiếp tục thựchiện một phép quay phải
Phép quay phải sẽ đưa B trởthành node gôc mới Node Ctrở thành con phải của B
Hình 9: Phép quay trái - phải
Sau phép quay kết hợp, cây
Trang 17Khi một node được chèn vàolàm con trái của cây con phải.Điều này làm cho node A bịmất cân bằng Trong tìnhhuống như vậy ta phải thựchiện phép quay kết hợp phải -trái, để đưa cây trở về trạngthái cân bằng.
Đầu tiên, trên cây con phảicủa node A, ta sẽ thực hiệnphép quay phải để khiến C trởthành con phải của B
Sau khi thực hiện xong mộtphép quay phải, cây vẫn chưa
ở trạng thái cân bằng Để đưacây trở về trạng thái cânbằng, ta cần tiếp tục thựchiện một phép quay trái
Phép quay trái tiếp theo sẽđưa B trở thành node gôc mới.Node A trở thành con trái củaB
Trang 18Hình 10: Phép quay phải – trái
Sau phép quay kết hợp, cây
đã có trạng thái cân bằng
IV Các thao tác cơ bản trên cây AVL
1 Thêm một phần tử
+ Thêm bình thường như trường hợp cây NPTK
+ Nếu cây tăng trưởng chiều cao
Lần ngược về gốc để phát hiện nút bị mất cân bằng
Tiến hành cân bằng lại nút đó bằng thao tác cân bằngthích hợp
+ Việc cân bằng lại chỉ cần thực hiện 1 lần nơi mất cân bằng
*Việc thêm một phần tử vào cây AVL giống như khi thêm một phần tử vào cây NPTK và phải tuân thủ những quy tắc của cây NPTK.
+ Giá trị của tất cả các Node ở cây con bên trái phải <= giá trịcủa Node gốc
+ Giá trị của tất cả các Node ở cây con bên phải phải > giá trịcủa Node gốc
+ Tất cả các cây con (bao gồm bên trái và phải) cũng đều phải
Trang 19Mỗi nút đưa thêm 1 thông tin là hệ số cân bằng có thể nhận 3giá trị:
+ Left_higher (hoặc ‐1)
+ Equal_height (hoặc 0)
+ Right_higher (hoặc +1)
Nếu chiều cao của cây thay đổi sau khi thêm xong một phần
tử , ta phải xét từ dưới gốc lên khi đó ta sẽ có hai trường hợp
+ TH1: Chiều cao của cây thay đổi nhưng cây chưa mất cân bằng
Nếu node có giá trị 3 được thêm vào, sẽ có một node có
hệ số cân bằng bằng 1 xuất hiện, nhưng ta chưa cần phải điềuchỉnh vì hệ số cân bằng chưa vượt quá 1
Hình 11: Chiều cao của cây thay đổi nhưng cây chưa mất cân
bằng
+ TH2: Thay đổi chiều cao và làm mất độ cân bằng
Khi node có giá trị bằng 2 được thêm vào sẽ dẫn đến trongcây xuất hiện một node có hệ số cân bằng bằng 2 Lúc này tacần điều chỉnh để đưa cây về trạng thái cân bằng
Trang 20Hình 12: Thay đổi chiều cao và làm mất độ cân bằng
Chú ý: ta chỉ thực hiện phép xoay tại nút mất cân bằng
CODE: void insert_node(tree_avl &root, int x)
{ int bal;
if(root==NULL)
root=getnode(x);
else{ if(x< root->data) insert_node(root->left,x);
else insert_node(root->right,x);
Trang 21left_rotate(root);
else if( bal>1 && x > root->left->data) { left_rotate(root->left);
right_rotate(root); } else if(bal<-1 && x < root->right->data ) { right_rotate(root->right);
left_rotate(root); } }
}
2 Xóa một phần tử
+ Hủy bình thường như trường hợp cây NPTK
+ Nếu cây giảm chiều cao:
Lần ngược về gốc để phát hiện nút bị mất cân bằng
Tiến hành cân bằng lại nút đó bằng thao tác cân bằngthích hợp
Tiếp tục lần ngược lên nút cha…
+Việc cân bằng lại có thể lan truyền lên tận gốc
Một nút bị xóa sẽ giống như nút lá Sau khi xóa một nút,
hệ số cân bằng của các nút sẽ thay đổi Để cân bằng lại hệ sốcân bằng, người ta thực hiện các phép xoay thích hợp
Có ba trường hợp để xóa một nút
Trường hợp 1: Nếu nút cần xóa là nút lá (tức là không có bất kỳcon nào), thì loại bỏ nút cần xóa
Trang 22Trường hợp 2: Nếu nút cần xóa có một nút con, thì ta sẽ thaythế nội dung của nút cần xóa bằng nội dung của con đó Loại
bỏ nút con
Trường hợp 3: Nếu nút cần xóa có hai nút con, ta sẽ tìm nút kếnhiệm w theo thứ tự inorder của nút cần xóa (tức là Nút có giátrị nhỏ nhất trong cây con bên phải)
Hình 13: Xóa node và cân bằng lại cây
3.Tìm kiếm một phần tử
Việc tìm kiếm cũng tương tự như như việc thêm phần tử, ta cóquy trình như sau:
Trang 23 Nếu node hiện tại có giá trị bằng giá trị cần tìm, ta trả vềtrue và kết thúc.
Nếu node hiện tại có giá trị lớn hơn giá trị cần tìm, ta gọi
đệ quy tìm ở cây con bên trái
Nếu node hiện tại có giá trị nhỏ hơn giá trị cần tìm, ta gọi
đệ quy tìm ở cây con bên phải
Nếu tìm hết cây mà (Node đó = NULL) không xảy ra thì trả
về false và kết thúc
VD minh họa:
Trang 24Hình 14:Tìm kiếm
Trang 25CODE int search(tree_avl root, int x)
{ node *p;
p=root;
if(p!=NULL) { while(p!=NULL) { if(x <p->data) p=p->left;
else if(x> p->data) p=p->right;
else return 1; } }return 0;
Trang 26Hình 15: Duyệt trước
Ở hình VD minh họa trên, A là nút gốc Đầu tiên ta sẽ truycập chính nút gốc A, sau đó di chuyển tới nút con bên trái B của
nó B cũng được duyệt theo thứ tự tương tự, và tiến trình tiếptục cho tới khi tất cả các nút đều đã được truy cập Cách thứcduyệt cho ra kết quả là: A → B → D → E → C → F → G
b
Phép duyệt giữa:
Trong cách duyệt này, cây con bên trái được truy cập đầu
Trang 27phân được duyệt theo thứ tự giữa, kết quả tạo ra sẽ là các giátrị khóa được duyệt theo thứ tự tăng dần.
Hình 16: duyệt giữa
Trong hình VD minh họa trên, ta bắt đầu từ nút gốc A, dichuyển đến cây con bên trái B của nút gốc Tại đây, B cũngđược duyệt theo cách tương tự, tiến trình tiếp tục cho tới khi tất
cả các nút đều đã được truy cập Kết quả của cách thức duyệt
giữa cho cây trên sẽ là: D → B → E → A → F → C → G
c
Phép duyệt sau:
Trang 28Trong cách thức duyệt này, nút gốc của cây sẽ được truycập cuối cùng Đầu tiên ta sẽ duyệt cây con bên trái, sau đóduyệt cây con bên phải và cuối cùng là duyệt nút gốc.
Hình 17:duyệt sau
Trong hình VD minh họa trên, từ nút gốc A ta bắt đầu truycập cây con bên trái B B cũng được duyệt theo cách tương tự.Tiến trình sẽ tiếp tục cho tới khi tất cả các nút đề đã được truy
cập Kết quả của phép duyệt sau cho cây con trên sẽ là: D → E
Trang 29- Do là 1 cấu trúc dữ liệu nên AVL cũng nhằm mục đích tổchức thông tin
- Cây AVL là một cấu trúc dữ liệu thuộc họ "Cây tìm kiếmnhị phân tự cân bằng" Đặc điểm nổi trội nhất của nó so với cáccấu trúc dữ liệu thông thường như mảng tuyến tính và cây nhịphân tìm kiếm thông thường là độ phức tạp của 3 phép toán cơbản thao tác trên cây là: Chèn, xóa và tìm kiếm đều là O(log n)
Vậy nên một trong những ứng dụng phổ biến của cây AVL
là dùng để lưu trữ thông tin cần truy xuất nhanh: Từ điển (haydùng nhất), cấu trúc dữ liệu dạng văn bản (cây văn bản) nhưOpen Office (trong cơ sở dữ liệu của Open Office) …
- Để lập chỉ số cho các bản ghi lớn trong cơ sở dữ liệu
-Vì cây AVL là dạng cấu trúc dữ liệu thuộc họ “Cây tìmkiếm nhị phân” nên có thể tìm kiếm trong cơ sở dữ liệu lớn
VI Độ phức tạp giải thuật
Tốt nhất Xấu nhất
Trang 30KẾT LUẬN
Trong phần trình bày trên đã nói rõ các khái niệm cơ bản
về cây cân bằng, hệ số cân bằng và các phép quay trái, phải …
để đưa cây AVL trở lại trạng thái cân bằng khi nó bị phá vỡ bởimột yếu tố nào đó như việc chèn dữ liệu vào cây, xóa node khỏicây AVL Để đưa cây về trạng thái cân bằng sau khi xóa nodephức tạp hơn so với trường hợp chèn node và nó đã được làm rõ
ở trong phần trình bày trên Ngoài ra còn có các thuật toán tìmkiếm phần tử trong cây và các phép duyệt cây Cây AVL cónhiều ưu điểm nổi trội hơn cây nhị phân tìm kiếm do các câytìm kiếm nhị phân được xây dựng theo phương pháp chènthông thường có thể có những biến dạng mất cân đối nghiêmtrọng, chẳng hạn có thể hoàn toàn lệch phải (tất cả các núttrong chỉ có con phải) hoặc lệch trái (tất cả các nút trong chỉ cócon trái) Trong các trường hợp này chi phí cho việc tìm kiếmtrong trường hợp xấu nhất đạt tới n (n là số nút trên cây) Nếu
có một cây tìm kiếm nhị phân cân bằng hoàn toàn, chi phí đóchỉ xấp xỉ log2n Tuy nhiên nhiều khi không thể xây dựng mộtcây tìm kiếm nhị phân như vậy cho mọi dãy khóa G.M.Adelson-Velsky và E.M Landis đã đề xuất một tiêu chuẩn cânbằng (sau này gọi là cân bằng AVL), giảm nhẹ hơn so với cânbằng hoàn toàn Đây là cấu trúc dữ liệu đầu tiên có khả năng tựcân bằng Cây AVL thường được so sánh với cây đỏ-đen vì cảhai đều hỗ trợ cùng một tập hợp các thao tác và mất O(log n)thời gian cho các thao tác cơ bản Đối với các ứng dụng tra cứu