Tải bản đầy đủ (.doc) (8 trang)

Tin học cơ sở - Chương 7 pptx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (147.1 KB, 8 trang )

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 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).
52
Ch¬ng 7 - Gi¶i thuËt xö lý th«ng tin
Ví dụ, cho hai số nguyên dương a, b. Cần xây dựng giải thuật để tìm ước số
chung lớn nhất (UCLN) của a và b. Dưới đây là giải thuậ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.
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ải thuậ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ải thuậ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ải thuậ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
53
Ch¬ng 7 - Gi¶i thuËt xö lý th«ng tin
7.2.2. Tính xác định
Tính xác định của giải thuậ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ải thuậ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ả.
7.2.3. Tính phổ dụng

Tính phổ dụng có nghĩa là một giải thuậ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ải
thuậ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ải thuật có một hoặc nhiều đại lượng vào. Ví dụ, Giải thuật Euclid ở trên có
đại lượng vào là a và b.
7.2.5. Đại lượng ra
Sau khi giải thuật đã được thực hiện xong nó phải cho ra kết quả: Ví dụ, Giải thuậ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ải thuậ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ải thuậ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ải thuậ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.

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¶i thuËt xö lý th«ng tin
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á 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ải thuật Euclid tìm UCLN của hai số
nguyên dương.



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¶i thuËt xö lý th«ng tin
Hình 7.2. Lưu đồ cho giải thuật Euclid
56
Ch¬ng 7 - Gi¶i thuË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ải thuậ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ải thuậ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ật giả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
57
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¶i thuËt xö lý th«ng tin
Hình 7.4. Thể hiện thuật toán Euclid bằng các cấu trúc điều khiển
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ải thuậ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ải thuậ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ải thuậ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ải thuật 2 kém hiệu quả
hơn giải thuật Euclid đã trình bày ở trên. Giải thuậ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ải thuậ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ải thuật là gì? Cho ví dụ?
2. Hãy viết giải thuậ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ải
thuậ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ải thuật và nêu rõ nghĩa của tính chất này?
5*. Hãy phát biểu giải thuậ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ải thuật hay không?
58
Ch¬ng 7 - Gi¶i thuËt xö lý th«ng tin
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.
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.
59

×