Các cấu trúc dữ liệu nâng cao (Advanced Data Structures) 3.1 Cây nhị phân tìm kiếm cân bằng 3.3 Bảng băm – Hash Table Winter 2014 123 (C) Nguyen Tri Tuan - DH.HCM Cây nhị phân tìm kiếm cân bằng (1) Cây BST có thể bị lệch Vì sao cây BST trở nên bị lệch ? Chi phí tìm kiếm trên cây bị lệch ? Một cây BST không cân bằng Winter 2014 124 (C) Nguyen Tri Tuan - DH.HCM Cây nhị phân tìm kiếm cân bằng (2) Cây cân bằng chiều cao và chi phí tìm kiếm tối ưu O(log2N) Winter 2014 125 (C) Nguyen Tri Tuan - DH.HCM Cây nhị phân tìm kiếm cân bằng (3) Cần có phương pháp để duy trì tính cân bằng cho cây BST Winter 2014 126 (C) Nguyen Tri Tuan - DH.HCM Cây nhị phân tìm kiếm cân bằng (4) Các loại cây BST cân bằng Cây AVL Cây Đỏ - Đen (Red – Black tree) Cây AA Winter 2014 127 (C) Nguyen Tri Tuan - DH.HCM Cây AVL (1) Định nghĩa Cài đặt cấu trúc dữ liệu Mất cân bằng khi thêm/xóa node Các thuật toán điều chỉnh cây Đánh giá/so sánh E. Adelson-Velskii Winter 2014 128 (C) Nguyen Tri Tuan - DH.HCM Cây AVL (2) Cấu trúc cây AVL do 2 tác giả người Liên xô: G. Adelson-Velskii và E. Landis công bố năm 1962 Đây là mô hình cây tự cân bằng đầu tiên được đề xuất (self-adjusting, height- balanced binary search tree) Winter 2014 129 (C) Nguyen Tri Tuan - DH.HCM Định nghĩa cây AVL (1) Cây AVL: Là một cây nhị phân tìm kiếm (BST) Mỗi nút p của cây đều thỏa: chiều cao của cây con bên trái (p->left) và chiều cao của cây con bên phải (p->right) chênh lệch nhau không quá 1 ∀p∈TAVL: abs(hp->left - hp->right)≤ 1 Winter 2014 130 (C) Nguyen Tri Tuan - DH.HCM Định nghĩa cây AVL (2) Chiều cao 2 cây con left, right chênh lệch không quá 1 Winter 2014 131 (C) Nguyen Tri Tuan - DH.HCM Định nghĩa cây AVL (3) Cây AVL ? Winter 2014 132 (C) Nguyen Tri Tuan - DH.HCM Cài đặt cấu trúc dữ liệu (1) Cấu trúc node, tree tương tự như BST Thêm vào mỗi node một field balance, diễn tả trạng thái cân bằng của node đó: balance = -1: node lệch trái (cây con trái cao hơn cây con phải) balance = 0: node cân bằng (cây con trái cao bằng cây con phải) balance = +1: node lệch phải (cây con phải cao hơn cây con trái) Winter 2014 133 (C) Nguyen Tri Tuan - DH.HCM Cài đặt cấu trúc dữ liệu (2) +1 20 +1 -1 10 30 0 0 0 15 26 40 0 0 25 27 Hệ số cân bằng của các node trong cây AVL Winter 2014 134 (C) Nguyen Tri Tuan - DH.HCM Cài đặt cấu trúc dữ liệu (3) template <class T> class AVLNode { public: T key; // key of node char balance; // balance status of node BSTNode *left; // pointer to left child BSTNode *right; // pointer to right child BSTNode() { } BSTNode(T aKey) { key = aKey; balance = 0; left = right = NULL; } }; // end class Winter 2014 135 (C) Nguyen Tri Tuan - DH.HCM Mất cân bằng khi thêm/xóa node (1) [Insert – Thêm 1 phần tử vào cây]: có thể làm cây mất cân bằng.
Duyệt từ node vừa thêm ngược về node gốc Nếu tìm thấy node P bị mất cân bằng thì tiến hành xoay cây tại nút P (chỉ cần điều chỉnh 1 lần duy nhất) Winter 2014 136 (C) Nguyen Tri Tuan - DH.HCM Mất cân bằng khi thêm/xóa node (2) 44 P 17 78 Thêm phần tử 54 32 50 88 làm cây mất cân bằng tại node P 48 62 54 Winter 2014 137 (C) Nguyen Tri Tuan - DH.HCM Mất cân bằng khi thêm/xóa node (3) [Delete – Xóa 1 phần tử]: có thể làm cây mất cân bằng. Duyệt từ node vừa xóa ngược về node gốc Nếu tìm thấy node P bị mất cân bằng thì tiến hành xoay cây tại node P Lưu ý: Thao tác điều chỉnh có thể làm cho những node phía trên của node P bị mất cân bằng cần điều chỉnh cho đến khi không còn node nào bị mất cân bằng nữa (lùi dần về node gốc) Winter 2014 138 (C) Nguyen Tri Tuan - DH.HCM Mất cân bằng khi thêm/xóa node (4) P 44 17 78 Xóa phần tử 32 làm 32 50 88 cây mất cân bằng tại node P 48 62 Winter 2014 139 (C) Nguyen Tri Tuan - DH.HCM Các thuật toán điều chỉnh cây (1) P -1 P -1 -1 +1 P1 P1 h h h C h+1 h h+1 C B A A B (a1) (b1) Hai trường hợp cây bị mất cân bằng ở nhánh trái Winter 2014 140/203 (C) Nguyen Tri Tuan - DH.HCM Các thuật toán điều chỉnh cây (2) P +1 P +1 +1 -1 P1 P1 h h A h A h+1 h h+1 B C C B (a2) (b2) Hai trường hợp cây bị mất cân bằng ở nhánh phải Winter 2014 141 (C) Nguyen Tri Tuan - DH.HCM Các thuật toán điều chỉnh cây (3) P -1 P1 0 -1 P1 P 0 SLR h h C h+1 h+1 h h B A A B C Trường hợp (a1): áp dụng phép xoay đơn Trái - Phải (SLR – Single Left-to-Right) Winter 2014 142 (C) Nguyen Tri Tuan - DH.HCM Các thuật toán điều chỉnh cây (4) 44 44 -1 0 P P1 78 17 50 17 P1 0 P 32 50 -1 88 32 48 78 48 62 46 62 88 SLR 46 Ví dụ: điều chỉnh cây bằng thao tác xoay đơn SLR Winter 2014 143 (C) Nguyen Tri Tuan - DH.HCM Các thuật toán điều chỉnh cây (5) P -1 P2 0 +1 P1 P1 P DLR P2 h h C h B1 B2 h A A C B1 B2 Trường hợp (b1): áp dụng phép xoay kép Trái - Phải (DLR – Double Left–to-Right) Winter 2014 144 (C) Nguyen Tri Tuan - DH.HCM Các thuật toán điều chỉnh cây (6) 44 44 P P2 -1 17 78 0 17 62 P1 P1 P +1 0 32 50 88 32 50 78 +1 P2 48 62 48 88 54 -1 DLR 54 Ví dụ: thao tác xoay kép DLR Winter 2014 145 (C) Nguyen Tri Tuan - DH.HCM Các thuật toán điều chỉnh cây (7) Đối với trường hợp (a2) và (b2) Xử lý tương tự như (a1) và (b1), đối xứng qua trục đứng Trường hợp (a2) Áp dụng phép xoay SRL – Single Right-to-Left Trường hợp (b2) Áp dụng phép xoay DRL – Double Right-to-Left Winter 2014 146 (C) Nguyen Tri Tuan - DH.HCM Ví dụ tạo cây AVL (1) Tạo cây AVL với các khóa lần lượt là: 30, 20, 10,… 30 20 20 SLR 10 30 10 Winter 2014 147 (C) Nguyen Tri Tuan - DH.HCM Ví dụ tạo cây AVL (2) 20 20 10 30 10 30 15 25 40 15 26 40 27 DRL 25 27 26 …thêm 15, 40, 25, 27, 26 Winter 2014 148 (C) Nguyen Tri Tuan - DH.HCM Ví dụ tạo cây AVL (3) 20 20 DLR 10 30 30 10 5 15 26 40 26 40 5 14 13 25 27 15 25 27 13 14 … thêm 5, 13, 14 Winter 2014 149 (C) Nguyen Tri Tuan - DH.HCM Đánh giá/so sánh Độ cao của cây: hAVL < 1.44*log2(N+1) Cây AVL có độ cao nhiều hơn không quá 44% so với độ cao của 1 cây nhị phân tối ưu. Chi phí tìm kiếm O(log2N) Chi phí thêm phần tử O(log2N) Tìm kiếm: O(log2N) Điều chỉnh cây: O(log2N) Chi phí xóa phần tử O(log2N) Tìm kiếm: O(log2N) Điều chỉnh cây: O(log2N) Winter 2014 150 (C) Nguyen Tri Tuan - DH.HCM Các cấu trúc dữ liệu nâng cao (Advanced Data Structures) 3.1 Cây nhị phân tìm kiếm cân bằng 3.3 Bảng băm – Hash Table Winter 2014 168 (C) Nguyen Tri Tuan - DH.HCM Bảng băm – Hash Table Giới thiệu Direct-address table Bảng băm Khai báo cấu trúc Hash Table Xung đột địa chỉ Hàm băm Các phương pháp xử lý xung đột Winter 2014 169 (C) Nguyen Tri Tuan - DH.HCM Giới thiệu (1) Bài toán: Cho một tập các khóa (key). Nhu cầu chủ yếu là tìm kiếm (thêm, xóa ít khi xảy ra) Cách tổ chức lưu trữ và tìm kiếm với chi phí thấp ? Winter 2014 170 (C) Nguyen Tri Tuan - DH.HCM Giới thiệu (3) Các cấu trúc dữ liệu đã biết: Mảng, Danh sách liên kết, BST,… tìm kiếm bằng cách so sánh lần lượt các phần tử thời gian tìm kiếm không nhanh và phụ thuộc N (số phần tử) Cây bậc 3 chi phí tìm kiếm O(log3N) Winter 2014 172 (C) Nguyen Tri Tuan - DH.HCM Direct-address table (1) Giả sử có một tập khoá U: Kích thước không quá lớn Các giá trị khoá phân biệt VD.
U = {0, 1, 2, …, 9} Mô hình minh họa dùng direct-address table T[m] để lưu trữ các khoá trong tập U Winter 2014 173 (C) Nguyen Tri Tuan - DH.HCM Direct-address table (2) Direct-address table: Một mảng T[m] (T[0],…,T[m-1]) để chứa các khoá trong tập U |T| = |U| Mỗi vị trí T[k] (slot) sẽ chứa: • Khóa k, hay • NULL nếu khoá k không có trong tập hợp Lưu ý: U (Universe of keys): tập các giá trị khóa K (Actual keys): tập các khoá thực sự được dùng Chi phí thao tác: O(1) Winter 2014 174 (C) Nguyen Tri Tuan - DH.HCM Direct-address table (3) Các giới hạn của direct-address table: Kích thước tập U quá lớn không thể tạo bảng T với số slot tương ứng với |U| Kích thước của tập K quá nhỏ so với U rất nhiều slot bị bỏ trống Winter 2014 175 (C) Nguyen Tri Tuan - DH.HCM Bảng băm (1) Khi tập khóa K nhỏ hơn nhiều (VD) so với tập U ta chỉ dùng mảng T[m] với kích thước vừa đủ cho tập K m = Θ(|K|) Do đó, không thể áp dụng ánh xạ trực tiếp T[k] k được nữa Thay vì ánh xạ trực tiếp T[k] k, ta dùng hàm băm h để ánh xạ T[h(k)] k Winter 2014 176 (C) Nguyen Tri Tuan - DH.HCM Bảng băm (2) Hàm băm h: dùng để ánh xạ các khoá của tập U vào những slot của bảng băm T[0.m-1] h(k): giá trị băm (hash value) của khoá k Winter 2014 177 (C) Nguyen Tri Tuan - DH.HCM Bảng băm (3) Định nghĩa bảng băm: Bảng băm là một cấu trúc dữ liệu, lưu trữ các khóa trong bảng T (danh sách đặc); sử dụng một hàm băm (hash function) để ánh xạ khoá (key) với một địa chỉ lưu trữ Hàm băm có tác dụng biến đổi khoá thành chỉ số địa chỉ (index) – tương ứng với khoá Bảng băm là cấu trúc rất phù hợp để cài đặt cho bài toán “từ điển (dictionary)” Dictionary: dạng bài toán chỉ chủ yếu sử dụng thao tác chèn thêm (Insert) và tìm kiếm (Search) Winter 2014 178 (C) Nguyen Tri Tuan - DH.HCM Bảng băm (4) Hàm băm – biến đổi khoá thành địa chỉ index Winter 2014 179 (C) Nguyen Tri Tuan - DH.