FinalOn tap CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

32 1 0
FinalOn tap CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Đ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

7/15/2020 CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Data Structures & Algorithms ƠN TẬP Nội dung cần ơn tập Tìm kiếm Tuyến Tính, Tuyến tính cải tiến, Nhị Phân, Nội Suy Tìm kiếm Sắp xếp Viết code cho biết độ phức tạp Cây nhị phân / nhị phân tìm kiếm Chạy tay Bảng băm Tìm kiếm tuyến tính Tìm kiếm tuyến tính X=6 Tìm thấy vị trí i 6 7/15/2020 Tìm kiếm tuyến tính Tìm kiếm tuyến tính X=10 i=7, khơng tìm thấy i 6 Tìm kiếm tuyến tính Đánh giá: - Trường hợp tốt (best case): a0 chứa khóa x  số lần lặp  độ phức tạp số O(1) - Trường hợp xấu (worst case): A khơng có phần tử có khóa x  số lần lặp n  độ phức tạp tuyến tính O(n) - Trường hợp trung bình (average case): độ phức tạp tuyến tính O(n) Tìm kiếm tuyến tính CẢI TIẾN Phân tích: Theo thuật tốn tìm tuyến tính: - Cần phải kiểm tra điều kiện dừng xét hết danh sách (i < n) - Cần phải kiểm tra điều kiện dừng tìm thấy phần tử vòng lặp Cài đặt: (trên mảng) int linearSearch(int A[], int n, int x) { int i = 0; while (i < n) { if (A[i] == x) return i; i++; } return -1; } Tìm kiếm tuyến tính CẢI TIẾN Điều kiện dừng ? int linearSearch(int A[], int n, int x) { int i = 0; while (i < n) { if (A[i] == x) return i; i++; } return -1; } 10 Tìm kiếm tuyến tính CẢI TIẾN Ý tưởng: - Thêm phần tử an có khóa x vào A, A có n+1 phần tử Phần tử thêm vào gọi phần tử cầm canh - Chỉ cần điều kiện dừng tìm thấy phần tử có khóa x  Rút gọn điều kiện dừng 7/15/2020 Tìm kiếm tuyến tính CẢI TIẾN Tìm kiếm nhị phân Cài đặt: (trên mảng) int linearSearchA(int A[],int n,int x) { int i = 0; A[n] = x;//A có n phần tử while (A[i] != x) i++; if (i < n) return i; else return -1; } Thuật tốn: Đầu vào: Danh sách A có n phần tử có thứ tự , giá trị khóa x cần tìm Đầu ra: Chỉ số i phần tử A có giá trị khóa x Trong trường hợp khơng tìm thấy i=-1 Tìm kiếm nhị phân Tìm kiếm nhị phân – Thuật giải Ý tưởng: - Chọn am A để tận dụng kết so sánh với khóa x A chia thành hai phần: trước sau am Chỉ số bắt đầu, kết thúc A l, r - Nếu x = am, tìm thấy dừng - Xét thứ tự x, a m Nếu thứ tự • Là , tìm x đoạn [l, r] với r=m-1; • Ngược lại, tìm x đoạn [l, r] với l=m+1 16 Tìm kiếm nhị phân – Thuật giải Tìm thấy vị trí X=2 M L R 10 17 7/15/2020 Tìm kiếm nhị phân Thuật toán: X=-1 M L R 10 L=0 l  0, r  n-1 while l  r m  (l + r) div if x = A[m] then return m end if if x  A[m] then r  m – else l  m + end if end while return -1 R=-1 => khơng tìm thấy X=-1 Tìm kiếm nhị phân Tìm kiếm nhị phân Q trình tính tốn: Giả sử A = {1,2,3,4,5,7,9}, thứ tự  pRight; } return NULL; } 132 22 7/15/2020 Các thao tác Binary Search Tree Binary Search Tree – Bài tập Cho nhị phân tìm kiếm, node có giá trị nguyên, định nghĩa hàm sau: In node có giá trị chẵn In node có giá trị lớn x Đếm số node Tính độ cao Tìm node có giá trị x Tìm node có giá trị lớn Tìm node có giá trị nhỏ phải Tìm node có key x – dùng đê quy TNode *SearchTNode(TREE T, int x) { if(T!=NULL) { if(T->key==x) return T; else if(x>T->key) return SearchTNode(T->pRight,x); else return SearchTNode(T->pLeft,x); } return NULL; } 133 Binary Search Tree – Bài tập 134 Các thao tác Binary Search Tree Xóa node Đếm số node (node bậc 0) Đếm số node có (node bậc 1) 10 Đếm số node có phải 11 Đếm số node có trái 12 Đếm số node (node bậc 2) 13 In node mức 14 Cho biết độ dài đường từ gốc đến node x Hủy phần tử phải đảm bảo điều kiện ràng buộc Cây nhị phân tìm kiếm Có trường hợp hủy nút 36 TH1: X nút TH2: X có (cây trái phải) TH3: X có đầy đủ 15 40 23 135 Các thao tác Binary Search Tree 136 Các thao tác Binary Search Tree TH1:Xóa node khơng ảnh hưởng đến nút khác TH2 Xóa node có 44 Hủy X=37 18  Xóa node giá trị 88 36  Xóa node giá trị 40 15 13 59 37 108 40 23 15 137 23 55 71 Trước xoá x ta móc nối cha x với x 138 23 7/15/2020 Các thao tác Binary Search Tree Các thao tác Binary Search Tree TH3 Xóa node có TH3 Xóa node có Tìm phần tử mạng cho phần tử cần xóa Có cách tìm nút mạng  C1: Nút có khố nhỏ (trái nhất) bên phải node cần xóa  C2: Nút có khoá lớn (phải nhất) bên trái node cần xóa Bước 1: Tìm node mạng • Cách 1: Tìm node trái phải • Cách 2: Tìm node phải trái Bước 2: Thay giá trị node mạng vào node cần xóa Bước 3: Xóa node mạng 36 15 40 23 16 139 140 Các thao tác Binary Search Tree Các thao tác Binary Search Tree Xóa node có giá trị 36 36 15 Xóa node có giá trị 36 Bước 1: Tìm node mạng nhỏ bên phải lớn bên trái node 36 Cập nhật giá trị 36 23 40 Bước 2: Thay giá trị node mạng cho node cần xóa 23 Node mạng 15 40 23 Node mạng 16 16 141 Các thao tác Binary Search Tree 142 Đề Minh Họa – Cây nhị phân tìm kiếm Xóa node có giá trị 36 Bước 3: Xóa node mạng 36 23 15 40 23 Node mạng 16 143 144 24 7/15/2020 Đề Minh Họa – Cây nhị phân tìm kiếm Đề Minh Họa – Cây nhị phân tìm kiếm 145 Đề Minh Họa – Cây nhị phân tìm kiếm 146 Đề Minh Họa – Cây nhị phân tìm kiếm 147 Bảng băm 148 Hash Table - Hash Map • Bảng băm CTDL phần tử Khái niệm, khai báo, so sánh với CTDL học cặp (khóa, giá trị) (key - value) Xử lý trường hợp bị đụng độ với cách khác 149 150 25 7/15/2020 Hash Table - Hash Map Đụng độ - Colission Sự đụng độ tượng khóa khác băm địa 151 152 Hàm băm - HASH Funtion Hàm dùng để ánh xạ khoá – Key vào dãy số nguyên dùng giá trị nguyên để truy xuất liệu 153 154 Ví dụ dùng bảng Hash Yêu cầu hash funtion T U V M D O Các khóa: M, O, T, V, I, D, U Hàm băm tốt phải thỏa mãn điều kiện sau: • Tính tốn nhanh hash(x) = char_index(x) % 10 • Các khố phân bố bảng Tìm V • Ít xảy đụng độ (Colission) Tìm F • Giải trường hợp băm với khố khơng I phải số ngun Không có char_index: Space=0, A=1, B=2, …, Z=27 M O T V I D U F 155 26 7/15/2020 (1) Phương pháp nối kết (chaining method) Phương pháp giải đụng độ (Colission) (1) Phương pháp nối kết (chaining method): phần tử bị băm Mỗi phần tử bảng băm danh sách liên kết địa (các phần tử bị xung đột) gom thành (bucket) DSLK - Chèn phần tử vào bảng băm ta phải chèn vào danh sách liên kết (2) Phương pháp băm lại (rehash function): Nếu băm lần đầu bị xung đột băm lại lần 1, bị xung đột băm lai -Trường hợp hai phần tử có chung giá trị (hash code) ta chèn chúng vào chung danh sách liên kết lần 2,… Q trình băm lại diễn khơng xung đột 157 (1) Kỹ thuật Separate Chaining 158 (1) Kỹ thuật Separate Chaining Giả sử ta có hàm băm chuyển đổi khóa 50, 700, 76, 85, 92, 73, 101 cách chia cho lấy số dư Giả sử ta có hàm băm chuyển đổi khóa 50, 700, 76, 85, 92, 73, 101 cách chia cho lấy số dư 159 160 (2) Phương pháp (rehash function) (1) Kỹ thuật Separate Chaining Ưu điểm: Nếu băm lần đầu bị xung đột băm lại lần 1, bị xung • Cài đặt đơn giản • Khơng phải lo tới kích thước bảng băm, ta ln thêm liệu đột băm lai lần 2,… Quá trình băm lại diễn cho vào bảng cách thêm vào danh sách liên kết đến khơng cịn xung đột Nhược điểm: Dị tuyến tính tính (Linear Probing Method)) • Phải sử dụng vùng nhớ • Khi mà chuỗi (danh sách liên kết) trở nên dài, lúc thời gian Rehash function cho thao tác tìm kiếm, xóa phần tử tốn thời gian Dò bậc hai (Quadratic Proping Method) Băm kép (Double hashing Method) 161 162 27 7/15/2020 (2.1) Dị tuyến tính (Linear Probing Method) (2.1) Dị tuyến tính (Linear Probing Method) • Nếu chưa bị xung đột thêm nút vào địa qua hàm băm • truy xuất địa Hàm băm lại lần i • Nếu bị xung đột hàm băm lại lần một- f1 xét địa kế tiếp, lại bị xung đột hàm băm hàm băm lại lần hai - f2 xét địa biểu diên cơng thức sau: f(key)=(f(key)+i) %M • Q trình tìm địa trống thêm nút vào địa với f(key) hàm băm bảng băm • Khi tìm nút có khố key vào bảng băm, hàm băm f(key) xác định địa i khoảng từ đến M-1, tìm nút khố key khối đặc chứa nút xuất phát từ địa i • • Mỗi nút bảng băm mẫu tin có trường key để chứa khố nút • Khi khởi tạo bảng băm tất trường key gán NULLKEY • Khi thêm nút có khoá key vào bảng băm, hàm băm f(key) xác định địa i Thêm nút 32, 53, 22, 92, 17, 34, 24, 37, 56 vào bảng băm phương pháp dị tuyến tính khoảng từ đến M-1: nullkey nullkey nullkey nullkey … Lưu ý địa dị tìm địa dị đến cuối bảng (2.1) Dị tuyến tính (Linear Probing Method) • Được cài đặt danh sách kề có M nút Hàm băm lại phương pháp dị tuyến tính nullkey M-1 nullkey 32 NULL NULL NULL NULL NULL NULL NULL NULL 32 NULL NULL 32 53 NULL NULL NULL NULL NULL NULL NULL NULL 53 32 53 22 32 53 22 NULL 92 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 22 92 166 Thêm nút 32, 53, 22, 92, 17, 34, 24, 37, 56 vào bảng băm phương pháp dò tuyến tính 17 NULL NULL NULL NULL NULL NULL NULL NULL 32 53 22 32 53 22 32 53 22 32 53 22 34 24 37 Thêm nút 32, 53, 22, 92, 17, 34, 24, 37, 56 vào bảng băm phương pháp dị tuyến tính NULL 56 NULL NULL 32 53 22 32 53 22 92 92 34 56 92 92 92 92 NULL 34 34 34 34 17 17 17 17 17 17 NULL NULL 24 24 24 24 NULL NULL NULL 37 37 37 167 168 28 7/15/2020 (2.1) Nhận xét - Linear Probing Method  Bảng băm tối ưu băm đều, nghĩa bảng băm khối đặc chứa vài phần tử khối phần tử chưa sử dụng xen kẽ nhau, tốc độ truy xuất lúc có bậc 0(1)  Trường hợp xấu băm không bảng băm đầy, lúc hình thành khối đặc có n phần tử, nên tốc độ truy xuất lúc có bậc 0(n) (2.2) Dị bậc hai (Quadratic Proping Method) Hàm băm lại phương pháp dò bậc hai truy xuất địa cách bậc Hàm băm lại hàm fi biểu diễn công thức sau: fi(key)=( f(key) + i2 ) % M với f(key) hàm băm bảng băm Nếu dị đến cuối bảng trở dị lại từ đầu bảng Bảng băm với phương pháp bậc hai nên chọn số địa M số nguyên tố Ví dụ (2.2) Dị bậc hai (Quadratic Proping Method) • Nếu chưa bị xung đột thêm nút vào địa i • Nếu bị xung đột hàm băm lại lần - f1 xét địa cách i2, lại bị xung đột hàm băm lại lần f2 xét địa cách i - 22 ,…, • Q trình tìm trống thêm nút vào địa • Khi tìm mơt nút có khóa key bảng băm xét nút địa i=f(key), chưa tìm thấy xét nút cách i 12,22,…,quá trình tìm khóa(trường hợp tìm thấy) rơi vào địa trống(trường hợp khơng tìm thấy) (2.2) Dị bậc hai (Quadratic Proping Method) Khắc phục phương pháp dị tuyến tính rải nút khơng  bảng băm với phương pháp dò bậc hai rải nút  Bảng băm trường hợp cài đặt danh sách kề có M nút, nút bảng băm mẫu tin có trường key để chứa khóa nút  Khi khởi tạo bảng băm tất trường key bị gán NULLKEY  Khi thêm nút có khóa key vào bảng băm, hàm băm f(key) xác định địa i khoảng từ đến M-1 Ví dụ Thêm vào khóa 10, 15, 16, 20, 30, 25, 26, 36 Thêm vào khóa 10, 15, 16, 20, 30, 25, 26, 36 fi(key)=( f(key) + i2 ) % M 10 NULL NULL NULL NULL 15 16 NULL NULL NULL 10%10 = 15%10 = 16%10 = fi(key)=( f(key) + i2 ) % M 10 NULL NULL NULL NULL 15 16 NULL NULL NULL 10 20 NULL NULL NULL 15 16 NULL NULL NULL 20%10 =  Đụng độ Băm lại lần cách vị trí đụng độ đơn vị  29 7/15/2020 Ví dụ Ví dụ Thêm vào khóa 10, 15, 16, 20, 30, 25, 26, 36 Thêm vào khóa 10, 15, 16, 20, 30, 25, 26, 36 fi(key)=( f(key) + i2 ) % M 10 NULL NULL NULL NULL 15 16 NULL NULL NULL 10 20 NULL NULL NULL 15 16 NULL NULL NULL 10 20 NULL NULL 30 15 16 NULL NULL 25 fi(key)=( f(key) + i2 ) % M 30%10 =  Đụng độ Băm lại lần cách vị trí đụng độ đơn vị   Đụng độ Băm lại lần cách vị trí đụng độ đơn vị  Ví dụ 10 NULL NULL NULL NULL 15 16 NULL NULL NULL 10 20 NULL NULL 30 15 16 NULL NULL 25 30%10 =  Đụng độ Băm lại lần cách vị trí đụng độ đơn vị   Đụng độ Băm lại lần cách vị trí đụng độ đơn vị  Thêm vào khóa 10, 15, 16, 20, 30, 25, 26, 36 fi(key)=( f(key) + i2 ) % M 10 NULL NULL NULL NULL 15 16 NULL NULL NULL 10 20 NULL NULL NULL 15 16 NULL NULL NULL Ví dụ Thêm vào khóa 10, 15, 16, 20, 30, 25, 26, 36 9 10 20 NULL NULL NULL 15 16 NULL NULL NULL 10 20 NULL NULL 30 15 16 NULL NULL 25 fi(key)=( f(key) + i2 ) % M 10 20 NULL NULL 30 15 16 26 NULL 25 (2.2) Quadratic Proping Method – Nhận xét •Nên chọn số địa M số nguyên tố Khi khởi động bảng băm tất M trường key gán NULL, biến tồn cục N gán •Bảng băm đầy N = M-1, nên dành phần tử trống bảng băm •Bảng băm tối ưu bảng băm dùng phương pháp dị tuyến tính rải rác phần tử hơn, bảng băm chưa 10 NULL NULL NULL NULL 15 16 NULL NULL NULL 10 20 NULL NULL NULL 15 16 NULL NULL NULL 10 20 NULL NULL 30 15 16 NULL NULL 25 10 10 20 20 NULL 36 NULL NULL 30 30 15 15 16 16 26 26 NULL NULL 25 25 (2.2) Băm kép -Double hashing Method • Bảng băm dùng hai hàm băm khác với mục đích để rải rác phần tử bảng băm • Chúng ta dùng hai hàm băm bất kì, ví dụ chọn hai hàm băm sau: đầy tốc độ truy xuất có bậc 0(1) Trường hợp xấu f1(key)= key %M bảng băm đầy lúc tốc độ truy xuất chậm phải thực f2(key) =(M-2)-key %(M-2) nhiều lần so sánh 30 7/15/2020 (2.2) Băm kép -Double hashing Method (2.2) Băm kép -Double hashing Method • Bảng băm cài đặt danh sách kề có M phần tử, phần • Khi thêm phần tử có khố key vào bảng băm, i=f1(key) tử bảng băm mẫu tin có trường key để lưu j=f2(key) xác định địa i j khoảng từ khoá phần tử đến M-1: • Khởi tạo bảng băm: tất trường key gán NULL • Nếu chưa bị xung đột thêm phần tử địa i • Khi tìm kiếm phần tử có khố key bảng băm, hàm băm i=f1(key) j=f2(key) xác định địa i j • Nếu bị xung đột hàm băm lại lần f1 xét địa i+j, lại bị xung đột hàm băm lại lần f2 xét địa i+2j, …, trình tìm địa trống thêm phần tử vào địa chi khoảng từ đến M-1., …, trình tìm khoáXét phần tử địa i, chưa tìm thấy xét tiếp phần tử i+ji+2j (trường hợp tìm thấy) bị rơi vào địa trống (trường hợp khơng tìm thấy) Thêm vào khóa 10, 15, 16, 20, 30, 25, 26, 36 : f1(key)= key %M f2(key) =(M-2)-(key %(M-2)) 10 NULL NULL NULL NULL 15 16 NULL NULL NULL 10 NULL NULL NULL 20 15 16 NULL NULL NULL 10 NULL 30 NULL NULL 15 16 NULL 25 10 20 30 NULL NULL 15 16 NULL 26 25 Đề Minh Họa – Bảng băm 10 20 26 36 20 15 16 NULL NULL 25 184 Đề Minh Họa – Bảng băm Đề Minh Họa – Bảng băm 185 186 31 7/15/2020 Đề Minh Họa – TÌM KIẾM SẮP XẾP Đề Minh Họa – TÌM KIẾM SẮP XẾP 187 188 189 190 191 192 Đề Minh Họa – TÌM KIẾM SẮP XẾP 32 ... Ngược lại, tìm x đoạn [l, r] với l=m+1 16 Tìm kiếm nhị phân – Thuật giải Tìm thấy vị trí X=2 M L R 10 17 7/15/2020 Tìm kiếm nhị phân Thuật tốn: X=-1 M L R 10 L=0 l  0, r  n-1 while l  r m ... Bước Quick Sort – Ý tưởng Quick Sort – Giải thuật Partition – Phân hoạch Partition – Phân hoạch 13 7/15/2020 Quick Sort – Cài đặt Quick Sort – Chạy tay Chạy thuật toán Quick Sort xếp mảng sau theo... Làm theo nguyên tắc thêm node vào cây: * Luôn bắt đầu so sánh từ node gốc * Đảm bảo đăc điểm lớn bên phải, nhỏ bên trái 23 Nút có giá trị lớn nằm nút phải Nhờ cấu trúc Định hướng tìm kiếm 123

Ngày đăng: 25/02/2023, 15:26

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

Tài liệu liên quan