Bài toán và thuật toán: Khám phá ngôn ngữ lập trình máy tính
Trong lĩnh vực tin học, bài toán và thuật toán là hai khái niệm quan trọng không thể thiếu. Chúng đóng vai trò trung tâm trong quá trình giải quyết vấn đề bằng máy tính. Cùng tìm hiểu những điểm cơ bản về bài toán và thuật toán nhé!
Bài toán: Sự muốn máy tính thực hiện
Bài toán là một việc cần máy tính thực hiện. Nó bao gồm hai yếu tố chính là thông tin đưa vào (input) và thông tin cần tìm (output). Input là những thông tin đã biết và được đưa vào máy tính, trong khi output là những thông tin mà chúng ta mong muốn lấy ra từ máy tính.
Ví dụ về bài toán:
- Tìm ước số chung lớn nhất (USCLN) của hai số nguyên dương.
- Tìm số lớn nhất trong ba số nguyên dương a, b, c.
- Tìm nghiệm của phương trình bậc nhất: ax + b = 0 (a≠0).
Thuật toán: Cấu trúc giải quyết một bài toán
Thuật toán được sử dụng để giải quyết một bài toán. Nó gồm một dãy hữu hạn các thao tác, được thực hiện theo một trình tự xác định. Sau khi thực hiện xong các thao tác đó, chúng ta sẽ nhận được kết quả (output) đúng đắn của bài toán.
Có hai cách để biểu diễn thuật toán:
-
Sử dụng phương pháp liệt kê: Nêu ra tuần tự các thao tác cần tiến hành. Ví dụ: Cho bài toán Tìm nghiệm của phương trình bậc 2: ax2 + bx + c = 0 (a≠0)
- Xác định bài toán:
- Input: Các số thực a, b, c
- Output: Các số thực x thỏa mãn ax2 + bx + c = 0 (a≠0)
- Thuật toán:
- Bước 1: Nhập a, b, c (a≠0)
- Bước 2: Tính Δ = b2 - 4ac
- Bước 3: Nếu Δ > 0 thì phương trình có 2 nghiệm là
- x₁ = (-b + √Δ) / (2a)
- x₂ = (-b - √Δ) / (2a)
- Bước 4: Nếu Δ = 0 thì phương trình có nghiệm kép x₁,₂ = -b / (2a)
- Bước 5: Kết luận phương trình vô nghiệm
- Xác định bài toán:
-
Sử dụng sơ đồ khối: Biểu diễn các thao tác bằng các hình học phù hợp.
- Hình thoi: thể hiện thao tác so sánh.
- Hình chữ nhật: thể hiện các phép tính toán.
- Hình ô van: thể hiện thao tác nhập, xuất dữ liệu.
- Các mũi tên: qui định trình tự thực hiện các thao tác.
Bài toán 1: Kiểm tra tính nguyên tố
Xác định bài toán
- Input: N là một số nguyên dương
- Output: N là số nguyên tố hoặc N không là số nguyên tố
- Định nghĩa: "Một số nguyên dương N là số nguyên tố nếu nó chỉ có đúng hai ước là 1 và N"
- Tính chất:
- Nếu N = 1 thì N không là số nguyên tố
- Nếu 1 < N < 4 thì N là số nguyên tố
Ý tưởng
- N < 4: Xem như bài toán đã được giải quyết
- N >= 4: Tìm ước số đầu tiên > 1 của N
- Nếu ước đó < N thì N không là số nguyên tố (vì N có ít nhất 3 ước: 1, ước đó và N)
- Nếu ước đó = N thì N là số nguyên tố
Xây dựng thuật toán
a) Cách liệt kê
- Bước 1: Nhập số nguyên dương N
- Bước 2: Nếu N = 1 thì thông báo "N không là số nguyên tố", kết thúc
- Bước 3: Nếu N < 4 thì thông báo "N là số nguyên tố", kết thúc
- Bước 4: (i ← 2)
- Bước 5: Nếu i là ước của N thì đến bước 7
- Bước 6: (i ← i + 1) rồi quay lại bước 5; (Tăng i lên 1 đơn vị)
- Bước 7: Nếu i = N thì thông báo "N là số nguyên tố", ngược lại thì thông báo "N không là số nguyên tố", kết thúc
b) Sơ đồ khối
Lưu ý: Nếu N >= 4 và không có ước trong phạm vi từ 2 đến phần nguyên căn bậc 2 của N thì N là số nguyên tố
Bài toán 2: Sắp xếp bằng cách tráo đổi
Xác định bài toán
- Input: Dãy A gồm N số nguyên a₁, a₂,..., aᵣ
- Output: Dãy A được sắp xếp thành dãy không giảm
- Dãy A sau khi sắp xếp: a₁, a₂,..., aᵣ
Ý tưởng
- Với mỗi cặp số hạng đứng liền kề trong dãy, nếu số trước > số sau ta đổi chỗ chúng cho nhau. (Các số lớn sẽ được đẩy dần về vị trí xác định cuối dãy)
- Việc này lặp lại nhiều lượt, mỗi lượt tiến hành nhiều lần so sánh cho đến khi không có sự đổi chỗ nào xảy ra nữa
Xây dựng thuật toán
- Bước 1. Nhập N, các số hạng a₁, a₂,..., aᵣ
- Bước 2. Đầu tiên gọi M là số số hạng cần so sánh, vậy M sẽ chứa giá trị của N: (M ← N)
- Bước 3. Nếu số số hạng cần so sánh < 2 thì dãy đã được sắp xếp. Kết thúc
- Bước 4. M chứa giá trị mới là số phép so sánh cần thực hiện trong lượt: (M ← M - 1). Gọi i là số thứ tự của mỗi lần so sánh, đầu tiên i = 0
- Bước 5. Để thực hiện lần so sánh mới, i tăng lên 1 (lần so sánh thứ i)
- Bước 6. Nếu lần so sánh thứ i > số phép so sánh M: đã hoàn tất M số phép so sánh của lượt này. Lặp lại bước 3, bắt đầu lượt kế (với số số hạng cần so sánh mới chính là M đã giảm 1 ở bước 4)
- Bước 7. So sánh 2 phần tử ở lần thứ i là aᵢ và aᵢ₊₁. Nếu aᵢ > aᵢ₊₁ thì tráo đổi 2 phần tử này
- Bước 8. Quay lại bước 5
a) Đối chiếu, hình thành các bước liệt kê
- Bước 1: Nhập N, các số hạng a₁, a₂,..., aᵣ
- Bước 2: (M ← N)
- Bước 3: Nếu M < 2 thì đưa ra dãy A đã được sắp xếp, rồi kết thúc
- Bước 4: (M ← M - 1; i ← 0)
- Bước 5: (i ← i - 1)
- Bước 6: Nếu i > M thì quay lại bước 3
- Bước 7: Nếu aᵢ > aᵢ₊₁ thì tráo đổi aᵢ và aᵢ₊₁ cho nhau
- Bước 8: Quay lại bước 5
b) Sơ đồ khối
Bài toán 3: Tìm kiếm tuần tự
Xác định bài toán
- Input: Dãy A gồm N số nguyên khác nhau a₁, a₂,..., aᵣ và một số nguyên k (khóa)
- Output: Vị trí i mà aᵢ = k hoặc thông báo không tìm thấy k trong dãy. Vị trí của 2 trong dãy là 5 (không tìm thấy 6)
Ý tưởng
Tìm kiếm tuần tự được thực hiện một cách tự nhiên: Lần lượt đi từ số hạng thứ nhất, ta so sánh giá trị số hạng đang xét với khóa cho đến khi gặp một số hạng bằng khóa hoặc dãy đã được xét hết mà không tìm thấy giá trị của khóa trên dãy.
Xây dựng thuật toán
a) Cách liệt kê
- Bước 1: Nhập N, các số hạng a₁, a₂,..., aᵣ và giá trị khóa k
- Bước 2: (i ← 1)
- Bước 3: Nếu aᵢ = k thì thông báo chỉ số i, rồi kết thúc
- Bước 4: (i ← i + 1)
- Bước 5: Nếu i > N thì thông báo dãy A không có số hạng nào có giá trị bằng k, rồi kết thúc
- Bước 6: Quay lại bước 3
b) Sơ đồ khối
Bài toán 4: Tìm kiếm nhị phân
Xác định bài toán
- Input: Dãy A là dãy tăng gồm N số nguyên khác nhau a₁, a₂,..., aᵣ và một số nguyên k
- Output: Vị trí i mà aᵢ = k hoặc thông báo không tìm thấy k trong dãy. Vị trí của 21 trong dãy là 6 (không tìm thấy 25)
Ý tưởng
- Sử dụng tính chất dãy A đã sắp xếp tăng, ta tìm cách thu hẹp nhanh vùng tìm kiếm bằng cách so sánh k với số hạng ở giữa phạm vi tìm kiếm (aᵢgiữa), khi đó chỉ xảy ra một trong ba trường hợp:
- Nếu aᵢgiữa = k thì tìm được chỉ số i, kết thúc
- Nếu aᵢgiữa > k thì việc tìm kiếm thu hẹp chỉ xét từ aᵢđầu (phạm vi) → aᵢgiữa - 1
- Nếu aᵢgiữa < k việc tìm kiếm thu hẹp chỉ xét từ aᵢgiữa + 1 → aᵢcuối (phạm vi)
Xây dựng thuật toán
a) Cách liệt kê
- Bước 1: Nhập N, các số hạng a₁, a₂,..., aᵣ và giá trị khóa k
- Bước 2: Đầu ← 1; Cuối ← N
- Bước 3: Giữa ← [(Đầu + Cuối) / 2]
- Bước 4: Nếu aᵢgiữa = k thì thông báo chỉ số Giữa, rồi kết thúc
- Bước 5: Nếu aᵢgiữa > k thì đặt Cuối ← Giữa - 1 rồi chuyển sang bước 7
- Bước 6: Đầu ← Giữa + 1
- Bước 7: Nếu Đầu > Cuối thì thông báo không tìm thấy khóa k trên dãy, rồi kết thúc
- Bước 8: Quay lại bước 3
b) Sơ đồ khối