cấu trúc dữ liệu và giải thuật đề tài cây đỏ đen red black tree

47 0 0
Tài liệu đã được kiểm tra trùng lặp
cấu trúc dữ liệu và giải thuật đề tài cây đỏ đen red black tree

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Định nghĩa và tính chấtCây đỏ đen là một cây nhị phân tìm kiếm BST tuân thủ các quy tắc sau: Mọi node phải là đỏ hoặc đen.Node gốc và các nốt lá NIL phải luôn luôn đen.Nếu một node là đỏ

Trang 1

HỌC VIỆN NGÂN HÀNG

KHOA HỆ THỐNG THÔNG TIN QUẢN LÝ

Học phần: Cấu Trúc Dữ Liệu Và Giải Thuật

ĐỀ TÀI:

CÂY ĐỎ ĐEN (RED BLACK TREE)Giảng viên hướng dẫn:Nguyễn Thị Giang Huyền

Sinh viên thực hiện: 24A4043246 - Trần Thị Sao Mai24A4043247 - Lê Mỹ Duyên

24A4043251 - Phạm Thị KhuyênLớp: J03HTA

Hà Nội, ngày 30 tháng 06 năm 2023

Trang 2

DANH SÁCH THÀNH VIÊN NHÓM 3

Trang 3

LỜI CẢM ƠN

Không có thành công nào mà không có sự hỗ trợ, dìu dắt dù ít hay nhiều, dù trực tiếp hay gián tiếp của mọi người xung quanh bởi đơn giản một bàn tay không thể vỗ thành tiếng Với lòng biết ơn sâu sắc của mình, chúng em xin được gửi lời cảm ơn tới toàn bộ quý thầy cô đã đồng hành cùng chúng em cũng như các thành viên, thầy cô đã truyền đạt vốn tri thức quý giá của mình bằng lòng nhiệt thành và tâm huyết nhất trong thời gian học tập vừa qua Đặc biệt chúng em cũng xin cảm ơn Khoa hệ thống thông tin quản lý định hướng Nhật Bản đã cho chúng em có cơ hội được tiếp cận với môn học thật sự cần thiết và hữu ích, đó là môn “Cấu trúc dữ liệu và giải thuật” Chúng em xin được cảm ơn Cô Nguyễn Thị Giang Huyền đã luôn nhiệt huyết, tận tâm hướng dẫn, giải đáp những khúc mắc cho chúng em cũng như các bạn trong lớp, nếu không có những hướng dẫn chi tiết tận tình của cô thì có lẽ chúng em cũng không thể hoàn thành bài báo cáo này.

Trong quá trình làm bài tập lớn không thể tránh được những thiếu sót, chúng em rất mong mình có thể nhận được những ý kiến đóng góp của cô cũng như của các bạn trong lớp để ngày một hoàn thiện bản thân mình hơn.

Sau cùng chúng em xin kính chúc các thầy cô trong khoa nói chung và Cô Nguyễn Thị Giang Huyền nói riêng luôn mạnh khỏe, hạnh phúc để có thể tiếp tục giảng dạy và công tác ở Học Viện, và truyền bá những kiến thức bổ ích cho chúng em cũng như là các thế hệ sau này.

Chúng em xin được cảm ơn.

Nhóm sinh viên thực hiện Nhóm 3

Trang 4

LỜI CAM ĐOAN

Chúng em xin được cam đoan rằng, bài tiểu luận trên là công sức và chất xám của Nhóm 3 bỏ ra trong thời gian vừa qua Việc một số mục có sự tham khảo về kiến thức nghiệp vụ chung là trung thực, chính xác Chúng em xin được chịu trách nhiệm về lời cam đoan này cũng như đảm bảo tính liêm chính trong học thuật.

Nhóm sinh viên thực hiệnNhóm 3

Trang 5

4 M tột số đi m thú v (tham kh o)ểm thú vị (tham khảo)ịnh nghĩa và tính chấtảo) 4

PH N 2: CÁC THAO TÁC TRÊN CÂY Đ ĐENẦN I: GIỚI THIỆUỎ ĐEN 5

1 Phép tìm ki mếm 5

2 Phép quay 5

3 Thao tác thêm node 6

a, Các bước tiến hànhc ti n hànhếm 6

b, Các trường hợp xảy ra nếu thêm nodeng h p x y ra n u thêm nodeợp xảy ra nếu thêm nodeảo)ếm 6

4 Thao tác xóa node trên cây đ đenỏ đen 13

Trang 7

DANH MỤC HÌNH ẢNH

Hình 2 Một ví dụ về cây đỏ đen 1

Hình 3 Trường hợp 3 node đen liền nhau 1

Hình 4 Chiều cao đen 1

Hình 26 Hai con của X (kể cả node NIL) đều là node đen 1

Hình 30 S màu đen và con trái của S màu đỏ, con phải S màu đen 1

Hình 32 S màu đỏ 1

Hình 33 S màu đỏ 1

1

Trang 8

PHẦN I: GIỚI THIỆU1 Đặt vấn đề

Cây tìm kiếm nhị phân là một cấu trúc lưu trữ dữ liệu tốt với tốc độ tìm kiếm nhanh Tuy nhiên trong một số trường hợp cây tìm kiếm nhị phân có một số hạn chế

Những node này tự sắp xếp thành một đường không phân nhánh

Độ phức tạp: Khi cây một nhánh, sẽ trở thành một danh sách liên kết, dữ liệu sẽ là một chiều thay vì hai chiều Trong trường hợp này, thời gian truy xuất giảm về O(N), thay vì O(log2N) đối với cây cân bằng.

Để đảm bảo thời gian truy xuất nhanh của cây, chúng ta cần phải bảo đảm cây luôn luôn cân bằng (ít ra cũng là cây gần cân bằng)

Từ đó cây nhị phân tự cân bằng ra đời và có 2 cây tự cân bằng ra đời là cây AVL và cây đỏ đen

Cây AVL đã là BST tự cân bằng được phát minh vào năm 1962 Vậy thì tại sao năm 1972 lại phải tạo ra thêm cây đỏ đen (RBTree) làm gì nữa? Đúng là sự cân bằng của cây AVL thuộc dạng hoàn hảo khi chênh lệch về chiều cao của 2 cây con trái phải luôn luôn nhỏ hơn hoặc bằng 1 Tuy nhiên, không phải khi nào hoàn hảo cũng tốt Khi ta thêm rất nhiều Node vào cây thì sẽ khiến cây phải quay (cân bằng) liên tục Cây có càng nhiều phần tử thì việc cân bằng lại cây sẽ càng mất công hơn Cây đỏ đen sẽ khắc phục yếu điểm này.

2 Định nghĩa và tính chất

Cây đỏ đen là một cây nhị phân tìm kiếm (BST) tuân thủ các quy tắc sau: Mọi node phải là đỏ hoặc đen.

Node gốc và các nốt lá (NIL) phải luôn luôn đen.

Nếu một node là đỏ thì những node con của nó phải đen

 Cha node đỏ là đen; không thể có hai node đỏ cùng một lúc, nhưng 2 node đen cùng một lúc thì có

Mọi đường dẫn từ gốc đến một lá phải có cùng số lượng node đen - Chiều cao

quá hai lần đường đi ngắn nhất Do đó cây đỏ đen là gần cân bằng.

Hình 1 Các node được chèn theo thứ tự giảm dầnHình 1 Các node được chèn theo thứ tự giảm dần

Trang 9

Khi chèn hay xóa một node mới, cần phải tuân thủ các quy tắc trên - quy tắc đỏ đen Nếu được tuân thủ, cây sẽ được cân bằng.

Hình 1 Một ví dụ về cây đỏ đen

Trường hợp có 3 node đen liên tiếp:

Hình 2 Trường hợp 3 node đen liền nhau

Ở đây mình có một cây đỏ đen (nhìn khá cân bằng), có thể thấy từ node root đến node NULL đầu tiên có 3 node đen là 12, 10, null Nhưng từ node root đến node NULL thứ ba thì chỉ có 2 node đen là 12 và null Như vậy thì đã vi phạm quy tắc số 4 (Theo quy tắc số 4: Mọi đường dẫn từ một node đến bất kì node NULL (thuộc con của nó) thì đều có cùng số lượng node đen).

3

Trang 10

Vì vậy, không thể có 3 node đen liên tiếp Vì thế số lượng node đen từ root đến tất cả các node NULL luôn luôn bằng nhau Sự khác biệt giữa các đường đi là các node đỏ, tuy nhiên vẫn không đáng kể để ảnh hưởng đến sự cân bằng của cây.

4 Một số điểm thú vị (tham khảo)

Hình 3 Chiều cao đen

Chiều cao đen: là số lượng node đen từ root → NULL Vì thế nếu cây đỏ đen có chiều cao là h thì có chiều cao đen >= h / 2.

Chiều cao cây đỏ đen có n node là h thì: h <= 2 * log2(n + 1).

Độ sâu đen của một node là số lượng node đen từ node đó → NULL (Khá tương tự chiều cao đen).

Mỗi cây đỏ đen đều là một trường hợp đặc biệt của cây tìm kiếm nhị phân BST.

Trang 11

PHẦN 2: CÁC THAO TÁC TRÊN CÂY ĐỎ ĐEN1 Phép tìm kiếm

Thực hiện tương tự như phép tìm kiếm trong cây nhị phân theo 2 cách: Đệ quyhoặc Không đệ quy.

Trang 12

Thực ra quay không có nghĩa là các node bị quay mà để chỉ sự thay đổi quan hệ giữa chúng Một node được chọn làm "đỉnh" của phép quay Nếu chúng ta đang thực hiện một phép quay qua phải, node "đỉnh" này sẽ di chuyển xuống dưới và về bên phải, vào vị trí của node con bên phải của nó Node con bên trái sẽ đi lên để chiếm lấy vị trí của nó.

Phải đảm bảo trong phép quay phải, node ở đỉnh phải có node con trái Nếu không chẳng có gì để quay vào điểm đỉnh Tương tự, nếu làm phép quay trái, node ở đỉnh phải có node con phải.

3 Thao tác thêm node a, Các bước tiến hành

Việc thực hiện chèn một node N vào cây đỏ đen sẽ được thực hiện theo các bước sau đây:

B1: Gán màu của Node cần chèn là màu đỏ.

B2: Thực hiện chèn một node vào cây đỏ đen giống như thao tác chèn trên cây nhị phân tìm kiếm (nếu cây rỗng thêm N thì N là gốc, cây khác rỗng → kiểm tra xem lớn hay nhỏ hơn gốc: nhỏ → trái, lớn → phải).

B3: Điều chỉnh lại nếu thêm mới vi phạm các qui định của cây đỏ đen.

Một số qui ước:

Hình 5 Sơ đồ phả hệ

N: Node vừa được thêm vào cây P: Node cha của N.

Hình 4 Phép quay

Trang 13

U: Node chú bác của N (node cùng cha với P) G: Node cha của nút P (node ông của P).

b, Các trường hợp xảy ra nếu thêm node

TH1: N được chèn vào vị trí node gốc của cây N → N là gốc Nếu N không là gốc thì: N có P Khi đó dẫn đến TH2.

TH2: P là node đen, nếu P không đen thì dẫn đến TH3 TH3: Cả P và U đều đỏ.

TH4: P là node đỏ, U là node đen

Hình 6 Các trường hợp thêm node

TH1: N được chèn vào vị trí node gốc của cây

Nút chèn là nút đỏ → vi phạm yêu cầu: nút gốc phải là nút đen → đổi màu nút N thành màu đen.

Hình 7 Trường hợp N được chèn là node gốc

Trang 14

TH2: P là node đen

Hình 8 P là node đen

→ Không vi phạm định nghĩa cây đỏ đen → Không vi phạm tính chất của cây đỏ đen → Không cần điều chỉnh

TH3: Cả P và U đều đỏ

Hình 9 Cả P và U đều đỏ

→ Vi phạm yêu cầu: cha của nút đỏ phải là nút đen.

→ Chuyển P và U thành node đen (cả 2 con node đỏ phải là đen)

Trang 15

(đường đi của G và U chỉ có 1 đen → tăng 2 nút đen → dư 1 đen).

→ Chuyển G thành node đỏ

(có thể dẫn đến dây chuyền vi phạm → xét tiếp)

VD: Tạo cây đỏ đen từ dãy số sau: 50, 75, 25, 80, 100, 110, 105

TH4: P là node đỏ, U là node đen

P là con trái của G, N là con trái của P (Left - Left) P là con phải của G, N là con phải của P (Right - Right) P là con trái của G, N là con phải của P (Left - Right) P là con phải của G, N là con trái của P (Right - Left).

Hình 10 Cả P và U đều đỏ

Hình 11 Minh họa thêm node

Trang 16

TH4.1 P là con trái của G, N là con trái của P (Left – Left ): P đỏ, U đen, P trái G, N trái P

Hình 12 Trường hợp Left–Left

→ Vi phạm yêu cầu: cha nút đỏ phải là nút đen.→ Quay phải node G

Trang 17

→ Đổi màu node G và P: P thành đen, G thành đỏ (đảm bảo chiều cao đen)

TH4.2 P là con phải của G, N là con phải của P(Right - Right): P đỏ, U đen, P phảiG, N phải P

Hình 14 Trường hợp Right–Right

→ Vi phạm yêu cầu: cha nút đỏ phải là nút đen → Quay trái node G

→ Đổi màu node G và P: P thành đen, G thành đỏ (đảm bảo chiều cao đen)

Hình 13 Trường hợp Left–Left

Trang 18

Hình 15 Trường hợp Right–Right

TH4.3 P là con trái của G, N là con phải của P(Left - Right): P đỏ, U đen, P trái G,N phải P

→ Vi phạm yêu cầu: cha nút đỏ phải là nút đen → Quay trái node P.

Hình 16 Trường hợp Left–Right

→ Thực hiện như L - L → Quay phải node G

Trang 19

→ Đổi màu node G và N: N thành đen, G thành đỏ (đảm bảo chiều cao đen)

TH4.4 P là con phải của G, N là con trái của P (Right - Left): P đỏ, U đen, P phảiG, N trái P

Hình 18 Trường hợp Right–Left

→ Vi phạm yêu cầu: cha nút đỏ phải là nút đen.→ Quay phải node P

Trang 20

Hình 19 Trường hợp Right–Left

→ Đổi màu node G và N: N thành đen, G thành đỏ (đảm bảo chiều cao đen)

Hình 20 Trường hợp Right–Left

Trang 21

VD: Tạo cây đỏ đen từ dãy số sau: 50, 75, 25, 80, 100, 110, 105 (tiếp tục với 100)

4 Thao tác xóa node trên cây đỏ đena, Các bước tiến hành

B1: Tìm kiếm node cần xóa, nếu không tìm thấy thì dừng B2: Nếu tìm thấy, ta tiến hành xóa.

Node cần xóa là nút lá.

Node cần xóa là nút 1 con: Nối con trỏ trỏ vào nút cần xóa tới thẳng con của nút cần xóa.

Node cần xóa là nút 2 con (tìm node thay thế, thường là nút lớn nhất của con bên trái).

B3: Điều chỉnh lại nếu vi phạm các quy định của cây đỏ đen.

b, Các TH có thể xảy ra nếu xóa node X của cây đỏ đenTH1: Node cần xóa X là node đỏ hoặc node gốc

Việc xóa node X sẽ không ảnh hưởng tới đặc điểm và tính chất của cây đỏ đen nên không cần điều chỉnh.

Hình 21 Minh họa thêm node

Trang 22

Nếu xóa node bên phải thì duyệt đến khi node con bên trai là lá thì lấy lá thế chỗ cho node xóa.

TH2: Node cần xóa X là node đen:

TH2.1 Node con của X là nút đỏ (có 1 con):

Sau khi xóa X thì nối P với con của X (Y)

Điều chỉnh màu của node con của X thành màu đen

TH2.2 Hai con của X (kể cả node NIL) đều là node đen:

Gọi S là node anh em của X: Có 4 trường hợp xảy ra:

Hình 22 Xóa node gốcHình 23 Xóa node đỏ

Hình 24 Node con của X là nút đỏ (có 1 con)

Trang 23

S màu đen và con phải của S màu đỏ

Hình 25 Hai con của X (kể cả node NIL) đều là node đen

Tất cả các đường đi qua nút X sẽ bị ít hơn 1 nút đen → Y được gọi là nút 2 đen (đen kép)

TH2 2.1 S màu đen và 2 con của S màu đen:

Để đảm bảo định nghĩa, tính chất của cây đỏ đen

17

Trang 24

Đổi nút S sang màu đỏ, Đổi nút P sang màu đen

TH2 2.2 S màu đen và con phải của S màu đỏ (con trái màu gì cũng được):

Quay trái tại P

Sau đó tiến hành đảo màu của P và S: P màu gì S màu đó, Z đổi màu đen

Hình 26 S đen và 2 con của S màu đen

Hình 27 S màu đen và con phải của S màu đỏ

Trang 25

VD: Xóa node đỏ 80

TH2 2.3 S màu đen và con trái của S màu đỏ, con phải của S màu đen:

Ta tiến hành quay phải tại S Đổi màu Z và S

Hình 28 Minh họa xóa node

Trang 26

Hình 29 S màu đen và con trái của S màu đỏ, con phải S màu đen

Sau khi đổi màu, trở lại trường hợp trước đó: S màu đen và con phải của S màu đỏ

Quay trái tại P và tiến hành đảo màu

TH2 2.4 S màu đỏ:

Tiến hành quay trái tại P

Hình 30 S màu đen và con trái của S màu đỏ, con phải S màu đen

Trang 27

Hình 31 S màu đỏ

Đổi màu P sang đỏ, S sang đen:

Hình 32 S màu đỏ

Y vẫn là nút đen kép, tùy từng cấu trúc của cây xem xem nó rơi vào trường hợp nào trong các TH rồi tiến hành tương tự.

VD: Xóa node gốc

21

Trang 28

Khi xóa 50, tiến hành đổi chỗ 25 và 50

Hình 33 Minh họa xóa node

Hình 34 Minh họa xóa node

Trang 29

PHẦN 3: THUẬT TOÁN CÀI ĐẶT

Trang 30

Node* insertHelp(Node* root, int key) { // f đúng khi có xung đột RED RED

bool f = false; if (root == NULL) {

return new Node{ key, NULL, NULL, NULL, 1 }; // RED Node }

else if (key < root->data) {

root->left = insertHelp(root->left, key);

// *** Khi này (ll, lr, rr, rl = false) nên chưa xử lí liền // *** Sau khi thoát 1 vòng đệ quy thì: root = X->parent->parent

// *** Tức là Node ông, lúc này ta quay Node ông // Case 1 : Left left - Trái trái

Trang 31

if (ll) {

root = rotateRight(root);// Quay phải tại nút gốc root->color = 0; // Chuyển nút gốc thành Black

root->right->color = 1; // Đổi màu con phải nút gốc thành Red ll = false;

}

// Case 2 : Right right - Phải phải else if (rr) {

root = rotateLeft(root); // Quay phải tại nút gốc

root->color = 0; // Đổi màu nút gốc thành Black

root->left->color = 1; // Đổi màu bên trái nút gốc thành Red

root = rotateRight(root); // Quay phải nút gốc

root->color = 0; // Đổi màu nút gốc thành Black root->right->color = 1; // Đổi màu bên phải nút gốc

Trang 34

Node* current = root;

// Tìm kiếm Node có giá trị lớn nhất while (current->right != NULL)

Trang 36

cout << root->data << " (" << getColor(root) << ") " << "\n";

Trang 37

Node* insertHelp(Node* root, int key) { // f đúng khi có xung đột RED RED

else if (key < root->data) {

root->left = insertHelp(root->left, key);

Trang 38

// Case 1 : Left left - Trái trái

Trang 39

Node* sib = sibling(root); Node* par = root->parent;

33

Trang 41

Node* par = vDelete->parent; Node* sib = sibling(vDelete);

Trang 42

if (vDelete->left == NULL || vDelete->right == NULL) {

Node* search(int val) { Node* temp = Root; while (temp != NULL) {

void Delete(int val) {

Node* vDelete = search(val);

Trang 44

Kết quả:

PHẦN 4: ỨNG DỤNG

Hình 36 Kết quả xóa node

Trang 45

Một ứng dụng của cây đỏ đen – Red Black Tree:

Hầu hết các chức năng của thư viện cây BST tự cân bằng trong C++ (hoặc TreeSet và TreeMap trong Java) đều sử dụng cấu trúc cây đỏ đen.

Lập lịch tiến trình CPU cho hệ điều hành Linux.

Áp dụng vào trong thuật toán phân cụm K-mean nhằm giảm độ phức tạp về thời gian.

Ngoài ra MySQL cũng sử dụng cây đỏ đen cho các chỉ mục trên bảng

PHẦN 5: TỔNG KẾT

39

Trang 46

Ưu điểm:

Red Black Trees có độ phức tạp về thời gian được đảm bảo là O(log n) cho các thao tác cơ bản như chèn, xóa và tìm kiếm.

Cây Đỏ Đen tự cân bằng.

Cây Đỏ Đen có thể được sử dụng trong nhiều ứng dụng do hiệu suất hiệu quả và tính linh hoạt của chúng

Cơ chế được sử dụng để duy trì sự cân bằng trong Cây Đỏ Đen tương đối đơn

Trang 47

TÀI LIỆU THAM KHẢO

Ngày đăng: 29/04/2024, 16:17

Tài liệu cùng người dùng

Tài liệu liên quan