Tài liệu Thiết kế thuật toán 2 pdf

14 409 1
Tài liệu Thiết kế thuật toán 2 pdf

Đ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

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 ñượ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 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

Từ khóa liên quan

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

Tài liệu liên quan