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

Giáo trình Toán rời rạc Chương 4

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 (221.96 KB, 11 trang )

Chương IV
ĐẾM CÁC PHẦN TỬ
I) Các phương pháp đếm cơ bản
1. Mở đầu
Số serial của phiên bản Windows 98 của hãng MicroSoft gồm một dãy 25 chữ
số thập phân và chữ cái trong bộ mẫu tự tiếng Anh (không phân biệt hoa/ thường). Vậy
có bao nhiêu số serial khã dó dùng cho các bản copy của phiên bản đó? Có tất cả bao
nhiêu lời gọi đệ qui xảy ra khi thực hiện đoạn chương trình giải bài toán tháp Hà Nội
với kích thước dữ liệu đầu vào N? Tìm kiếm câu trả lời cho các câu hỏi tương tự như
vậy đều dẫn đến việc thực hiện các phép đếm. Khi số lượng thực hiện thao tác đếm với
số lượng cần phải đếm là rất lớn hoặc các cấu hình cần phải đếm thay đổi phức tạp thì
việc phát triễn các kỹ thuật đếm là rất cần thiết.
2. Các nguyên lý đếm cơ bản.
Các kỹ thuật đếm thường dựa trên nguyên tắc chia bài toán đếm thành các bài
toán nhỏ hơn có cấu hình quen thuộc mà việc đếm các phần tử trong cấu hình đó chỉ
cần dựa trên một số các nguyên lí đếm cơ bản. Dó nhiên bài toán đếm chỉ có nghóa khi
nó dẫn đến đáp số hữu hạn (mặc dù đáp số này có thể là một con số khổng lồ!). Vì vậy
mọi tập hợp X được xét sau đây đều mặc đònh là tập hữu hạn và N(X) để chỉ số phần tử
của X.
o Nguyên lí cộng:
Nếu A và B là hai tập hợp rời nhau thì N(A

B)=N(A)+N(B).
Ví dụ:
Có bao nhiêu cách chọn một vận động viên từ danh sách 12 người của
Huyện Chợ Lách, danh sách 14 người của Huyện Châu Thành và danh sách 20
người của Huyện Ba Tri biết rằng không có vận động viên nào thi đấu cho hơn một
huyện?
Lời giải:
Rõ ràng các danh sách là các tập rời nhau và việc lựa chọn vận động viên
trên mỗi danh sách là độc lập với nhau. Vì vậy số cách lựa chọn vận động viên là:


12+14+20=46 cách.
Ví dụ:
Xét đoạn mã chương trình viết bằng ngôn ngữ Pascal sau:
41
Var K,n1,n2,n3:byte;
Begin
{.....}
K := 7; n1:=5; n2:=10; n3:=15;
For i:=1 to n1 do K:=K+1; For j:=1 to n2 do K:=K+1;
For t:=1 to n3 do K:=K+1; writeln(‘K = ’,K);
{.....}
Đoạn chương trình này khi thực thi xong thì kết xuất của dòng
lệnh cuối cùng là gì?
Lời giải:
Ở mỗi lần lặp trong mỗi vòng lặp K đều tăng lên một đơn vò. Sau mỗi vòng
lặp K tăng lên đúng bằng số lần lặp. K được khởi tạo trước vòng lặp đầu tiên bằng
7. Vì các vòng lặp là rời nhau nên sau vòng lặp thứ nhất K=7+n1, sau vòng lặp thứ
hai K=7+n1+n2, sau vòng lặp thứ ba K=7+n1+n2+n3. Kết xuất của dòng lệnh cuối
cùng là:
K = 37
o Nguyên lí nhân:
Nếu mỗi thành phần a
i
của bộ có thứ tự (a
1
,a
2
,...,a
k
) có n

i
khả
năng lựa chọn (
1 i k
≤ ≤
) thì số cấu hình tạo ra là tích số các
khả năng này. Nói cách khác: Nếu
(1 ),
i i
i i k a A∀ ≤ ≤ ∈
thì:
N(A
1
xA
2
x ...x A
k
) = N(A
1
).N(A
2
)...N(A
k
)
Ví dụ:
Có bao nhiêu cách chọn ba vận động viên thuộc ba huyện theo thứ tự từ
danh sách 12 người của Huyện Chợ Lách, danh sách 14 người của Huyện Châu
Thành và danh sách 20 người của Huyện Ba Tri biết rằng mỗi huyện được chọn
đúng một vận động viên?
Lời giải:

Rõ ràng mỗi cách lựa chọn là một bộ ba (a
1
,a
2
,a
3
). Trong đó a
1
là vận động
viên của Chợ Lách, a
2
là vận động viên của Châu Thành, a
3
là vận động viên của
Batri. Có 12 cách lựa chọn a
1
. Với mỗi cách lựa chọn a
1
đó có 14 cách lựa chọn a
2
.
Với mỗi cách lựa chọn a
1
và a
2
đó có 20 cách lựa chọn a
3
. Vì vậy số cấu hình lựa
chọn có thể có là: 12x14x20 =3360.
Ví dụ:

Xét đoạn mã chương trình viết bằng ngôn ngữ Pascal sau:
Var K,n1,n2,n3:word;
Begin
{.....}
42
K := 7; n1:=5; n2:=10; n3:=15;
For i:=1 to n1 do
For j:=1 to n2 do
For t:=1 to n3 do
K:=K+1;
writeln(‘K = ’,K);
{.....}
Cho biết kết xuất của dòng lệnh cuối cùng là gì?
Lời giải:
Ở đây ta có ba vòng lặp FOR lồng nhau. Trình biên dòch Pascalsẽ biên dòch
để với mỗi lần lặp của vòng lặp bên ngoài thì vòng lặp ngay bên trong nó được thực
hiện đầy đủ các lần lặp. Vậy mỗi lần lặp của ba vòng lặp lồng nhau đó tương ứng
với một cấu hình là bộ ba có thứ tự (i,j,t). Ở mỗi lần lặp K đều tăng lên một đơn vò.
Sau tất cả lần lặp K tăng lên đúng bằng số lần lặp. K được khởi tạo trước khi vào
vòng lặp bằng 7. Vì i vét qua tất cả n
1
giá trò khác nhau, j vét qua tất cả n
2
giá trò
khác nhau, t vét qua tất cả n
3
giá trò khác nhau nên số cấu hình được tạo ra cho bộ
(i,j,t) là n
1
.n

2.
n
3
. Đó cũng chính là toàn bộ số lần lặp. Vậy sau khi toàn bộ vòng lặp
đã thực hiện xong thì K=7 + n
1
.n
2
.n
3
. Kết xuất của dòng lệnh cuối cùng là:
K = 757.
Ví dụ:
Số serial của phiên bản Windows 98 của hãng MicroSoft gồm một dãy 25
chữ số thập phân và chữ cái trong bộ mẫu tự tiếng Anh (không phân biệt hoa/
thường). Vậy có bao nhiêu số serial khã dó dùng cho các bản copy của phiên bản
đó?
Lời giải:
Mỗi số serial là một dãy 25 chữ cái và chữ số. Chẳng hạn:
HQ6K2-QPC42-3HWDM-BF4KJ-W4XWJ.
Bảng mẫu tự tiếng anh có 26 chữ cái (Từ A đến Z). Số chữ số thập phân là
10 chữ số (từ kí tự 0 đến kí tự 9). Vậy mỗi vò trí trong số serial có 36 lựa chọn khác
nhau. Vậy có tất cả 36
25


8.0828127746476406064313960045654e+38 khả năng
lựa chọn số serial khác nhau. Đây quả thật là một con số kinh khủng!
o Nguyên lí bù trừ:
Khi thực hiện nguyên lý cộng vào bài toán đếm ta phải giả thiết hai tập cần

được đếm A và B là rời nhau. Nếu không có giả thiết đó thì buộc phải loại bớt các phần
tử trùng nhau của hai tập bò đếùm qua quá một lần:
N(A

B)=N(A)+N(B)-N(A

B)
43
Ví dụ: Có bao nhiêu xâu nhò phân độ dài 8 bit với 3 bit 111 đứng đầu hoặc 2 bit 00 đứng
cuối.
Lời giải:
Số xâu độ dài 8 bit với 3 bit 111 đứng đầu là: 2
5
= 32 (Áp dụng nguyên lí nhân đối với 5
bít cuối do chỉ còn 5 bit cuối là thay đổi).
Tương tự, số xâu độ dài 8 bit với 2 bit 00 đứng cuối là: 2
6
= 64 (do chỉ còn 6 bit đầu là
thay đổi).
Số xâu vừa có 3 bit đứng đầu 111, vừa có 2 bit đứng cuối 00 là: 2
3
= 8.
Vậy số xâu thỏa điều kiện đòi hỏi là: (32+64) - 8 = 88
Tổng quát hơn:
Giả sử A
1
,A
2
, ...,A
m

là các tập. Khi đó:
1
1 2 1 2
( ... ) ... ( 1)
m
m m
N A A A N N N

= − + + −U U U
Trong đó N
k
là tổng các phần tử của tất cả các giao của k tập
lấy từ m tập đã cho.
Cụ thể N
1
là tổng các phần tử của tất cả các giao của 1 tập lấy từ m tập đã cho. Hay:
N
1
=N(A
1
)+N(A
2
)+...+N(A
m
).
N
2
là tổng các phần tử của tất cả các giao của 2 tập lấy từ m tập đã cho. Có tất cả
2
m

C

phần giao như vậy. Hay:
N
2
= N(A
1

A
2
)+N(A
1

A
3
)+...+N(A
i

A
j
)+....
N
2
=
, 1
( )
m
i j
i j
i j

N A A
=



....
N
k
=
1 2
1 2
j
, ,..., 1
các i khác nhau đôi một
( ... )
k
k
m
i i i
i i i
N A A A
=

I I I

....
N
m
là tổng các phần tử của tất cả các giao của m tập lấy từ m tập đã cho. Hay N
m

=N(A
1

A
2

A
3

...

A
m
)
Ta chấp nhận không chứng minh tính chất trên.
Ví dụ:
Trong tập X={1,2, ... , 10000} có bao nhiêu số không chia hết cho bất cứ số nào trong
ba số 3,4,7?
Lời giải:
Đặt A
i
là tập các số thuộc X mà chia hết cho i {i=3,4,7}.
44
Khi đó A
3

A
4

A

7
là tập các số thuộc X mà chia hết cho ít nhất một trong ba số 3,4,7.
Vậy theo công thức trên ta sẽ có số các số chia hết cho ít nhất một trong 3 số 3,4,7 là:
N(A
3

A
4

A
7
) = N
1
-N
2
+ N
3
.
Sử dụng toán tử div cho phép chia nguyên, ta cóù:
N
1
= N(A
3
)+N(A
4
)+N(A
7
) = (10000 div 3)+(10000 div 4)+(10000 div 5)
= 3333+2500+1428 = 7261
N

2
= N(A
3

A
4
)+N(A
3

A
7
)+N(A
4

A
7
)
= (10000 div (3x4))+(10000 div (3x7))+(10000 div (4x7)) = 833+476+357 =1666
N
3
= N(A
3

A
4

A
7
)=(10000 div (3x4x7))=119.
Suy ra số các số thuộc X mà không chia hết cho số nào trong 3 số 3,4,7 là:

N(X)-N(A
3

A
4

A
7
)=10000 - (7261-1666+119) = 4286.
o Biểu đồ cây.
Trong một số trường hợp giải bài toán đếm bằng biểu đồ cây làm cho lời giải
được trực quan và sáng sủa hơn.
Ví dụ:
Xem đoạn chương trình giải bài toán tháp Hà Nội
1
sau đây:
Procedure Ch(n:số đóa; A,B,C : Vò trí)
{Thủ tục Chuyển n đóa từ vò trí A sang vò trí C lấy vò trí B làm trung gian}
BEGIN
IF (n>=1) THEN
BEGIN
Ch(n-1,A,C,B)
Output(A,C) {Dời 1 đóa ở A qua C}
Ch(n-1,B,A,C)
END
END
Chúng ta biết rằng các kết xuất của đoạn chương trình trên chỉ có thể thực hiện
khi toàn bộ các lời gọi đệ qui đã được thực thi. Với n là dữ liệu nhập câu hỏi đặt ra là
có tất cả bao nhiêu lời gọi đệ qui đã được thực hiện khi chương trình thực hiện Output?
Biểu đồ cây sau đây (với n=3) cho thấy các lời gọi đệ qui đã diễn ra như thế

nào.
1
Người viết giả thiết rằng người đọc đã biết phát biểu của bài toán này. Và ở thời điểm đọc
phần này người đọc đã hiểu về lời gọi đệ qui trong một ngôn ngữ lập trình nào đó.
45

×