Thông tin tài liệu
Thiết kế thuật toán Lê Sỹ Vinh Bộ môn Khoa Học Máy Tính – Khoa CNTT ðại Học Công Nghệ - ðHQGHN Email: vinhioi@yahoo.com Chia ñể trị (Divide and Conquer) • Chia bài toán lớn thành các bài toán nhỏ cùng dạng với bài toán lớn nhưng có kích thước nhỏ hơn. • Giải quyết các bài toán nhỏ ñộc lập • Kết hợp nghiệm của nhửng bài toán nhỏ ñể thu ñược bài toán lớn Ví dụ: Merge sort ðể sắp xếp một mảng A[start…end], ta chia mảng A thành 2 mảng con A1 và A2. Sắp xếp A1 và A2, sau ñó hòa nhập chúng thành một ñể ñược mang A ñã sắp xếp. void MergeSort( Item A[ ], int start, int end) {void MergeSort( Item A[ ], int start, int end) { if (start < end) { int mid = (start + end)/2; MergeSort ( A, start, mid ); MergeSort ( A, mid+1, end); Merge ( A, start, mid, end); } } Ví dụ: Quick sort Tư tưởng của Quick sort: Phân chia danh sách dữ liệu cần sắp xếp ra thành hai phần “phần bên trái” và “phần bên phải” sao cho các phần tử ở phần bên trái nhỏ hơn hoặc bằng các phần tử ở phần bên phải. Sau khi phân chia, tiếp tục thực hiện “quick sort trên hai phần dữ liệu trên. Void quickSort (Item A[], int start, int end) { if (start < end) { pivotLocation = partition (A, start, end); quickSort (A, start, pivotLocation – 1); quickSort (A, pivotLocation + 1, end) } } Binary search BinarySearch (lookingData, items, start, end) { if (start > end) return (-1) else { mid = (start + end) / 2; if (items[mid] == lookingData) return midreturn mid else if (items[mid] > lookingData) BinarySearch (lookingData, items, start, mid -1) else BinarySearch (lookingData, items, mid + 1, end) } } Tìm phần tử lớn nhất trong danh sách findMax (int start, int end, items) { if (start == end) return items[start] else { int med = (start + end) / 2; Item max1 = findMax (start, med, items); Item max2 = findMax (med + 1, end, items); return Max (max1, max2); } } Chiến lược vét cạn (Backtracking) Lần lượt duyệt qua tất cả các trạng thái có thể trong không gian tìm kiếm • A = (a 0 , a 1 , a n-1 ): Là một trạng thái gồm N thành phần, nếu trạng thái A thỏa mãn các yêu cầu của bài toán thì gọi là vector nghiệm. Trong ñó a i ∈ S i ∈ S i • ðể liệt kê ñược tất cả các trạng thái A có thể, ta tiến hành gọi ñệ quy qua N vòng, tại bước thứ i sẽ lần lượt tiến hành thử tất cả các a i ∈ S i Chiến lược vét cạn (Backtracking) Backtracking (A, i) { for a i ∈ S i { A = A ⋃ a i ; if (i < N) Backtracking (A, i+1) ⋃ if (i < N) Backtracking (A, i+1) else CheckConfiguration (A); A = A – {a i } } } [...]... i) { for (int v = 0; v < 2; v ++) { A[i] = v; if (i < N) Binary (A, i+1) else A.print (); A[i] = -1; } } Ví d : Li t kê t t c hoán v ñ dài N Void Permutation (A, dd, i) { for (int v = 1; v . • Chia bài toán lớn thành các bài toán nhỏ cùng dạng với bài toán lớn nhưng có kích thước nhỏ hơn. • Giải quyết các bài toán nhỏ ñộc lập • Kết hợp nghiệm. bài toán nhỏ ñể thu ñược bài toán lớn Ví dụ: Merge sort ðể sắp xếp một mảng A[start…end], ta chia mảng A thành 2 mảng con A1 và A2. Sắp xếp A1 và A2, sau
Ngày đăng: 12/12/2013, 13:15
Xem thêm: Tài liệu Thiết kế thuật toán 2 pdf, Tài liệu Thiết kế thuật toán 2 pdf