PHÂN TÍCH VÀ THIẾT KẾ GIẢI THUẬT : CÁC GIẢI THUẬT SẮP XẾP, GIẢI THUẬT TÌM KIẾM NHỊ PHÂN, GIẢI THUẬT THAM LAM , Insertion Sort , Selection Sort , Merge Sort , Quick Sort , Giải bài toán ATM sử dụng giải thuật tham lam
Trang 1Mục lục
I CÁC GIẢI THUẬT SẮP XẾP 6
1.Insertion Sort 6
Ý tưởng của thuận toán 6
Các bước thực hiện 6
Cài đặt thuật toán 7
Đánh giá độ phức tạp của giải thuật 7
2.Selection Sort 8
Ý tưởng của thuật toán 8
Các bước thực hiện 8
Cài đặt thuật toán 9
Đánh giá độ phức tạp 9
3.Merge Sort 10
Ý tưởng của thuật toán 10
Các bước thực hiện thuật toán 10
Cài đặt thuật toán 11
Đánh giá độ phức tạp : 12
4.Quick Sort 13
Ý tưởng của thuật toán 13
Cài đặt thuật toán 15
Đánh giá độ phức tạp 15
II GIẢI THUẬT TÌM KIẾM NHỊ PHÂN 16
Ý tưởng của giải thuật tìm kiếm nhị phân 16
1.Giải thuật tìm kiếm nhị phân không sử dụng đệ quy 17
· Cài đặt thuật toán 17
· Đánh giá độ phức tạp 18
2.Giải thuật tìm kiếm nhị phân sử dụng đệ quy 18
Trang 2· Cài đặt thuật toán .18
· Đánh giá độ phức tạp 19
III GIẢI THUẬT THAM LAM 20
1 Bài toán đầu tư sử dụng giải thuật tham lam 20
Ý tưởng : 20
Cài đặt giải thuật: Ngôn ngữ Java 21
2.Giải bài toán ATM sử dụng giải thuật tham lam 24
Ý tưởng 24
Cài đặt giải thuật: 25
Trang 3BÁO CÁO BÀI TẬP LỚN 2 Môn : PHÂN TÍCH VÀ THIẾT KẾ GIẢI THUẬT
I I CÁC GIẢI THUẬT SẮP XẾP
1.Insertion Sort :
- Ý tưởng của thuận toán : Giả sử ta có trước một dãy số đã theo thứ tự tăng
dần, sau đó ta muốn chèn thêm một phần tử vào dãy thì việc cần làm là tìm một vị trí thích hợp cho phần tử đó để dãy vẫn giữ đúng thứ tự ban đầu
- Do dãy số đang tăng dần, nên để tìm được vị trí đó ta chỉ cần duyệt qua các phần tử trong dãy từ cuối đến đầu, nếu gặp một phần tử A[i] nào nhỏ hơn hoặc bằng phần tử x cần chèn thì chèn x vào ngay sau A[i], thì dãy số A vẫn giữ đúng thứ tự tăng dần
- Vậy với dãy số đầu vào A[1 n] không theo thứ tự, ta có thể xem A[1] là mộtdãy có thứ tự (do chỉ có 1 phần tử), kế tiếp ta tìm vị trí để chèn A[2] vào, sau đó ta
đã được dãy A[1 2] có thứ tự Lặp lại các bước tương tự cho đến khi A[1 n] có thứ tự
Trang 4· Các bước thực hiện:
- Bước 1: i = 2 (xem A[1] là dãy số có thứ tự vì nó chỉ có 1 phần tử)
- Bước 2: temp = A[i] (phải lưu A[i] ra biến tạm vì trong lúc hoán đổi vị trí sẽ làm mất giá trị của A[i])
- Bước 3: j = i – 1
- Bước 4: Xét từ j về 1, tìm vị trí thích hợp để chèn temp vào mãng A
o Nếu A[j] > temp thì A[j+i] = A[j]
Nếu j > 1 thì j = j – 1; Lặp lại bước 4
Ngược lại, A[j] = temp;
o Ngược lại: A[j+1] = temp;
- Bước 5: Nếu i < n thì i = i + 1; Quay lại bước 2;
Ngược lại thì ta đã có mảng A[1 n] theo thứ tự tăng dần
· Cài đặt thuật toán : Ngôn ngữ Java
· Đánh giá độ phức tạp của giải thuật :
Độ phức tạp của giải thuật này là O(n2)
Trang 52.Selection Sort:
Ý tưởng của thuật toán :
Đây là thuật toán tự nhiên nhất, rất dễ hiểu và dễ
thực hiện Tư tưởng của thuật toán như sau:
+ Chọn phần tử nhỏ nhất trong n phần tử ban
đầu, đưa phần tử này về vị trí đúng là đầu tiên của dãy
hiện hành
+Sau đó không quan tâm đến nó nữa, xem dãy
hiện hành chỉ còn n-1 phần tử còn lại, bắt đầu từ vị trí
thứ 2
+Lặp lại quá trình trên cho dãy hiện hành đến khi
dãy hiện hành chỉ còn 1 phần tử
+Dãy ban đầu có n phần tử, vậy tóm tắt ý tưởng
thuật toán là thực hiện n-1 lượt việc đưa phần tử nhỏ
nhất trong dãy hiện hành về vị trí đúng ở đầu dãy
Các bước thực hiện:
- Bước 1: i = 1
- Bước 2: Tìm phần tử nhỏ nhất A[min] trong dãy hiện hành từ A[i] đến A[n]
- Bước 3: Hoán vị A[min] và A[i]
- Bước 4: i = i + 1
- Bước 5: Nếu i < n thì quay lại bước 2 (i = n tức là mãng chỉ còn 1 phần tử)
Trang 6· Cài đặt thuật toán : Ngôn ngữ Java
· Đánh giá độ phức tạp :
Độ phức tạp là: O (n2)
Trang 73.Merge Sort :
· Ý tưởng của thuật toán :
Merge Sort là một thuật toán sắp xếp để sắp xếp các danh sách (hoặc bất kỳcấu trúc dữ liệu nào có thể truy cập tuần tự, v.d luồng tập tin) theo một trật tự nào
đó Thuật toán này là một ví dụ tương đối điển hình của lối thuật toán chia để trị
Các bước thực hiện thuật toán như sau:
Trang 8· Cài đặt thuật toán : Ngôn ngữ Java
Trang 9· Đánh giá độ phức tạp :
Ta thấy rằng số lần lặp của bước 2 và bước 3 trong thuật toán MergeSort bằnglog2n do sau mỗi lần lặp giá trị của k tăng lên gấp đôi Dễ thấy, chi phí thực hiệnbước 2 và bước 3 tỉ lệ thuận bới n Như vậy, chi phí thực hiện của giải thuậtMergeSort sẽ là O(nlog2n) Do không sử dụng thông tin nào về đặc tính của dãycần sắp xếp, nên trong mọi trường hợp của thuật toán chi phí là không đổi Ðâycũng chính là một trong những nhược điểm lớn của thuật toán
Trang 104.Quick Sort :
· Ý tưởng của thuật toán :
Đây là giả thuật sắp xếp nhanh, chỉ tốn O(nlogn) Cài đặt của giả thuật tương đốiphức tạp Chúng ta cần chú ý đến:
Trang 11- Bước 1: Tìm chốt: Chốt là phần tử lớn nhất trong 2 phần tử khác nhau đầutiên của mảng Nếu mảng có 1 phần tử tất cả phần tử bằng nhau sẽ không có chốt:Chốt của mảng trên la 59 (vị trí 0).
+ L chạy từ trái qua, dừng lại khi gặp phần tử >= pivot
+ R chạy từ phải qua, dừng lại khi gặp phần tử < pivot
+ Tại điểm dùng: Nếu L < R : Chúng ta sẽ swap A[L] và A[R]
b2, tiếp tục cho đến khi L > R
- Bước 3: Lặp lại như thế (Dùng đệ qui)
Trang 12· Cài đặt thuật toán : Ngôn ngữ Java
· Đánh giá độ phức tạp :
Độ phức tạp của giải thuật này là O(nlogn)
Là một thuật toán sắp xếp nhanh nhất trong thực tế
Trang 13II GIẢI THUẬT TÌM KIẾM NHỊ PHÂN
· Ý tưởng của giải thuật tìm kiếm nhị phân :
Tìm kiếm nhị phân ( binary search ) là một thuật toán dùng để tìm kiếm phần tửtrong một danh sách đã sắp xếp ( sorted lists and array )
So sánh phần tử cần tìm với phần tử nằm chính giữa danh sách để xác định vùng
dữ liệu có chứa giá trị cần tìm Nếu 2 phần tử bằng nhau thì thuật toán kết thúc.Nếu 2 phần tử không bằng nhau thì tùy vào phần tử nào lớn hơn, thuật toán lặp lạibước so sánh trên với nửa đầu hoặc nửa sau của danh sách
Vì sau mỗi bước tìm kiếm, miền dữ liệu cần xét giảm đi một nửa nên thời gianthực thi của thuật toán là hàm logarit
Phép tìm kiếm nhị phân được thực hiện trên dãy khoá có thứ tự (xét dãy tăng dần): a[0]<=a[1]<=a[2]<= <=a[n-1] Giá trị cần tìm x
Trang 14Chia đôi dãy khoá cần tìm kiếm So sánh khoá giữa dãy với x, có 3 trường hợp xãyra:
- Giá trị khoá này bằng x, tìm kiếm thành công
- Giá trị khoá này lớn hơn x, thì ta tiến hành tìm x với nữa bên trái của khoá này
- Giá trị khoá này nhỏ hơn x, thì ta tiến hành tìm x với nữa bên phải của khoá này
Trường hợp tìm kiếm thất bại khi dãy khoá cần tìm không có phần tử nào
1.Giải thuật tìm kiếm nhị phân không sử dụng đệ quy :
· Cài đặt thuật toán : Ngôn ngữ C++
Trang 15· Đánh giá độ phức tạp :
– Tốt nhất : O(1) – Phần tử cần tìm ở chính giữa danh sách
– Xấu nhất : O(log2(n)) – Không có phần tử cần tìm trong danh sách
– Trung bình : O(log2(n/2)) – Xác suất các phần tử trong danh sách chứa giá trịcần tìm là như nhau
2.Giải thuật tìm kiếm nhị phân sử dụng đệ quy :
· Cài đặt thuật toán : Ngôn ngữ C++
· Đánh giá độ phức tạp :
Trang 16– Tốt nhất : O(1) – Phần tử cần tìm ở chính giữa danh sách
– Xấu nhất : O(log2(n)) – Không có phần tử cần tìm trong danh sách
– Trung bình : O(log2(n/2)) – Xác suất các phần tử trong danh sách chứa giá trịcần tìm là như nhau
Trang 17III GIẢI THUẬT THAM LAM
1 Bài toán đầu tư sử dụng giải thuật tham lam
· Ý tưởng :
Giải thuật tham lam (Greedy Algorithm) là giải thuật tối ưu hóa tổ hợp Giảithuật tìm kiếm, lựa chọn giải pháp tối ưu địa phương ở mỗi bước với hi vọngtìm được giải pháp tối ưu toàn cục
Giải thuật tham lam lựa chọn giải pháp nào được cho là tốt nhất ở thời điểmhiện tại và sau đó giải bài toán con nảy sinh từ việc thực hiện lựa chọn đó Lựachọn của giải thuật tham lam có thể phụ thuộc vào lựa chọn trước đó Việcquyết định sớm và thay đổi hướng đi của giải thuật cùng với việc không bao giờxét lại các quyết định cũ sẽ dẫn đến kết quả là giải thuật này không tối ưu đểtìm giải pháp toàn cục
Là một dạng của bài toán tối ưu, nó có dạng tổng quát như sau:
Cho hàm f(X) xác định trên một tập hữu hạn các phần tử D Hàm f(X) được gọi là hàm mục tiêu
Mỗi phần tử X thuộc D có dạng X = (x1, x2,…xn) được gọi là một phương án
Cần tìm một phương án X thuộc D sao cho hàm f(X) đạt min (max)
Phương án X như vậy gọi là tối ưu
Ta có thể tìm thấy phương án tối ưu bằng “vét cạn” nghĩa là xét tất cả cácphương án trong tập D (hữu hạn) để tìm phương án tốt nhất Mặc dù tập D làhữu hạn nhưng để tìm phương án tối ưu cho một bài toán kích thước n bằng vétcạn ta có thể cần một thời gian hàm mũ
Trang 18· Cài đặt giải thuật : Ngôn ngữ Java
Class InVest.java ( Đầu Tư ) :
Trang 19Class ProJect.java (Dự Án) :
Trang 20Class ChuongTrinh.java (Test)
Trang 212.Giải bài toán ATM sử dụng giải thuật tham lam :
Ý tưởng :
Trong máy rút tiền tự động ATM, ngân hàng đã chuẩn bị sẵn các loại tiền cómệnh giá100.000 đồng, 50.000 đồng, 20.000 đồng và 10.000 đồng Giả sử mỗi loạitiền đều có số lượng không hạn chế Khi có một khách hàng cần rút một số tiền n đồng (tính chẵn đến 10.000 đồng, tức là n chia hết cho 10000) Hãy tìm một
phương án trả tiền sao cho trả đủ n đồng và số tờ giấy bạc phải trả là ít nhất
Gọi X = (X1, X2, X3, X4) là một phương án trả tiền, trong đó X1 là số tờ giấy bạc mệnh giá 100.000 đồng, X2 là số tờ giấy bạc mệnh giá 50.000 đồng, X3
là số tờ giấy bạc mệnh giá 20.000 đồng và X4 là số tờ giấy bạc mệnh giá 10.000 đồng Theo yêu cầu ta phải có
X1 + X2 + X3 + X4 nhỏ nhất và X1 * 100.000 + X2 * 50.000 + X3 *
20.000 + X4 * 10.000 = n
Áp dụng kĩ thuật tham ăn để giải bài toán này là: để có số tờ giấy bạc phải trả (X1 +X2 + X3 + X4) nhỏ nhất thì các tờ giấy bạc mệnh giá lớn phải được chọn nhiều nhất
Trước hết ta chọn tối đa các tờ giấy bạc mệnh giá 100.000 đồng, nghĩa là X1
là số nguyên lớn nhất sao cho X1 * 100.000 ≤ n Tức là X1 = n DIV 100.000
Trang 22· Cài đặt giải thuật : Ngôn ngữ C#