Bài giảng Kỹ thuật lập trình: Các thuật toán thông dụng - Nguyễn Minh Huy
lượt xem 3
download
Bài giảng Kỹ thuật lập trình: Các thuật toán thông dụng, được biên soạn gồm các nội dung chính sau Thuật toán sắp xếp; Thuật toán quy hoạch động. Mời các bạn cùng tham khảo!
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Kỹ thuật lập trình: Các thuật toán thông dụng - Nguyễn Minh Huy
- Các thuật toán thông dụng GV. Nguyễn Minh Huy Kỹ thuật lập trình - Nguyễn Minh Huy 1
- Nội dung Thuật toán sắp xếp. xếp. Thuật toán quy hoạch động. động. Kỹ thuật lập trình - Nguyễn Minh Huy 2
- Nội dung Thuật toán sắp xếp. xếp. Thuật toán quy hoạch động. động. Kỹ thuật lập trình - Nguyễn Minh Huy 3
- Thuật toán sắp xếp Khái niệm sắp xếp: xếp: Bài toán: toán: Cho mảng N phần tử. tử. Bố trí các phần tử theo thứ tự. tự. N! cách bố trí! trí! Các thuật toán: toán: Độ phức tạp Không gian Thuật toán Tốt Xấu Trung bình bộ nhớ Interchange Sort N2 N2 N2 1 Selection Sort N2 N2 N2 1 Merge Sort N logN N logN N logN N Quick Sort N logN N2 N logN logN Kỹ thuật lập trình - Nguyễn Minh Huy 4
- Thuật toán sắp xếp Sắp xếp đổi chỗ (Interchange Sort): Ý tưởng: tưởng: Mảng có thứ tự không có nghịch thế! thế! Duyệt tất cả cặp phần tử. tử. Đổi chỗ nếu phát hiện nghịch thế. thế. Cài đặt: đặt: interchange_sort( interchange_sort( mảng A, kích thước N ) { for ( int i = 0; i < N – 1; i++ ) for ( int j = i + 1; j < N; j++ ) if ( a[ j ] < a[ i ] ) // Phát hiện nghịch thế. thế. swap( swap( a[ i ], a[ j ] ); } Kỹ thuật lập trình - Nguyễn Minh Huy 5
- Thuật toán sắp xếp Sắp xếp chọn (Selection Sort): Ý tưởng: tưởng: Tìm phần tử nhỏ nhất đưa lên đầu. đầu. Lặp lại với phần còn lại của mảng. mảng. Cài đặt: đặt: selection_sort( selection_sort( mảng A, kích thước N ) { for ( int i = 0; i < N – 1; i++ ) { int min = i; for (int j = i + 1; j < N; j++ ) (int if ( a[ j ] < a[ min ] ) min = j; swap( swap( a[ i ], a[ min ] ); } } Kỹ thuật lập trình - Nguyễn Minh Huy 6
- Thuật toán sắp xếp Sắp xếp trộn (Merge Sort): Bài toán trộn 2 mảng có thứ tự: tự: a 1 4 5 7 9 c 1 2 3 4 5 6 7 8 9 b 2 3 6 8 Quyết đinh chọn phần tử ở mảng kết quả: quả: // i, ia, ib lần lược là vị trí đang xét ở mảng c, a, b. ia, if ( a[ ia ] < b[ ib ] ) c[ i ] = a[ ia++ ]; ia++ else c[ i ] = b[ ib++ ]; ib++ c[ i ] = (a[ ia ] < b[ ib ]) ? a[ ia++ ] : b[ ib++ ]; ia++ ib++ Kỹ thuật lập trình - Nguyễn Minh Huy 7
- Thuật toán sắp xếp Sắp xếp trộn (Merge Sort): Dùng kỹ thuật chia để trị: trị: merge_sort( merge_sort( mảng A, kích thước N ) { if ( N == 1 ) Kết thúc; thúc; else { Chia đôi A thành A1 và A2; merge_sort(A merge_sort(A1, kích thước A1 ); merge_sort(A merge_sort(A2, kích thước A2 ); merge_array(A merge_array(A1, kích thức A1, A2, kích thước A2, A ); } } Kỹ thuật lập trình - Nguyễn Minh Huy 8
- Nội dung Thuật toán sắp xếp. xếp. Thuật toán quy hoạch động. động. Kỹ thuật lập trình - Nguyễn Minh Huy 9
- Thuật toán quy hoạch động Khái niệm quy hoạch động: động: Lời giải đệ quy: quy: Trường hợp cơ bản: giải tường minh. bản: Suy biến bài toán về trường hợp đơn giản hơn. hơn. Nếu nhiều trường hợp suy biến trùng lặp? lặp? Xây dựng bảng tra lời giải cho các trường hợp. hợp. Quy hoạch động = Quy hoạch bảng tra lời giải. giải. Bài toán Fibonacci - F(0) = 1, F(1) = 1 - F(n) = F(n – 1) + F(n – 2) n=0 1 n=1 1 n=2 2 n=3 3 Kỹ thuật lập trình - Nguyễn Minh Huy 10
- Thuật toán quy hoạch động Khái niệm quy hoạch động: động: Khi nào dùng quy hoạch động? động? Bài toán đệ quy. quy. Có thể suy biến về trường hợp cơ bản. bản. Các trường hợp suy biến trùng lắp nhau. nhau. Có thể dùng bảng tra để lưu lời giải. giải. Không quá nhiều trường hợp suy biến. biến. Có thể lưu trữ bảng tra. tra. fibo(n) fibo(n) fibo(n-1) fibo(n-2) fibo(n-1) fibo(n-2) fibo(n-2) fibo(n-3) fibo(n-3) fibo(n-4) fibo(n-3) fibo(n-4) … … … … … … Kỹ thuật lập trình - Nguyễn Minh Huy 11
- Thuật toán quy hoạch động Phân loại quy hoạch động: động: Quy hoạch từ trên xuống (top-down): (top- Quy hoạch bảng tra cho trường hợp tổng quát trước. trước. Gọi đệ quy đến trường hợp đơn giản hơn. hơn. Gặp trường hợp đã giải thì truy xuất bảng tra. tra. solve_top_down( solve_top_down( trường hợp N, bảng tra lời giải T ) { if ( đã giải trường hợp N ) return T[ N ]; ]; // Giải trường hợp N và đưa vào bảng tra. tra. if ( N cơ bản ) T[ N ] = lời giải cơ bản; bản; else T[ N ] = solve_top_down( N – 1, T ); solve_top_down( } Kỹ thuật lập trình - Nguyễn Minh Huy 12
- Thuật toán quy hoạch động Phân loại quy hoạch động: động: Quy hoạch từ dưới lên (bottom-up): (bottom- Quy hoạch bảng tra cho trường hợp cơ bản trước. trước. Dùng vòng lặp tính trường hợp tổng quát dựa vào bảng tra. tra. Cách thức khử đệ quy. quy. solve_bottom_up( solve_bottom_up( trường hợp N ) { Khai báo bảng tra T; Khởi tạo T với các trường hợp cơ bản; bản; for (int i = trường hợp tổng quát đầu tiên; i
- Tóm tắt Thuật toán sắp xếp: xếp: Interchange Sort. Selection Sort. Merge Sort. Thuật toán quy hoạch động: động: Quy hoạch bảng tra lời giải. giải. Phân loại: loại: Top- Top-down: tổng quát trước, dùng đệ quy. trước, quy. Bottom- Bottom-up: cơ bản trước, dùng vòng lặp. trước, lặp. Kỹ thuật lập trình - Nguyễn Minh Huy 14
- Bài tập Bài tập 10.1: Viết chương trình C cài đặt sắp xếp trộn trên danh sách liên kết đơn. đơn. Kỹ thuật lập trình - Nguyễn Minh Huy 15
- Bài tập Bài tập 10.2: Viết chương trình C dùng quy hoạch động (cả 2 cách top-down và top- bottom- bottom-up) để tìm dãy con tăng không liên tục dài nhất trong dãy N phần tử. tử. Ví dụ: dụ: Cho dãy AN = { 1 5 9 2 4 7 8 } Dãy con tăng không liên tục dài nhất SN = { 1 2 4 7 8 } Kỹ thuật lập trình - Nguyễn Minh Huy 16
- Bài tập Bài tập 10.3: Viết chương trình C dùng quy hoạch động (cả 2 cách top-down và top- bottom- bottom-up) để giải bài toán sau: sau: - Cho N loại tiền mệnh giá { T0, T1, …, TN } - Tìm cách đổi số tiền M ra các tờ tiền có mệnh giá được cho. cho. - Các tờ tiền được dùng để đổi là ít nhất. nhất. Ví dụ 1: Cho các loại tiền mệnh giá { 5 10 20 40 } Số tiền cần đổi 90 = 40 + 40 + 10. Ví dụ 2: Cho các loại tiền mệnh giá { 10 50 60 90 } Số tiền cần đổi 110 = 50 + 60. Kỹ thuật lập trình - Nguyễn Minh Huy 17
- Bài tập Bài tập 10.4: Viết chương trình C dùng quy hoạch động (cả 2 cách top-down và top- bottom- bottom-up) để giải bài toán sau: sau: - Tìm cách biểu diễn số nguyên N bằng tổng các số nguyên tố. tố. - Các số nguyên tố dùng để biểu diễn là ít nhất. nhất. Ví dụ: dụ: 6 = 3 + 3 (ít hơn 2 + 2 + 2) (ít 8=3+5 38 = 31 + 7 Kỹ thuật lập trình - Nguyễn Minh Huy 18
- Bài tập Bài tập 10.5: Viết chương trình C dùng quy hoạch động (cả 2 cách top-down và top- bottom- bottom-up) để giải bài toán sau: sau: Một lâu đài cổ có M tầng lầu, mỗi tầng lầu có N phòng. Tại mỗi lầu, phòng. phòng của lâu đài đều có 3 cái thang thông với 3 phòng của tầng lầu phía trên gồm: phòng ngay bên trên, phòng trên bên trái và phòng trên gồm: trên, bên phải. Trong mỗi phòng có một rương tiền với giá trị nhất định. phải. định. Một người săn kho báu xuất phát từ tầng trệt của lâu đài. Anh ta đài. vào một phòng bất kỳ rồi từ đó đi lên các phòng ở tầng trên. Mỗi tầng trên. anh ta chỉ ghé qua một phòng. phòng. Hãy tìm lộ trình phòng ở mỗi tầng mà người săn kho báu ghé qua để thu được số tiền nhiều nhất. nhất. Kỹ thuật lập trình - Nguyễn Minh Huy 19
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Kỹ thuật lập trình - Phạm Thế Bảo
0 p | 220 | 32
-
Bài giảng Kỹ thuật lập trình: Chương I - Lưu Hồng Việt
48 p | 194 | 23
-
Bài giảng Kỹ thuật lập trình: Chương IV - Lưu Hồng Việt
32 p | 151 | 17
-
Bài giảng Kỹ thuật lập trình: Chương III - Lưu Hồng Việt
51 p | 147 | 15
-
Bài giảng Kỹ thuật lập trình: Chương V - Lưu Hồng Việt
19 p | 127 | 15
-
Bài giảng Kỹ thuật lập trình: Phần 1 - ĐH CNTT&TT
37 p | 114 | 10
-
Bài giảng Kỹ thuật lập trình - Bài 1: Tổng quan về kỹ thuật lập trình
65 p | 165 | 8
-
Bài giảng Kỹ thuật lập trình: Bài 1 - Phạm Đình Sắc
9 p | 129 | 7
-
Bài giảng Kỹ thuật lập trình nâng cao: Chương 4 - ThS. Dương Thành Phết
26 p | 92 | 7
-
Bài giảng Kỹ thuật lập trình - Chương 10: Tổng kết môn học (Trường Đại học Bách khoa Hà Nội)
67 p | 15 | 4
-
Bài giảng Kỹ thuật lập trình: Chương 1 - Trần Quang
39 p | 8 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 2 - Trần Quang
25 p | 10 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 3 - Trần Quang
52 p | 10 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 4 - Trần Quang
32 p | 7 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 6 - Trần Quang
37 p | 11 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 7 - Trần Quang
28 p | 6 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 8 - Trần Quang
34 p | 8 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 9 - Trần Quang
33 p | 4 | 2
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn