Việc xác định bài toán tức là phải xác định xem ta phải giải quyết vấn đề gì?,
Trang 1Chương 1: THUẬT TOÁN VÀ PHÂN TÍCH THUẬT TOÁN
1 Giải bài toán trên máy tính
Xác định bài toán
Việc xác định bài toán tức là phải xác định xem ta phải giải quyết vấn đề gì?, với giả thiết nào đã cho và lời giải cần phải đạt những yêu cầu nào
Input → Process → Output (Dữ liệu vào → Xử lý → Kết quả ra)
Đối với những bài toán tin học ứng dụng trong thực tế, lời giải cần tìm chỉ cần tốt tới mức nào đó, thậm chí là tồi ở mức chấp nhận được Bởi lời giải tốt nhất đòi hỏi quá nhiều thời gian và chi phí
Ví dụ:
Khi cài đặt các hàm số phức tạp trên máy tính Nếu tính bằng cách khai triển chuỗi vô hạn thì độ chính xác cao hơn nhưng thời gian chậm hơn hàng tỉ lần so với phương pháp xấp xỉ.
Trên thực tế việc tính toán luôn luôn cho phép chấp nhận một sai số nào đó nên các hàm số trong máy tính đều được tính bằng phương pháp xấp xỉ của giải tích số
Xác định đúng yêu cầu bài toán là rất quan trọng bởi nó ảnh hưởng tới cách thức giải quyết và chất lượng của lời giải Một bài toán thực tế thường cho bởi những thông tin khá mơ hồ và hình thức, ta phải phát biểu lại một cách chính xác
và chặt chẽ để hiểu đúng bài toán
Ví dụ:
• Bài toán: Một dự án có n người tham gia thảo luận, họ muốn chia thành các nhóm và mỗi nhóm thảo luận riêng về một phần của dự án Nhóm có bao nhiêu người thì được trình lên bấy nhiêu ý kiến Nếu lấy ở mỗi nhóm một ý kiến đem ghép lại thì được một bộ ý kiến triển khai dự án Hãy tìm cách chia để số bộ ý kiến cuối cùng thu được là lớn nhất.
• Phát biểu lại: Cho một số nguyên dương n, tìm các phân tích n thành tổng các số nguyên dương sao cho tích của các số đó là lớn nhất.
Trên thực tế, ta nên xét một vài trường hợp cụ thể để thông qua đó hiểu được bài toán rõ hơn và thấy được các thao tác cần phải tiến hành Đối với những bài
Trang 2toán đơn giản, đôi khi chỉ cần qua ví dụ là ta đã có thể đưa về một bài toán quen thuộc để giải
Lựa chọn hoặc thiết kế thuật toán
a Lựa chọn thuật toán
Chúng ta biết rằng mỗi thuật toán chỉ giải một bài toán, một bài toán có nhiều thuật toán để giải Vì vậy cần phải chọn một giải thuật phù hợp để giải bài toán đã đặt ra sao cho đạt hiệu quả nhất
Việc chọn một thuật toán để giải bài toàn ta thường quan tâm đến các yếu tố sau: yếu tố không gian để biểu diễn bài toán, lưu trữ các kết quá tính toán trung gian, kết quả của bài toán, yếu tố về mặt thời gian chạy của chương trình và yếu tố thuật tiện cho việc cài đặt thuật toán Ngoài ra, ta còn phải căn cứ vào lượng tài nguyên mà thuật toán đòi hỏi và lượng tài nguyên thực tế cho phép của hệ thống b) Diễn tả thuật toán
Việc diễn tả một thuật toán có thể bằng cách liệt kê, sơ đồ khối hoặc bằng một ngôn ngữ điều khiển
Vi dụ Thuật chia Ơ-clit
Sẽ tồn tại duy nhất hai số nguyên q và r sao cho a = q.b + r với 0 ≤ r < b, trong
đó q được gọi là thương của phép chia a cho b và r được gọi là phần dư
Cho trước a và b, ta cần tìm q và r Ta có:
C Input: Hai số nguyên dương a và b;
C Output: Đưa ra thương số q và số dư r.
♠ Ý tưởng: Nếu a < b thì q = 0 và r = a Còn nếu a > b thì a giảm đi một giá
trị bằng b và q tăng lên 1 Quay trở lại lặp cho đến khi a < b thì kết thúc
Bước 3: Viết chương trình
Việc viết chương trình là một tổng hợp hữu cơ giữa việc lựa chọn cấu trúc dữ liệu và ngôn ngữ lập trình để diễn đạt đúng thuật toán Bên cạnh là thuật chia Ơ-clit viết bằng ngôn ngữ Pascal
Bước 4: Hiệu chỉnh
Sau khi được viết xong, chương trình vẫn còn có thể có nhiều lỗi khác nhau chưa phát hiện được.Vì vậy, cần phải thử chương trình bằng cách thực hiện nó với một số bộ Input tiêu biểu phụ thuộc vào đặc thù của bài toán Các bộ Input này được gọi là các test
Trang 3Bước 5: Viết tài liệu
Tài liệu phải mô tả chi tiết bài toán, thiết kế thuật toán, chương trình, kết quả thử nghiệm và hướng dẫn sử dụng
Các bước trên có thể lặp đi lặp lại nhiều lần cho đến khi mà ta cho là chương trình đó làm việc đúng đắn
2 Mô hình dữ liệu (Data Model)
Mô hình dữ liệu là các trừu tượng dùng để mô tả bài toán: Mô hình toán học,
ví dụ đồ thị, tập hợp, danh sách, cây Một mô hình dữ liệu thường có hai khía cạnh:
- Giá trị mà đối tượng có thể nhận được, ví dụ đối tượng nhận giá trị nguyên, thực,… Đó là khía cạnh tĩnh (static) của mô hình dữ liệu, nó cho biết những giá trị mà một đối tượng có thể nhận được Thành phần tĩnh này gọi là kiểu
dữ liệu (type data).
- Các phép toán ( operation) trên mô hình đó, ví dụ: các phép cộng trừ số nguyên, số thực chẳng hạn Đây là khía cạnh động ( dynamic) của mô hình, cho biết cách thức thay đổi giá trị để thu được giá trị mới.
Mô hình dữ liệu của các ngôn ngữ lập trình
Mỗi chương trình có quyền truy/xuất đến các “ hộp” có thể xem như những
vùng lưu trữ Một hộp có một kiểu (type), chẳng hạn như Int hoặc Char Thường
ta gọi những giá trị được lưu trong hộp là các đối tượng dữ liệu (data object) Ta hoàn toàn có thể đặt tên cho các hộp này
3 Kiểu dữ liệu có cấu trúc
Trong thực tế chỉ với các kiểu dữ liệu cơ sở không đủ biểu diễn các bài, dẫn đến nhu cầu phải xây dựng các kiểu dữ liệu mới dựa trên việc tổ chức, liên kết các thành phần dữ liệu có kiểu dữ liệu đã được định nghĩa Những kiểu dữ liệu được xây dựng như thế gọi là kiểu dữ liệu có cấu trúc (hay còn gọi là cấu trúc dữ liệu) Đa số các ngôn ngữ lập trình đều cài đặt sẵn một số kiểu có cấu trúc cơ bản như mảng, chuỗi, tập tin, bản ghi và cung cấp cơ chế cho lập trình viên tự định nghĩa kiểu dữ liệu mới
Giả sử đã có cấu trúc phù hợp để lưu trữ một sinh viên, nhưng thực tế lại cần quản
lý nhiều sinh viên, lúc đó nảy sinh nhu cầu xây dựng kiểu dữ liệu mới Mục tiêu của việc nghiên cứu cấu trúc dữ liệu chính là tìm những phương cách thích hợp để tổ chức, liên kết dữ liệu, hình thành các kiểu dữ liệu có cấu trúc từ những kiểu dữ liệu đã được định nghĩa
Trang 44 Khái niệm thuật toán
4.1 Khái niệm thuật toán
Thuật toán để giải một bài toán là một dãy hữu hạn các thao tác được sắp xếp theo một trình tự xác định sao cho sau khi thực hiện dãy thao tác đó, từ Input của bài toán này ta nhận được Output cần tìm
Ví dụ: Cần tìm giá trị lớn nhất của dãy số a1, a2, …,an,
Ta xác định bài toán gồm:
- Input : Số nguyên dương N và dãy số a1, a2, , , aN.
- Output : Tìm Max là giá trị lớn nhất của dãy đã cho.
Ý t ưởng thuật toán:
Giả thiết Max=a1.Bắt đầu từ số hạng thứ 2 đến số hạng thứ N, lần lượt đối sánh ai với Max Với mỗi i, nếu ai > Max thì thay giá trị Max hiện thời bằng ai
4.2 Mô tả thuật toán
a) Cách liệt kê
Cách này sử dụng ngôn ngữ tự nhiên, kết hợp với ngôn ngữ toán học thông thường để liệt kê các bước và các thao tác của thuật toán Trong mỗi bước xác định các thao tác cần thực hiện và thứ tự thực hiện các bước tiếp theo Ví dụ, với bài toán đã xác định ở trên, ta có thể mô tả thuật toán giải bằng cách liệt kê như sau: Bước 1 Nhập N và dãy a1, , aN
Bước 2 Đặt Max = a1, i = 2
Bước 3 Nếu i > N thì chuyển đến bước 5
Bước 4
4.1 N ếu ai > Max thì đ ặt Max = ai
4.2 Đ ặt i=i+1 ( T ăng i lên 1) rồi quay lại bước 3
Bước 5 Đưa ra Max rồi kết thúc
b) Sơ đồ khối
- Để có thể mô tả thuật toán một cách trực quan, người ta dùng một số hình
vẽ kết hợp chú thích bằng lời Thường hay dùng các hình vẽ chủ yếu sau: