Chương7 - Giảithuật xử lý thông tin
CHƯƠNG 7.GIẢITHUẬT
7.1. KHÁI NIỆM BÀI TOÁN VÀ GIẢI THUẬT
Trước khi xem xét đặc trưng của “bài toán” ta xét một số ví dụ.
Ví dụ 1. Bài toán kiểm tra tính nguyên tố.
Cho: Số nguyên dương N;
Cần biết: N có là số nguyên tố hay không?
Ví dụ 2. Bài toán quản lý hồ sơ cán bộ.
Cho: Hồ sơ gốc của các cán bộ trong cơ quan
Cần biết: Bảng thống kê, phân loại cán bộ theo trình độ văn hoá
Qua các ví dụ trên, ta thấy các bài toán được cấu tạo bởi hai thành phần cơ bản:
Thông tin vào (input): cái cho trước
Thông tin ra (output): cái cần tìm
Như vậy, việc cho một bài toán có nghĩa là mô tả rõ input và output của nó. Cho bài toán
nghĩa là làm rõ câu hỏi "Có các dữ kiện gì và phải làm gì?" nhưng không cho biết "Phải
làm thế nào". Việc giải bài toán có nghĩa là xuất phát từ input dùng một số hữu hạn số lần
thực hiện các thao tác thích hợp để tìm được output theo yêu cầu của bài toán đã đề ra.
Lưu ý rằng trong toán học có một xu hướng nghiên cứu định tính các bài toán. Theo xu
hướng này, khi xem xét các bài toán, người ta chỉ cần chứng tỏ sự tồn tại của output khi
cho input và nếu có thể, xét xem có bao nhiêu "lời giải" và nghiên cứu tính chất của chúng.
Trong các nghiên cứu như vậy, nhiều khi ta không cần tìm ra lời giải một cách tường minh
nhưng bằng cách dùng các công cụ toán học khác nhau một cách thích hợp ta vẫn có thể
chứng minh chặt chẽ các điều khẳng định liên quan đến lời giải. Chẳng hạn, định lý của
giải tích khẳng định rằng nếu hàm f(x) liên tục trên đoạn [a, b] và f(a). f(b)<0 thì tồn tại
điểm c nằm giữa a và b sao cho f’(c) = 0. Sự tồn tại lời giải theo nghĩa này không luôn cho
ta cách thức khả thi để tìm ra lời giải.
Ở đây, ta sẽ quan niệm việc giải bài toán là việc xác định tường minh output theo input
bằng một quá trình có thể thực hiện một cách hiệu quả. Đó chính là nội dung cơ bản của lý
thuyết tính toán.
Theo lý thuyết tính toán, một quá trình gồm một dãy hữu hạn các thao tác có thể thực hiện
được sắp xếp theo một trình tự xác định dùng để giải một bài toán được gọi là một giải
thuật (algorithm). Như vậy, khác với quan niệm về việc giải một bài toán theo toán học
truyền thống, việc giải bài toán theo quan niệm của tin học có nghĩa là chỉ ra một giải thuật
tường minh mà về nguyên tắc, các thao tác này có thể "giao cho máy tính làm được".
Quan niệm như vậy về việc giải bài toán là cốt lõi để ta có thể chuyển giao công việc đó
cho máy tính. Bản thân máy tính là một thiết bị vật lý vô tri vô giác, do đó với thể hiện vật
lý cụ thể, máy tính chỉ có thể thực hiện được các thao tác rất đơn giản (tất nhiên với tốc độ
rất nhanh).
Ví dụ, cho hai số nguyên dương a, b. Cần xây dựng giảithuật để tìm ước số chung lớn nhất
(UCLN) của a và b. Dưới đây là giảithuật Euclid đề xuất cho bài toán nêu trên dựa trên
một tính chất hiển nhiên là : Nếu a = b thì chính b là USCLN của a và b. Ngược lại thì
USCLN(a,b) = USCLN(b-a, a) nếu a < b và USCLN(a,b) = USCLN(b, a-b) nếu a>b.
52
Chương 7 - Giảithuật xử lý thông tin
Bài toán
input : a, b nguyên dương
output: UCLN của a và b
Giải thuật Euclid
Bước 1: Nhập a và b
Bước 2: Nếu a = b thì lấy giá trị chung này làm USCLN rồi kết thúc.
Bước 3: Nếu a> b thì bớt a đi một lượng là b rồi chuyển bước 5.
Bước 4: Bớt b đi một lượng là a rồi quay trở lại bước 2.
Bước 5: Kết thúc.
Các thao tác bao gồm:
Phép gán trị: xây dựng các giá trị của đối tượng (ví dụ bớt a đi một lượng là b hay
cho USCLN là a).
Phép dừng, kết thúc quá trình xử lý.
Phép chuyển có hoặc không có điều kiện cho phép thực hiện tiếp từ một bước nào
đó ví dụ sau bước 2 quay trở lại bước 1.
Ở cuối bước 3 của giảithuật trên ta gặp thao tác "trở lại bước 2". Trong trường hợp này bộ
xử lý sẽ chuyển sang thực hiện bước 2 của giải thuật. Khi diễn đạt giảithuật ta ngầm qui
định rằng nếu không gặp phép chuyển điều khiển thì bộ xử lý sẽ thực hiện tuần tự: sau
bước thứ i sẽ chuyển sang bước thứ i + 1. Như vậy bước 3 nếu không quay về bước 2 thì sẽ
thực hiện tiếp bước 4.
7.2. MỘT SỐ ĐẶC TRƯNG CỦA GIẢI THUẬT
Người ta thường liệt kê các đặc trưng sau đây của giải thuật:
7.2.1. Tính kết thúc (tính dừng)
Giải thuật phải đưa ra được output sau một số hữu hạn bước thực hiện. Giảithuật Euclid
tìm UCLN thoả mãn tính dừng vì sau mỗi bước ta thấy tổng a+b giảm thực sự nhưng
không được hơn 2. Vì vậy quá trình trên nhất định phải dừng sau một số hữu hạn bước.
Lưu ý rằng số bước của một quy tắc thao tác có thể là hữu hạn nhưng quy tắc đó không có
tính dừng. Ví dụ, Xét quy tắc sau:
Bước 1: Xoá bảng
Bước 2: Vẽ hình tròn
Bước 3: Quay lại bước 1
Quy tắc đó có 3 bước nhưng không có tính dừng
7.2.2. Tính xác định
Tính xác định của giảithuật đòi hỏi ở mỗi bước các thao tác phải hoàn toàn xác định, đơn
trị không có sự nhập nhằng, lẫn lộn, tuỳ tiện. Nói cách khác, trong cùng một điều kiện, các
chủ thể xử lý dù là người hay máy thực hiện cùng một bước của giảithuật thì phải cho
cùng một kết quả.
Nhờ tính chất này mà việc thực hiện thuật toán thuần tuý mang tính cơ học, không cần bất
kỳ một sự chỉ dẫn nào về cách giải bài toán cả.
53
Chương 7 - Giảithuật xử lý thông tin
7.2.3. Tính phổ dụng
Tính phổ dụng có nghĩa là một giảithuật có thể được áp dụng với một lớp các bài toán với
input thay đổi chứ không chỉ áp dụng cho một trường hợp cụ thể. Giảithuật Euclid nói trên
có thể áp dụng cho bất kỳ cặp hai số tự nhiên
Cần lưu ý là trong khi tính dừng và tính xác định là điều kiện cần để một quá trình là một
giải thuật thì tính phổ dụng chỉ là một tính chất thường thấy vì có nhiều bài toán có input
hoàn toàn xác định, không tồn tại một lớp các bài toán tương tự.
7.2.4. Đại lượng vào
Mỗi giảithuật có một hoặc nhiều đại lượng vào. Ví dụ, Giảithuật Euclid ở trên có đại
lượng vào là a và b.
7.2.5. Đại lượng ra
Sau khi giảithuật đã được thực hiện xong nó phải cho ra kết quả: Ví dụ, Giảithuật Euclid
cho UCLN của 2 số a và b
7.3. CÁC PHƯƠNG PHÁP DIỄN TẢ GIẢI THUẬT
Người ta thường diễn tả giảithuật bằng một trong ba cách thức sau đây:
7.3.1. Liệt kê từng bước
Liệt kê ra các thao tác, các chỉ thị thực hiện bằng ngôn ngữ tự nhiên.
Ví dụ, có N que diêm. Hai người chơi luân phiên bốc diêm. Mỗi lượt, mỗi người bốc từ 1
đến 3 que diêm. Người nào bốc cuối cùng sẽ thắng cuộc. Giảithuật để người đi trước luôn
thắng cuộc được diễn tả bằng cách liệt kê từng bước như sau:
Bước 1: Nhập N.
Bước 2: Bốc 3 que rồi đợi đối phương đi.
Bước 3: Đối phương bốc (giả sử x que, 0<x<4).
Bước 4: Đến lượt người đi trước bốc a = (4-x) que. Nếu còn diêm thì quay lại bước 3.
Bước 5: Tuyên bố thắng cuộc - kết thúc.
7.3.2. Lưu đồ (flow chart) hay còn gọi là sơ đồ khối
Lưu đồ là một phương tiện hình học giúp ta diễn tả giảithuật một cách trực quan. Lưu đồ
được tạo bởi các kiểu khối cơ bản nối với nhau bằng các đường có hướng. Sau đây là một
số khối được dùng để diễn đạt giải thuật.
Hình 7.1. Các loại biểu diễn hình học trong sơ đồ khối
Khối tính toán được biểu diễn bằng hình chữ nhật. Trong khối này ta viết một hoặc một
dãy các thao tác như tạo giá trị, hoặc là một nhóm công việc. Nếu để thể hiện việc tính giá
54
Khối điều kiện
Khối chỉ điểm
bắt đầu
Khối chỉ điêm
kết thúc
Hướng xử lý
Khối input
Khối output
Khối thao
tác tuần tự
Chương 7 - Giảithuật xử lý thông tin
trị ta sẽ dùng dấu gán := với ý nghĩa đại lượng đứng bên trái dấu gán được gán giá trị cho
biểu thức phía phải dấu gán. Khối tính toán có nhiều đường đi đến và 1 đường đi ra.
Khối điều kiện được biểu diễn bằng hình thoi. Trong khối này ta viết một điều kiện. Tuỳ
theo điều kiện này thoả mãn hay không mà việc thực hiện tiếp theo sẽ được chỉ dẫn bởi
một trong hai đường đi ra mang dẫu + (cho trường hợp đúng) hoặc dấu - (cho trường hợp
sai). Như vậy khối điều kiện có một đường đi đến và hai đường đi ra.
Hai khối đặc biệt là khối bắt đầu và khối kết thúc được biểu diễn bằng hình tròn chỉ rõ
điểm bắt đầu và điểm kết thúc của giải thuật. Khối bắt đầu không có đường đi đến và có 1
đường đi ra. Khối kết thúc không có đường đi ra, có thể có một hoặc nhiều đường đi tới.
Trong khối input ghi rõ các đại lượng vào, và ở khối output ghi các đại lượng ra. Khối
input có thể đặt kế tiếp khối bắt đầu, còn khối output có thể đặt liền trước khối kết thúc.
Chúng ta dùng lưu đồ ở Hình 7.2 diễn tả lại giảithuật Euclid tìm UCLN của hai số nguyên
dương.
Hình 7.2. Lưu đồ cho giảithuật Euclid
55
đúng
Nhập a, b
d := a
In d
a:= a - b b := b-a
a=b ?
a>b ?
sai
đúng
sai
Chương 7 - Giảithuật xử lý thông tin
Hình 7.3 là lưu đồ cho bài toán bốc diêm. Trong các ô thao tác không chỉ là phép gán mà
có thể là mô tả một hành động nào đó.
Hình 7.3. Lưu đồ giảithuật trò chơi bốc diêm
7.3.3.Ngôn ngữ thuật toán
Cách thức này dựa trên hệ thống dùng các ký hiệu và quy tắc để mô tả, giảithuật một cách
nhất quán, tựa một ngôn ngữ tự nhiên nào đó bằng một số cách nói như “trong khi một
điều kiện thoả mãn thì lặp lại một nhóm thao tác“ hay “nếu một điều kiện thoả mãn thì
thực hiện nhóm thao tác này ngược lại thực hiện nhóm thao tác kia” hay “sau thao tác này
thì thực hiện thao tác kia”. Như vậy, các diễn đạt đó chỉ rõ cách thiết lập thứ tự các thao
tác và được gọi là cấu trúc điều khiển. Cấu trúc điều khiển chính là cách thể hiện giải thuật
của các ngôn ngữ lập trình bậc cao mà ta sẽ thảo luận kỹ hơn trong phần ngôn ngữ lập
trình.
Ví dụ, thuậtgiải Euclid có thể thể hiện như sau:
Trong khi a ≠ b thì lặp lại khối sau
Nếu a > b thì
Bớt a đi một lượng là b
Nếu không thì
Bớt b đi một lượng là a
Cho tới khi a= b thì tuyên bố USCLN chính là giá trị chung của a và b
Hình 7.4. Thể hiện thuật toán Euclid bằng các cấu trúc điều khiển
56
Người đầu
Người đầu
Lấy 3 que
Ta lấy 4-x que
Đối phương lấy
x que diêm
Số diêm
còn >0 ?
Tuyên bố
thắng cuộc
đúng
sai
Chương 7 - Giảithuật xử lý thông tin
7.4. SƠ LƯỢC VỀ ĐÁNH GIÁ GIẢI THUẬT
Đối với một bài toán, có thể có nhiều giảithuật nhưng chúng phải cho cùng một output đối
với một input. Tuy nhiên chúng có thể khác nhau về hiệu quả:
Hiệu quả thời gian: Tốc độ xử lý là nhanh hay chậm. Ta có thể đánh giá căn cứ vào
số bước thực hiện.
Hiệu quả không gian: Có thể đánh giá không gian lưu trữ theo số các đối tượng
dùng để ghi nhớ các kết quả (kể cả kết quả trung gian).
Ví dụ: Để tìm USCLN có thể có nhiều giảithuật như:
Giải thuật 2:
Bước 1: Nhập a và b.
Bước 2: Phân tích các số a và b thành tích của các thừa số nguyên tố.
Bước 3: Lấy tích của các thừa số chung với số mũ nhỏ nhất làm USCLN.
Bước 4: Kết thúc xử lý.
Giải thuật 3 : Giảithuật Euclid cải tiến
Bước 1: Nhập a và b.
Bước 2: Chia a cho b tìm số dư r.
Bước 3: Nếu r = 0 thì thông báo kết quả: UCLN là b rồi chuyển bước 5.
Bước 4: Gán giá trị b cho a, gán giá trị r cho b rồi quay trở lại thực hiện bước 2.
Bước 5: Kết thúc.
Ta thấy xét về hiệu quả cả về không gian và thời gian thì giảithuật 2 kém hiệu quả hơn
giải thuật Euclid đã trình bày ở trên. Giảithuật 3 thực sự là một cải tiến so với giải thuật
Euclid mà ta đã trình bày trước đây vì phép chia lấy phần dư thực tế đã thay cho hàng loạt
phép trừ nói trong giảithuật Euclid. Vì vậy trong trường hợp chung nó tìm được USCLN
với số bước xử lý ít hơn nhiều.
Trong Tin học có cả một ngành chuyên đánh giá độ phức tạp của giải thuật, chủ yếu là
đánh giá về hiệu quả thời gian. Thực tế sử dụng cho thấy thách thức về không gian lưu trữ
có thể giải quyết dễ hơn thách thức về thời gian thực hiện.
Bài tập
1. Giảithuật là gì? Cho ví dụ?
2. Hãy viết giảithuật vẽ đồ thị của hàm số y = a/x (với a khác 0) thông qua đồ thị của hàm
số y = ax?
3. Cho tam giác ABC có góc vuông A và cho biết cạnh a và góc B. Hãy viết giảithuật để
tính góc C, cạnh b và cạnh c?
4. Trình bày tính chất xác định của giảithuật và nêu rõ nghĩa của tính chất này?
5*. Hãy phát biểu giảithuật để giải bài toán sau: "Có một số quả táo. Dùng cân hai đĩa
(không có quả cân) để xác định quả táo nặng nhất"?
6. Quy tắc chơi sau đây có phải là một giảithuật hay không?
Giả sử cho trước một cuốn sách tiếng Việt.
a) Hãy mở một trang có chữ số tận cùng bằng 5.
57
Chương 7 - Giảithuật xử lý thông tin
b) Hãy lấy từ đầu tiên của trang đó.
c) Hãy xem chữ cái đầu tiên của từ đó nếu chữ cái đó là một chữ từ A đến H thì bạn thắng,
ngoài ra thì bạn thua.
7. Hãy xác định input và output cho các bài toán sau đây:
a) Rút gọn một phân số.
b) Kiểm tra xem ba số cho trước a, b và c có thể là độ dài ba cạnh của một tam giác hay
không?
c) Tính trung bình cộng của hai số.
d) Dùng một cốc phụ để tráo nước ở hai cốc cho trước.
e) Tìm chu vi và diện tích của hình tròn có bán kính cho trước.
58
. Chương 7 - Giải thuật xử lý thông tin
CHƯƠNG 7. GIẢI THUẬT
7. 1. KHÁI NIỆM BÀI TOÁN VÀ GIẢI THUẬT
Trước khi xem. sẽ
thực hiện tiếp bước 4.
7. 2. MỘT SỐ ĐẶC TRƯNG CỦA GIẢI THUẬT
Người ta thường liệt kê các đặc trưng sau đây của giải thuật:
7. 2.1. Tính kết thúc (tính