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 1Chươ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 2Chú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 42/ 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 5chí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 6Cá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 7cá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 8Xuấ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 9Trong 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 104 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 11II Độ 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 132.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 14và 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 15Hệ 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 170! = 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 18thà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 19trườ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 20ngườ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 213.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 22Từ 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 244 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 26a := 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 28số 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 29phí đườ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 30VI 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 31kiể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 33Bướ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 34chú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 35thuậ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 36Câ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 38b/ 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 39Câ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ố ann 0và bnn 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 40CHƯƠ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