Cấu trúc dữ liệu - Chương I: Các khái niệm cơ bản

Xác định bài toán #  Xác định xem ta phải giải quyết vấn đề gì? #  Xác định yêu cầu cần thực hiện của bài toán $ các thao tác cần thực hiện #  Các bài toán tin học cần phải chỉ ra lời giải tốt nhất bởi vì nếu không lời giải đó có thể đòi hỏi nhiều thời gian và chi phí

pdf10 trang | Chia sẻ: thuychi16 | Lượt xem: 841 | Lượt tải: 1download
Bạn đang xem nội dung tài liệu Cấu trúc dữ liệu - Chương I: Các khái niệm cơ bản, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
CTDL – Khoa CNTH – Viện ĐH Mở HN CẤU TRÚC DỮ LIỆU Khoa Công nghệ thông tin Email: trinhxuan@gmail.com Thời lượng: 60 tiết – LT Web: //sites.google.com/site/trinhxuan 1 CTDL – Khoa CNTH – Viện ĐH Mở HN ! Hình thức thi: BTL "  Nhóm 4 SV ! Cách tính điểm: " Điểm CC: 10% " Điểm GK: 20% " Điểm thi: 70% ! Bài tập lớn ! Test Bài tập lớn 2 CTDL – Khoa CNTH – Viện ĐH Mở HN *Tài liệu học tập: ! Giáo trình bắt buộc " Giáo trình Cấu trúc dữ liệu – Khoa CNTT, Viện ĐH Mở HN – Lưu hành nội bộ ! Giáo trình tham khảo " Đỗ Xuân Lôi, “Cấu trúc dữ liệu và giải thuật”, NXB Khoa học và kỹ thuật. " Introduction to Algorithms – The cormen 3 CTDL – Khoa CNTH – Viện ĐH Mở HN Mục đích môn học # Hiểu được khái niệm CTDL và Thuật toán # Biết cách đánh giá độ phức tạp của một thuật toán # Nắm được các CTDL cơ bản: Mảng, Danh sách # Hiểu và vận dụng được một số CTDL đặc biệt: Hàng đợi, Ngăn xếp, Cây, Đồ thị # Hiểu và áp dụng được một số thuật toán cơ bản: Tìm kiếm, Sắp xếp, 4 CTDL – Khoa CNTH – Viện ĐH Mở HN *Nội dung môn học 5 CTDL – Khoa CNTH – Viện ĐH Mở HN STT SỐ TIẾT NỘI DUNG GIẢNG DẠY Y/C Đọc TL Ghi chú 1 5 Đánh giá Thuật Toán - Phân công BTL Các buổi Thực hành có thể mang máy tính cá nhân đi thực hành 2 5 TK và SX x 3 5 TK và SX x 4 5 Thực hành mảng - Test x 5 5 DSLK Đơn x 6 5 Thực hành DSLK Đơn - Test x 7 5 Danh sách liên kết đôi x 8 5 Stack - Queue x 9 5 Cây x 10 5 Cây - Test x 11 5 Đồ thị x 12 5 Test BTL – Đánh giá sơ bộ - TH x 6 CTDL – Khoa CNTH – Viện ĐH Mở HN Lưu ý sử dụng Phòng máy ! Sử dụng điều hòa: Phải đăng ký và mất phí ! Tổng số buổi thực hành: 03 buổi ! Tổng phí phải nộp: 600.000đ (200.000/1 buổi) "  Phí tính trên 1 sinh viên: 10.000đ/3 buổi ! Lớp trưởng thu giúp ! Cách thức thực hiện: "  Buổi 1: Thu thập nguyên vọng sử dụng điều hòa "  Buổi 2+3: Thu tiền sử dụng điều hòa ! Nguyên tắc số ít theo số nhiều 7 CTDL – Khoa CNTH – Viện ĐH Mở HN Yêu cầu kiến thức cần có !  Xem và tổng hợp lại ngôn ngữ C !  Nội dung cần tổng hợp lại: "  Cấu trúc chương trình "  Khai báo biến "  Nhập/xuất dữ liệu "  Cấu trúc điều khiển "  Mảng "  Chuỗi "  Chương trình con – hàm "  Cấu trúc "  Con trỏ "  File "  8 CTDL – Khoa CNTH – Viện ĐH Mở HN CHƯƠNG I: CÁC KHÁI NIỆM CƠ BẢN 9 CTDL – Khoa CNTH – Viện ĐH Mở HN I. Giới thiệu ! Các bước để xây dựng bài toán tin học trong máy tính Bài toán thực tế Yêu cầu Thiết kế Giải thuật Thuật toán #include Chương trình Lập trình • Ngôn ngữ lập trình: • PASCAL, • C/C++, • JAVA, • Visual Basic •  Xây dựng một bài toán tin học thực chất là chuyển một bài toán thực tế thành một bài toán giải quyết được bằng máy tính 10 CTDL – Khoa CNTH – Viện ĐH Mở HN II. Các bước xây dựng chương trình Xác định bài toán Tìm CTDL biểu diễn bài toán Tìm thuật toán Lập trình Kiểm thử Tối ưu chương trình 11 CTDL – Khoa CNTH – Viện ĐH Mở HN 1. Xác định bài toán #  Xác định xem ta phải giải quyết vấn đề gì? #  Xác định yêu cầu cần thực hiện của bài toán $ các thao tác cần thực hiện #  Các bài toán tin học cần phải chỉ ra lời giải tốt nhất bởi vì nếu không lời giải đó có thể đòi hỏi nhiều thời gian và chi phí. 12 CTDL – Khoa CNTH – Viện ĐH Mở HN 2. Tìm CTDL biểu diễn bài toán %  Xác định input và output của bài toán %  Input: dữ liệu đầu vào %  Output: Kết quả mong muốn đạt được Các tiêu chuẩn: #  Biểu diễn đầy đủ các thông tin nhập và xuất của bài toán #  Phải phù hợp với các thao tác của thuật toán mà ta lựa chọn để giải quyết bài toán #  Cài đặt được trên máy tính với một ngôn ngữ lập trình xác định 13 CTDL – Khoa CNTH – Viện ĐH Mở HN 3. Tìm thuật toán %  Xác định hệ thống chặt chẽ và rõ ràng các quy tắc để từ Input có được Output %  Xác định dãy thao tác trên CTDL đầu vào để giải quyết yêu cầu bài toán Đảm bảo #  Mỗi bước thao tác rõ ràng #  Không được rơi vào quá trình vô hạn #  Sau khi thực hiện các bước phải cho kết quả đúng #  Phải đảm bảo cài đặt được chương trình 14 CTDL – Khoa CNTH – Viện ĐH Mở HN 4. Lập trình #  Xác định ngôn ngữ lập trình được sử dụng #  Thông thường ta không nên cụ thể hóa ngay toàn bộ chương trình mà nên tiến hành theo phương pháp tinh chế từng bước # Nguyên tắc % Ban đầu, thể hiện thuật toán với các bước tổng thể, mỗi bước nêu lên một công việc phải thực hiện % Một công việc đơn giản hoặc là một đoạn chương trình đã được học thuộc thì ta tiến hành viết mã lệnh ngay bằng ngôn ngữ lập trình % Một công việc phức tạp thì ta lại chia thành những công việc nhỏ hơn để lại tiếp tục với những công việc nhỏ hơn đó. 15 CTDL – Khoa CNTH – Viện ĐH Mở HN 5. Kiểm thử #  Kiểm tra lỗi chương trình #  Lỗi cơ bản &  Lỗi cú pháp &  Lỗi cài đặt &  Lỗi thuật toán #  Lập bộ test để kiểm thử #  Nguyên tắc xây dựng bộ test &  Bắt đầu với bộ test nhỏ, đơn giản, &  Tiếp theo vẫn là các bộ test nhỏ, nhưng chứa các giá trị đặc biệt hoặc tầm thường. &  Các bộ test phải đa dạng, tránh sự lặp đi lặp lại &  Có một vài bộ test lớn 16 CTDL – Khoa CNTH – Viện ĐH Mở HN 6. Tối ưu chương trình #  Đặt mục tiêu viết chương trình sao cho đơn giản, làm sao chạy ra kết quả đúng, sau đó ta xem lại những chỗ nào viết chưa tốt thì tối ưu lại mã lệnh để chương trình ngắn hơn, chạy nhanh hơn #  Không nên viết tới đâu tối ưu tới đó, bởi chương trình có mã lệnh tối ưu thường phức tạp và khó kiểm soát. #  Tiêu chuẩn tối ưu &  Tính tin cậy &  Tính uyển chuyển &  Tính trong sáng &  Tính hữu hiệu 17 CTDL – Khoa CNTH – Viện ĐH Mở HN III. CTDL và Thuật toán ! Xây dựng một bài toán cần: " Xác định Cấu trúc dữ liệu ! Đối tượng dữ liệu dùng trong bài toán $ Tổ chức biểu diễn được đối tượng " Xác định Thuật toán ! Các yêu cầu xử lý trên đối tượng đó $ Xác định và xây dựng thao tác xử lý trên đối tượng CTDL + Thuật toán = Chương trình Structure Data + Algorithm = Program 18 CTDL – Khoa CNTH – Viện ĐH Mở HN a. Cấu trúc dữ liệu – Structure Data ! Cấu trúc dữ liệu là một cách để tổ chức và lưu thông tin các đối tượng bài toán (thực tế) vào trong máy tính sao cho nó có thể được sử dụng một cách hiệu quả ! Các kiểu cấu trúc dữ liệu cơ bản: " Mảng, Bản ghi " Danh sách liên kết, Ngăn xếp, Hàng đợi " Cây " Đồ thị 19 CTDL – Khoa CNTH – Viện ĐH Mở HN !  Các yếu tố xác định một kiểu CTDL: "  Tên kiểu CTDL "  Miền giá trị "  Kích thước lưu trữ "  Tập các toán tử (thao tác) thực hiện trên kiểu dữ liệu đó !  Các tiêu chuẩn đánh giá một CTDL: "  Phản ảnh đúng thực tế "  Phù hợp với thao tác xử lý "  Tiết kiệm tài nguyên hệ thống !  Một cấu trúc dữ liệu được thiết kế tốt cho phép: "  Thực hiện nhiều phép toán, "  Sử dụng càng ít tài nguyên, "  Thời gian xử lý và không gian bộ nhớ tốt 20 CTDL – Khoa CNTH – Viện ĐH Mở HN b. Thuật toán - Algorithm: ! Thuật toán, còn gọi là giải thuật " là một bộ các qui tắc hay qui trình cụ thể nhằm giải quyết một vấn đề nào đó trong một số bước hữu hạn, " hoặc cho ra một kết quả (output) từ một tập hợp của các dữ liệu đưa vào (input) Input Output Thuật toán 21 CTDL – Khoa CNTH – Viện ĐH Mở HN * Tính chất của thuật toán ! Tính chính xác ! Tính rõ ràng ! Tính khách quan ! Tính phổ dụng ! Tính kết thúc 22 CTDL – Khoa CNTH – Viện ĐH Mở HN IV. Đánh giá độ phức tạp thuật toán ! Các tiêu chí lựa chọn thuật toán: "  1. Thuật toán đơn giản, dễ hiểu. "  2. Thuật toán dễ cài đặt (dễ viết chương trình) "  3. Thuật toán cần ít bộ nhớ "  4. Thuật toán chạy nhanh ! => để đánh giá thuật toán dựa vào độ phức tạp thuật toán ! Độ phức tạp thuật toán được thể hiện qua: "  Không gian "  Thời gian 23 CTDL – Khoa CNTH – Viện ĐH Mở HN a. Độ phức tạp không gian: ! Là tổng số chi phí về mặt không gian (bộ nhớ) cần thiết sử dụng cho thuật toán $ đánh giá dựa vào tổng số bộ nhớ khai báo cho các biến ! Chi phí bộ nhớ gồm: " Lưu dữ liệu vào - input " Lưu dữ liệu ra - output " Lưu các kết quả trung gian - temp 24 CTDL – Khoa CNTH – Viện ĐH Mở HN b. Độ phức tạp thời gian: !  là tổng thời gian cần thiết để hoàn thành thuật toán ! Được đánh giá dựa vào số lượng các thao tác được sử dụng trong thuật toán dựa trên bộ dữ liệu đầu vào !  Các thao tác được xem xét: "  Phép so sánh "  Phép cộng, trừ, nhân, chia, "  Phép toán thay đổi "  Phép gán "  Phép trả lại giá trị "  !  Khi xét độ phức tạp thuật toán chỉ tập trung vào độ phức tạp tính toán (độ phức tạp thời gian) 25 CTDL – Khoa CNTH – Viện ĐH Mở HN int sum (int n) { int sum, i ; sum = 0; i = 1; while (i < n) { sum = sum + i; i = i+ 1; } return sum; } No time 1 Unit 1 Unit n Unit (n Comparison) 2 x (n-1) Unit 2 x (n-1) Unit 1 Unit T"(n)"="1+1+n+2*(n+1)+2*(n+1)+1"="5n"+"1"" VD: Xác định độ phức tạp thuật toán 26 CTDL – Khoa CNTH – Viện ĐH Mở HN int Sum (int n) { int sum ; sum =0; for ( int i =0 ; i<n; i++) sum = sum + i; return sum; } VD: Xác định độ phức tạp không gian và thời gian thuật toán 27 CTDL – Khoa CNTH – Viện ĐH Mở HN %  Thời gian chạy trong trường hợp xấu nhất (worst-case running time) Là thời gian chạy lớn nhất của thuật toán đó trên tất cả các dữ liệu vào cùng cỡ, %  Thời gian chạy trung bình (average running time) Là số trung bình cộng của thời gian chạy của thuật toán đó trên tất cả các dữ liệu vào cùng cỡ n. 5 3 10 13 6 9 15 21 12 8 61 39 Best Case Worst Case Average Case %  Thời gian chạy trong trường hợp tốt nhất (best-case running time) Là thời gian chạy nhỏ nhất (1 lần chạy) của thuất toán đó trên tất cả dữ liệu vào cùng cỡ Ký hiệu thời gian : T(n), trong đó n là cỡ của dữ liệu vào.! 39"5" *Phân loại đánh giá: 28 CTDL – Khoa CNTH – Viện ĐH Mở HN c. Ký hiệu O: !  Để ước lượng độ phức tạp của một thuật toán ta thường dùng khái niệm O - lớn !  Định nghĩa: "  Giả sử T(n) và g(n) là các hàm của đối số nguyên n. "  Ta nói T(n) là ô lớn của g(n) và viết là: T(n) = O(g(n)) nếu tồn tại các hằng số dương c và n0 sao cho T(n) <= c.g(n) với mọi n >= n0. !  Giả sử f(n) = 5n3 + 2n2 + 13n + 6, ta có: f(n) = 5n3 + 2n2 + 13n + 6 <= 5n3 + 2n3 + 13n3 + 6n3 <= 26n3 f(n) = O(n3). 29 CTDL – Khoa CNTH – Viện ĐH Mở HN int sum (int n) { int sum, i ; sum = 0; i = 1; while (i < n) { sum = sum + i; i = i+ 1; } return sum; } No time 1 Unit 1 Unit n Unit (n Comparison) 2 x (n-1) Unit 2 x (n-1) Unit 1 Unit T"(n)"="1+1+n+2*(n+1)+2*(n+1)+1"="5n"+"1"" <="5n"+"1n" <="6n"" T"(n)"="O(n)" VD: Xác định độ phức tạp thuật toán (O-lớn) 30 CTDL – Khoa CNTH – Viện ĐH Mở HN int Sum (int n) { int sum ; sum = 0; for ( int i =1 ; i<=n; i++) { sum = sum + i*i*i; } return sum; } No time 1 Unit 3n + 2 Unit 4 *n Unit 1 Unit T"(n)"="1"+"3n"+"2"+"4*n"+"1"="7n"+"4"" <="7n"+"4n" <="11n"" T"(n)"="O(n)" VD: Xác định ký hiệu O –lớn của thuật toán 31 CTDL – Khoa CNTH – Viện ĐH Mở HN %  Vòng lặp đơn (for, while, do-while) for ( int i = 0; i<n ; i++) { s1, s2,, sk } Câu lệnh s1, s2, có dạng O(1) %  Các câu lệnh thông thường s1, s2,, sk (i = 1; i = i*i ) O(1) O(n) *Một số trường hợp ký tự O-lớn đặc biệt 32 CTDL – Khoa CNTH – Viện ĐH Mở HN %  Lưa chọn (if-else, switch) if ( condition ) { s1, s2,, sk } else { s1, s2,, sk } Câu lệnh s1, s2, có dạng O(1) O(1) 33 CTDL – Khoa CNTH – Viện ĐH Mở HN %  Vòng lặp lồng nhau (for, while, do-while) for ( int i = 0; i<n ; i++) { for ( int j = 0; j<n ; j ++) { s1, s2,sk } } Câu lệnh s1, s2, có dạng O(1) O(n2) 34 CTDL – Khoa CNTH – Viện ĐH Mở HN %  Tổng hợp (tuần tự, for, while, do-while) for( int k =0 ; k<n ; k++) { s1, s2,sk } s1, s2, , sk for ( int i = 0; i<n ; i++) { for ( int j = 0; j<n ; j++) { s1, s2,sk } } Câu lệnh s1, s2, có dạng O(1) O(n) O(n2) O(1) O(n2) 35 CTDL – Khoa CNTH – Viện ĐH Mở HN Ký hiệu ô lớn Tên gọi O(1) O(logn) O(n) O(nlogn) O(n2) O(n3) O(2n) hằng logarit tuyến tính nlogn bình phương lập phương mũ 36 CTDL – Khoa CNTH – Viện ĐH Mở HN V. Biểu diễn thuật toán ! Liệt kê theo bước ! Sơ đồ khối – flow chart ! Mã giả - Pseudocode " Dùng ngôn ngữ C để cài đặt thuật toán 37 CTDL – Khoa CNTH – Viện ĐH Mở HN * Sử dụng lưu đồ khối ! Là công cụ rất trực quan để diễn đạt các thuật toán ! Là hệ thống các nút có hình dạng khác nhau, thể hiện các chức năng khác nhau và được nối bởi các cung ! Các thành phần của lưu đồ khối: 38 CTDL – Khoa CNTH – Viện ĐH Mở HN int sum (int n) { int sum, i ; sum = 0; i = 1; while (i < n) { sum = sum + i; i = i+ 1; } return sum; } VD: Xây dựng sơ đồ thuật toán sau Begin i < n Sum = 0; i = 1; sum = sum + i i = i + 1 End return sum; Đúng Sai 39 CTDL – Khoa CNTH – Viện ĐH Mở HN VI. Giải thuật đệ quy (recursion) ! Khái niệm ! Bài toán ! Lời giải và giải thuật đệ quy 40 CTDL – Khoa CNTH – Viện ĐH Mở HN 1. Giải thuật đệ quy ! Giải thuật đệ quy là lời giải một bài toán P được thực hiện bằng lời giải của bài toán P khác có dạng giống như P, P phải nhỏ hơn P ! Ví dụ: " Tính giai thừa " Tính tổng các số nhỏ hơn hoặc bằng n 41 CTDL – Khoa CNTH – Viện ĐH Mở HN ! Định nghĩa một giải thuật đệ quy: " phần neo (anchor) ! Chỉ ra lời giải đơn giản của bài toán $ trường hợp đơn giản ! Có thể giải trực tiếp chứ không cần phải nhờ đến một bài toán con nào khác " phần đệ quy ! xác định những bài toán con đã có và bài toán cần giải thực hiện gọi đệ quy giải những bài toán con đó, ! để giải bài toán thì phối hợp các các bài toán con đã có lời giải lại với nhau theo nguyên tắc xác định # Ví dụ: Tính giai thừa & Phần tử neo: n = 1 & Phần đệ quy: Giai thừa (n) = n * Giai thừa (n-1) 42 CTDL – Khoa CNTH – Viện ĐH Mở HN 2. Phân loại hàm đệ quy # Đệ quy tuyến tính Trong thân hàm gọi 1 lần chính nó # Đệ quy nhị phân Thân hàm gọi 2 lần chính nó # Đệ quy phi tuyến Thân hàm lặp gọi nhiều lần chính nó # Đệ quy tương hỗ Hai hàm đệ quy gọi nhau int Giaithua ( int n ) { if (n==1) return 1; return n * Giaithua ( n-1 ); } long Fibonaci ( int n ) { if (n<=2) r t r ; else return Fibonaci( n – 2 + Fibonaci( n – 1 ); } long Tong ( int n ) { if (n<6) return n; long S = 0; for ( int i = 5; i > 0; i-- ) S = S + Tong( n-i ); return S; } long G( int n ); long U ( int n) { if (n<5) return n; return U(n-1) + G(n-2); } long G( int n ) { if (n<8) return n-3; return U(n-1) + G(n-2); } 43 CTDL – Khoa CNTH – Viện ĐH Mở HN 3. Kỹ thuật tìm giải thuật đệ quy #  Thông số hóa bài toán #  Tìm các điều kiện biên (điều kiện chặn) &  Lời giải với giá trị cụ thể &  Tìm giải thuật cho các tình huống này #  Tìm giải thuật tổng quát theo hướng đệ quy lui dần về tình huống bị chặn #  Thực hiện cài đặt &  Viết chương trình theo đúng thứ tự công thức đệ quy 44 CTDL – Khoa CNTH – Viện ĐH Mở HN 45 Ví dụ: Thực hiện giải bài toán tính tổng các số nguyên nhỏ hơn hoặc bằng n bằng đệ quy (n là số nguyên dương) CTDL – Khoa CNTH – Viện ĐH Mở HN VD: TÍNH TỔNG N PHẦN TỬ CỦA MẢNG A Thông số hóa: int a[ ], int n Điều kiện biên: Mảng 0 phần tử thì tổng bằng 0. Giải thuật tổng quát Sum (a, n) = a[0] + a[1] + a[2] + ... + a[n-2] + a[n-1] Sum(a, n-1) Sum (a, n) = 0 nếu n=0 a[n-1] + Sum (a, n-1) với n>=1 46 CTDL – Khoa CNTH – Viện ĐH Mở HN VD: TÍNH TỔNG N PHẦN TỬ CỦA MẢNG A (tiếp) int Sum ( int a[ ], int n) { if ( n == 0 ) return 0; else return ( a[n-1] + Sum (a, n-1) ); } Cài đặt thuật toán 47 CTDL – Khoa CNTH – Viện ĐH Mở HN VD2: Tìm trị lớn nhất của mảng a gồm n phần tử ! Điều kiện biên: Mảng 1 phần tử thì trị lớn nhất là a[0]. !  Giải thuật chung: Max(a,n) = a[0] , a[1] , a[2] , ... , a[n-2] , a[n-1] Max(a, n-1 ) Max (a,n) = a[0] , n=1 a[n-1] > Max(a, n-1)? a[n-1] : Max(a,n-1) Sv tự viết 48 CTDL – Khoa CNTH – Viện ĐH Mở HN Cài đặt đệ quy tìm phần tử lớn nhất trong mảng float Max ( float a[ ], int n ) { if (n==1) return a[0]; else return ((a[n-1] > Max(a, n-1))? a[n-1] : Max(a,n-1)); } 49 CTDL – Khoa CNTH – Viện ĐH Mở HN BÀI TẬP VỀ NHÀ ! Giải bài toán tìm phần tử lớn nhất của mảng a gồm n số nguyên bằng đệ quy ! Yêu cầu: " Viết bằng tay đầy đủ các bước để giải " Đầu giờ sau nộp lại cho GV 50 CTDL – Khoa CNTH – Viện ĐH Mở HN Tóm lược bài học Các khái niệm CTDL và thuật toán Đánh giá độ phức tạp thuật toán Biểu diễn thuật toán Các bước thiết kế thuật toán Giải thuật đệ quy 51 CTDL – Khoa CNTH – Viện ĐH Mở HN Bài tập về nhà !  Làm theo nhóm !  Trình bày đầy đủ - chi tiết các bước để giải quyết bài toán !  Bài toán: cho thông tin của hàng hóa gồm: mã hàng hóa, tên hàng hóa, số lượng và đơn giá. Viết chương trình quản lý hàng hóa với các yêu cầu: "  Nhập vào một danh sách hàng hóa "  In lại danh sách hàng hóa "  In danh sách hàng hóa có đơn giá trên 50000 "  Tính tổng tiền của tất cả các hàng hóa "  Đếm số hàng hóa có số lượng dưới 20 !  Yêu cầu: "  Cài đặt code "  Làm báo cáo chi tiết các bước để giải bài toán (viết tay hoặc đánh máy) 52 CTDL – Khoa CNTH – Viện ĐH Mở HN Bài tập viết hàm đệ quy ! Tính tổng các số nguyên nhỏ hơn hoặc bằng n ! Tính tổng các phần tử của mảng a gồm n số nguyên ! BTVN: Bài tập viết hàm đệ quy "  Tính số Fibonaci thứ n "  Tìm phần tử lớn nhất của mảng a gồm n phần tử 54 CTDL – Khoa CNTH – Viện ĐH Mở HN 5. Nhận xét về hàm đệ quy HÀM ĐỆ QUY: Vừa tốn bộ nhớ vừa chạy chậm vì gọi hàm nhiều   Giải thuật đệ quy đẹp (gọn gàng), dễ chuyển thành chương trình.   Nhiều ngôn ngữ không hỗ trợ giải thuật đệ quy (Fortran).   Nhiều giải thuật rất dễ mô tả dạng đệ quy nhưng lại rất khó mô tả với giải thuật không-đệ-quy. 68 CTDL – Khoa CNTH – Viện ĐH Mở HN 7. Khử đệ quy !  Là quá trình chuyển đổi 1 giải thuật đệ quy thành giải thuật không đệ quy. !  Chưa có giải pháp cho việc chuyển đổi này một cách tổng quát. !  Cách tiếp cận: " Dùng quan điểm đệ quy để tìm giải thuật cho bài toán. " Mã hóa giải thuật đệ quy. " Khử đệ quy để có giải thuật không-đệ-quy. 69 CTDL – Khoa CNTH – Viện ĐH Mở HN *Khử đệ quy bằng vòng lặp ! Ý tưởng: Lưu lại các trị của các lần tính toán trước làm dữ liệu cho việc tính toán của lần sau. ! Đi từ điều kiện biên đi tới điều kiện kết thúc. 70 CTDL – Khoa CNTH – Viện ĐH Mở HN Thí dụ: Hàm tính giai thừa của n long GiaiThua( int n) { if (n<2) return 1; return n * GiaiThua(n-1); } Trị cần lưu long GiaiThua( int n) { long K=1; for (int i =2; i<=n;i++) K=K*i; return K; } Điều kiện biên K chính là kết qủa của trị giai thừa trước đó 71 CTDL – Khoa CNTH – Viện ĐH Mở HN Thí dụ hàm tính trị thứ n của dãy Fibonacci: 1 1 2 3 5 8... long Fibo(int n) { if (n<=2) return 1; // hai chặn return Fibo(n-2) + Fibo (n-1); } t 1 t 2 t3=t1+t2 t1 t2 t3 t1 t2 t3 t1 t2 t3 long Fibo(int n) { if (n<=2) return 1; // hai chặn long t1=1, t2=1; for (int i=3; i<=n;i++) { t3=t1+t2; t1=t2; t2= t3; } return t3; } i = 3 4 5 6 72 CTDL – Khoa CNTH – Viện ĐH Mở HN BTVN ! Làm bài tập về nhà số 01, viết ra giấy, đầu giờ buổi sau thu ! Đọc và nghiên cứu trước giáo trình phần: " Thuật toán tìm kiếm (tuyến tính và nhị phân) " Thuật toán sắp xếp (selection, insertion ) " Mỗi thuật toán xác định: ! Ý tưởng ! Các bước thực hiện ! Đánh giá độ phức tạp thuật toán ! Lấy ví dụ minh họa 77