8 cây nh phân can bang

27 114 0
8 cây nh  phân  can bang

Đ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

Cấu trúc dữ liệu và giải thuật: Cây cân bằng...................................................................................................................................................................

Đánh giá tìm kiếm 1, 2, 3, 4, 5 Cây AVL Giới thiệu AVL Tree Phương pháp chèn CNPTK có biến dạng cân đối nghiêm trọng Chi phí cho việc tìm kiếm trường hợp xấu đạt tới n VD: triệu nút ⇒ chi phí tìm kiếm = 1.000.000 nút Nếu có tìm kiếm nhị phân cân hồn tồn, chi phí cho việc tìm kiếm xấp xỉ log2n VD: triệu nút ⇒ chi phí tìm kiếm = log21.000.000 ≈ 20 nút G.M Adelson-Velsky E.M Landis đề xuất tiêu chuẩn cân (sau gọi cân AVL) Cây AVL có chiều cao O(log2(n)) Cây AVL AVL Tree - Định nghĩa Cây nhị phân tìm kiếm cân (AVL) mà nút độ cao trái phải chênh lệch không 44 23 13 88 59 37 15 30 40 55 108 71 Cây AVL AVL Tree – Ví dụ AVL Tree ? Cây AVL AVL Tree? AVL Tree Chỉ số cân nút: Định nghĩa: Chỉ số cân nút hiệu chiều cao phải trái Đối với cân bằng, số cân (CSCB) nút mang ba giá trị sau đây: CSCB(p) = ⇔ Độ cao phải (p) = Độ cao trái (p) CSCB(p) = ⇔ Độ cao phải (p) > Độ cao trái (p) CSCB(p) = -1 ⇔ Độ cao phải (p) < Độ cao trái (p) Cây AVL Ví dụ - Chỉ số cân nút 10 -1 -1 40 -1 30 20 45 35 25 •What is the balance factor for each node in this AVL tree? •Is this an AVL tree? Cây AVL 60 AVL Tree – Ví dụ Cây AVL AVL Tree – Biểu diễn #define RH #define EH #define LH -1 /* Cây phải cao */ /* Hai */ /* Cây trái cao */ struct AVLNode{ char balFactor; DataType data; AVLNode* pLeft; AVLNode* pRight; }; typedef AVLNode* AVLTree; Cây AVL // Chỉ số cân AVL Tree – Biểu diễn Các thao tác đặc trưng AVL: Thêm phần tử vào AVL Hủy phần tử AVL Cân lại vừa bị cân (Rotation) Trường hợp thêm phần tử AVL thực giống thêm CNPTK, nhiên sau thêm phải cân lại Trường hợp hủy phần tử AVL thực giống hủy CNPTK phải cân lại Việc cân lại phải thực cho ảnh hưởng tối thiểu đến nhằm giảm thiểu chi phí cân Cây AVL AVL Tree - Các trường hợp cân 10 Khơng khảo sát tính cân nhị phân mà quan tâm đến khả cân xảy chèn xóa nút AVL Các trường hợp cân bằng: Sau chèn (xóa) trái lệch trái (left of left) Sau chèn (xóa) trái lệch phải (right of left) Sau chèn (xóa) phải lệch phải (right of right) Sau chèn (xóa) phải lệch trái (left of right) Cây AVL Ví dụ: Các trường hợp cân Cây AVL Ví dụ: Các trường hợp cân Cây AVL AVL Tree - Các trường hợp cân Chèn nút vào AVL ảnh đối xứng ảnh đối xứng Cây AVL Cây AVL – Tái cân Trường hợp giải phép quay: Trường hợp quay ảnh đối xứng Cây AVL Cây AVL – Tái cân Trường hợp cần phép quay kép (double) Trường hợp phép quay ảnh đối xứng Cây AVL Ví dụ: Tái cân 16 left of left Cây AVL Ví dụ: Tái cân right of left 17 Cây AVL Ví dụ: Tái cân right of right 18 Cây AVL Ví dụ: Tái cân left of right 19 Cây AVL AVL Tree 20 Các trường hợp cân bằng: Các trường hợp lệch bên phải hoàn toàn đối xứng với trường hợp lệch bên trái Vì vậy, cần khảo sát trường hợp lệch bên trái Trong trường hợp lệch bên trái, trường hợp T1 lệch phải phức tạp Các trường hợp lại giải đơn giản Cây AVL AVL Tree - Cân lại AVL 25 Lưu ý: Trước cân T có chiều cao h+2 trường hợp 1.1, 1.2 1.3 Sau cân bằng: Trường hợp 1.1 1.3 có chiều cao h+1 Trường hợp 1.2 có chiều cao h+2 Đây trường hợp sau cân nút T cũ có số cân ≠ Thao tác cân lại tất trường hợp có độ phức tạp O(1) Cây AVL 26 Cây AVL AVL Tree - Cân lại AVL 27 T/h 1.1: T1 lệch bên trái Ta thực phép quay đơn Left-Left T L T1 T1 R h- T h L1 h- h L1 h- R1 R1 h- R Cây AVL AVL Tree 28 Trường hợp 1: T lệch bên trái T L T T1 h-1 h R h-1 R1 L1 L T1 h-1 R L1 T L T1 R h h L1 Cây AVL L1 h-1 R1 h h-1 AVL Tree 29 Trường hợp 2: T lệch bên phải T h-1 T R T1 h-1 L1 R h-1 L h-1 h h R1 T1 L R1 L1 T h-1 R T1 L h h L1 Cây AVL 30 Cây AVL R1 31 Cây AVL AVL Tree - Cân lại AVL 32 Quay đơn Left-Left: void rotateLL(AVLTree &T) //quay đơn Left-Left { AVLNode* T1 = T->pLeft; T->pLeft = T1->pRight; T1->pRight = T; switch(T1->balFactor) { case LH: T->balFactor = EH; T1->balFactor = EH; break; case EH: T->balFactor = LH; T1->balFactor = RH; break; } T = T1; } Cây AVL AVL Tree - Cân lại AVL 33 Quay đơn Right-Right: void rotateRR (AVLTree &T)//quay đơn Right-Right { AVLNode* T1 = T->pRight; T->pRight = T1->pLeft; T1->pLeft = T; switch(T1->balFactor) { case RH: T->balFactor = EH; T1->balFactor= EH; break; case EH: T->balFactor = RH; T1->balFactor= LH; break; } T = T1; } Cây AVL AVL Tree - Cân lại AVL 34 Quay kép Left-Right: void rotateLR(AVLTree &T)//quay kép Left-Right { AVLNode* T1 = T->pLeft; AVLNode* T2 = T1->pRight; T->pLeft = T2->pRight; T2->pRight = T; T1->pRight = T2->pLeft; T2->pLeft = T1; switch(T2->balFactor) { case LH: T->balFactor = RH; T1->balFactor = EH; break; case EH: T->balFactor = EH; T1->balFactor = EH; break; case RH: T->balFactor = EH; T1->balFactor = LH; break; } T2->balFactor = EH; T = T2; } Cây AVL AVL Tree - Cân lại AVL 35 Quay keùp Right-Left void rotateRL(AVLTree &T) //quay kép Right-Left { AVLNode* T1 = T->pRight; AVLNode* T2 = T1->pLeft; T->pRight = T2->pLeft; T2->pLeft = T; T1->pLeft = T2->pRight; T2->pRight = T1; switch(T2->balFactor) { case RH: T->balFactor = LH; T1->balFactor = EH; break; case EH: T->balFactor = EH; T1->balFactor = EH; break; case LH: T->balFactor = EH; T1->balFactor = RH; break; } T2->balFactor = EH; T = T2; } Cây AVL AVL Tree - Cân lại AVL 36 Cân bị lêch bên trái: int balanceLeft(AVLTree &T) //Cân bị lêch bên trái { AVLNode* T1 = T->pLeft; switch(T1->balFactor) { case LH: rotateLL(T); return 2; case EH: rotateLL(T); return 1; case RH: rotateLR(T); return 2; } return 0; } Cây AVL AVL Tree - Cân lại AVL 37 Cân bị lêch bên phải int balanceRight(AVLTree &T ) //Cân bị lêch bên phải { AVLNode* T1 = T->pRight; switch(T1->balFactor) { case LH: rotateRL(T); return 2; case EH: rotateRR(T); return 1; case RH: rotateRR(T); return 2; } return 0; } Cây AVL AVL Tree - Thêm phần tử AVL 38 Việc thêm phần tử vào AVL diễn tương tự CNPTK Sau thêm xong, chiều cao thay đổi, từ vị trí thêm vào, ta phải lần ngược lên gốc để kiểm tra xem có nút bị cân khơng Nếu có, ta phải cân lại nút Việc cân lại cần thực lần nơi cân Hàm insertNode trả giá trị –1, 0, không đủ nhớ, gặp nút cũ hay thành công Nếu sau thêm, chiều cao bị tăng, giá trị trả int insertNode(AVLTree &T, DataType X) Cây AVL AVL Tree - Thêm phần tử AVL 39 int insertNode(AVLTree &T, DataType X) { int res; if (T) if (T->key == X) return 0; //đã có { if (T->key > X) { res = insertNode(T->pLeft, X); if(res < 2) return res; switch(T->balFactor) { case RH: T->balFactor = EH; return 1; case EH: T->balFactor = LH; return 2; case LH: balanceLeft(T); return 1; } } insertNode2 } Cây AVL AVL Tree - Thêm phần tử AVL 40 int insertNode(AVLTree &T, DataType X) { else // T->key < X { res = insertNode(T-> pRight, X); if(res < 2) return res; switch(T->balFactor) { case LH: T->balFactor = EH; return 1; case EH: T->balFactor = RH; return 2; case RH: balanceRight(T); return 1; } } } insertNode3 Cây AVL AVL Tree - Thêm phần tử AVL 41 int insertNode(AVLTree &T, DataType X) { T = new TNode; if(T == NULL) return -1; //thiếu nhớ T->key = X; T->balFactor = EH; T->pLeft = T->pRight = NULL; return 2; // thành công, chiều cao tăng } Cây AVL AVL Tree - Hủy phần tử AVL 42 Cũng giống thao tác thêm nút, việc hủy phần tử X khỏi AVL thực giống CNPTK Sau hủy, tính cân bị vi phạm ta thực việc cân lại Tuy nhiên việc cân lại thao tác hủy phức tạp nhiều xảy phản ứng dây chuyền Hàm delNode trả giá trị 1, hủy thành công khơng có X Nếu sau hủy, chiều cao bị giảm, giá trị trả về: int delNode(AVLTree &T, DataType X) Cây AVL AVL Tree - Hủy phần tử AVL 43 int delNode(AVLTree &T, DataType X) { int res; if(T==NULL) return 0; if(T->key > X) { res = delNode (T->pLeft, X); if(res < 2) return res; switch(T->balFactor) { case LH: T->balFactor = EH; return 2; case EH: T->balFactor = RH; return 1; case RH: return balanceRight(T); } } // if(T->key > X) } delNode2 Cây AVL AVL Tree - Hủy phần tử AVL 44 int delNode(AVLTree &T, DataType X) { if(T->key < X) { res = delNode (T->pRight, X); if(res < 2) return res; switch(T->balFactor) { case RH: T->balFactor = EH; return 2; case EH: T->balFactor = LH; return 1; case LH: return balanceLeft(T); } } // if(T->key < X) } delNode3 Cây AVL AVL Tree - Hủy phần tử AVL 45 int delNode(AVLTree &T, DataType X) { else //T->key == X { AVLNode* p = T; if(T->pLeft == NULL) { else if(T->pRight == NULL) { T = T->pRight; res = 2; } T = T->pLeft; res = 2; } else //T có đủ { res = searchStandFor(p,T->pRight); if(res < 2) return res; switch(T->balFactor) { case RH: T->balFactor = EH; return 2; case EH: T->balFactor = LH; return 1; case LH: return balanceLeft(T); } } delete p; return res; } } Cây AVL AVL Tree - Hủy phần tử AVL 46 int searchStandFor(AVLTree &p, AVLTree &q) //Tìm phần tử mạng { int res; if(q->pLeft) { res = searchStandFor(p, q->pLeft); if(res < 2) return res; switch(q->balFactor) { case LH: q->balFactor = EH; return 2; case EH: q->balFactor = RH; return 1; case RH: return balanceRight(T); } } else { p->key = q->key; p = q; q = q->pRight; return 2; } } Cây AVL Binary Tree - Biểu diễn 47 a b d g e h Cây AVL Tree – Ví dụ 48 Cây AVL c f i j k Một số khái niệm 49 Độ dài đường từ gốc đến nút x: Px = số nhánh cần qua kể từ gốc đến x Độ dài đường tổng cây: PT = ∑ PX X∈T Px độ dài đường từ gốc đến X Độ dài đường trung bình: PI = PT/n (n số nút T) Rừng cây: tập hợp nhiều thứ tự quan trọng Cây AVL Tree – Ví dụ 50 Cây AVL Depth-first Search 51 Cây AVL Breadth-first Search 52 Cây AVL AVL Tree - Nhận xét 53 Thao tác thêm nút có độ phức tạp O(1) Thao tác hủy nút có độ phức tạp O(h) Với cân trung bình lần thêm vào cần lần cân lại; lần hủy cần lần cân lại Cây AVL AVL Tree - Nhận xét 54 Việc hủy nút phải cân dây chuyền nút từ gốc cho đên phần tử bị hủy thêm vào cần lần cân cục Độ dài đường tìm kiếm trung bình cân gần cân hoàn toàn log2n, việc cân lại đơn giản nhiều Một cân không cao 45% cân hoàn toàn tương ứng dù số nút Cây AVL ...AVL Tree - Đ nh nghĩa Cây nh phân tìm kiếm cân (AVL) mà nút độ cao trái phải ch nh lệch không 44 23 13 88 59 37 15 30 40 55 1 08 71 Cây AVL AVL Tree – Ví dụ AVL Tree ? Cây AVL AVL Tree?... trái (left of right) Cây AVL Ví dụ: Các trường hợp cân Cây AVL Ví dụ: Các trường hợp cân Cây AVL AVL Tree - Các trường hợp cân Chèn nút vào AVL nh đối xứng nh đối xứng Cây AVL Cây AVL – Tái cân... nh đối xứng Cây AVL Cây AVL – Tái cân Trường hợp cần phép quay kép (double) Trường hợp phép quay nh đối xứng Cây AVL Ví dụ: Tái cân 16 left of left Cây AVL Ví dụ: Tái cân right of left 17 Cây

Ngày đăng: 19/04/2019, 11:54

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

  • Đang cập nhật ...

Tài liệu liên quan