BÀI GIÁNG TOÁN RàI RC
PHN 1: THUYT T HP
TOÁN RI RC
2
N⑥I
DUNG
c v t hp.
Bài toán đếm
Bài toán lit
TOÁN RI RC
3
2.
BÀI TOÁN LIST
N⑥I
DUNG
2.1.
Giái thi»u bài toán
2.2.
Thuªt toán độ phùc tp tính toán
2.3.
Phuơng pháp sinh
2.4.
Thuªt toán quay lui
TOÁN RI RC
4
d 2.1.1: Cho các s a
1
, a
2
, . . . , a
n
s M. Hãy tìm tt c p con
gm k phn đưc ly n s đã cho sao cho tng các phn trong mői
tªp con này đúng bng M.
2.1. Giái thi»u bài toán
TOÁN RI RC
5
n
n
Phân tích:
De dàng thy rng s các tªp con gm k phn ly {a
1
, a
2
, . . . , a
n
} C
k
.
Như vªy, ta cn duyt trong s
C
k
tªp con
k
phn đ ly ra các tªp
tng các phn đúng bng
M.
Tuy nhiên, ta s g°p rt nhiều khó khăn để xác định bao nhiêu tªp con
gm
k
phn ly
n
tng các phần cǔa tªp con này đúng bng
M
.
Do vªy, mt phương pháp thích hp cho bài toán này xây dng các c
phù hp để liệt đưc hết tất c tªp con thǒa mãn. Đây là bài toán
thuc nhóm
bài toán li»t kê.
TOÁN RI RC
6
D Bài toán đưa ra danh sách tt các cu hình t hp th đưc đưc
gi là bài toán li»t kê.
D Phuơng pháp chung để giái bài toán: Xác định mt thuªt toán để theo
đó th y dng đưc ln t tt các cu hình cn quan tâm.
D Phuơng pháp li»t phái đám báo hai nguyên tc:
Không đưc l°p li bt k mt cu hình o.
Không đưc sót bt k mt cu hìnho.
TOÁN RI RC
7
D c buác tiến hành giái bài toán trên máy tính:
Hiu yêu cu cǔa bài toán.
Chn cu trúc liu biu dien phương án cn duyt.
Chn thuªt toán phù hp vi cu trúc liu.
Cài đ°t thuªt toán thû nghim chương trình.
Ti ưu a chương trình.
TOÁN RI RC
8
2.2.1.
Thuªt toán
D Định nghĩa: Dãy u hạn các thao tác cấp F = F
1
F
2
· · ·
F
n
: Input
Output
đưc gi mt thuªt toán trên tªp thông tin vào Input để
đưc kết quǎ ra Output. Dãy các thao tác cấp được hiu các phép toán
s hc, các phép toán logic, các phép toán so sánh.
D Các đ°c trung bán cúa thuªt toán:
Đầu vào (Input):
Thuªt toán nhªn dú liu vào tø mt tªp nào đó.
Đầu ra (Output):
Vi mői tªp các liu đầu vào, thuªt toán đưa ra các
dú liệu tương ùng vi lời giǎi cǔa bài toán.
2.2. Thuªt toán độ phùc tp tính toán
TOÁN RI RC
9
Chính xác (Precision):
Các c cǔa thuªt toán đưc chính c.
Húu hn (Finiteness): Thuªt toán cn phǎi đưa được đầu ra sau mt s
húu hn (có th rt ln) c vi mi đầu vào.
Đơn trị (Uniqueness): Các kết quǎ trung gian cǔa tøng c thc hin
thuªt toán được xác định một cách đơn tr chǐ phụ thuộc vào đầu vào
các kết quǎ cǔa các c trưc.
Tng quát (Generality): Thuªt toán th áp dụng để giǎi mọi bài toán
có dạng đã cho.
TOÁN RI RC
10
Ví d 2.2.1:
Mô tǎ một thuªt toán đ tìm giá tr ln nht trong mt dãy s
nguyên húu hn?
TOÁN RI RC
11
Giái:
Ta th tiến hành theo các c sau:
Buác 1:
аt giá tr ln nht tm thi (max) bng s đầu tiên cǔa dãy.
Buác 2:
So sánh s ngay gn sau trong dãy vi max, nếu s này ln hơn
max thì đ°t lại max bng s vøa so sánh.
Buác S:
L°p lại bước trên nếu dãy còn có thêm nhiu s hng.
Buác 4:
Døng li nếu không còn s hạng nào cǔa dãy. Giá tr ln nht tm
thời ơ bước này chính là giá tr ln nhất cǔa dãy.
TOÁN RI RC
12
Giái (Ví d 2.2.1): Cho d quá trình thc hiên thuªt toán trên vái dãy
gm a
1
= 1, a
2
= 4, a
3
= 3 nhu sau:
+ Ti c 1, đ°t max (giá tr ln nht tm thi):=a
1
(=1).
+ Ti c 2, s hng ngay sau
a
2
=
4
thy
a
2
=
4
> max
nên thay đỗi
max và đ°t max:=4.
+ Do dãy s còn s hng chưa duyt nên chuyn sang c 3: So sánh
a
3
=
3
vi max thy
a
3
< max
nên không làm gì, tùc max=4.
+ Do dãy s không còn s hng tiếp nên chuyn sang c 4, tùc kết thúc
thuªt toán. Giá tr ln nhất cǔa dãy là
4
.
TOÁN RI RC
13
Giái (Ví d 2.2.1): Bây già, ta chí ra thuªt toán vøa các đ°c trung
cơ bán:
Đầu vào:
dãy húu hn các s.
Đầu ra:
s ln nht trong dãy.
Chính xác, đơn tr$:
Thuªt toán chǐ các phép gán, mt vòng l°p húu hn và
các câu lệnhđiều kiện nên mői bước được xác định chính xác; khi thuªt
toán kết thúc, max chính s ln nht cǔa dãy; nếu đầu vào đã xác định thì
kết quǎ ơ mői bước được xác định duy nht kết quǎ này chǐ phụ thuc
vào đầu vào và các kết quǎ cǔa các bước trước đó.
Húu hn: Thuªt toán kết thúc khi tất cǎ các số hạng được kim tra nên
thc hin sau mt s húu hn c.
Tng quát: Thuªt toán luôn đưa ra giá tr ln nht cǔa dãy bt k.
TOÁN RI RC
14
Giái (Ví d 2.2.1):
Đon chương trình cǔa thuªt toán trên:
int max
value(int a[],
int n){
max = a[0];
for (i = 1; i < n, i + +){
if max < a[i]{
max = a[i];
}
}
return (max);
}
TOÁN RI RC
15
D Phuơng pháp biu din thuªt toán:
Ngôn ngú t nhiên:
phương tiện giao tiếp giúa con ngưi vi con
người. Ta có th sû dụng nó để mô tǎ thuªt toán.
Ngôn ngú hình thùc:
phương tiện giao tiếp trung gian giúa con
người máy tính; chng hạn: ngôn nsơ đ khối, ngôn ngú đ°c tǎ,
ngôn ngú ta t nhiên... Thông thường người ta hay dùng ngôn ngú
này để mô tǎ thuªt toán.
Ngôn ngú máy tính:
phương tin giao tiếp giúa các máy tính vi
nhau. Người ta th dng bt k ngôn ngú lªp trình nào đ biu
dien thuªt toán.
TOÁN RI RC
16
d 2.2.2:
thuªt toán tìm ước chung ln nht cǔa hai s t nhiên
a, b
(ký hiu:
UCLN
(
a, b
)
) bng ngôn ngú t nhiên?
TOÁN RI RC
17
Giái:
Đầu vào:
Đưa vào hai s t nhiên
a
b
.
Đầu ra:
S nguyên không âm
u
ln nht để
a
b
đều chia hết cho
u.
Thuªt toán (thuªt toán Euclide):
B1.
Đưa vào hai s t nhiên
a
b.
B2.
Nếu
b
0
thì chuyn đến c 3; còn nếu
b
=
0
thì thc hin c 4.
BS.
аt
r
=
a
mod
b
; đỗi
a
=
b
b
=
r
. Sau đó quay trơ li c 2.
B4.
Kết luªn
u
=
a
s cn tìm.
TOÁN RI RC
18
d 2.2.S:
thuªt toán tìm ước chung ln nht cǔa hai s t nhiên
a, b
(ký hiu:
UCLN
(
a, b
)
) bng ngôn ngú hình tc?
TOÁN RI RC
19
Giái: Thuªt toán Euclide:
Đầu vào: a N, b N.
Đầu ra: s = max{u N | a mod u = 0, b mod u = 0}.
Format: s =
Euclid (a, b).
Actions:
while
(
b
0)
do
r = a mod b; a = b; b = r;
endwhile;
return (a);
Endactions.
TOÁN RI RC
20
d 2.2.4:
thuªt toán tìm ước chung ln nhất cǔa hai số t nhiên
a, b
(ký hiu:
UCLN
(
a, b
)
) bng ngôn ngú máy tính (dùng ngôn ngú lªp
trình
C
+ +
)?

Preview text:


BÀI GIÁNG TOÁN RàI RẠC
PHẦN 1: LÝ THUYẾT TỔ HỢP TOÁN RỜI RẠC N⑥I DUNG
• Sơ lược về tỗ hợp. • Bài toán đếm • Bài toán liệt kê 2 TOÁN RỜI RẠC 2. BÀI TOÁN LIST KÊ N⑥I DUNG
2.1. Giái thi»u bài toán
2.2. Thuªt toán và độ phùc tạp tính toán
2.3. Phuơng pháp sinh
2.4. Thuªt toán quay lui 3 TOÁN RỜI RẠC
2.1. Giái thi»u bài toán
Ví dụ 2.1.1: Cho các số a1, a2, . . . , an và số M. Hãy tìm tất cǎ các tªp con
gồm k phần tû được lấy tø n số đã cho sao cho tỗng các phần tû trong mői
tªp con này đúng bằng M. 4 TOÁN RỜI RẠC Phân tích:
De dàng thấy rằng số các tªp con gồm k phần tû lấy tø {a1, a2, . . . , an} là Ckn .
Như vªy, ta cần duyệt trong số Ck tªp con k phần tû để lấy ra các tªp có n
tỗng các phần tû đúng bằng M.
Tuy nhiên, ta sẽ g°p rất nhiều khó khăn để xác định có bao nhiêu tªp con
gồm k phần tû lấy tø n mà tỗng các phần tû cǔa tªp con này đúng bằng M.
Do vªy, một phương pháp thích hợp cho bài toán này là xây dụng các bước
phù hợp để liệt kê được hết tất cǎ các tªp con thǒa mãn. Đây là bài toán
thuộc nhóm bài toán li»t kê. 5 TOÁN RỜI RẠC
D Bài toán đưa ra danh sách tất cǎ các cấu hình tỗ hợp có thể có được được
gọi là bài toán li»t kê.
D Phuơng pháp chung để giái bài toán: Xác định một thuªt toán để theo
đó có thể xây dụng được lần lượt tất cǎ các cấu hình cần quan tâm.
D Phuơng pháp li»t kê phái đám báo hai nguyên tắc:
• Không được l°p lại bất kỳ một cấu hình nào.
• Không được bǒ sót bất kỳ một cấu hình nào. 6 TOÁN RỜI RẠC
D Các buác tiến hành giái bài toán trên máy tính:
• Hiểu yêu cầu cǔa bài toán.
• Chọn cấu trúc dú liệu biểu dien phương án cần duyệt.
• Chọn thuªt toán phù hợp với cấu trúc dú liệu.
• Cài đ°t thuªt toán và thû nghiệm chương trình.
• Tối ưu hóa chương trình. 7 TOÁN RỜI RẠC
2.2. Thuªt toán và độ phùc tạp tính toán 2.2.1. Thuªt toán
D Định nghĩa: Dãy húu hạn các thao tác sơ cấp F = F1F2 · · · Fn : Input →
Output được gọi là một thuªt toán trên tªp thông tin vào Input để có
được kết quǎ ra Output. Dãy các thao tác sơ cấp được hiểu là các phép toán
số học, các phép toán logic, các phép toán so sánh.
D Các đ°c trung cơ bán cúa thuªt toán:
Đầu vào (Input): Thuªt toán nhªn dú liệu vào tø một tªp nào đó.
Đầu ra (Output): Với mői tªp các dú liệu đầu vào, thuªt toán đưa ra các
dú liệu tương ùng với lời giǎi cǔa bài toán. 8 TOÁN RỜI RẠC
Chính xác (Precision): Các bước cǔa thuªt toán được mô tǎ chính xác.
Húu hạn (Finiteness): Thuªt toán cần phǎi đưa được đầu ra sau một số
húu hạn (có thể rất lớn) bước với mọi đầu vào.
Đơn trị (Uniqueness): Các kết quǎ trung gian cǔa tøng bước thục hiện
thuªt toán được xác định một cách đơn trị và chǐ phụ thuộc vào đầu vào
và các kết quǎ cǔa các bước trước.
Tổng quát (Generality): Thuªt toán có thể áp dụng để giǎi mọi bài toán có dạng đã cho. 9 TOÁN RỜI RẠC
Ví dụ 2.2.1: Mô tǎ một thuªt toán để tìm giá trị lớn nhất trong một dãy số nguyên húu hạn? 10 TOÁN RỜI RẠC
Giái: Ta có thể tiến hành theo các bước sau:
Buác 1: аt giá trị lớn nhất tạm thời (max) bằng số đầu tiên cǔa dãy.
Buác 2: So sánh số ngay gần sau trong dãy với max, và nếu số này lớn hơn
max thì đ°t lại max bằng số vøa so sánh.
Buác S: L°p lại bước trên nếu dãy còn có thêm nhiều số hạng.
Buác 4: Døng lại nếu không còn số hạng nào cǔa dãy. Giá trị lớn nhất tạm
thời ơ bước này chính là giá trị lớn nhất cǔa dãy. 11 TOÁN RỜI RẠC
Giái (Ví dụ 2.2.1): Cho ví dụ quá trình thục hiên thuªt toán trên vái dãy
gồm a1 = 1, a2 = 4, a3 = 3 nhu sau:
+ Tại Bước 1, đ°t max (giá trị lớn nhất tạm thời):=a1 (=1).
+ Tại Bước 2, số hạng ngay sau là a2 = 4 và thấy a2 = 4 > max nên thay đỗi max và đ°t max:=4.
+ Do dãy số còn số hạng chưa duyệt nên chuyển sang Bước 3: So sánh
a3 = 3 với max và thấy a3 < max nên không làm gì, tùc max=4.
+ Do dãy số không còn số hạng tiếp nên chuyển sang Bước 4, tùc là kết thúc
thuªt toán. Giá trị lớn nhất cǔa dãy là 4. 12 TOÁN RỜI RẠC
Giái (Ví dụ 2.2.1): Bây già, ta chí ra thuªt toán vøa mô tá có các đ°c trung cơ bán:
Đầu vào: dãy húu hạn các số. Đầu ra: số lớn nhất trong dãy.
Chính xác, đơn tr$: Thuªt toán chǐ có các phép gán, một vòng l°p húu hạn và
các câu lệnh có điều kiện nên mői bước được xác định chính xác; khi thuªt
toán kết thúc, max chính là số lớn nhất cǔa dãy; nếu đầu vào đã xác định thì
kết quǎ ơ mői bước được xác định duy nhất và kết quǎ này chǐ phụ thuộc
vào đầu vào và các kết quǎ cǔa các bước trước đó.
Húu hạn: Thuªt toán kết thúc khi tất cǎ các số hạng được kiểm tra nên nó
thục hiện sau một số húu hạn bước.
Tổng quát: Thuªt toán luôn đưa ra giá trị lớn nhất cǔa dãy bất kỳ. 13 TOÁN RỜI RẠC
Giái (Ví dụ 2.2.1): Đoạn chương trình cǔa thuªt toán trên:
int max−value(int a[], int n){
max = a[0];
for (i = 1; i < n, i + +){
if max < a[i]{
max = a[i]; } }
return (max); } 14 TOÁN RỜI RẠC
D Phuơng pháp biểu diễn thuªt toán:
Ngôn ngú tụ nhiên: Là phương tiện giao tiếp giúa con người với con
người. Ta có thể sû dụng nó để mô tǎ thuªt toán.
Ngôn ngú hình thùc: Là phương tiện giao tiếp trung gian giúa con
người và máy tính; chẫng hạn: ngôn ngú sơ đồ khối, ngôn ngú đ°c tǎ,
ngôn ngú tụa tụ nhiên... Thông thường người ta hay dùng ngôn ngú
này để mô tǎ thuªt toán.
Ngôn ngú máy tính: Là phương tiện giao tiếp giúa các máy tính với
nhau. Người ta có thể sû dụng bất kỳ ngôn ngú lªp trình nào để biểu dien thuªt toán. 15 TOÁN RỜI RẠC
Ví dụ 2.2.2: Mô tǎ thuªt toán tìm ước chung lớn nhất cǔa hai số tụ nhiên
a, b (ký hiệu: UCLN(a, b)) bằng ngôn ngú tụ nhiên? 16 TOÁN RỜI RẠC Giái:
Đầu vào: Đưa vào hai số tụ nhiên a b.
Đầu ra: Số nguyên không âm u lớn nhất để a b đều chia hết cho u.
Thuªt toán (thuªt toán Euclide):
B1. Đưa vào hai số tụ nhiên a b.
B2. Nếu b 0 thì chuyển đến bước 3; còn nếu b = 0 thì thục hiện bước 4.
BS. аt r = a mod b; đỗi a = b b = r. Sau đó quay trơ lại bước 2.
B4. Kết luªn u = a là số cần tìm. 17 TOÁN RỜI RẠC
Ví dụ 2.2.S: Mô tǎ thuªt toán tìm ước chung lớn nhất cǔa hai số tụ nhiên
a, b (ký hiệu: UCLN(a, b)) bằng ngôn ngú hình thùc? 18 TOÁN RỜI RẠC
Giái: Thuªt toán Euclide:
Đầu vào: a ∈ N, b ∈ N.
Đầu ra: s = max{u ∈ N | a mod u = 0, b mod u = 0}.
Format: s = Euclid (a, b). Actions:
while (b 0) do
r = a mod b; a = b; b = r; endwhile;
return (a); Endactions. 19 TOÁN RỜI RẠC
Ví dụ 2.2.4: Mô tǎ thuªt toán tìm ước chung lớn nhất cǔa hai số tụ nhiên
a, b (ký hiệu: UCLN(a, b)) bằng ngôn ngú máy tính (dùng ngôn ngú lªp trình C + +)? 20