1. Trang chủ
  2. » Công Nghệ Thông Tin

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

22 1,1K 7

Đ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

Thông tin cơ bản

Định dạng
Số trang 22
Dung lượng 638,79 KB
File đính kèm PHAN TICH THIET KE GIAI THUAT.zip (6 KB)

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

Mụ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 3

BÁ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 5

2.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 7

3.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 10

4.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 13

II 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 14

Chia đô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 17

III 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 19

Class ProJect.java (Dự Án) :

Trang 20

Class ChuongTrinh.java (Test)

Trang 21

2.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#

Ngày đăng: 07/01/2017, 19:26

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w