1. Trang chủ
  2. » Khoa Học Tự Nhiên

Giáo trình toán rời rạc phần 2 TS đỗ văn nhơn (biên soạn)

100 1,1K 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 100
Dung lượng 554,15 KB

Nội dung

 Xuất output: Từ mỗi tập hợp các giá trị được nhập một thuật toán thường tạo ra những giá trị xuất output values thuộcmột tập hợp nhất định nào đó thể hiện lời giải cho bài toán.. Độ ph

Trang 1

Chương 4: THUẬT TOÁN

I Thuật toán và cách biểu diễn thuật toán

1.1 Khái niệm thuật toán

Thuật toán là một khái niệm cơ bản của Toán học và Tin học.Khi viết một chương trình máy tính, người ta thường cài đặt mộtphương pháp đã được nghĩ ra trước đó để giải quyết một vấn đề Từ

“thuật toán” được dùng trong khoa học máy tính để để chỉ sự mô tảmột phương pháp giải bài toán thích hợp cho việc cài đặt thành cácchương trình nhờ các ngôn ngữ lập trình Một thuật toán thường đượcthể hiện bởi một thủ tục gồm một dãy hữu hạn bước mà theo đó ta sẽđạt đến lời giải cho bài toán Người ta có thể trình bày thuật toánbằng cách liệt kê ra các bước của thuật toán sử dụng ngôn ngữ tựnhiên hay một ngôn ngữ qui ước nào đó chẳng hạn sử dụng một ngônngữ lập trình nào đó gần với ngôn ngữ tự nhiên

Ví dụ 1: thuật toán tìm phần tử lớn nhất trong một dãy hữu hạncác số nguyên

Bài toán tìm phần tử lớn nhất trong một dãy hữu hạn tương đốitầm thường Tuy nhiên đây là một trong những ví dụ khá tốt để minhhọa cho khái niệm về thuật toán Có nhiều vấn đề mà trong đó đòihỏi phải tìm số nguyên lớn nhất trong một dãy số Chẳng hạn nhưviệc tìm ra một học sinh có điểm cao nhất trong một kỳ thi, hay tìm

ra một nhân viên có năng suất cao nhất trong một xí nghiệp, v.v

Trang 2

Chúng ta có nhiều cách để giải bài toán nầy Một trong nhữngphương pháp để tìm phần tử lớn nhất trong một dãy số nguyên làthực hiện một thủ tục theo các bước sau đây:

1 Trước hết ta đặt cho giá trị lớn nhất tạm thời bằng số nguyênđầu tiên (Giá trị lớn nhất tạm thời này chính là giá trị lớn nhất

ở mỗi giai đoạn của thủ tục.)

2 So sánh số nguyên kế tiếp trong dãy với giá trị lớn nhất tạmthời, và nếu nó lớn hơn giá trị lớn nhất tạm thời thì đặt cho giátrị lớn nhất tạm thời bằng số nguyên nầy

3 Lặp lại bước 2 nếu còn số nguyên trong dãy chưa được xét tới

4 Dừng nếu không còn số nguyên nào trong dãy chưa được xét.Giá trị lớn nhất tạm thời lúc nầy chính là giá trị lớn nhất trongdãy số

Ví dụ 2: Thuật toán tính nghiệm của phương trình bậc hai: ax2 +

bx + c = 0 khi biết 3 hệ số a, b, c (a  0)

Bước 1: Tính giá trị  theo công thức

 = b2- 4acBước 2: Xét dấu , ta có kết quả tùy thuộc một trong 3 trườnghợp sau đây:

- Trường hợp  > 0: Phương trình có 2 nghiệm được tính theocông thức

Trang 3

- Trường hợp  < 0: Phương trình vô nghiệm.

1.2 Biểu diễn thuật toán

Để trình bày một thuật toán hay biểu diễn một thuật toán, ta có thểsử dụng các phương pháp biểu diễn thuật toán sau đây:

1 Dùng ngôn ngữ tự nhiên

2 Dùng lưu đồ hay sơ đồ khối

3 Dùng mã giả

- Lưu đồ:

Ngôn ngữ lưu đồ hay sơ đồ khối là một công cụ rất trực quan đểdiễn đạt các thuật toán Biểu diễn bằng lưu đồ sẽ giúp ta có được mộtcái nhìn tổng quan về toàn cảnh của quá trình xử lý theo thuật toán

Lưu đồ là một hệ thống các nút có hình dạng khác nhau, thể hiệncác chức năng khác nhau và được nối với nhau bởi các cung Lưu đồđược tạo thành bởi 4 thành phần chủ yếu sau đây:

1/ Nút giới hạn: được biểu diễn bởi hình ôvan có ghi chữ bêntrong như :

Các nút trên còn được gọi là nút đầu và nút cuối của lưu đồ

Trang 4

2/ Nút thao tác: là một hình chữ nhật có ghi các lệnh cần thựchiện Ví dụ:

tăng k

3/ Nút điều kiện: thường là một hình thoi có ghi điều kiện cầnkiểm tra Trong các cung nối với nút nầy có 2 cung ra chỉ hướng đitheo 2 trường hợp: điều kiện đúng và điều kiện sai Ví dụ:

4/ Cung: là các đường nối từ nút nầy đến nút khác của lưu đồ

Hoạt động của thuật toán theo lưu đồ được bắt đầu từ nút đầutiên Sau khi thực hiện các thao tác hoặc kiểm tra điều kiện ở mỗinút thì bộ xử lý sẽ theo một cung để đến nút khác Quá trình thựchiện thuật toán dừng khi gặp nút kết thúc hay nút cuối

Trong giáo trình nầy chúng ta chủ yếu là sử dụng ngôn ngữ tự nhiênvà mã giả để trình bày thuật toán Trong cách sử dụng ngôn ngữ tựnhiên ta sẽ liệt kê các bước thực hiện các thao tác hay công việc nàođó của thuật toán bằng ngôn ngữ mà con người sử dụng một cách phổthông hàng ngày Các thuật toán được trình bày trong hai ví dụ trên

Trang 5

chính là cách biểu diễn thuật toán dùng ngôn ngữ tự nhiên Mặc dùcách biểu diễn nầy khá tự nhiên và không đòi hỏi người viết thuậttoán phải biết nhiều quy ước khác, nhưng nó không thể hiện rõ tínhcấu trúc của thuật toán nên không thuận lợi cho việc thiết kế và càiđặt những thuật toán phức tạp Hơn nữa trong nhiều trường hợp việcbiểu diễn thuật toán bằng ngôn ngữ tự nhiên tỏ ra dài dòng và dẽ gây

ra sự nhầm lẫn đối với người đọc Còn việc sử dụng lưu đồ sẽ rấtcồng kềnh đối với các thuật toán phức tạp

- Mã giả:

Để biểu diễn thuật toán một cách hiệu quả, người ta thường dùng mãgiả (pseudocode) Theo cách nầy, ta sẽ sử dụng một số qui ước củamột ngôn ngữ lập trình, chẳng hạn là ngông ngữ lập trình PASCAL,nhất là các cấu trúc điều khiển của ngôn ngữ lập trình như các cấutrúc chọn, các cấu trúc lặp

Trong mã giả ta còn sử dụng cả các ký hiệu toán học, các biến,và đôi khi cả cấu trúc kiểu thủ tục Cấu trúc thuật toán kiểu thủ tụcthường được sử dụng để trình bãy các thuật toán đệ qui hay các thuậttoán quá phức tạp cần phải được trình bày thành nhiều cấp độ

Cùng với việc sử dụng các biến, trong thuật toán rất thường gặpmột phát biểu hành động đặt (hay gán) một giá trị cho một biến Vídu:ï hành động tăng biết i lên 1 có thể được viết như sau:

i := i + 1hay

i  i + 1

Trang 6

Các cấu thường được sử dụng trong mã giả dựa theo ngôn ngữ lậptrình PASCAL gồm:

1/ Cấu trúc chọn:

if (điều kiện) then (hành động)

if (điều kiện) then (hành động) else (hành động)

2/ Cấu trúc lặp:

while (điều kiện) do (hành động)

Repeat

(hành động)

Until (điều kiện)

for (biến) := (giá trị đầu) to (giá trị cuối) do (hành

Trang 7

các bước thực hiện thuật toán ta thường ghi rõ những gì được cho

trước (phần nhập) và kết quả cần đạt được (phần xuất).

- Thuật toán tìm phần tử lớn nhất trong một dãy hữu hạn các sốnguyên:

Nhập: dãy số a1, a2, , an

Xuất: max là giá trị lớn nhất trong dãy số đã cho trong input Thuật toán:

1 max := a1

2 for i := 2 to n do

if max < a1 then max := a1

3 max là giá trị lớn nhất trong dãy số

- Thuật toán giải phương trình bậc hai ax2+ bx + c = 0 (a  0):

Nhập : 3 hệ số a, b, c

3 esle if delta = 0 then

Xuất kết quả: phương trình có nghiệm kép là -b / (2*a)

4 else trường hợp delta < 0

Trang 8

Xuất kết quả: phương trình vô nghiệm;

(Trong thuật toán nầy, ký hiệu sqrt(delta) dùng để chỉ căn bậchai dương của delta)

1.3 Các tính chất của thuật toán

Thuật toán có vai trò rất quan trọng trong khoa học máy tính Để cóthể lập trình giải bài toán trên máy tính, ta cần có một thuật toán bảođảm những tính chất nhất định Khi mô tả một thuật toán chúng tacần chú ý đến các tính chất sau đây:

 Nhập (input): Các thuật giải có các giá trị nhập (input values)

từ một tập hợp nhất định nào đó

 Xuất (output): Từ mỗi tập hợp các giá trị được nhập một thuật

toán thường tạo ra những giá trị xuất (output values) thuộcmột tập hợp nhất định nào đó thể hiện lời giải cho bài toán

 Tính xác định (definiteness): Các bước trong thuật toán phải

chính xác rõ ràng

 Tính hữu hạn (finiteness): Thuật toán phải cho ra lời giải (hay

kết quả) sau một số hữu hạn bước

 Tính hiệu quả (về thời gian): Thuật toán cần phải được thực

hiện một cách chính xác và trong một khoảng thời gian chophép

 Tính tổng quát Thuật toán phải áp dụng được cho tất cả các

bài toán có dạng như mong muốn, chứ không phải chỉ áp dụngđược cho một số trường hợp đặc biệt nào đó

 Tình đúng: Thuật toán phải cho kết quả như mong muốn.

Trang 9

Trong các tính chất trên, 3 tính chất cơ bản của thuật toán đòi hỏiphải được thỏa mãn là tính xác định, tính hữu hạn và tính đúng.Các thuật toán trong hai ví dụ 1 và 2 được trình bày ở trên đều thỏamãn các tính chất nêu trên.

Dưới đây chúng ta xét thêm một số ví dụ về các thuật toán

Ví dụ 3: Thuật toán tìm kiếm tuyến tính (Linear Search)

Bài toán được đặt ra là xác định xem một phần tử x có trongmột dãy a1, a2, , anhay không? Lời giải của bài toán nầy làgiá trị chỉ vị trí (hay chỉ số) của một phần tử trong dãy bằngphần tử x, hoặc là 0 nếu x không có trong dãy

Một thuật toán đơn giản để giải bài toán nầy là thuật toán tìmkiếm tuyến tính (hay còn gọi là tìm kiếm tuần tự) Thuật toánbắt đầu bằng việc so sánh x với a1, và nếu x = a1thì lời giải là

vị trí của a1(tức là 1) Khi x  a1, ta tiếp tục so sánh x với a2.Nếu x = a2, thì lời giải là vị trí của a2(tức là 2) Khi x  a2, tatiếp tục so sánh x với a3 Cứ tiếp tục quá trình nầy: lần lượt sosánh x với từng phần tử của dãy cho tới khi gặp một phần tửbằng x hoặc là cho tới khi đạt đến cuối dãy Lời giải là vị trícủa phần tử trong dãy bằng x; hoặc là 0 nếu không có phần tửnào trong dãy bằng x Thuật toán nầy có thể được viết dướidạng mã giả như dưới đây

Thuật toán: Tìm kiếm tuyến tính (hay tuần tự)

Nhập : dãy a1, a2, , an, và phần tử x

Xuất : vị trí của x trong dãy (chỉ số của phần tử trong dãy bằng

với x), hoặc 0

Trang 10

4 location là một lời giải (ví trí cần tìm).

Trong thuật toán nầy từ "location" là một biến nguyên

Ghi chú : Trong trường hợp dãy a1, a2, , ancó thứ tự thì ta có thểtìm kiếm theo thuật toán tìm kiếm nhị phân (binary search) Ta cóthể tham khảo thuật toán nầy trong các sách về "cấu trúc dữ liệuvà thuật toán"

Ví dụ 4: thuật toán kiểm tra tính đối xứng của một ma trận

Nhập : ma trận M cấp n.

Xuất : Yes nếu ma trận M là ma trận đối xứng.

No nếu M không đối xứng

Trang 11

II Độ phức tạp của thuật toán

2.1 Khái niệm độ phức tạp của thuật toán

Một chương trình máy tính thường được cài đặt dựa trên một thuậttoán để giải bài toán hay vấn đề đặt ra Một đòi hỏi đương nhiên làthuật toán phải đúng Tuy nhiên, ngay cả khi thuật toán đúng, chươngtrình vẫn có thể là không sử dụng được đối với một số dữ liệu nhậpnào đó bởi vì thời gian cần thiết để chạy chương trình hay vùng nhớcần thiết để lưu trữ dữ liệu (như các biến trong chương trình, các filelưu trữ, ) quá lớn

Thuật ngữ phân tích thuật toán đề cập đến một quá trình tìm ra

một đánh giá về thời gian và không gian cần thiết để thực hiện thuật

toán Độ phức tạp của thuật toán được thể hiện qua khối lượng thời

gian và không gian để thực hiện thuật toán Không gian ở đây đượchiểu là các yêu cầu về bộ nhớ, thiết bị lưu trữ, … của máy tính đểthuật toán có thể làm việc được Việc xem xét độ phức tạp về khônggian của thuật toán phụ thuộc phần lớn vào cấu trúc dữ liệu được sửdụng trong cài đặt thuật toán Trong phần nầy chúng ta chỉ đề cậpđến độ phức tạp về thời gian của thuật toán

Chúng ta cũng có thể đạt được những thông tin rất hữu ích khiphân tích độ phức tạp thời gian của thuật toán cơ sở của một chươngtrình máy tính Đánh giá một cách chính xác thời gian thực hiện mộtchương trình phụ thuộc vào rất nhiều yếu tố và là một công việc rấtkhó khăn Tuy nhiên các nhà toán học đã phân tích cho chúng ta hầuđộ phức tạp của hầu hết các thuật toán thường được sử dụng như cácthuật toán sắp xếp, các thuật toán tìm kiếm, các thuật toán số học,v.v…

Trang 12

Độ phức tạp thời gian của thuật toán thường được đánh giá dựavào số lượng thao tác được sử dụng trong thuật toán và số lượng thaotác nầy phụ thuộc vào cở (size) của dữ liệu nhập Ta còn gọi độ phức

tạp thời gian của thuật toán là độ phức tạp tính toán Các thao tác

được sử dụng để đo độ phức tạp của thuật toán có thể là phép so sánh

2 số nguyên, cộng 2 số nguyên, nhân 2 số nguyên, chia 2 số nguyên,hay bất kỳ thao tác cơ bản nào khác Như thế ta có thể xem thời gianthực hiện thuật toán là một hàm phụ thuộc vào dữ liệu nhập (thườnglà cở của dữ liệu nhập) Nếu gọi cở dữ liệu nhập là n thì độ phức tạpcó thể được xem là một hàm theo n

Chúng ta có thể đặt ra câu hỏi về thời gian thực hiện thuật toánnhỏ nhất đối với các dữ liệu nhập có cở n Ta có thể nêu lên một sốbài toán có dữ liệu nhập có cở n như: sắp xếp dãy n số nguyên, tìmsố nhỏ nhất trong dãy n số nguyên, v.v Thời gian nhỏ nhất nầy

được gọi là thời gian thực hiện thuật toán trong trường hợp tốt nhất

đối với dữ liệu nhập có cở n Tương tự ta cũng thường đề cập đếnthời gian thực hiện thuật toán lớn nhất đối với các dữ liệu nhập có cở

n, và gọi là thời gian thực hiện thuật toán trong trường hợp xấu nhất

đối với dữ liệu nhập có cở n Ngoài ra, đối với thuật toán có dữ liệu

nhập có cở n trong một tập hữu hạn nào đó, ta còn muốn tính ra thời

gian trung bình để thực hiện thuật toán.

Ví dụ 1: Thuật toán tìm giá trị lớn nhất trong dãy gồm n sốnguyên (xem ví dụ 1, mục I) Trong thuật toán nầy nếu ta xemthời gian thực hiện thuật toán là số lần thực hiện phép so sánhhay phép gán thì thời gian thực hiện thuật toán trong trườnghợp xấu nhất là:

t(n) = 1 + 2*(n-1) = 2n+1và thời gian thực hiện thuật toán trong trường hợp tốt nhất là:

T(n) = 1 + (n-1) = n

Trang 13

2.2 Ký hiệu O

Việc tính toán độ phức tạp (về thời gian hay về tính toán) củathuật toán sẽ giúp ta có thể đánh giá và so sánh các thuật toán Tuynhiên có những trường hợp mà 2 thuật toán khác nhau để giải quyếtcùng một bài toán có số lượng thao tác cơ bản là f(n) và g(n), với n làcở dữ liệu nhập, rất khó so sánh đánh giá hơn kém theo sự so sánhlớn bé thông thường Hơn nữa trong hầu hết các thuật toán như thuậttoán sắp xếp, thuật toán tìm kiếm, … ta không thể tính ra được sốlượng thao tác f(n) theo n

Thông thường ta ít chú ý tới con số chính xác về thời gian thựchiện thuật toán trong trường hợp xấu nhất và trong trường hợp tốtnhất Điều mà chúng ta thường quan tâm hơn khi đánh giá độ phứctạp thời gian của thuật toán là mức độ tăng lên của thời gian thựchiện thuật toán khi cở của dữ liệu nhập tăng lên Chẳng hạn, mộtthuật toán đang được xem xét nào đó có thời gian thực hiện trongtrường hợp xấu nhất và trong trường hợp tốt nhất lần lượt là:

t(n) = 20n2+ 5n + 1,T(n) = n2+ 10n + 1

Như thế, nếu như n rất lớn thì ta có thể xấp xỉ t(n) và T(n) với20n2 và n2 Có thể nói rằng t(n) và T(n) tăng giống như n2khi n tăng.Để diễn đạt điều nầy, người ta định nghĩa và sử dụng ký hiệu O đượcđịnh nghĩa như dưới đây

- Định nghĩa: Cho 2 hàm thực f và g có miền xác định trong tập số tự nhiên N Ta viết:

f(n)  O(g(n))

Trang 14

và nói là f(n) có cấp cao nhất là g(n), hay f(n) thuộc lớp O(g(n)),khi có một hằng số dương C sao cho:

f(n) C | g(n) |,

với “hầu hết” n thuộc miền xác định của các hàm f và g Từ

“hầu hết” ở đây ý nói là “với mọi chỉ trừ một số hữu hạn”,hay nói một cách chính xác là

C > 0,  k  N,  n  N, n  k  f(n) C | g(n) |

Ví dụ:

1 Với t(n) = 20n2+ 5n + 1 và T(n) = n2+ 10n + 1 Ta có thểchứng minh được rằng nói t(n) và T(n) có cấp cao nhất là n2,tức là t(n)  O(n2) và T(n)  O(n2)

2 Xét f(n) = log (n!) Ta có

n! = 1.2 .n  n.n .n  nn

 log(n!)  log (nn) = n.log(n)Suy ra

log(n!)  O(n log n)

- Định lý: Nếu f(n) là một đa thức bậc k theo n, tức là f(n) có dạng

f(n) = aknk+ ak-1nk-1+ + a1n + a0, với ak  0,thì ta có f(n) thuộc lớp O(nk)

- Ngoài ra ta còn có các tính chất sau đây:

 Giả sử rằng f1(n)  O(g1(n)) và f2(n)  O(g2(n)) Khi ấy ta có

f1(n) + f2(n)  O ( max(g1(n), g2(n)) )

Trang 15

Hệ quả là nếu f1(n) và f2(n) đều thuộc O(g(n)) thì ta cũng có

Ta cũng có thể tính toán ra được thời gian thực hiện thuật toántrong trường hợp xấu nhất và thời gian thực hiện thuật toántrung bình đều là O(n)

2.3 Một số lớp độ phức tạp

Liên quan đến độ phức tạp của thuật toán ta có một số thuật ngữthường dùng trong sự phân lớp các độ phức tạp của thuật toán đượcliệt kê dưới đây:

- độ phức tạp hằng: O(1)

- độ phức tạp logarith: O(log n)

- độ phức tạp tuyến tính: O(n)

- độ phức tạp n log n: O(n log n)

Trang 16

- độ phức tạp đa thức: O(nb).

- độ phức tạp lũy thừa: O(bn), trong đó b > 1

- độ phức tạp giai thừa: O(n!)

III Thuật toán đệ quy

3.1 Khái niệm đệ quy

Thuật toán đệ qui là một trong những sự mở rộng của khái niệmthuật toán Như đã biết, một thuật toán được đòi hỏi phải thỏa mãncác tính chất:

Ví dụ 1: Định nghĩa giai thừa

Giai thừa của một số tự nhiên n, ký hiệu là n!, được địnhnghĩa bằng cách qui nạp như sau:

Trang 17

0! = 1,n! = (n-1)!*n, với mọi n > 0.

Ví dụ 2: Định nghĩa dãy số Fibonacci  f1, f2, , fn,  :

Những thuật toán loại nầy được gọi là những thuật toán đệ quy.

Dưới đây là các thuật toán đệ quy tính giai thừa của một số tựnhiên n và tính số hạng thứ n của dãy số Fibonacci

Thuật toán đệ quy tính giai thừa của một số tự nhiên

Input : số tự nhiên n

Thuật toán đệ quy tính số hạng thứ n của dãy số Fibonacci

Input : số nguyên dương n

Output : F (n) bằng số hạng thứ n của dãy Fibonacci

Trang 18

thành thuật toán đệ quy Ta còn gọi bước nầy là bước thực hiện đệ

quy Trong thuật toán tính số hạng thứ n, ký hiệu F(n), của dãy số

Fibonacci ở trên ta phải tính F(n-1) và F(n-2) nếu n > 1 trong bước 2.Bước tính F(n-1) và F(n-2) nầy chính là bước đệ quy của thuật toán.Thuật toán đệ quy đã vi phạm tính xác định và rõ ràng của thuật toán

vì ở các bước đệ quy của nó Tuy nhiên ta vẫn chấp nhận các thuậttoán đệ quy vì nó tiện lợi trong nhiều trường hợp chẳng hạn như việccài đặt các định nghĩa đệ quy hay trong những trường hợp bài toán cóthể được đưa về bài toán cùng loại ở mức độ thấp hơn Hơn nữa cácngôn ngữ lập trình đều cho phép ta viết các chương trình con (thủ tụchay hàm) dưới dạng đệ quy

Ưu thế của thuật toán đệ quy là khi suy nghĩ về phương pháp giải bàitoán bằng cách phân chia trường hợp mà trong đó có những trườnghợp bài toán được thu gọn về bài toán cùng loại với cấp độ thấp hơn,và những trường hợp nầy chính là những trường hợp mà ta phải thựchiện bước đệ quy Còn những trường hợp khác thì ta có thể giải quyếttrực tiếp một cách dễ dàng, và ta gọi những trường hợp nầy là những

Trang 19

trường hợp dừng đệ quy Ví dụ như trong việc tính số hạng F(n) ứngvới chỉ số n của dãy Fibonacci thì trường hợp n = 0 và trường hợp n =

1 là các trường hợp dừng đệ quy, còn trường hợp n > 1 là trường hợpmà ta phải thực hiện các bước đệ quy: tính các số hạng F(n-1) và F(n-2) để suy ra số hạng F(n)

3.2 Cấu trúc của thuật toán đệ quy

- Trong thuật giải đệ qui thường gồm 2 phần: phần cơ sở và phần

đệ quy.

 Phần cơ sở gồm các trường hợp không cần thực hiện lại thuậttoán, tức là các trường hợp dừng mà ta có thể trực tiếp giải quyếtđược bài toán (hay không có yêu cầu gọi đệ qui) Trong thuậttoán tìm số hạng thứ n của dãy Fibonacci ở trên, bước 1 trongthuật toán là phần cơ sở của thuật giải đệ qui

 Phần đệ quy là phần trong thuật toán có yêu cầu gọi đệ quy, tứclà yêu cầu thực hiện lại thuật toán ở cấp độ thấp hơn Trong thuậttoán tìm số hạng thứ n của dãy Fibonacci ở trên, bước 2 trongthuật toán là phần đệ quy Trong phần đệ quy, yêu cầu gọi đệ quithường được đặt trong một điều kiện kiểm tra việc gọi đệ quy

Cần lưu ý rằng phần cơ sở luôn luôn phải có hay nói cách khác làphần đệ quy luôn luôn phải nằm trong điều kiện kiểm soát dừng đệquy, vì nếu không thì thuật toán sẽ bị lặp vô hạn do việc gọi đệ quyluôn được thực hiện

- Về mặt cài đặt, nếu như có sử dụng biến cục bộ trong thủ tục hayhàm đệ quy thì các biến nầy được tạo ra và được đặt trong vùngnhớ “STACK” Do đó quá trình gọi đệ quy dễ gây ra tình trạngtràn stack (stack overflow) Trong nhiều trường hợp có thể được

Trang 20

người ta tìm cách viết lại thuật toán đệ quy dưới dạng lặp Thuậttoán đệ qui để tìm số hạng thứ n của dãy số Fibonacci và thuậttoán tính n! có thể được viết lại dưới dạng lặp như sau:

Thuật toán lặp tính số hạng thứ n của dãy số Fibonacci

Input : số nguyên dương n.

Output : F (n) bằng số hạng thứ n của dãy Fibonacci.

Thuật toán lặp tính giai thừa của một số tự nhiên

Input : số tự nhiên n.

Trang 21

3.3 Trình bày (hay viết) thuật toán đệ quy

Để tiện trình bày thuật toán đệ quy, nhất là ở các bước gọi đệ quy(hay thực hiện đệ quy), ta thường đặt tên cho thuật toán có đi kèmcác tham biến chính liên quan đến bài toán cũng giống như ta khaibáo thủ tục hay hàm trong các chương trình máy tính Dưới đây ta xét

2 ví dụ khác về các bài toán mà ta có thể giải bằng phương pháp đệquy

Ví dụ 1: Tính tổ hợp n chọn k, ký hiệu là C(n,k) Nhắc lại một sốtính chất của C(n,k):

C(n,0) = C(n,n) = 1, vàC(n,k) = C(n-1,k) + C(n-1,k-1) nếu 0 < k < n

Các tính chất trên của phép tính tổ hợp cho ta một cách tính tổhợp theo phương pháp đệ quy Đặt tên cho thuật toán tính tổ hợp

n chọn k là Tohop(n,k) ta có thuật toán đệ quy để tính tổ hợp sauđây:

Thuật toán tính tổ hợp n chọn k: Tohop(n,k)

If (k = 0) or (k = n) then

Tohop := 1;

If (0 < k) and (k < n) then

Tohop := Tohop(n-1, k) + Tohop(n-1, k-1);

Ví dụ 2: Tính ước số chung lớn nhất của 2 số tự nhiên a và b, kýhiệu là USCLN(a,b)

Trang 22

Từ các tính chất dưới đây (cho các số nguyên tùy ý) của phép tínhước số chung lớn nhất:

USCLN(a, 0) = USCLN(0, a) = a,USCLN(a, b) = USCLN(a-b, b), vàUSCLN(a, b) = USCLN(a, b-a)

Ta có ngay một cách tính USCLN theo phương pháp đệ quy Đặttên cho thuật toán tính USCLN của 2 số tự nhiên a và b là

USCLN(a, b) ta có thuật toán đệ quy sau đây:

Thuật toán tính USCLN của a và b: USCLN(a,b)

USCLN := USCLN(a, b -a);

Ghi chú: Một ví dụ khá tốt để minh họa cho thuật toán đệ quy cũng

thường được đề cập tới là bài toán "Tháp Hà Nội" Chúng ta cóthể tham khảo về bài toán nầy trong [5] trang 227

IV Một số thuật toán số học

Trong phần nầy chúng ta sẽ giới thiệu một số thuật toán đơn giản vềsố học Việc giới thiệu nầy nhằm giúp cho học viên cũng cố thêmnhững kiến thức về thuật toán đã được trình bày ở các phần trên vàcũng là những chất liệu cần thiết về toán làm những bài tập cơ bảncho việc học lập trình

Trang 23

- Thuật toán kiểm tra số nguyên tố.

Vấn đề đặt ra là : cho một số nguyên dương p Làm thế nào đểbiết được p có phải là số nguyên tố hay không?

Cách đơn giản nhất để biết p có nguyên tố hay không là dựavào định nghĩa của số nguyên tố Trước hết ta xem xét điều kiện p 

1 Nếu p = 1 thì p không nguyên tố Nếu đúng là p  1 thì tiếp tụckiểm tra xem trong các số từ 2 đến p-1 có ước số của p hay không?Nếu có thì p không nguyên tố; ngược lại thì p nguyên tố Thuật toánkiểm tra số nguyên tố theo cách nầy có thể được viết như sau:

Thuật toán 1: Kiểm tra tính nguyên tố của một số nguyên dương

Nhập: p nguyên dương

Xuất : kết luận về tính nguyên tố của p

Thuật toán :

1 if p = 1 then

beginkết luận : p không nguyên tố;

Trang 24

4 if flag = TRUE then

kết luận: p là số nguyên tốelse

kết luận: p không là số nguyên tố

Nhờ vào mệnh đề dưới đây, thuật toán trên còn có thể được cải tiếnđể giảm bớt thao tác trong quá trình thực hiện thuật toán Không làmmất tính tổng quát, ta chỉ cần viết thuật toán kiểm tra tính nguyên tốcủa một số nguyên dương n trong trường hợp n > 1

Mệnh đề Nếu số nguyên n > 1 không phải là một số nguyên tố

thì n có một ước số nguyên tố (dương)  n

Thuật toán 2 Thuật toán kiểm tra số nguyên tố

Nhập: n nguyên dương

Điều kiện : n > 1

Xuất : kết luận về tính nguyên tố của n

Thuật toán :

1 p := 2 (p sẽ được kiểm tra xem có phải là một

ước số của n hay không)

2 flag := TRUE

3 while p  n and flag do

if (p là ước số của n) thenflag := FALSE

else

p := p+1

4 if flag = TRUE then

kết luận: p là số nguyên tốelse

kết luận: p không là số nguyên tố

Trang 25

- Thuật toán tính ước số chung lớn nhất của 2 số nguyên.

Trong mục nầy chúng ta phát biểu một số tính chất liên quan đếnước số chung lớn nhất của hai số nguyên Từ đó rút ra một thuật toánđể tìm ước số chung lớn nhất của hai số nguyên

Mệnh đề.

(1) Nếu a là một ước số của b thì (a,b) = a

(2) (a,b) = (a, a  b)

(3) Giả sử a là một số nguyên tùy ý, b là một số nguyên khác

0 Gọi r là số dư khi chia a cho b Khi đó ta có : (a,b)

= (b, r) Tức là ước số chung lớn nhất của a và b bằng ướcsố chung lớn nhất của b và r

Từ các tính chất trên ta có một cách để tìm ước số chung lớn nhấtcủa hai số nguyên a và b (không đồng thời bằng 0) như sau:

Thuật toán 3 Tìm ước số chung lớn nhất của hai số nguyên.

Nhập : m, n là 2 số nguyên

Điều kiện : m và n không đồng thời bằng 0

Xuất : d là ước số chung lớn nhất của m và n

2 a := m; b := n

3 r := a mod b (gán cho r dư số trong phép chia a cho b)

4 while r  0 do

Trang 26

a := b (gán cho a giá trị của b)

b := r (gán cho b giá trị của r)

r := a mod b (gán cho r dư số trong phép chia

a cho b)end

5 d := b

V Sự phân lớp vấn đề - bài toán

Độ phức tạp của thuật toán chính là yếu tố cơ sở để phân loại vấn đề

- bài toán Một cách tổng quát, người ta phân chia các bài toán thành

2 lớp: lớp các bài toán giải được và lớp các bài toán không giải được.Lớp giải được chia làm 2 lớp con: lớp các bài toán có độ phức tạp đathức và lớp các bài toán có độ phức tạp không phải là đa thức Ngoài

ra ta còn có những bài toán thuộc loại NP, đó là những bài toán chưathể phân loại một cách chính xác là thuộc lớp có độ phức tạp đa thứchay có độ phức tạp không đa thức

5.1 Lớp bài toán có độ phức tạp đa thức

Các bài toán thuộc lớp nầy có độ phức tạp thuộc loại O(nk) Các bàitoán có độ phức tạp thuộc loại O(n log n) cũng là các bài toán có độphức tạp đa thức vì lớp O(n log n) bao hàm trong lớp O(n2) Tương tự,các bài toán có độ phức tạp hằng O(1), có độ phức tạp tuyến tínhO(n) cũng thuộc lớp các bài toán có độ phức tạp đa thức Các bàitoán có độ phức tạp tỉ lệ với hàm mũ theo n hay tỉ lệ với n! thì khôngthuộc lớp bài toán có độ phức tạp đa thức

Trang 27

Độ phức tạp tính toán của thuật toán cho chúng ta một sự đánh giátương đối về thời gian thực hiện của thuật toán Các bài toán thuộclớp đa thức, tức là có độ phức tạp đa thức, được xem là các bài toáncó lời giải thực tế Lời giải thực tế được hiểu là chi phí về mặt thờigian và không gian cho việc giải bài toán là chấp nhận được trongđiều kiện hiện tại Chúng ta đã thấy bài toán sắp xếp dãy, bài toántìm kiếm trên dãy đều có độ phức tạp đa thức.

Bất kỳ bài toán nào không thuộc lớp các bài toán có độ phức tạp đathức đều có chi phí lớn Vì vậy đối với bất kỳ bài toán nào, người tacũng mong muốn tìm ra những thuật toán giải quyết nó một cáchhiệu quả có độ phức tạp đa thức Tuy nhiên điều nầy không phải lúcnào cũng làm được và có những trường hợp không thể là được Đó làtrường hợp bài toán có độ phức tạp không đa thức

5.2 Lớp bài toán có độ phức tạp không đa thức

Như đã đề cập trong mục trên, người ta luôn mong muốn tìm ra thuậttoán có độ phức tạp đa thức để giải các bài toán Nhưng có nhiều bàitoán không thể có thuật toán thuộc lớp độ phức tạp đa thức để giảinó, mặc dù nó có lời giải Bài toán liệt kê tất cả các tập hợp con củamột tập hợp X hữu hạn có n phần tử là một ví dụ cho loại bài toángiải được nhưng có độ phức tạp không đa thức Về mặt toán học, tacó thể chứng minh được rằng tập hợp X (có n phần tử) sẽ có tất cả là

2n tập hợp con Như vậy, bất kỳ thuật toán nào để liệt kê tất cả cáctập hợp con của X đều phải thực hiện ít nhất 2n bước Ngoài ra ta cóthể nêu lên một thuật toán liệt kê các tập hợp con của X với độ phứctạp thuộc loại O(2n) Điều nầy đã chứng tỏ rằng bài toán không thuộclớp đa thức Với n chỉ cở 32 thì số bước thao tác để giải bài toán đãtrên 4 tỷ, và với n = 33 thì số thao tác của thuật toán sẽ hơn 8 tỷ! Với

Trang 28

số lượng thao tác như vậy, ngay cả đối với một siêu máy tính thì cũngphải tốn một thời gian đáng kể.

Một ví dụ khác về bài toán không thuộc lớp các bài toán có độ phứctạp đa thức là bài toán Tháp Hà nội vì số lần chuyển đĩa cho bài toánvới n đĩa ít nhất là 2n-1

5.3 Lớp bài toán NP

Như đã trình bày trong phần trên, đối với các bài toán người ta mongmuốn tìm ra một thuật toán có độ phức tạp đa thức để giải nhưng rấtkhông may là có những bài toán có độ phức tạp không đa thức, tức làkhông tồn tại thuật toán có độ phức tạp đa thức để giải bài toán.Chẳng hạn như bài toán liệt kê các tập hợp con của một tập hợp, bàitoán Tháp Hà Nội

Ngoài ra, ta còn có thể gặp phải những bài toán mà ta có thuật toánvới độ phức tạp không đa thức để giải nó nhưng lại chưa tìm ra đượcthuật toán đa thức để giải bài toán và cũng chưa chứng minh đượcrằng không thể có một thuật toán đa thức để giải bài toán Nói mộtcách khác, ta chưa phân loại được bài toán là loại có độ phức tạp đathức hay có độ phức tạp không đa thức Ta gọi những bài toán nầy là

những bài toán NP.

Ví dụ: Bài toán người bán hàng.

Một nhân viên phân phối hàng cho một công ty được giaonhiệm vụ phải giao hàng cho các đại lý của công ty, sau đó trở vềcông ty Vấn đề của người nhân viên là làm sao đi giao hàng chotất cả các đại lý với chi phí đường đi thấp nhất Ở đây ta xem chi

Trang 29

phí đường đi là độ dài đường đi mà người nhân viên đã đi để giaohàng và trở về nơi xuất phát (công ty).

Một cách giải cổ điển cho bài toán người bàn hàng là liệt kê tấtcả các cách đi có thể có và so sánh độ dài của đường đi của chúng đểtìm ra cách đi có độ dài đường đi ngắn nhất Theo cách nầy thì khi sốđại lý nhiều thì phải tốn rất nhiều thời gian cho việc liệt kê, tính toánvà so sánh Để giảm thiểu thời gian tính toán ta có thể giảm nhẹ yêucầu bài toán bằng cách tìm ra một cách đi với độ dài đường đi chấpnhận được (theo nghĩa là độ dài đường đi nhỏ hơn hoặc bằng một số

đo cho trước) Với yêu cầu giảm nhẹ nầy thì ta co thể thực hiện mộtsự liệt kê có hệ thống hơn theo một kiểu nào đó để hy vọng rằngkhông phải xét tất cả các trường hợp mà chỉ đến một bước nào đótrong quá trình liệt kê là ta đã tìm thấy một cách đi giao hàng vớiđường đi chấp nhận được Tuy nhiên cách giải quyết nầy vẫn có độphức tạp không phải đa thức Người ta đã chứng minh được rằng độphức tạp của thuật toán nầy là O(n!) Như vậy nếu số lượng đại lý làlớn thì thuật toán trên là không thực tế

Cho đến nay người ta chưa chứng minh được rằng tồn tại haykhông tồn tại một thuật toán có độ phức tạp đa thức để giải bài toánngười bán hàng Như thế bài toán nầy chứ thể xếp vào loại bài toáncó độ phức tạp đa thức hay không đa thức, và do đó đây là bài toánNP

Lưu ý rằng ta có thể giải bài toán nầy bằng cách sử dụng thuật

giải heuristic Khái niệm thuật giải heuristic được đề cập đến trong

phần kế tiếp, đây là một sự mở rộng khái niệm thuật toán để ta cóthể giải quyết được các bài toán phức tạp với một chi phí thỏa đángvà thường cho ta lời giải hay kết quả chấp nhận được

Trang 30

VI Thuật giải

6.1 Mở rộng khái niệm thuật toán: thuật giải

Như chúng ta đã biết, cách giải đệ quy không đáp ứng đầy đủ cácyêu cầu đối với một thuật toán Đó là một sự mở rộng khái niệmthuật toán Trong quá trình nghiên cứu giải quyết các bài toán, cácvấn đề đặt ra người ta nhận thấy có những tình huống như sau:

- Có những bài toán cho đến nay vẫn chưa có một cách giảitheo kiểu thuật toán được tìm ra và cũng không biết có tồntại thuật toán hay không

- Có những bài toán đã có thuật toán để giải nhưng khôngchấp nhận được vì thời gian giải theo thuật toán đó quá dàihoặc các điều kiện cho thuật toán khó đáp ứng

- Có những bài toán được giải theo những cách giải vi phạmthuật toán nhưng vẫn được chấp nhận

Từ những nhận định trên, người ta thấy rằng cần phải có nhữngđổi mới cho khái niệm thuật toán Một số tiêu chuẩn của thuật toánđược mở rộng: tính xác định, tính đúng đắn Việc mở rộng tính xácđịnh đối với thuật toán được thể hiện rõ qua các thuật toán đệ quy vàcác thuật giải ngẫu nhiên Tính đúng của thuật toán bây giờ khôngcòn bắt buộc đối với một số cách giải cho các bài toán, nhất là cáccách giải gần đúng Trong thực tiễn có nhiều trường hợp người tachấp nhận các cách giải chỉ cho kết quả gần đúng nhưng ít phức tạpvà hiệu quả

Một trong những mở rộng đối với thuật toán thường được đề cậpđến và sử dụng trong khoa học trí tuệ nhân tạo là các cách giải theo

Trang 31

kiểu heuristic Chúng thường khá đơn giản, tự nhiên nhưng cho kếtquả đúng hoặc gần đúng trong phạm vi cho phép.

Các cách giải chấp nhận được nhưng không hoàn toàn đáp ứngđầy đủ các tiêu chuẩn của thuật toán thường được gọi là các thuậtgiải Khái niệm mở rộng nầy của thuật toán đã mở rộng cửa chochúng ta trong việc tìm kiếm phương pháp để giải quyết các bài toánđược đặt ra trên máy tính

6.2 Thuật giải heuristic

- Thuật giải heuristic là một sự mở rộng khái niệm thuật toán Nóthể hiện một cách giải bài toán với các đặc tính như sau:

 Thuật giải thường tìm được lời giải tốt (nhưng không chắc làlời giải tốt nhất)

 Thực hiện cách giải theo thuật giải heuristic thường dễ dàngvà nhanh chóng hơn so với giải thuật tối ưu

 Thuật giải heuristic thường thể hiện một cách hành động khátự nhiên, gần gũi với cách suy nghĩ và cách hành động củacon người

- Có nhiều cách tiếp cận cho việc thiết kế một thuật giải heuristic.Trong đó ta có thể dựa vào một số nguyên lý cơ sở sau đây:

 Nguyên lý vét cạn thông minh: Trong một bài toán tìm kiếmnào đó, khi không gian tìm kiếm lớn ta thường tìm cách đểgiới hạn lại không gian tìm kiếm hoặc thực hiện một kiểu dòtìm đặc biệt dựa vào đặc thù của bài toán để nhanh chóng tìm

ra mục tiêu

Trang 32

 Nguyên lý tham lam: Lấy tiêu chuẩn tối ưu (trên phạm vi toànbộ) của bài toán để làm tiêu chuẩn chọn lựa hành động chophạm vi cục bộ của từng bước (hay từng giai đoạn) trong quátrình tìm kiếm lời giải.

 Nguyên lý thứ tự: thực hiện hành động dựa trên một cấu trúcthứ tự hợp lý của không gian khảo sát nhằm nhanh chóng đạtđược một lời giải tốt

Ngoài ra, trong việc thiết kế thuật giải heuristic người ta cũng

thường đưa ra các hàm heuristic Đó là các hàm mà giá trị của nó phụ

thuộc vào các trạng thái hay các tình huống trong quá trình thực hiệnthuật giải Nhờ việc so sánh giá trị hàm heuristic ta có thể chọn đượccách hành động tương đối hợp lý trong từng bước của thuật giải

Dưới đây chúng ta sẽ xét 2 ví dụ cụ thể minh họa cho các thuậtgiải heuristic Trong ví dụ 1 ta đưa ra một cách giải theo nguyên lýtham lam cho bài toán hành trình người bán hàng Ví dụ 2 là bài toánphân công việc đơn giản được giải bằng một cách dựa trên nguyên lýthứ tự Tất nhiên các cách giải nêu trong các ví dụ không luôn luôncho ta lời giải tốt nhất và các thuật giải có thể được cải tiến cho tốthơn

Ví dụ 1: Trên một đồ thị (liên thông) đơn giản gồm n đỉnh, mỗicung nối 2 đỉnh có một giá trị chi phí Hãy xây dựng một lịchtrình bắt đầu từ một đỉnh xuất phát A, đi qua tất cả các đỉnhtrên đồ thị và trở về nơi xuất phát sao cho chi phí là thấp nhất

Ta có thể tiến hành tìm lịch trình theo một cách rất đơn giản nhưsau:

Trang 33

Bước 1: Khởi đầu.

- Đặt lịch trình TOUR là rỗng

- Đặt chi phí COST là 0

- Đặt vị trí hiện tại S là A

Bước 2: Đi qua các đỉnh

for k := 1 to n-1 do

begin

- Chọn đỉnh X chưa tới sao cho c(S,X) nhỏ nhất Ởđây c(S,X) là chi phí cung (S,X)

- Đặt TOUR := TOUR + (S,X)

- Đặt COST := COST + c(S,X)

- Đặt S := X

endBuớc 3: Trở về nơi xuất phát và hoàn thành chuyến đi

- Đặt TOUR := TOUR + (S,A)

- Đặt COST := COST + c(S,A)

Aùp dụng thuật giải trên cho đồ thị:

Trang 34

chúng ta tìm được lịch trình A  B  C  E  D  A với chi phílà 10.

Ví dụ 2: Bài toán phân việc: Giả sử có m máy như nhau được kýhiệu bởi P1, P2, , Pm Có n công việc J1, J2, , Jn cần đượcthực hiện Các công việc có thể được hiện đồng thời và bất kỳcông việc nào cũng có thể chạy trên một máy nào đó Mỗi lầnmáy được cho thực hiện một công việc nó sẽ làm cho tới khihoàn thành Công việc Ji có thời gian thực hiện trên một máylà ti (i=1, ,n) Mục đích của chúng ta là tổ chức phân côngcác công việc cho các máy sao cho toàn bộ các công việcđược hoàn thành trong thời gian ngắn nhất

Kinh nghiệm cho thấy một trong những cách rất đơn giản (nhưnglại thường cho ta một phương án tốt) để xây dựng một bảng phâncông như sau:

Bước 1: Chọn một công việc J chưa được phân công và có thời

gain thực hiện lớn nhất

Bước 2: Chọn một máy P có thời gian thực hiện các công việc

(đã phân công cho máy) là thấp nhất

Bước 3: Phân việc J cho máy P

Bước 4: Quay lại Bước 1 nếu còn công việc chưa được chọn

để phân công

Đối với mẫu bài toán cụ thể có:

m = 3,

n = 8,

t1= 2, t2= 5, t3= 8, t4= 6, t5= 1, t6= 4, t7= 2, t8= 1,

Trang 35

thuật giải trên sẽ cho bảng phân công các công việc cho các máynhư sau:

Máy P1: J3(8) J7(2) thời gian làm việc

Câu 3: Một thuật toán đơn giản để tính ước số chung lớn nhất

(USCLN)của hai số tự nhiên a và b có thể được trình bày theongôn ngữ tự nhiên như sau: Ta thực hiện lặp đi lặp lại thao tác trừsố lớn (hơn hoặc bằng) cho số nhỏ trong hai số a, b cho tới khimột trong hai số bằng 0; khi ấy số kia chính là USCLN Hãy viếtthuật toán tính USCLN nầy dưới dạng mã giả

Câu 4: Viết thuật toán kiểm tra một số nguyên có phải là số nguyêntố hay không

Trang 36

Câu 5:

(a) Viết thuật toán tính tổng S của một dãy số a1, a2, , an.(b) Cho một dãy số a1, a2, , an, và một phần tử x Hãy viếtthuật toán đếm số lần xuất hiện của x trong dãy số đã cho.(c) Thuật toán tìm ra dãy gồm các phần tử khác nhau từng đôimột trong một dãy (hữu hạn) các số nguyên cho trước

Câu 6: Viết thuật toán kê ra các giá trị khác nhau của một dãy số chotrước, ứng với mỗi giá trị cũng cho biết số lần xuất hiện của giátrị đó trong dãy Ví dụ: nếu dãy số cho trước là dãy sau đây:

Trang 38

b/ Hãy tính xem trong thuật toán tính giá trị của một đa thức bậc ntại x=c như trên có bao nhiêu phép nhân và phép cộng được sửdụng.

Câu 10: Bài toán “8-hậu”: trên một bàn cờ gồm 64 ô (8 dòng và 8cột), ta tìm cách đặt 8 quân hậu sao cho không có quân hậu nàonằm trong phạm vi tấn công của quân hậu khác

(a) Hãy viết thuật giải tìm một phương án đặt 8 hậu trên bàn cờ.(b) Hãy viết thuật giải tìm tất cả các phương án đặt 8 hậu trênbàn cờ

Câu 11: Thế nào là thuật toán đệ quy? Cho ví dụ

Câu 12: Cấu trúc của thuật toán đệ quy

Câu 14: Viết thuật toán tìm kiếm nhị phân dưới dạng đệ quy

Câu 15: Viết một thuật toán đệ quy để tìm gia trị lớn nhất của mộtdãy số (gồm hữu hạn phần tử)

Câu 16: Viết thuật toán liệt kê tất cả các tập hợp con của một tậphữu hạn (có n phần tử) theo phương pháp đệ quy

Trang 39

Câu 17: Viết thuật toán liệt kê tất cả các hoán vị của một tập hợphữu hạn.

Câu 18: Cho 2 dãy số ann  0và bnn  0được định nghĩa như sau:

Câu 21: Bài toán “Mã đi tuần”: trên một bàn cồ gồm 64 ô (8 dòng và

8 cột) có một quân mã đang ở một một ô nào đó được xem là vịtrí xuất phát Chúng ta muốn tìm ra một phương án đi cho quânmã sao cho nó đi qua hết tất cả các ô trên bàn cờ Hãy viết mộtthuật giải tìm ra nước đi cho quân mã

Câu 22: Cho một dãy số a1, a2, , an Viết một thuật giải phân dãysố thành 2 dãy con sao cho sự sai biệt giữa các tổng số của 2 dãycon là nhỏ nhất

Trang 40

CHƯƠNG 5 QUAN HỆ

1.1 Định nghĩa và ví dụ

- Giữa các phần tử trong một tập hợp nào đó mà chúng ta đangquan tâm thường có những mối liên hệ hay những quan hệ Ví dụ:quan hệ lớn hơn giữa các số thực, quan hệ “anh em” giữa ngườivới người, quan hệ đồng dạng giữa các tam giác, v.v Mỗi quanhệ trong một tập hợp được đặc trưng bằng một hay một số tiêuchuẩn nào đó thể hiện ngữ nghĩa của quan hệ Ở đây chúng ta chỉđề cập đến những quan hệ, được gọi là những quan hệ 2 ngôi, nóilên sự liên hệ giữa mỗi phần tử với các phần tử khác trong tậphợp Khi ta đang xem xét một quan hệ như thế, thì với hai phần tử

x, y tùy ý trong tập hợp chúng sẽ có : hoặc là x có quan hệ với y,hoặc là x không có quan hệ với y Nói như vậy cũng có nghĩa làtập hợp các cặp (x, y) gồm 2 phần tử có quan hệ có thể xác địnhđược quan hệ đang xét trên tập hợp Về mặt toán học, một quanhệ 2 ngôi được định nghĩa như sau:

Định nghĩa : Cho một tập hợp X khác rỗng Một quan hệ 2 ngôi

trên X là một tập hợp con R của X2 Cho 2 phần tử x và y của X,

ta nói x có quan hệ R với y khi và chỉ khi (x,y)  R, và viết là x R

y Như vậy:

x R y  (x,y)  R

Khi x không có quan hệ R với y, ta viết: x R y

Ngày đăng: 06/12/2015, 20:40

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w