SlideShare a Scribd company logo
1 of 70
Download to read offline
các tập con của một tập hợp
Bài giảng chuyên đề “Một số thuật toán tổ hợp”
Lê Hồng Phương1
1Khoa Toán–Cơ–Tin học
Trường Đại học Khoa học Tự nhiên, ĐHQG Hà Nội
<phuonglh@gmail.com>
08/2012
Lê Hồng Phương (HUS, VNU) 08/2012 1 / 57
Nội dung
1 Giới thiệu
2 Sinh các tập con
Thuật toán cộng một
Thuật toán đệ quy
Thuật toán mã Gray
3 Sinh các tập con k phần tử
Các hệ số nhị thức
Thuật toán sinh theo thứ tự từ điển
Một số thuật toán khác
4 Tóm lược
Lê Hồng Phương (HUS, VNU) 08/2012 2 / 57
Nội dung
1 Giới thiệu
2 Sinh các tập con
Thuật toán cộng một
Thuật toán đệ quy
Thuật toán mã Gray
3 Sinh các tập con k phần tử
Các hệ số nhị thức
Thuật toán sinh theo thứ tự từ điển
Một số thuật toán khác
4 Tóm lược
Lê Hồng Phương (HUS, VNU) 08/2012 2 / 57
Nội dung
1 Giới thiệu
2 Sinh các tập con
Thuật toán cộng một
Thuật toán đệ quy
Thuật toán mã Gray
3 Sinh các tập con k phần tử
Các hệ số nhị thức
Thuật toán sinh theo thứ tự từ điển
Một số thuật toán khác
4 Tóm lược
Lê Hồng Phương (HUS, VNU) 08/2012 2 / 57
Nội dung
1 Giới thiệu
2 Sinh các tập con
Thuật toán cộng một
Thuật toán đệ quy
Thuật toán mã Gray
3 Sinh các tập con k phần tử
Các hệ số nhị thức
Thuật toán sinh theo thứ tự từ điển
Một số thuật toán khác
4 Tóm lược
Lê Hồng Phương (HUS, VNU) 08/2012 2 / 57
Nội dung
1 Giới thiệu
2 Sinh các tập con
Thuật toán cộng một
Thuật toán đệ quy
Thuật toán mã Gray
3 Sinh các tập con k phần tử
Các hệ số nhị thức
Thuật toán sinh theo thứ tự từ điển
Một số thuật toán khác
4 Tóm lược
Lê Hồng Phương (HUS, VNU) 08/2012 2 / 57
Nội dung
1 Giới thiệu
2 Sinh các tập con
Thuật toán cộng một
Thuật toán đệ quy
Thuật toán mã Gray
3 Sinh các tập con k phần tử
Các hệ số nhị thức
Thuật toán sinh theo thứ tự từ điển
Một số thuật toán khác
4 Tóm lược
Lê Hồng Phương (HUS, VNU) 08/2012 2 / 57
Nội dung
1 Giới thiệu
2 Sinh các tập con
Thuật toán cộng một
Thuật toán đệ quy
Thuật toán mã Gray
3 Sinh các tập con k phần tử
Các hệ số nhị thức
Thuật toán sinh theo thứ tự từ điển
Một số thuật toán khác
4 Tóm lược
Lê Hồng Phương (HUS, VNU) 08/2012 3 / 57
Giới thiệu
Cho X = {x1, x2, . . . , xn} là một tập hợp gồm n phần tử.
Mỗi tập con Y của tập X có thể được biểu diễn bằng một dãy nhị
phân b1, b2, . . . , bn xác định như sau:
bi =
1, nếu xi ∈ Y,
0, nếu xi ∈ Y.
Nói riêng, tập Y ≡ ∅ tương ứng với dãy 0, 0, . . . , 0 và tập Y ≡ X
tương ứng với dãy 1, 1, . . . , 1 .
Ta thấy bi, i = 1, 2, . . . , n nhận giá trị nhị phân nên số tập con của
tập X là 2n.
Nếu ta coi mỗi dãy nhị phân là biểu diễn nhị phân của một số
nguyên không âm thì mỗi tập con của tập X ứng với một số
nguyên trong đoạn [0, 2n − 1].
Lê Hồng Phương (HUS, VNU) 08/2012 4 / 57
Giới thiệu
Cho X = {x1, x2, . . . , xn} là một tập hợp gồm n phần tử.
Mỗi tập con Y của tập X có thể được biểu diễn bằng một dãy nhị
phân b1, b2, . . . , bn xác định như sau:
bi =
1, nếu xi ∈ Y,
0, nếu xi ∈ Y.
Nói riêng, tập Y ≡ ∅ tương ứng với dãy 0, 0, . . . , 0 và tập Y ≡ X
tương ứng với dãy 1, 1, . . . , 1 .
Ta thấy bi, i = 1, 2, . . . , n nhận giá trị nhị phân nên số tập con của
tập X là 2n.
Nếu ta coi mỗi dãy nhị phân là biểu diễn nhị phân của một số
nguyên không âm thì mỗi tập con của tập X ứng với một số
nguyên trong đoạn [0, 2n − 1].
Lê Hồng Phương (HUS, VNU) 08/2012 4 / 57
Giới thiệu
Ta quan tâm tới hai bài toán:
1 Sinh mọi tập con của tập X;
2 Sinh mọi tập con gồm k phần tử của tập X với k ≤ n.
Lê Hồng Phương (HUS, VNU) 08/2012 5 / 57
Nội dung
1 Giới thiệu
2 Sinh các tập con
Thuật toán cộng một
Thuật toán đệ quy
Thuật toán mã Gray
3 Sinh các tập con k phần tử
Các hệ số nhị thức
Thuật toán sinh theo thứ tự từ điển
Một số thuật toán khác
4 Tóm lược
Lê Hồng Phương (HUS, VNU) 08/2012 6 / 57
Sinh các tập con
Bài toán
Hãy liệt kê mọi tập con của một tập hợp gồm n phần tử.
Ví dụ, các tập con của tập gồm 3 phần tử {1, 2, 3 } là:
{},
{1}, {2}, {3},
{1, 2}, {1, 3}, {2, 3},
{1, 2, 3}.
Chú ý:
Số tập con của một tập gồm n phần tử là 2n, là rất lớn nếu n lớn.
Vì vậy, bài toán này chỉ có thể giải được nếu n nhỏ (n ≤ 20).
Lê Hồng Phương (HUS, VNU) 08/2012 7 / 57
Nội dung
1 Giới thiệu
2 Sinh các tập con
Thuật toán cộng một
Thuật toán đệ quy
Thuật toán mã Gray
3 Sinh các tập con k phần tử
Các hệ số nhị thức
Thuật toán sinh theo thứ tự từ điển
Một số thuật toán khác
4 Tóm lược
Lê Hồng Phương (HUS, VNU) 08/2012 8 / 57
Thuật toán cộng một
Biểu diễn dãy nhị phân của các tập hợp gợi ý cho ta một phương pháp
đơn giản để sinh mọi tập hợp của n phần tử như sau:
1 Xuất phát từ tập rỗng, ứng với số k = 0 hay dãy nhị phân
a0 = 0, 0, . . . , 0 ;
2 Trong mỗi bước, số k được cộng thêm 1 và tìm các biểu diễn nhị
phân tương ứng của nó. Ví dụ, 5 dãy nhị phân tiếp theo là
a1 = 0, 0, . . . , 0, 0, 1
a2 = 0, 0, . . . , 0, 1, 0
a3 = 0, 0, . . . , 0, 1, 1
a4 = 0, 0, . . . , 1, 0, 0
a5 = 0, 0, . . . , 1, 0, 1
3 Dừng thuật toán khi k = 2n − 1 hay khi dãy nhị phân là
1, 1, . . . , 1, 1 .
Lê Hồng Phương (HUS, VNU) 08/2012 9 / 57
Thuật toán cộng một
Ta có thể tăng tốc độ của thuật toán dựa trên quan sát đơn giản: dãy
nhị phân đứng sau có thể được sinh từ dãy nhị phân đứng trước bằng
cách quy nạp.
Giả sử đã sinh được dãy nhị phân ai = b0, b1, . . . , bn , dãy ai+1 được
tìm bằng cách:
1 Xét các bít bj với j giảm dần, bắt đầu từ n.
2 Lặp, trong khi j ≥ 1:
nếu bj = 1 thì đặt bj = 0 và tiếp tục xét bj−1;
nếu bj = 0 thì đặt bj = 1 và dừng vòng lặp.
Lê Hồng Phương (HUS, VNU) 08/2012 10 / 57
Thuật toán cộng một
Sinh tập con tiếp theo:
void nextSubset(int a[], int n) {
int j = n - 1;
while (j >= 0) {
if (a[j] == 1)
a[j] = 0;
else {
a[j] = 1;
break;
}
j--;
}
}
Lê Hồng Phương (HUS, VNU) 08/2012 11 / 57
Thuật toán cộng một
Sinh mọi tập con bằng thuật toán cộng một:
void enumerate(int a[], int n) {
int i, j;
unsigned long max = exponential(2, n);
for (j = 0; j < n; j++)
a[j] = 0;
for (i = 0; i < max; i++) {
printSubset(a, n);
nextSubset(a, n);
}
}
Lê Hồng Phương (HUS, VNU) 08/2012 12 / 57
Thuật toán cộng một
Với n = 4, các dãy nhị phân sinh bởi thuật toán là:
0 0, 0, 0, 0 8 1, 0, 0, 0
1 0, 0, 0, 1 9 1, 0, 0, 1
2 0, 0, 1, 0 10 1, 0, 1, 0
3 0, 0, 1, 1 11 1, 0, 1, 1
4 0, 1, 0, 0 12 1, 1, 0, 0
5 0, 1, 0, 1 13 1, 1, 0, 1
6 0, 1, 1, 0 14 1, 1, 1, 0
7 0, 1, 1, 1 15 1, 1, 1, 1
Lê Hồng Phương (HUS, VNU) 08/2012 13 / 57
Nội dung
1 Giới thiệu
2 Sinh các tập con
Thuật toán cộng một
Thuật toán đệ quy
Thuật toán mã Gray
3 Sinh các tập con k phần tử
Các hệ số nhị thức
Thuật toán sinh theo thứ tự từ điển
Một số thuật toán khác
4 Tóm lược
Lê Hồng Phương (HUS, VNU) 08/2012 14 / 57
Thuật toán đệ quy
Ta có thể liệt kê mọi dãy nhị phân độ dài n bằng thuật toán đệ quy:
void enumerate(int a[], int n, int k) {
if (k < 0) {
printSubset(a, n);
}
else {
a[k] = 0;
enumerate(a, n, k - 1);
a[k] = 1;
enumerate(a, n, k - 1);
}
}
Chương trình chính gọi hàm enumerate(a, n, n - 1).
Lê Hồng Phương (HUS, VNU) 08/2012 15 / 57
Thuật toán đệ quy
Ví dụ, với n = 3, cây đệ quy tìm các dãy nhị phân được minh họa
trong hình sau:
???
??0
?00
000 100
?10
010 110
??1
?01
001 101
?11
011 111
Ta thấy thuật toán đệ quy thực hiện duyệt cây theo cách duyệt tiền
thứ tự và xử lí các nút lá của cây.
Lê Hồng Phương (HUS, VNU) 08/2012 16 / 57
Bài tập
Bài tập 1. Giải thích thuật toán đệ quy và vẽ sơ đồ cây đệ quy tìm
các dãy nhị phân ứng với các tập con của tập gồm 4 phần
tử.
Bài tập 2. Viết chương trình cài đặt các thuật toán cộng một và đệ
quy sinh các tập con của một tập hợp. So sánh thời gian
chạy của hai thuật toán này trên các tập có kích thước
tương tự nhau.
Lê Hồng Phương (HUS, VNU) 08/2012 17 / 57
Nội dung
1 Giới thiệu
2 Sinh các tập con
Thuật toán cộng một
Thuật toán đệ quy
Thuật toán mã Gray
3 Sinh các tập con k phần tử
Các hệ số nhị thức
Thuật toán sinh theo thứ tự từ điển
Một số thuật toán khác
4 Tóm lược
Lê Hồng Phương (HUS, VNU) 08/2012 18 / 57
Thuật toán mã Gray
Mã Gray n-bít là một danh sách gồm 2n dãy nhị phân độ dài n
trong đó dãy tiếp theo chỉ khác dãy đứng trước ở một bít.
Mã Gray được phát minh năm 1947 bởi Frank Gray, một nghiên
cứu viên ở Bell Labs, sau đó được công bố năm 1953 trong 1.
Ban đầu được sử dụng trong các hệ thống chuyển mạch cơ điện tử;
ngày nay, mã Gray được sử dụng rộng rãi trong việc phát hiện lỗi
của các hệ thống liên lạc điện tử.
1
F. Gray, “Pulse code communication,” 1953, U.S. Patent 2,632,058
Lê Hồng Phương (HUS, VNU) 08/2012 19 / 57
Thuật toán mã Gray
Mã Gray còn được gọi là “mã nhị phân phản xạ” vì mã Gray n bít
được xây dựng đệ quy từ mã Gray n − 1 bít bằng cách phản xạ
mã này.
Phản xạ: liệt kê các phần tử của danh sách dãy nhị phân theo thứ
tự ngược lại.
Các bước cụ thể để sinh mã Gray n bít như sau:
Lê Hồng Phương (HUS, VNU) 08/2012 20 / 57
Thuật toán mã Gray
1 Xuất phát từ mã Gray n − 1 bít là danh sách gồm k = 2n−1 dãy
nhị phân:
α1, α2, . . . , αk−1, αk
2 Phản xạ mã Gray này, tức liệt kê các dãy nhị phân của nó theo
thứ tự ngược lại:
αk, αk−1, . . . , α2, α1
3 Đặt bít 0 lên trước các dãy trong danh sách ban đầu:
0α1, 0α2, . . . , 0αk−1, 0αk
4 Đặt bít 1 lên trước các dãy trong danh sách phản xạ:
1αk, 1αk−1, . . . , 1α2, 1α1
5 Ghép hai danh sách này lại sẽ thu được mã Gray n bít:
0α1, 0α2, . . . , 0αk, 1αk, 1αk−1, . . . , 1α2, 1α1.
Lê Hồng Phương (HUS, VNU) 08/2012 21 / 57
Thuật toán mã Gray
Ví dụ, mã Gray với n = 3 được sinh từ mã Gray với n = 2 như sau:
Mã 2-bít 00, 01, 11, 10
Mã phản xạ 10, 11, 01, 00
Đặt 0 lên trước mã ban đầu 000, 001, 011, 010
Đặt 1 lên trước mã phản xạ 110, 111, 101, 100
Ghép hai mã 000, 001, 011, 010, 110, 111, 101, 100
Lê Hồng Phương (HUS, VNU) 08/2012 22 / 57
Thuật toán mã Gray
Mã Gray 1 bít là G1 = 0, 1 . Mã này có thể được sinh từ mã Gray 0
bít G0 = ǫ chỉ gồm một dãy rỗng theo cách trên.
Trong quá trình sinh mã Gn+1 từ Gn ta thấy một số tính chất sau:
Nếu coi mỗi dãy nhị phân trong mã Gn là một số nguyên (trong cơ
số 10) thì Gn là một hoán vị của dãy số 0, 1, . . . , 2n − 1 .
Gn được “nhúng” vào nửa đầu của Gn+1.
Mỗi dãy của Gn chỉ khác với dãy đứng trước nó một bít.2.
Dãy cuối cùng của Gn chỉ khác dãy đầu tiên một bít.
2
Nói cách khác, khoảng cách Hamming giữa hai dãy liên tiếp của Gn là 1.
Lê Hồng Phương (HUS, VNU) 08/2012 23 / 57
Bài tập
Bài tập 3. Sinh mã Gray 4 bít bằng thuật toán đệ quy nêu trên.
Bài tập 4. Viết chương trình cài đặt thuật toán tìm mọi tập con của
tập hợp bằng thuật toán sinh mã Gray n bít đệ quy nêu
trên.
Lê Hồng Phương (HUS, VNU) 08/2012 24 / 57
Thuật toán mã Gray
Ta có thể tìm mã Gn+1 từ mã Gn bằng một thủ tục đệ quy.
Tuy nhiên, từ các tính chất của mã Gray ở trên, ta có thể tìm mã Gray
bằng một thuật toán nhanh hơn dựa trên quan sát sau:
Chuỗi thứ i trong Gn là biểu diễn nhị phân của số (i/2) ⊕ i ,
trong đó i/2 là phép chia nguyên của i cho 2 và ⊕ là phép toán xor.
Nhắc lại: phép xor giữa hai bít a và b cho giá trị 1 nếu chỉ a hoặc
b là 1. Cụ thể:
a b a ⊕ b
0 0 0
0 1 1
1 0 1
1 1 0
Lê Hồng Phương (HUS, VNU) 08/2012 25 / 57
Thuật toán mã Gray
Ta có thể tìm mã Gn+1 từ mã Gn bằng một thủ tục đệ quy.
Tuy nhiên, từ các tính chất của mã Gray ở trên, ta có thể tìm mã Gray
bằng một thuật toán nhanh hơn dựa trên quan sát sau:
Chuỗi thứ i trong Gn là biểu diễn nhị phân của số (i/2) ⊕ i ,
trong đó i/2 là phép chia nguyên của i cho 2 và ⊕ là phép toán xor.
Nhắc lại: phép xor giữa hai bít a và b cho giá trị 1 nếu chỉ a hoặc
b là 1. Cụ thể:
a b a ⊕ b
0 0 0
0 1 1
1 0 1
1 1 0
Lê Hồng Phương (HUS, VNU) 08/2012 25 / 57
Thuật toán mã Gray
Ví dụ, các chuỗi nhị phân thứ i, ∀i = 0, 1, . . . , 7 trong mã G3:
i(10) i(2) (i/2)(2) (i/2) ⊕ i G3
0 000 000 000 ⊕ 000 000
1 001 000 000 ⊕ 001 001
2 010 001 001 ⊕ 010 011
3 011 001 001 ⊕ 011 010
4 100 010 010 ⊕ 100 110
5 101 010 010 ⊕ 101 111
6 110 011 011 ⊕ 110 101
7 111 011 011 ⊕ 111 100
Cột đầu tiên là số i trong cơ số 10; cột thứ hai là biểu diễn của nó
trong cơ số 2; cột thứ ba là số i/2 trong cơ số 2; cột thứ tư là phép
toán xor giữa hai số i/2 và i trong cơ số 2; cột cuối cùng chính là chuỗi
nhị phân thứ i trong mã G3.
Lê Hồng Phương (HUS, VNU) 08/2012 26 / 57
Bài tập
Bài tập 5. Sinh mã Gray 4 bít theo thuật toán tính nhanh như bảng
trên (lập bảng tính G4).
Bài tập 6. Viết chương trình cài đặt thuật toán tìm mọi tập con của
tập hợp bằng thuật toán sinh mã Gray n bít theo thuật
toán tính nhanh như trên.
Lê Hồng Phương (HUS, VNU) 08/2012 27 / 57
Thuật toán mã Gray
Ta cũng có thể tìm chuỗi mã Gray thứ i + 1 từ chuỗi mã Gray thứ i
dựa trên quan sát sau:
1 Nếu chuỗi thứ i có một số chẵn bít 1 thì ta đảo bít cuối cùng của
nó sẽ có chuỗi thứ i + 1;
2 Nếu chuỗi thứ i có một số lẻ bít 1 thì ta tìm bít 1 ở bên phải nhất
của chuỗi và đảo bít ở bên trái bít đó.
Sử dụng quy tắc đảo bít này, ta sinh được mã Gray G4 như sau:
000
(1)
⇒ 001
(2)
⇒ 011
(1)
⇒ 010
(2)
⇒ 110
(1)
⇒ 111
(2)
⇒ 101
(1)
⇒ 100.
Lê Hồng Phương (HUS, VNU) 08/2012 28 / 57
Bài tập
Bài tập 7. Viết chương trình cài đặt thuật toán tìm mọi tập con của
tập hợp bằng thuật toán sinh mã Gray n bít theo thuật
toán đảo bít.
Bài tập 8. Viết chương trình giải bài toán sau. Có n gói kẹo, trong
mỗi gói kẹo chứa ai cái kẹo, i = 1, 2, . . . , n. Hãy tìm cách
chia n gói kẹo đó thành hai phần sao cho hiệu số kẹo của
hai phần là nhỏ nhất.
Lê Hồng Phương (HUS, VNU) 08/2012 29 / 57
Mô tả hình học
Nếu coi mỗi dãy nhị phân trong mã Gray n bít là một đỉnh của đồ thị;
hai đỉnh kề nhau nếu hai dãy nhị phân chỉ khác nhau ở 1 bít thì mã
Gray n bít tương ứng với một đường đi Hamilton trên đồ thị này.
0 1
00 01
10 11
000 001
011010
110 111
101100
n = 1 n = 2 n = 3
Lê Hồng Phương (HUS, VNU) 08/2012 30 / 57
Nội dung
1 Giới thiệu
2 Sinh các tập con
Thuật toán cộng một
Thuật toán đệ quy
Thuật toán mã Gray
3 Sinh các tập con k phần tử
Các hệ số nhị thức
Thuật toán sinh theo thứ tự từ điển
Một số thuật toán khác
4 Tóm lược
Lê Hồng Phương (HUS, VNU) 08/2012 31 / 57
Nội dung
1 Giới thiệu
2 Sinh các tập con
Thuật toán cộng một
Thuật toán đệ quy
Thuật toán mã Gray
3 Sinh các tập con k phần tử
Các hệ số nhị thức
Thuật toán sinh theo thứ tự từ điển
Một số thuật toán khác
4 Tóm lược
Lê Hồng Phương (HUS, VNU) 08/2012 32 / 57
Các k–tổ hợp
Ta xét các tập con k phần tử của một tập hợp có n phần tử. Các
tập này gọi là các k–tổ hợp.
Ví dụ, các 3-tổ hợp của 5 phần tử {a, b, c, d, e} là:
abc, abd, abe, acd, ace, ade, bcd, bce, bde, cde.
Ta đếm được 10 tổ hợp. Tổng quát, có bao nhiêu k–tổ hợp của n
phần tử?
Lê Hồng Phương (HUS, VNU) 08/2012 33 / 57
Các k–tổ hợp
Từ mục đếm các hoán vị, ta thấy có n(n − 1) · · · (n − k + 1) cách
chọn k phần tử đầu tiên của một hoán vị gồm n phần tử; và mỗi
k–tổ hợp xuất hiện đúng k! lần trong các xếp đặt này, vì mỗi tổ
hợp xuất hiện trong mọi hoán vị của nó.
Vì vậy số k–tổ hợp của n phần tử là:
n
k
=
n(n − 1) · · · (n − k + 1)
k(k − 1) · · · (1)
.
Ta dùng kí hiệu n
k , hoặc Ck
n để chỉ số tổ hợp. Đại lượng này còn
được gọi là các hệ số nhị thức.
Lê Hồng Phương (HUS, VNU) 08/2012 34 / 57
Các hệ số nhị thức
Các hệ số nhị thức ứng với n một số giá trị đầu tiên của k.
n
0
n
1
n
2
n
3
n
4
n
5
n
6
n
7
n
8
1 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0
1 2 1 0 0 0 0 0 0
1 3 3 1 0 0 0 0 0
1 4 6 4 1 0 0 0 0
1 5 10 10 5 1 0 0 0
1 6 15 20 15 6 1 0 0
1 7 21 35 35 21 7 1 0
1 8 28 56 70 56 28 8 1
Tam giác Pascal – Blaise Pascal, Traité du triangle arithmétique, 1653.
Lê Hồng Phương (HUS, VNU) 08/2012 35 / 57
Các hệ số nhị thức – Biểu diễn bằng giai thừa
Một số kĩ thuật cơ bản để tính toán các hệ số nhị thức được liệt kê
ngắn gọn như dưới đây.
1. Biểu diễn bằng giai thừa. Ta có công thức biểu diễn:
n
k
=
n!
k!(n − k)!
.
Hai phương pháp chứng minh công thức này:
Chứng minh bằng tính toán
Chứng minh bằng lập luận
Lê Hồng Phương (HUS, VNU) 08/2012 36 / 57
Các hệ số nhị thức – Tính chất đối xứng
2. Tính chất đối xứng.
n
k
=
n
n − k
.
(Chú ý: khi k > n thì hệ số nhị thức bằng 0.)
Có thể chứng minh tính chất này bằng công thức tính hệ số nhị
thức.
Tuy nhiên, tính chất này là dễ hiểu vì số cách chọn các tập k phần
tử từ n phần tử cũng chính là số cách chọn các tập bù gồm n − k
phần tử từ n phần tử. Do đó số k–tổ hợp chính là số n − k tổ hợp.
Chú ý rằng tính chất đối xứng được thể hiện trong mỗi hàng của
tam giác Pascal.
Lê Hồng Phương (HUS, VNU) 08/2012 37 / 57
Các hệ số nhị thức – Công thức cộng
3. Công thức cộng. Ta có tính chất cơ bản
n
k
=
n − 1
k − 1
+
n − 1
k
.
Tính chất này có thể được chứng minh bằng cách tự nhiên như sau. Để
chọn k phần tử từ n phần tử a1, a2, . . . , an, ta có thể chọn bằng một
trong hai cách:
chọn phần tử a1, khi đó ta cần chọn k − 1 phần tử nữa từ n − 1
phần tử còn lại; số cách chọn này là n−1
k−1 ;
không chọn phần tử a1, khi đó ta cần chọn k phần tử từ n − 1
phần tử còn lại; số cách chọn này là n−1
k .
Như vậy, số k–tổ hợp của n phần tử chính là tổng của hai đại lượng
trên.
Lê Hồng Phương (HUS, VNU) 08/2012 38 / 57
Các hệ số nhị thức – Công thức cộng
3. Công thức cộng. Ta có tính chất cơ bản
n
k
=
n − 1
k − 1
+
n − 1
k
.
Tính chất này có thể được chứng minh bằng cách tự nhiên như sau. Để
chọn k phần tử từ n phần tử a1, a2, . . . , an, ta có thể chọn bằng một
trong hai cách:
chọn phần tử a1, khi đó ta cần chọn k − 1 phần tử nữa từ n − 1
phần tử còn lại; số cách chọn này là n−1
k−1 ;
không chọn phần tử a1, khi đó ta cần chọn k phần tử từ n − 1
phần tử còn lại; số cách chọn này là n−1
k .
Như vậy, số k–tổ hợp của n phần tử chính là tổng của hai đại lượng
trên.
Lê Hồng Phương (HUS, VNU) 08/2012 38 / 57
Các hệ số nhị thức – Công thức cộng
Trong tam giác Pascal, mọi giá trị đều là tổng của hai giá trị ở hàng
trước và bên trái nó. Ví dụ
5 10
15
(15 = 5 + 10)
21 7
28
(21 = 7 + 28)
n
0
n
1
n
2
n
3
n
4
n
5
n
6
n
7
n
8
1 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0
1 2 1 0 0 0 0 0 0
1 3 3 1 0 0 0 0 0
1 4 6 4 1 0 0 0 0
1 5 10 10 5 1 0 0 0
1 6 15 20 15 6 1 0 0
1 7 21 35 35 21 7 1 0
1 8 28 56 70 56 28 8 1
Lê Hồng Phương (HUS, VNU) 08/2012 39 / 57
Các hệ số nhị thức – Công thức tích
4. Công thức tích. Ta có công thức tích sau:
n
m
m
k
=
n
k
n − k
m − k
.
Tương tự như trên, công thức này có thể được chứng minh dễ
dàng bằng cách khai triển tổ hợp.
Tuy nhiên, ta có thể chứng minh công thức này bằng cách suy
luận.
Lê Hồng Phương (HUS, VNU) 08/2012 40 / 57
Các hệ số nhị thức – Công thức tích
Xét ba tập hợp K, M, N. Giả sử |K| = k, |M| = m, |N| = n.
Ta thấy đại lượng bên trái của công thức chính là số các cặp tập
hợp (M, K) thoả mãn điều kiện K ⊂ M ⊂ N vì tập M có thể
chọn bằng n
m cách và tập K có thể chọn bằng m
k cách.
N
M
KN  M
Lê Hồng Phương (HUS, VNU) 08/2012 41 / 57
Các hệ số nhị thức – Công thức tích
Ta cũng có thể tính số cặp (M, K) này bằng cách khác như sau.
Chọn tập K trước, có n
k cách chọn tập K.
Với mỗi cách chọn K, ta chọn tập M sao cho K ⊂ M ⊂ N. Số
cách chọn tập M bằng số cách chọn tập M  K trong tập N  K
và bằng n−k
m−k .
Từ đó, số cách chọn các cặp (M, K) là n
k
n−k
m−k .
Lê Hồng Phương (HUS, VNU) 08/2012 42 / 57
Các hệ số nhị thức – Công thức tích
Công thức tích ở trên rất hữu dụng khi xử lí các công thức tổ hợp
trong đó có một chỉ số (ở đây là m) xuất hiện đồng thời ở cả vị trí dưới
và trên trong các tổ hợp; ta có thể chuyển chỉ số đó xuống vị trí dưới
nhờ công thức tích.
Với k = 1, ta có
n
m
m
1
=
n
1
n − 1
m − 1
,
hay
n
m
=
n
m
n − 1
m − 1
.
Công thức này được gọi là công thức “di chuyển các phần tử ra khỏi
ngoặc”.
Lê Hồng Phương (HUS, VNU) 08/2012 43 / 57
Các hệ số nhị thức – Khai triển nhị thức
5. Công thức nhị thức.
(x + y)n
=
n
k=0
n
k
xk
yn−k
.
Chính vì công thức này nên số k–tổ hợp được gọi là các
hệ số nhị thức.
Chú ý rằng công thức này cho ta
00
= 1.
Trong trường hợp riêng khi y = 1, ta có
(1 + x)n
=
n
k=0
n
k
xk
.
Và khi x = 1, ta có
2n
=
n
k=0
n
k
.
Lê Hồng Phương (HUS, VNU) 08/2012 44 / 57
Các hệ số nhị thức – Khai triển nhị thức
5. Công thức nhị thức.
(x + y)n
=
n
k=0
n
k
xk
yn−k
.
Chính vì công thức này nên số k–tổ hợp được gọi là các
hệ số nhị thức.
Chú ý rằng công thức này cho ta
00
= 1.
Trong trường hợp riêng khi y = 1, ta có
(1 + x)n
=
n
k=0
n
k
xk
.
Và khi x = 1, ta có
2n
=
n
k=0
n
k
.
Lê Hồng Phương (HUS, VNU) 08/2012 44 / 57
Các hệ số nhị thức – Tổng của tích
6. Tổng của tích.
n + m
k
=
n
s=0
n
s
m
k − s
.
Công thức này được chứng minh bằng lập luận đơn giản như sau.
Ta có n quả cam và m quả táo và muốn lấy k quả, với
0 ≤ k ≤ n + m.
Trong mỗi lần lấy, ta có thể lấy s quả cam và k − s quả táo. Có
n
s
m
k−s cách lấy k quả trong đó có s quả cam.
Giá trị của s có thể biến đổi từ 0 tới n nên ta có công thức tổng
của tích nêu trên.
Lê Hồng Phương (HUS, VNU) 08/2012 45 / 57
Các hệ số nhị thức – Tổng của tích
6. Tổng của tích.
n + m
k
=
n
s=0
n
s
m
k − s
.
Công thức này được chứng minh bằng lập luận đơn giản như sau.
Ta có n quả cam và m quả táo và muốn lấy k quả, với
0 ≤ k ≤ n + m.
Trong mỗi lần lấy, ta có thể lấy s quả cam và k − s quả táo. Có
n
s
m
k−s cách lấy k quả trong đó có s quả cam.
Giá trị của s có thể biến đổi từ 0 tới n nên ta có công thức tổng
của tích nêu trên.
Lê Hồng Phương (HUS, VNU) 08/2012 45 / 57
Nội dung
1 Giới thiệu
2 Sinh các tập con
Thuật toán cộng một
Thuật toán đệ quy
Thuật toán mã Gray
3 Sinh các tập con k phần tử
Các hệ số nhị thức
Thuật toán sinh theo thứ tự từ điển
Một số thuật toán khác
4 Tóm lược
Lê Hồng Phương (HUS, VNU) 08/2012 46 / 57
Sinh các k–tổ hợp
Giả sử tập n phần tử được kí hiệu là {1, 2, . . . , n}.
Bài toán
Hãy sinh mọi tập con k phần tử của một tập có n phần tử.
Lê Hồng Phương (HUS, VNU) 08/2012 47 / 57
Sinh các k–tổ hợp theo thứ tự từ điển
Ví dụ với k = 3 và n = 5, ta có 10 tập con gồm 3 phần tử của tập
{0, 1, 2, 3, 4} theo thứ tự như sau:
Thứ tự Tập a
0 {0, 1, 2} [0, 1, 2]
1 {0, 1, 3} [0, 1, 3]
2 {0, 1, 4} [0, 1, 4]
3 {0, 2, 3} [0, 2, 3]
4 {0, 2, 4} [0, 2, 4]
5 {0, 3, 4} [0, 3, 4]
6 {1, 2, 3} [1, 2, 3]
7 {1, 2, 4} [1, 2, 4]
8 {1, 3, 4} [1, 3, 4]
9 {2, 3, 4} [2, 3, 4]
Lê Hồng Phương (HUS, VNU) 08/2012 48 / 57
Sinh các k–tổ hợp theo thứ tự từ điển
Ý tưởng: Sinh tập con tiếp theo có thứ tự đứng ngay sau tập con
hiện tại.
Giả sử tập con hiện tại là {. . . , 5, 8, 9, 10}, khi đó tập con ngay sau
là {. . . , 6, 7, 8, 9}.
Tổng quát, nếu tập con hiện tại là {a1, . . . , ai−1, ai, . . . , ak} thì tập
con tiếp theo là
{a1, . . . , ai−1, ai + 1, ai + 2, . . . , ai + k − i + 1}.
Lê Hồng Phương (HUS, VNU) 08/2012 49 / 57
Sinh các k–tổ hợp theo thứ tự từ điển
Để tìm vị trí i (vị trí bắt đầu cập nhật giá trị), ta xuất phát từ vị
trí cuối (i = k − 1), giảm i nếu ai = n − k + i.
Sau khi tìm được vị trí i thì ta có thể cập nhật các giá trị aj như
sau:
ai = ai + 1
aj = aj−1 + 1, ∀j = i + 1, . . . , k − 1.
Từ đó, ta có thể liệt kê mọi k-tổ hợp của n phần tử bằng thuật
toán lặp sinh các tập theo thứ tự từ điển.
Lê Hồng Phương (HUS, VNU) 08/2012 50 / 57
Sinh các k–tổ hợp theo thứ tự từ điển
void enumerate(int a[], int n, int k) {
int i, j;
for (i = 0; i < MAX; i++)
a[i] = i;
while (a[k - 1] < n) {
printSubset(a, k);
i = k - 1;
while (i > 0 && a[i] == n - k + i)
i--;
a[i]++;
for (j = i + 1; j < k; j++)
a[j] = a[j - 1] + 1;
}
}
Lê Hồng Phương (HUS, VNU) 08/2012 51 / 57
Sinh các k–tổ hợp theo thứ tự từ điển
Ví dụ, thực hiện thuật toán với n = 6 và k = 3 ta có 20 tập con sau:
Thứ tự Tập Thứ tự Tập
0 {0, 1, 2 } 10 {1, 2, 3 }
1 {0, 1, 3 } 11 {1, 2, 4 }
2 {0, 1, 4 } 12 {1, 2, 5 }
3 {0, 1, 5 } 13 {1, 3, 4 }
4 {0, 2, 3 } 14 {1, 3, 5 }
5 {0, 2, 4 } 15 {1, 4, 5 }
6 {0, 2, 5 } 16 {2, 3, 4 }
7 {0, 3, 4 } 17 {2, 3, 5 }
8 {0, 3, 5 } 18 {2, 4, 5 }
9 {0, 4, 5 } 19 {3, 4, 5 }
Lê Hồng Phương (HUS, VNU) 08/2012 52 / 57
Bài tập
Bài tập 9. Viết chương trình tìm mọi tập con gồm k phần tử của
một tập n phần tử bằng phương pháp từ điển. Chạy thử
chương trình với các dữ liệu khác nhau và kiểm tra kết
quả.
Lê Hồng Phương (HUS, VNU) 08/2012 53 / 57
Nội dung
1 Giới thiệu
2 Sinh các tập con
Thuật toán cộng một
Thuật toán đệ quy
Thuật toán mã Gray
3 Sinh các tập con k phần tử
Các hệ số nhị thức
Thuật toán sinh theo thứ tự từ điển
Một số thuật toán khác
4 Tóm lược
Lê Hồng Phương (HUS, VNU) 08/2012 54 / 57
Một số thuật toán khác
Tham khảo thêm một số thuật toán sinh các tập con khác trong:
D. E. Knuth, The Art of Computer Programming: Introduction to
Combinatorial Algorithms and Boolean Functions, 1st ed.
Addison Wesley Publishing, 2008, vol. 4.
F. Ruskey, “Adjacent interchange generation of combinations,”
Journal of Algorithms, vol. 9, pp. 162–180, 1988.
T. Hough and F. Ruskey, “An effcient implementation of the
Eades, Hickey, Read adjacent interchange combination generation
algorithm,” Journal of Combinatorial Mathematics and
Combinatorial Computing, vol. 4, pp. 79–86, 1988.
S. G. Akl, “A comparison of combination generation methods,”
ACM Trans. Math. Softw., vol. 7, no. 1, pp. 42–45, 1981.
Lê Hồng Phương (HUS, VNU) 08/2012 55 / 57
Một số thuật toán khác
Tham khảo thêm một số thuật toán sinh các tập con khác trong:
D. E. Knuth, The Art of Computer Programming: Introduction to
Combinatorial Algorithms and Boolean Functions, 1st ed.
Addison Wesley Publishing, 2008, vol. 4.
F. Ruskey, “Adjacent interchange generation of combinations,”
Journal of Algorithms, vol. 9, pp. 162–180, 1988.
T. Hough and F. Ruskey, “An effcient implementation of the
Eades, Hickey, Read adjacent interchange combination generation
algorithm,” Journal of Combinatorial Mathematics and
Combinatorial Computing, vol. 4, pp. 79–86, 1988.
S. G. Akl, “A comparison of combination generation methods,”
ACM Trans. Math. Softw., vol. 7, no. 1, pp. 42–45, 1981.
Lê Hồng Phương (HUS, VNU) 08/2012 55 / 57
Một số thuật toán khác
Tham khảo thêm một số thuật toán sinh các tập con khác trong:
D. E. Knuth, The Art of Computer Programming: Introduction to
Combinatorial Algorithms and Boolean Functions, 1st ed.
Addison Wesley Publishing, 2008, vol. 4.
F. Ruskey, “Adjacent interchange generation of combinations,”
Journal of Algorithms, vol. 9, pp. 162–180, 1988.
T. Hough and F. Ruskey, “An effcient implementation of the
Eades, Hickey, Read adjacent interchange combination generation
algorithm,” Journal of Combinatorial Mathematics and
Combinatorial Computing, vol. 4, pp. 79–86, 1988.
S. G. Akl, “A comparison of combination generation methods,”
ACM Trans. Math. Softw., vol. 7, no. 1, pp. 42–45, 1981.
Lê Hồng Phương (HUS, VNU) 08/2012 55 / 57
Một số thuật toán khác
Tham khảo thêm một số thuật toán sinh các tập con khác trong:
D. E. Knuth, The Art of Computer Programming: Introduction to
Combinatorial Algorithms and Boolean Functions, 1st ed.
Addison Wesley Publishing, 2008, vol. 4.
F. Ruskey, “Adjacent interchange generation of combinations,”
Journal of Algorithms, vol. 9, pp. 162–180, 1988.
T. Hough and F. Ruskey, “An effcient implementation of the
Eades, Hickey, Read adjacent interchange combination generation
algorithm,” Journal of Combinatorial Mathematics and
Combinatorial Computing, vol. 4, pp. 79–86, 1988.
S. G. Akl, “A comparison of combination generation methods,”
ACM Trans. Math. Softw., vol. 7, no. 1, pp. 42–45, 1981.
Lê Hồng Phương (HUS, VNU) 08/2012 55 / 57
Nội dung
1 Giới thiệu
2 Sinh các tập con
Thuật toán cộng một
Thuật toán đệ quy
Thuật toán mã Gray
3 Sinh các tập con k phần tử
Các hệ số nhị thức
Thuật toán sinh theo thứ tự từ điển
Một số thuật toán khác
4 Tóm lược
Lê Hồng Phương (HUS, VNU) 08/2012 56 / 57
Tóm lược
Các nội dung chính của bài giảng:
Biểu diễn các tập con của một tập hợp
Ba thuật toán sinh các tập con của một tập hợp:
Thuật toán cộng một
Thuật toán đệ quy
Thuật toán mã Gray (phương pháp đệ quy, phương pháp tính
nhanh bằng xor, phương pháp đảo bít)
Các tập con k phần tử:
Các hệ số nhị thức
Thuật toán sinh các tập con theo thứ tự từ điển
Các bài tập lập trình để củng cố kiến thức
Lê Hồng Phương (HUS, VNU) 08/2012 57 / 57

More Related Content

What's hot

Chuong 2. de quy dai hoc
Chuong 2. de quy   dai hocChuong 2. de quy   dai hoc
Chuong 2. de quy dai hocVũ Nam
 
Chuong 05 de quy
Chuong 05 de quyChuong 05 de quy
Chuong 05 de quyCau Chu Nho
 
Chương 1 dai so truu tuong
Chương 1 dai so truu tuongChương 1 dai so truu tuong
Chương 1 dai so truu tuongvpmity
 
08 mat102-bai 5-v1.0
08 mat102-bai 5-v1.008 mat102-bai 5-v1.0
08 mat102-bai 5-v1.0Yen Dang
 
Thuật toán berlekamp và đa thức chia đường tròn modulo p
Thuật toán berlekamp và đa thức chia đường tròn modulo pThuật toán berlekamp và đa thức chia đường tròn modulo p
Thuật toán berlekamp và đa thức chia đường tròn modulo pBui Loi
 
Gt khong gian_metric Nguyen Hoang
Gt khong gian_metric Nguyen HoangGt khong gian_metric Nguyen Hoang
Gt khong gian_metric Nguyen HoangBui Loi
 
07 mat102-bai 4-v1.0
07 mat102-bai 4-v1.007 mat102-bai 4-v1.0
07 mat102-bai 4-v1.0Yen Dang
 
[123doc.vn] bg-giai-tich-iii-nguyen-xuan-thao-2014
[123doc.vn]   bg-giai-tich-iii-nguyen-xuan-thao-2014[123doc.vn]   bg-giai-tich-iii-nguyen-xuan-thao-2014
[123doc.vn] bg-giai-tich-iii-nguyen-xuan-thao-2014Con TrIm Lông Bông
 
Tính toán khoa học - Chương 0: Introduction
Tính toán khoa học - Chương 0: IntroductionTính toán khoa học - Chương 0: Introduction
Tính toán khoa học - Chương 0: IntroductionChien Dang
 
chuong 2. phep dem
chuong 2. phep demchuong 2. phep dem
chuong 2. phep demkikihoho
 
ThiếT Kế Và đáNh Giá ThuậT ToáN
ThiếT Kế Và đáNh Giá ThuậT ToáNThiếT Kế Và đáNh Giá ThuậT ToáN
ThiếT Kế Và đáNh Giá ThuậT ToáNguest717ec2
 
Đề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuật
Đề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuậtĐề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuật
Đề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuậtHưởng Nguyễn
 
[Pascal] sang tao1[v5.10]
[Pascal] sang tao1[v5.10][Pascal] sang tao1[v5.10]
[Pascal] sang tao1[v5.10]MasterCode.vn
 

What's hot (20)

Chuong 2. de quy dai hoc
Chuong 2. de quy   dai hocChuong 2. de quy   dai hoc
Chuong 2. de quy dai hoc
 
Gt de quy
Gt de quyGt de quy
Gt de quy
 
Chuong 05 de quy
Chuong 05 de quyChuong 05 de quy
Chuong 05 de quy
 
Luận văn: Lớp bài toán tìm giá trị lớn nhất giá trị nhỏ nhất, HOT
Luận văn: Lớp bài toán tìm giá trị lớn nhất giá trị nhỏ nhất, HOTLuận văn: Lớp bài toán tìm giá trị lớn nhất giá trị nhỏ nhất, HOT
Luận văn: Lớp bài toán tìm giá trị lớn nhất giá trị nhỏ nhất, HOT
 
Chương 1 dai so truu tuong
Chương 1 dai so truu tuongChương 1 dai so truu tuong
Chương 1 dai so truu tuong
 
08 mat102-bai 5-v1.0
08 mat102-bai 5-v1.008 mat102-bai 5-v1.0
08 mat102-bai 5-v1.0
 
Thuật toán berlekamp và đa thức chia đường tròn modulo p
Thuật toán berlekamp và đa thức chia đường tròn modulo pThuật toán berlekamp và đa thức chia đường tròn modulo p
Thuật toán berlekamp và đa thức chia đường tròn modulo p
 
Gt khong gian_metric Nguyen Hoang
Gt khong gian_metric Nguyen HoangGt khong gian_metric Nguyen Hoang
Gt khong gian_metric Nguyen Hoang
 
07 mat102-bai 4-v1.0
07 mat102-bai 4-v1.007 mat102-bai 4-v1.0
07 mat102-bai 4-v1.0
 
[123doc.vn] bg-giai-tich-iii-nguyen-xuan-thao-2014
[123doc.vn]   bg-giai-tich-iii-nguyen-xuan-thao-2014[123doc.vn]   bg-giai-tich-iii-nguyen-xuan-thao-2014
[123doc.vn] bg-giai-tich-iii-nguyen-xuan-thao-2014
 
Tính toán khoa học - Chương 0: Introduction
Tính toán khoa học - Chương 0: IntroductionTính toán khoa học - Chương 0: Introduction
Tính toán khoa học - Chương 0: Introduction
 
Dien tu so
Dien tu soDien tu so
Dien tu so
 
Lawoflargenumber
LawoflargenumberLawoflargenumber
Lawoflargenumber
 
Cyclic code
Cyclic codeCyclic code
Cyclic code
 
Chuong04
Chuong04Chuong04
Chuong04
 
chuong 2. phep dem
chuong 2. phep demchuong 2. phep dem
chuong 2. phep dem
 
ThiếT Kế Và đáNh Giá ThuậT ToáN
ThiếT Kế Và đáNh Giá ThuậT ToáNThiếT Kế Và đáNh Giá ThuậT ToáN
ThiếT Kế Và đáNh Giá ThuậT ToáN
 
Đề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuật
Đề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuậtĐề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuật
Đề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuật
 
[Pascal] sang tao1[v5.10]
[Pascal] sang tao1[v5.10][Pascal] sang tao1[v5.10]
[Pascal] sang tao1[v5.10]
 
Lttt b11
Lttt b11Lttt b11
Lttt b11
 

Viewers also liked

Giáo trình pascal cho gv hs thpt
Giáo trình pascal cho gv hs thptGiáo trình pascal cho gv hs thpt
Giáo trình pascal cho gv hs thptTâm Phan
 
Phương pháp tham lam giải bài toán lập lịch công việc
Phương pháp tham lam giải bài toán lập lịch công việcPhương pháp tham lam giải bài toán lập lịch công việc
Phương pháp tham lam giải bài toán lập lịch công việcNguyễn Danh Thanh
 
Phương pháp nhánh cận
Phương pháp nhánh cậnPhương pháp nhánh cận
Phương pháp nhánh cậnDiên Vĩ
 
[Pascal] sang tao2(v5.10)
[Pascal] sang tao2(v5.10)[Pascal] sang tao2(v5.10)
[Pascal] sang tao2(v5.10)MasterCode.vn
 
Sáng tạo trong thuật toán và lập trình Pascal và C#
Sáng tạo trong thuật toán và lập trình Pascal và C#Sáng tạo trong thuật toán và lập trình Pascal và C#
Sáng tạo trong thuật toán và lập trình Pascal và C#Dương Tuấn
 
Bai toan va thuat toan
Bai toan va thuat toanBai toan va thuat toan
Bai toan va thuat toanHữu Duy Duy
 
Ngôn ngữ lập trình pascal (bổ trợ tin 11)
Ngôn ngữ lập trình pascal (bổ trợ tin 11)Ngôn ngữ lập trình pascal (bổ trợ tin 11)
Ngôn ngữ lập trình pascal (bổ trợ tin 11)Hong Phuoc Nguyen
 
Giao an trinh_pascal_bai_tap_co_dap_an_huong_dan
Giao an trinh_pascal_bai_tap_co_dap_an_huong_danGiao an trinh_pascal_bai_tap_co_dap_an_huong_dan
Giao an trinh_pascal_bai_tap_co_dap_an_huong_danVõ Tâm Long
 

Viewers also liked (11)

Gt de quy_2
Gt de quy_2Gt de quy_2
Gt de quy_2
 
Giáo trình pascal cho gv hs thpt
Giáo trình pascal cho gv hs thptGiáo trình pascal cho gv hs thpt
Giáo trình pascal cho gv hs thpt
 
Phương pháp tham lam
Phương pháp tham lamPhương pháp tham lam
Phương pháp tham lam
 
Phương pháp tham lam giải bài toán lập lịch công việc
Phương pháp tham lam giải bài toán lập lịch công việcPhương pháp tham lam giải bài toán lập lịch công việc
Phương pháp tham lam giải bài toán lập lịch công việc
 
Phương pháp nhánh cận
Phương pháp nhánh cậnPhương pháp nhánh cận
Phương pháp nhánh cận
 
Đệ Quy, Quay Lui, Nhánh Cận
Đệ Quy, Quay Lui, Nhánh CậnĐệ Quy, Quay Lui, Nhánh Cận
Đệ Quy, Quay Lui, Nhánh Cận
 
[Pascal] sang tao2(v5.10)
[Pascal] sang tao2(v5.10)[Pascal] sang tao2(v5.10)
[Pascal] sang tao2(v5.10)
 
Sáng tạo trong thuật toán và lập trình Pascal và C#
Sáng tạo trong thuật toán và lập trình Pascal và C#Sáng tạo trong thuật toán và lập trình Pascal và C#
Sáng tạo trong thuật toán và lập trình Pascal và C#
 
Bai toan va thuat toan
Bai toan va thuat toanBai toan va thuat toan
Bai toan va thuat toan
 
Ngôn ngữ lập trình pascal (bổ trợ tin 11)
Ngôn ngữ lập trình pascal (bổ trợ tin 11)Ngôn ngữ lập trình pascal (bổ trợ tin 11)
Ngôn ngữ lập trình pascal (bổ trợ tin 11)
 
Giao an trinh_pascal_bai_tap_co_dap_an_huong_dan
Giao an trinh_pascal_bai_tap_co_dap_an_huong_danGiao an trinh_pascal_bai_tap_co_dap_an_huong_dan
Giao an trinh_pascal_bai_tap_co_dap_an_huong_dan
 

Similar to Thuật toán đồ thị

304686218-Chia-đoi-tập-vdgdhợp-2.docx
304686218-Chia-đoi-tập-vdgdhợp-2.docx304686218-Chia-đoi-tập-vdgdhợp-2.docx
304686218-Chia-đoi-tập-vdgdhợp-2.docxNguynAnThch
 
Bài giảng chi tiết giải tích 1 07 2013 bo môn toán
Bài giảng chi tiết giải tích 1  07 2013 bo môn toánBài giảng chi tiết giải tích 1  07 2013 bo môn toán
Bài giảng chi tiết giải tích 1 07 2013 bo môn toánLaurent Koscielny
 
BG GT1.pdf
BG GT1.pdfBG GT1.pdf
BG GT1.pdfdonnam23
 
Các phương pháp đếm nâng cao
Các phương pháp đếm nâng caoCác phương pháp đếm nâng cao
Các phương pháp đếm nâng caoThế Giới Tinh Hoa
 
ChuyenDeSoHocVMF.pdf
ChuyenDeSoHocVMF.pdfChuyenDeSoHocVMF.pdf
ChuyenDeSoHocVMF.pdfHngAnhV13
 
Chuyen de so hoc nang cao VN
Chuyen de so hoc nang cao VNChuyen de so hoc nang cao VN
Chuyen de so hoc nang cao VNvothimyhanh
 
Luận văn: Phương trình tích phân tuyến tính và các ứng dụng, HAY
Luận văn: Phương trình tích phân tuyến tính và các ứng dụng, HAYLuận văn: Phương trình tích phân tuyến tính và các ứng dụng, HAY
Luận văn: Phương trình tích phân tuyến tính và các ứng dụng, HAYViết thuê trọn gói ZALO 0934573149
 
Tich phan choquet_va_dinh_li_choquet_4398
Tich phan choquet_va_dinh_li_choquet_4398Tich phan choquet_va_dinh_li_choquet_4398
Tich phan choquet_va_dinh_li_choquet_4398Garment Space Blog0
 
đề 2003
đề 2003đề 2003
đề 2003dvcuong
 

Similar to Thuật toán đồ thị (20)

304686218-Chia-đoi-tập-vdgdhợp-2.docx
304686218-Chia-đoi-tập-vdgdhợp-2.docx304686218-Chia-đoi-tập-vdgdhợp-2.docx
304686218-Chia-đoi-tập-vdgdhợp-2.docx
 
Luận văn: Phương trình sóng phi tuyến chứa số hạng KIRCHHOFF có nguồn phi tuyến
Luận văn: Phương trình sóng phi tuyến chứa số hạng KIRCHHOFF có nguồn phi tuyếnLuận văn: Phương trình sóng phi tuyến chứa số hạng KIRCHHOFF có nguồn phi tuyến
Luận văn: Phương trình sóng phi tuyến chứa số hạng KIRCHHOFF có nguồn phi tuyến
 
Bài giảng chi tiết giải tích 1 07 2013 bo môn toán
Bài giảng chi tiết giải tích 1  07 2013 bo môn toánBài giảng chi tiết giải tích 1  07 2013 bo môn toán
Bài giảng chi tiết giải tích 1 07 2013 bo môn toán
 
BG GT1.pdf
BG GT1.pdfBG GT1.pdf
BG GT1.pdf
 
Hoán vị lặp tổ hợp
Hoán vị lặp tổ hợpHoán vị lặp tổ hợp
Hoán vị lặp tổ hợp
 
MATMAT- Chuong1
MATMAT- Chuong1MATMAT- Chuong1
MATMAT- Chuong1
 
Các phương pháp đếm nâng cao
Các phương pháp đếm nâng caoCác phương pháp đếm nâng cao
Các phương pháp đếm nâng cao
 
Luận văn: Phương trình sóng tuyến tính mô tả dao động của thanh đàn hồi nhớt
Luận văn: Phương trình sóng tuyến tính mô tả dao động của thanh đàn hồi nhớtLuận văn: Phương trình sóng tuyến tính mô tả dao động của thanh đàn hồi nhớt
Luận văn: Phương trình sóng tuyến tính mô tả dao động của thanh đàn hồi nhớt
 
Về Một Số Lớp Bất Phương Trình Hàm.doc
Về Một Số Lớp Bất Phương Trình Hàm.docVề Một Số Lớp Bất Phương Trình Hàm.doc
Về Một Số Lớp Bất Phương Trình Hàm.doc
 
Kỹ thuật số
Kỹ thuật sốKỹ thuật số
Kỹ thuật số
 
ChuyenDeSoHocVMF.pdf
ChuyenDeSoHocVMF.pdfChuyenDeSoHocVMF.pdf
ChuyenDeSoHocVMF.pdf
 
Chuyen desohocvmf
Chuyen desohocvmfChuyen desohocvmf
Chuyen desohocvmf
 
Chuyen de so hoc nang cao VN
Chuyen de so hoc nang cao VNChuyen de so hoc nang cao VN
Chuyen de so hoc nang cao VN
 
Baitapmaygiat
BaitapmaygiatBaitapmaygiat
Baitapmaygiat
 
Luận văn: Phương trình tích phân tuyến tính và các ứng dụng, HAY
Luận văn: Phương trình tích phân tuyến tính và các ứng dụng, HAYLuận văn: Phương trình tích phân tuyến tính và các ứng dụng, HAY
Luận văn: Phương trình tích phân tuyến tính và các ứng dụng, HAY
 
Tich phan choquet_va_dinh_li_choquet_4398
Tich phan choquet_va_dinh_li_choquet_4398Tich phan choquet_va_dinh_li_choquet_4398
Tich phan choquet_va_dinh_li_choquet_4398
 
đề 2003
đề 2003đề 2003
đề 2003
 
Lttt
LtttLttt
Lttt
 
Luận văn: Chương trình sóng phi tuyến tính chứa số hạng nhớt phi tuyến
Luận văn: Chương trình sóng phi tuyến tính chứa số hạng nhớt phi tuyếnLuận văn: Chương trình sóng phi tuyến tính chứa số hạng nhớt phi tuyến
Luận văn: Chương trình sóng phi tuyến tính chứa số hạng nhớt phi tuyến
 
Phép Tính Tích Phân Và Áp Dụng.doc
Phép Tính Tích Phân Và Áp Dụng.docPhép Tính Tích Phân Và Áp Dụng.doc
Phép Tính Tích Phân Và Áp Dụng.doc
 

Thuật toán đồ thị

  • 1. các tập con của một tập hợp Bài giảng chuyên đề “Một số thuật toán tổ hợp” Lê Hồng Phương1 1Khoa Toán–Cơ–Tin học Trường Đại học Khoa học Tự nhiên, ĐHQG Hà Nội <phuonglh@gmail.com> 08/2012 Lê Hồng Phương (HUS, VNU) 08/2012 1 / 57
  • 2. Nội dung 1 Giới thiệu 2 Sinh các tập con Thuật toán cộng một Thuật toán đệ quy Thuật toán mã Gray 3 Sinh các tập con k phần tử Các hệ số nhị thức Thuật toán sinh theo thứ tự từ điển Một số thuật toán khác 4 Tóm lược Lê Hồng Phương (HUS, VNU) 08/2012 2 / 57
  • 3. Nội dung 1 Giới thiệu 2 Sinh các tập con Thuật toán cộng một Thuật toán đệ quy Thuật toán mã Gray 3 Sinh các tập con k phần tử Các hệ số nhị thức Thuật toán sinh theo thứ tự từ điển Một số thuật toán khác 4 Tóm lược Lê Hồng Phương (HUS, VNU) 08/2012 2 / 57
  • 4. Nội dung 1 Giới thiệu 2 Sinh các tập con Thuật toán cộng một Thuật toán đệ quy Thuật toán mã Gray 3 Sinh các tập con k phần tử Các hệ số nhị thức Thuật toán sinh theo thứ tự từ điển Một số thuật toán khác 4 Tóm lược Lê Hồng Phương (HUS, VNU) 08/2012 2 / 57
  • 5. Nội dung 1 Giới thiệu 2 Sinh các tập con Thuật toán cộng một Thuật toán đệ quy Thuật toán mã Gray 3 Sinh các tập con k phần tử Các hệ số nhị thức Thuật toán sinh theo thứ tự từ điển Một số thuật toán khác 4 Tóm lược Lê Hồng Phương (HUS, VNU) 08/2012 2 / 57
  • 6. Nội dung 1 Giới thiệu 2 Sinh các tập con Thuật toán cộng một Thuật toán đệ quy Thuật toán mã Gray 3 Sinh các tập con k phần tử Các hệ số nhị thức Thuật toán sinh theo thứ tự từ điển Một số thuật toán khác 4 Tóm lược Lê Hồng Phương (HUS, VNU) 08/2012 2 / 57
  • 7. Nội dung 1 Giới thiệu 2 Sinh các tập con Thuật toán cộng một Thuật toán đệ quy Thuật toán mã Gray 3 Sinh các tập con k phần tử Các hệ số nhị thức Thuật toán sinh theo thứ tự từ điển Một số thuật toán khác 4 Tóm lược Lê Hồng Phương (HUS, VNU) 08/2012 2 / 57
  • 8. Nội dung 1 Giới thiệu 2 Sinh các tập con Thuật toán cộng một Thuật toán đệ quy Thuật toán mã Gray 3 Sinh các tập con k phần tử Các hệ số nhị thức Thuật toán sinh theo thứ tự từ điển Một số thuật toán khác 4 Tóm lược Lê Hồng Phương (HUS, VNU) 08/2012 3 / 57
  • 9. Giới thiệu Cho X = {x1, x2, . . . , xn} là một tập hợp gồm n phần tử. Mỗi tập con Y của tập X có thể được biểu diễn bằng một dãy nhị phân b1, b2, . . . , bn xác định như sau: bi = 1, nếu xi ∈ Y, 0, nếu xi ∈ Y. Nói riêng, tập Y ≡ ∅ tương ứng với dãy 0, 0, . . . , 0 và tập Y ≡ X tương ứng với dãy 1, 1, . . . , 1 . Ta thấy bi, i = 1, 2, . . . , n nhận giá trị nhị phân nên số tập con của tập X là 2n. Nếu ta coi mỗi dãy nhị phân là biểu diễn nhị phân của một số nguyên không âm thì mỗi tập con của tập X ứng với một số nguyên trong đoạn [0, 2n − 1]. Lê Hồng Phương (HUS, VNU) 08/2012 4 / 57
  • 10. Giới thiệu Cho X = {x1, x2, . . . , xn} là một tập hợp gồm n phần tử. Mỗi tập con Y của tập X có thể được biểu diễn bằng một dãy nhị phân b1, b2, . . . , bn xác định như sau: bi = 1, nếu xi ∈ Y, 0, nếu xi ∈ Y. Nói riêng, tập Y ≡ ∅ tương ứng với dãy 0, 0, . . . , 0 và tập Y ≡ X tương ứng với dãy 1, 1, . . . , 1 . Ta thấy bi, i = 1, 2, . . . , n nhận giá trị nhị phân nên số tập con của tập X là 2n. Nếu ta coi mỗi dãy nhị phân là biểu diễn nhị phân của một số nguyên không âm thì mỗi tập con của tập X ứng với một số nguyên trong đoạn [0, 2n − 1]. Lê Hồng Phương (HUS, VNU) 08/2012 4 / 57
  • 11. Giới thiệu Ta quan tâm tới hai bài toán: 1 Sinh mọi tập con của tập X; 2 Sinh mọi tập con gồm k phần tử của tập X với k ≤ n. Lê Hồng Phương (HUS, VNU) 08/2012 5 / 57
  • 12. Nội dung 1 Giới thiệu 2 Sinh các tập con Thuật toán cộng một Thuật toán đệ quy Thuật toán mã Gray 3 Sinh các tập con k phần tử Các hệ số nhị thức Thuật toán sinh theo thứ tự từ điển Một số thuật toán khác 4 Tóm lược Lê Hồng Phương (HUS, VNU) 08/2012 6 / 57
  • 13. Sinh các tập con Bài toán Hãy liệt kê mọi tập con của một tập hợp gồm n phần tử. Ví dụ, các tập con của tập gồm 3 phần tử {1, 2, 3 } là: {}, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}. Chú ý: Số tập con của một tập gồm n phần tử là 2n, là rất lớn nếu n lớn. Vì vậy, bài toán này chỉ có thể giải được nếu n nhỏ (n ≤ 20). Lê Hồng Phương (HUS, VNU) 08/2012 7 / 57
  • 14. Nội dung 1 Giới thiệu 2 Sinh các tập con Thuật toán cộng một Thuật toán đệ quy Thuật toán mã Gray 3 Sinh các tập con k phần tử Các hệ số nhị thức Thuật toán sinh theo thứ tự từ điển Một số thuật toán khác 4 Tóm lược Lê Hồng Phương (HUS, VNU) 08/2012 8 / 57
  • 15. Thuật toán cộng một Biểu diễn dãy nhị phân của các tập hợp gợi ý cho ta một phương pháp đơn giản để sinh mọi tập hợp của n phần tử như sau: 1 Xuất phát từ tập rỗng, ứng với số k = 0 hay dãy nhị phân a0 = 0, 0, . . . , 0 ; 2 Trong mỗi bước, số k được cộng thêm 1 và tìm các biểu diễn nhị phân tương ứng của nó. Ví dụ, 5 dãy nhị phân tiếp theo là a1 = 0, 0, . . . , 0, 0, 1 a2 = 0, 0, . . . , 0, 1, 0 a3 = 0, 0, . . . , 0, 1, 1 a4 = 0, 0, . . . , 1, 0, 0 a5 = 0, 0, . . . , 1, 0, 1 3 Dừng thuật toán khi k = 2n − 1 hay khi dãy nhị phân là 1, 1, . . . , 1, 1 . Lê Hồng Phương (HUS, VNU) 08/2012 9 / 57
  • 16. Thuật toán cộng một Ta có thể tăng tốc độ của thuật toán dựa trên quan sát đơn giản: dãy nhị phân đứng sau có thể được sinh từ dãy nhị phân đứng trước bằng cách quy nạp. Giả sử đã sinh được dãy nhị phân ai = b0, b1, . . . , bn , dãy ai+1 được tìm bằng cách: 1 Xét các bít bj với j giảm dần, bắt đầu từ n. 2 Lặp, trong khi j ≥ 1: nếu bj = 1 thì đặt bj = 0 và tiếp tục xét bj−1; nếu bj = 0 thì đặt bj = 1 và dừng vòng lặp. Lê Hồng Phương (HUS, VNU) 08/2012 10 / 57
  • 17. Thuật toán cộng một Sinh tập con tiếp theo: void nextSubset(int a[], int n) { int j = n - 1; while (j >= 0) { if (a[j] == 1) a[j] = 0; else { a[j] = 1; break; } j--; } } Lê Hồng Phương (HUS, VNU) 08/2012 11 / 57
  • 18. Thuật toán cộng một Sinh mọi tập con bằng thuật toán cộng một: void enumerate(int a[], int n) { int i, j; unsigned long max = exponential(2, n); for (j = 0; j < n; j++) a[j] = 0; for (i = 0; i < max; i++) { printSubset(a, n); nextSubset(a, n); } } Lê Hồng Phương (HUS, VNU) 08/2012 12 / 57
  • 19. Thuật toán cộng một Với n = 4, các dãy nhị phân sinh bởi thuật toán là: 0 0, 0, 0, 0 8 1, 0, 0, 0 1 0, 0, 0, 1 9 1, 0, 0, 1 2 0, 0, 1, 0 10 1, 0, 1, 0 3 0, 0, 1, 1 11 1, 0, 1, 1 4 0, 1, 0, 0 12 1, 1, 0, 0 5 0, 1, 0, 1 13 1, 1, 0, 1 6 0, 1, 1, 0 14 1, 1, 1, 0 7 0, 1, 1, 1 15 1, 1, 1, 1 Lê Hồng Phương (HUS, VNU) 08/2012 13 / 57
  • 20. Nội dung 1 Giới thiệu 2 Sinh các tập con Thuật toán cộng một Thuật toán đệ quy Thuật toán mã Gray 3 Sinh các tập con k phần tử Các hệ số nhị thức Thuật toán sinh theo thứ tự từ điển Một số thuật toán khác 4 Tóm lược Lê Hồng Phương (HUS, VNU) 08/2012 14 / 57
  • 21. Thuật toán đệ quy Ta có thể liệt kê mọi dãy nhị phân độ dài n bằng thuật toán đệ quy: void enumerate(int a[], int n, int k) { if (k < 0) { printSubset(a, n); } else { a[k] = 0; enumerate(a, n, k - 1); a[k] = 1; enumerate(a, n, k - 1); } } Chương trình chính gọi hàm enumerate(a, n, n - 1). Lê Hồng Phương (HUS, VNU) 08/2012 15 / 57
  • 22. Thuật toán đệ quy Ví dụ, với n = 3, cây đệ quy tìm các dãy nhị phân được minh họa trong hình sau: ??? ??0 ?00 000 100 ?10 010 110 ??1 ?01 001 101 ?11 011 111 Ta thấy thuật toán đệ quy thực hiện duyệt cây theo cách duyệt tiền thứ tự và xử lí các nút lá của cây. Lê Hồng Phương (HUS, VNU) 08/2012 16 / 57
  • 23. Bài tập Bài tập 1. Giải thích thuật toán đệ quy và vẽ sơ đồ cây đệ quy tìm các dãy nhị phân ứng với các tập con của tập gồm 4 phần tử. Bài tập 2. Viết chương trình cài đặt các thuật toán cộng một và đệ quy sinh các tập con của một tập hợp. So sánh thời gian chạy của hai thuật toán này trên các tập có kích thước tương tự nhau. Lê Hồng Phương (HUS, VNU) 08/2012 17 / 57
  • 24. Nội dung 1 Giới thiệu 2 Sinh các tập con Thuật toán cộng một Thuật toán đệ quy Thuật toán mã Gray 3 Sinh các tập con k phần tử Các hệ số nhị thức Thuật toán sinh theo thứ tự từ điển Một số thuật toán khác 4 Tóm lược Lê Hồng Phương (HUS, VNU) 08/2012 18 / 57
  • 25. Thuật toán mã Gray Mã Gray n-bít là một danh sách gồm 2n dãy nhị phân độ dài n trong đó dãy tiếp theo chỉ khác dãy đứng trước ở một bít. Mã Gray được phát minh năm 1947 bởi Frank Gray, một nghiên cứu viên ở Bell Labs, sau đó được công bố năm 1953 trong 1. Ban đầu được sử dụng trong các hệ thống chuyển mạch cơ điện tử; ngày nay, mã Gray được sử dụng rộng rãi trong việc phát hiện lỗi của các hệ thống liên lạc điện tử. 1 F. Gray, “Pulse code communication,” 1953, U.S. Patent 2,632,058 Lê Hồng Phương (HUS, VNU) 08/2012 19 / 57
  • 26. Thuật toán mã Gray Mã Gray còn được gọi là “mã nhị phân phản xạ” vì mã Gray n bít được xây dựng đệ quy từ mã Gray n − 1 bít bằng cách phản xạ mã này. Phản xạ: liệt kê các phần tử của danh sách dãy nhị phân theo thứ tự ngược lại. Các bước cụ thể để sinh mã Gray n bít như sau: Lê Hồng Phương (HUS, VNU) 08/2012 20 / 57
  • 27. Thuật toán mã Gray 1 Xuất phát từ mã Gray n − 1 bít là danh sách gồm k = 2n−1 dãy nhị phân: α1, α2, . . . , αk−1, αk 2 Phản xạ mã Gray này, tức liệt kê các dãy nhị phân của nó theo thứ tự ngược lại: αk, αk−1, . . . , α2, α1 3 Đặt bít 0 lên trước các dãy trong danh sách ban đầu: 0α1, 0α2, . . . , 0αk−1, 0αk 4 Đặt bít 1 lên trước các dãy trong danh sách phản xạ: 1αk, 1αk−1, . . . , 1α2, 1α1 5 Ghép hai danh sách này lại sẽ thu được mã Gray n bít: 0α1, 0α2, . . . , 0αk, 1αk, 1αk−1, . . . , 1α2, 1α1. Lê Hồng Phương (HUS, VNU) 08/2012 21 / 57
  • 28. Thuật toán mã Gray Ví dụ, mã Gray với n = 3 được sinh từ mã Gray với n = 2 như sau: Mã 2-bít 00, 01, 11, 10 Mã phản xạ 10, 11, 01, 00 Đặt 0 lên trước mã ban đầu 000, 001, 011, 010 Đặt 1 lên trước mã phản xạ 110, 111, 101, 100 Ghép hai mã 000, 001, 011, 010, 110, 111, 101, 100 Lê Hồng Phương (HUS, VNU) 08/2012 22 / 57
  • 29. Thuật toán mã Gray Mã Gray 1 bít là G1 = 0, 1 . Mã này có thể được sinh từ mã Gray 0 bít G0 = ǫ chỉ gồm một dãy rỗng theo cách trên. Trong quá trình sinh mã Gn+1 từ Gn ta thấy một số tính chất sau: Nếu coi mỗi dãy nhị phân trong mã Gn là một số nguyên (trong cơ số 10) thì Gn là một hoán vị của dãy số 0, 1, . . . , 2n − 1 . Gn được “nhúng” vào nửa đầu của Gn+1. Mỗi dãy của Gn chỉ khác với dãy đứng trước nó một bít.2. Dãy cuối cùng của Gn chỉ khác dãy đầu tiên một bít. 2 Nói cách khác, khoảng cách Hamming giữa hai dãy liên tiếp của Gn là 1. Lê Hồng Phương (HUS, VNU) 08/2012 23 / 57
  • 30. Bài tập Bài tập 3. Sinh mã Gray 4 bít bằng thuật toán đệ quy nêu trên. Bài tập 4. Viết chương trình cài đặt thuật toán tìm mọi tập con của tập hợp bằng thuật toán sinh mã Gray n bít đệ quy nêu trên. Lê Hồng Phương (HUS, VNU) 08/2012 24 / 57
  • 31. Thuật toán mã Gray Ta có thể tìm mã Gn+1 từ mã Gn bằng một thủ tục đệ quy. Tuy nhiên, từ các tính chất của mã Gray ở trên, ta có thể tìm mã Gray bằng một thuật toán nhanh hơn dựa trên quan sát sau: Chuỗi thứ i trong Gn là biểu diễn nhị phân của số (i/2) ⊕ i , trong đó i/2 là phép chia nguyên của i cho 2 và ⊕ là phép toán xor. Nhắc lại: phép xor giữa hai bít a và b cho giá trị 1 nếu chỉ a hoặc b là 1. Cụ thể: a b a ⊕ b 0 0 0 0 1 1 1 0 1 1 1 0 Lê Hồng Phương (HUS, VNU) 08/2012 25 / 57
  • 32. Thuật toán mã Gray Ta có thể tìm mã Gn+1 từ mã Gn bằng một thủ tục đệ quy. Tuy nhiên, từ các tính chất của mã Gray ở trên, ta có thể tìm mã Gray bằng một thuật toán nhanh hơn dựa trên quan sát sau: Chuỗi thứ i trong Gn là biểu diễn nhị phân của số (i/2) ⊕ i , trong đó i/2 là phép chia nguyên của i cho 2 và ⊕ là phép toán xor. Nhắc lại: phép xor giữa hai bít a và b cho giá trị 1 nếu chỉ a hoặc b là 1. Cụ thể: a b a ⊕ b 0 0 0 0 1 1 1 0 1 1 1 0 Lê Hồng Phương (HUS, VNU) 08/2012 25 / 57
  • 33. Thuật toán mã Gray Ví dụ, các chuỗi nhị phân thứ i, ∀i = 0, 1, . . . , 7 trong mã G3: i(10) i(2) (i/2)(2) (i/2) ⊕ i G3 0 000 000 000 ⊕ 000 000 1 001 000 000 ⊕ 001 001 2 010 001 001 ⊕ 010 011 3 011 001 001 ⊕ 011 010 4 100 010 010 ⊕ 100 110 5 101 010 010 ⊕ 101 111 6 110 011 011 ⊕ 110 101 7 111 011 011 ⊕ 111 100 Cột đầu tiên là số i trong cơ số 10; cột thứ hai là biểu diễn của nó trong cơ số 2; cột thứ ba là số i/2 trong cơ số 2; cột thứ tư là phép toán xor giữa hai số i/2 và i trong cơ số 2; cột cuối cùng chính là chuỗi nhị phân thứ i trong mã G3. Lê Hồng Phương (HUS, VNU) 08/2012 26 / 57
  • 34. Bài tập Bài tập 5. Sinh mã Gray 4 bít theo thuật toán tính nhanh như bảng trên (lập bảng tính G4). Bài tập 6. Viết chương trình cài đặt thuật toán tìm mọi tập con của tập hợp bằng thuật toán sinh mã Gray n bít theo thuật toán tính nhanh như trên. Lê Hồng Phương (HUS, VNU) 08/2012 27 / 57
  • 35. Thuật toán mã Gray Ta cũng có thể tìm chuỗi mã Gray thứ i + 1 từ chuỗi mã Gray thứ i dựa trên quan sát sau: 1 Nếu chuỗi thứ i có một số chẵn bít 1 thì ta đảo bít cuối cùng của nó sẽ có chuỗi thứ i + 1; 2 Nếu chuỗi thứ i có một số lẻ bít 1 thì ta tìm bít 1 ở bên phải nhất của chuỗi và đảo bít ở bên trái bít đó. Sử dụng quy tắc đảo bít này, ta sinh được mã Gray G4 như sau: 000 (1) ⇒ 001 (2) ⇒ 011 (1) ⇒ 010 (2) ⇒ 110 (1) ⇒ 111 (2) ⇒ 101 (1) ⇒ 100. Lê Hồng Phương (HUS, VNU) 08/2012 28 / 57
  • 36. Bài tập Bài tập 7. Viết chương trình cài đặt thuật toán tìm mọi tập con của tập hợp bằng thuật toán sinh mã Gray n bít theo thuật toán đảo bít. Bài tập 8. Viết chương trình giải bài toán sau. Có n gói kẹo, trong mỗi gói kẹo chứa ai cái kẹo, i = 1, 2, . . . , n. Hãy tìm cách chia n gói kẹo đó thành hai phần sao cho hiệu số kẹo của hai phần là nhỏ nhất. Lê Hồng Phương (HUS, VNU) 08/2012 29 / 57
  • 37. Mô tả hình học Nếu coi mỗi dãy nhị phân trong mã Gray n bít là một đỉnh của đồ thị; hai đỉnh kề nhau nếu hai dãy nhị phân chỉ khác nhau ở 1 bít thì mã Gray n bít tương ứng với một đường đi Hamilton trên đồ thị này. 0 1 00 01 10 11 000 001 011010 110 111 101100 n = 1 n = 2 n = 3 Lê Hồng Phương (HUS, VNU) 08/2012 30 / 57
  • 38. Nội dung 1 Giới thiệu 2 Sinh các tập con Thuật toán cộng một Thuật toán đệ quy Thuật toán mã Gray 3 Sinh các tập con k phần tử Các hệ số nhị thức Thuật toán sinh theo thứ tự từ điển Một số thuật toán khác 4 Tóm lược Lê Hồng Phương (HUS, VNU) 08/2012 31 / 57
  • 39. Nội dung 1 Giới thiệu 2 Sinh các tập con Thuật toán cộng một Thuật toán đệ quy Thuật toán mã Gray 3 Sinh các tập con k phần tử Các hệ số nhị thức Thuật toán sinh theo thứ tự từ điển Một số thuật toán khác 4 Tóm lược Lê Hồng Phương (HUS, VNU) 08/2012 32 / 57
  • 40. Các k–tổ hợp Ta xét các tập con k phần tử của một tập hợp có n phần tử. Các tập này gọi là các k–tổ hợp. Ví dụ, các 3-tổ hợp của 5 phần tử {a, b, c, d, e} là: abc, abd, abe, acd, ace, ade, bcd, bce, bde, cde. Ta đếm được 10 tổ hợp. Tổng quát, có bao nhiêu k–tổ hợp của n phần tử? Lê Hồng Phương (HUS, VNU) 08/2012 33 / 57
  • 41. Các k–tổ hợp Từ mục đếm các hoán vị, ta thấy có n(n − 1) · · · (n − k + 1) cách chọn k phần tử đầu tiên của một hoán vị gồm n phần tử; và mỗi k–tổ hợp xuất hiện đúng k! lần trong các xếp đặt này, vì mỗi tổ hợp xuất hiện trong mọi hoán vị của nó. Vì vậy số k–tổ hợp của n phần tử là: n k = n(n − 1) · · · (n − k + 1) k(k − 1) · · · (1) . Ta dùng kí hiệu n k , hoặc Ck n để chỉ số tổ hợp. Đại lượng này còn được gọi là các hệ số nhị thức. Lê Hồng Phương (HUS, VNU) 08/2012 34 / 57
  • 42. Các hệ số nhị thức Các hệ số nhị thức ứng với n một số giá trị đầu tiên của k. n 0 n 1 n 2 n 3 n 4 n 5 n 6 n 7 n 8 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 2 1 0 0 0 0 0 0 1 3 3 1 0 0 0 0 0 1 4 6 4 1 0 0 0 0 1 5 10 10 5 1 0 0 0 1 6 15 20 15 6 1 0 0 1 7 21 35 35 21 7 1 0 1 8 28 56 70 56 28 8 1 Tam giác Pascal – Blaise Pascal, Traité du triangle arithmétique, 1653. Lê Hồng Phương (HUS, VNU) 08/2012 35 / 57
  • 43. Các hệ số nhị thức – Biểu diễn bằng giai thừa Một số kĩ thuật cơ bản để tính toán các hệ số nhị thức được liệt kê ngắn gọn như dưới đây. 1. Biểu diễn bằng giai thừa. Ta có công thức biểu diễn: n k = n! k!(n − k)! . Hai phương pháp chứng minh công thức này: Chứng minh bằng tính toán Chứng minh bằng lập luận Lê Hồng Phương (HUS, VNU) 08/2012 36 / 57
  • 44. Các hệ số nhị thức – Tính chất đối xứng 2. Tính chất đối xứng. n k = n n − k . (Chú ý: khi k > n thì hệ số nhị thức bằng 0.) Có thể chứng minh tính chất này bằng công thức tính hệ số nhị thức. Tuy nhiên, tính chất này là dễ hiểu vì số cách chọn các tập k phần tử từ n phần tử cũng chính là số cách chọn các tập bù gồm n − k phần tử từ n phần tử. Do đó số k–tổ hợp chính là số n − k tổ hợp. Chú ý rằng tính chất đối xứng được thể hiện trong mỗi hàng của tam giác Pascal. Lê Hồng Phương (HUS, VNU) 08/2012 37 / 57
  • 45. Các hệ số nhị thức – Công thức cộng 3. Công thức cộng. Ta có tính chất cơ bản n k = n − 1 k − 1 + n − 1 k . Tính chất này có thể được chứng minh bằng cách tự nhiên như sau. Để chọn k phần tử từ n phần tử a1, a2, . . . , an, ta có thể chọn bằng một trong hai cách: chọn phần tử a1, khi đó ta cần chọn k − 1 phần tử nữa từ n − 1 phần tử còn lại; số cách chọn này là n−1 k−1 ; không chọn phần tử a1, khi đó ta cần chọn k phần tử từ n − 1 phần tử còn lại; số cách chọn này là n−1 k . Như vậy, số k–tổ hợp của n phần tử chính là tổng của hai đại lượng trên. Lê Hồng Phương (HUS, VNU) 08/2012 38 / 57
  • 46. Các hệ số nhị thức – Công thức cộng 3. Công thức cộng. Ta có tính chất cơ bản n k = n − 1 k − 1 + n − 1 k . Tính chất này có thể được chứng minh bằng cách tự nhiên như sau. Để chọn k phần tử từ n phần tử a1, a2, . . . , an, ta có thể chọn bằng một trong hai cách: chọn phần tử a1, khi đó ta cần chọn k − 1 phần tử nữa từ n − 1 phần tử còn lại; số cách chọn này là n−1 k−1 ; không chọn phần tử a1, khi đó ta cần chọn k phần tử từ n − 1 phần tử còn lại; số cách chọn này là n−1 k . Như vậy, số k–tổ hợp của n phần tử chính là tổng của hai đại lượng trên. Lê Hồng Phương (HUS, VNU) 08/2012 38 / 57
  • 47. Các hệ số nhị thức – Công thức cộng Trong tam giác Pascal, mọi giá trị đều là tổng của hai giá trị ở hàng trước và bên trái nó. Ví dụ 5 10 15 (15 = 5 + 10) 21 7 28 (21 = 7 + 28) n 0 n 1 n 2 n 3 n 4 n 5 n 6 n 7 n 8 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 2 1 0 0 0 0 0 0 1 3 3 1 0 0 0 0 0 1 4 6 4 1 0 0 0 0 1 5 10 10 5 1 0 0 0 1 6 15 20 15 6 1 0 0 1 7 21 35 35 21 7 1 0 1 8 28 56 70 56 28 8 1 Lê Hồng Phương (HUS, VNU) 08/2012 39 / 57
  • 48. Các hệ số nhị thức – Công thức tích 4. Công thức tích. Ta có công thức tích sau: n m m k = n k n − k m − k . Tương tự như trên, công thức này có thể được chứng minh dễ dàng bằng cách khai triển tổ hợp. Tuy nhiên, ta có thể chứng minh công thức này bằng cách suy luận. Lê Hồng Phương (HUS, VNU) 08/2012 40 / 57
  • 49. Các hệ số nhị thức – Công thức tích Xét ba tập hợp K, M, N. Giả sử |K| = k, |M| = m, |N| = n. Ta thấy đại lượng bên trái của công thức chính là số các cặp tập hợp (M, K) thoả mãn điều kiện K ⊂ M ⊂ N vì tập M có thể chọn bằng n m cách và tập K có thể chọn bằng m k cách. N M KN M Lê Hồng Phương (HUS, VNU) 08/2012 41 / 57
  • 50. Các hệ số nhị thức – Công thức tích Ta cũng có thể tính số cặp (M, K) này bằng cách khác như sau. Chọn tập K trước, có n k cách chọn tập K. Với mỗi cách chọn K, ta chọn tập M sao cho K ⊂ M ⊂ N. Số cách chọn tập M bằng số cách chọn tập M K trong tập N K và bằng n−k m−k . Từ đó, số cách chọn các cặp (M, K) là n k n−k m−k . Lê Hồng Phương (HUS, VNU) 08/2012 42 / 57
  • 51. Các hệ số nhị thức – Công thức tích Công thức tích ở trên rất hữu dụng khi xử lí các công thức tổ hợp trong đó có một chỉ số (ở đây là m) xuất hiện đồng thời ở cả vị trí dưới và trên trong các tổ hợp; ta có thể chuyển chỉ số đó xuống vị trí dưới nhờ công thức tích. Với k = 1, ta có n m m 1 = n 1 n − 1 m − 1 , hay n m = n m n − 1 m − 1 . Công thức này được gọi là công thức “di chuyển các phần tử ra khỏi ngoặc”. Lê Hồng Phương (HUS, VNU) 08/2012 43 / 57
  • 52. Các hệ số nhị thức – Khai triển nhị thức 5. Công thức nhị thức. (x + y)n = n k=0 n k xk yn−k . Chính vì công thức này nên số k–tổ hợp được gọi là các hệ số nhị thức. Chú ý rằng công thức này cho ta 00 = 1. Trong trường hợp riêng khi y = 1, ta có (1 + x)n = n k=0 n k xk . Và khi x = 1, ta có 2n = n k=0 n k . Lê Hồng Phương (HUS, VNU) 08/2012 44 / 57
  • 53. Các hệ số nhị thức – Khai triển nhị thức 5. Công thức nhị thức. (x + y)n = n k=0 n k xk yn−k . Chính vì công thức này nên số k–tổ hợp được gọi là các hệ số nhị thức. Chú ý rằng công thức này cho ta 00 = 1. Trong trường hợp riêng khi y = 1, ta có (1 + x)n = n k=0 n k xk . Và khi x = 1, ta có 2n = n k=0 n k . Lê Hồng Phương (HUS, VNU) 08/2012 44 / 57
  • 54. Các hệ số nhị thức – Tổng của tích 6. Tổng của tích. n + m k = n s=0 n s m k − s . Công thức này được chứng minh bằng lập luận đơn giản như sau. Ta có n quả cam và m quả táo và muốn lấy k quả, với 0 ≤ k ≤ n + m. Trong mỗi lần lấy, ta có thể lấy s quả cam và k − s quả táo. Có n s m k−s cách lấy k quả trong đó có s quả cam. Giá trị của s có thể biến đổi từ 0 tới n nên ta có công thức tổng của tích nêu trên. Lê Hồng Phương (HUS, VNU) 08/2012 45 / 57
  • 55. Các hệ số nhị thức – Tổng của tích 6. Tổng của tích. n + m k = n s=0 n s m k − s . Công thức này được chứng minh bằng lập luận đơn giản như sau. Ta có n quả cam và m quả táo và muốn lấy k quả, với 0 ≤ k ≤ n + m. Trong mỗi lần lấy, ta có thể lấy s quả cam và k − s quả táo. Có n s m k−s cách lấy k quả trong đó có s quả cam. Giá trị của s có thể biến đổi từ 0 tới n nên ta có công thức tổng của tích nêu trên. Lê Hồng Phương (HUS, VNU) 08/2012 45 / 57
  • 56. Nội dung 1 Giới thiệu 2 Sinh các tập con Thuật toán cộng một Thuật toán đệ quy Thuật toán mã Gray 3 Sinh các tập con k phần tử Các hệ số nhị thức Thuật toán sinh theo thứ tự từ điển Một số thuật toán khác 4 Tóm lược Lê Hồng Phương (HUS, VNU) 08/2012 46 / 57
  • 57. Sinh các k–tổ hợp Giả sử tập n phần tử được kí hiệu là {1, 2, . . . , n}. Bài toán Hãy sinh mọi tập con k phần tử của một tập có n phần tử. Lê Hồng Phương (HUS, VNU) 08/2012 47 / 57
  • 58. Sinh các k–tổ hợp theo thứ tự từ điển Ví dụ với k = 3 và n = 5, ta có 10 tập con gồm 3 phần tử của tập {0, 1, 2, 3, 4} theo thứ tự như sau: Thứ tự Tập a 0 {0, 1, 2} [0, 1, 2] 1 {0, 1, 3} [0, 1, 3] 2 {0, 1, 4} [0, 1, 4] 3 {0, 2, 3} [0, 2, 3] 4 {0, 2, 4} [0, 2, 4] 5 {0, 3, 4} [0, 3, 4] 6 {1, 2, 3} [1, 2, 3] 7 {1, 2, 4} [1, 2, 4] 8 {1, 3, 4} [1, 3, 4] 9 {2, 3, 4} [2, 3, 4] Lê Hồng Phương (HUS, VNU) 08/2012 48 / 57
  • 59. Sinh các k–tổ hợp theo thứ tự từ điển Ý tưởng: Sinh tập con tiếp theo có thứ tự đứng ngay sau tập con hiện tại. Giả sử tập con hiện tại là {. . . , 5, 8, 9, 10}, khi đó tập con ngay sau là {. . . , 6, 7, 8, 9}. Tổng quát, nếu tập con hiện tại là {a1, . . . , ai−1, ai, . . . , ak} thì tập con tiếp theo là {a1, . . . , ai−1, ai + 1, ai + 2, . . . , ai + k − i + 1}. Lê Hồng Phương (HUS, VNU) 08/2012 49 / 57
  • 60. Sinh các k–tổ hợp theo thứ tự từ điển Để tìm vị trí i (vị trí bắt đầu cập nhật giá trị), ta xuất phát từ vị trí cuối (i = k − 1), giảm i nếu ai = n − k + i. Sau khi tìm được vị trí i thì ta có thể cập nhật các giá trị aj như sau: ai = ai + 1 aj = aj−1 + 1, ∀j = i + 1, . . . , k − 1. Từ đó, ta có thể liệt kê mọi k-tổ hợp của n phần tử bằng thuật toán lặp sinh các tập theo thứ tự từ điển. Lê Hồng Phương (HUS, VNU) 08/2012 50 / 57
  • 61. Sinh các k–tổ hợp theo thứ tự từ điển void enumerate(int a[], int n, int k) { int i, j; for (i = 0; i < MAX; i++) a[i] = i; while (a[k - 1] < n) { printSubset(a, k); i = k - 1; while (i > 0 && a[i] == n - k + i) i--; a[i]++; for (j = i + 1; j < k; j++) a[j] = a[j - 1] + 1; } } Lê Hồng Phương (HUS, VNU) 08/2012 51 / 57
  • 62. Sinh các k–tổ hợp theo thứ tự từ điển Ví dụ, thực hiện thuật toán với n = 6 và k = 3 ta có 20 tập con sau: Thứ tự Tập Thứ tự Tập 0 {0, 1, 2 } 10 {1, 2, 3 } 1 {0, 1, 3 } 11 {1, 2, 4 } 2 {0, 1, 4 } 12 {1, 2, 5 } 3 {0, 1, 5 } 13 {1, 3, 4 } 4 {0, 2, 3 } 14 {1, 3, 5 } 5 {0, 2, 4 } 15 {1, 4, 5 } 6 {0, 2, 5 } 16 {2, 3, 4 } 7 {0, 3, 4 } 17 {2, 3, 5 } 8 {0, 3, 5 } 18 {2, 4, 5 } 9 {0, 4, 5 } 19 {3, 4, 5 } Lê Hồng Phương (HUS, VNU) 08/2012 52 / 57
  • 63. Bài tập Bài tập 9. Viết chương trình tìm mọi tập con gồm k phần tử của một tập n phần tử bằng phương pháp từ điển. Chạy thử chương trình với các dữ liệu khác nhau và kiểm tra kết quả. Lê Hồng Phương (HUS, VNU) 08/2012 53 / 57
  • 64. Nội dung 1 Giới thiệu 2 Sinh các tập con Thuật toán cộng một Thuật toán đệ quy Thuật toán mã Gray 3 Sinh các tập con k phần tử Các hệ số nhị thức Thuật toán sinh theo thứ tự từ điển Một số thuật toán khác 4 Tóm lược Lê Hồng Phương (HUS, VNU) 08/2012 54 / 57
  • 65. Một số thuật toán khác Tham khảo thêm một số thuật toán sinh các tập con khác trong: D. E. Knuth, The Art of Computer Programming: Introduction to Combinatorial Algorithms and Boolean Functions, 1st ed. Addison Wesley Publishing, 2008, vol. 4. F. Ruskey, “Adjacent interchange generation of combinations,” Journal of Algorithms, vol. 9, pp. 162–180, 1988. T. Hough and F. Ruskey, “An effcient implementation of the Eades, Hickey, Read adjacent interchange combination generation algorithm,” Journal of Combinatorial Mathematics and Combinatorial Computing, vol. 4, pp. 79–86, 1988. S. G. Akl, “A comparison of combination generation methods,” ACM Trans. Math. Softw., vol. 7, no. 1, pp. 42–45, 1981. Lê Hồng Phương (HUS, VNU) 08/2012 55 / 57
  • 66. Một số thuật toán khác Tham khảo thêm một số thuật toán sinh các tập con khác trong: D. E. Knuth, The Art of Computer Programming: Introduction to Combinatorial Algorithms and Boolean Functions, 1st ed. Addison Wesley Publishing, 2008, vol. 4. F. Ruskey, “Adjacent interchange generation of combinations,” Journal of Algorithms, vol. 9, pp. 162–180, 1988. T. Hough and F. Ruskey, “An effcient implementation of the Eades, Hickey, Read adjacent interchange combination generation algorithm,” Journal of Combinatorial Mathematics and Combinatorial Computing, vol. 4, pp. 79–86, 1988. S. G. Akl, “A comparison of combination generation methods,” ACM Trans. Math. Softw., vol. 7, no. 1, pp. 42–45, 1981. Lê Hồng Phương (HUS, VNU) 08/2012 55 / 57
  • 67. Một số thuật toán khác Tham khảo thêm một số thuật toán sinh các tập con khác trong: D. E. Knuth, The Art of Computer Programming: Introduction to Combinatorial Algorithms and Boolean Functions, 1st ed. Addison Wesley Publishing, 2008, vol. 4. F. Ruskey, “Adjacent interchange generation of combinations,” Journal of Algorithms, vol. 9, pp. 162–180, 1988. T. Hough and F. Ruskey, “An effcient implementation of the Eades, Hickey, Read adjacent interchange combination generation algorithm,” Journal of Combinatorial Mathematics and Combinatorial Computing, vol. 4, pp. 79–86, 1988. S. G. Akl, “A comparison of combination generation methods,” ACM Trans. Math. Softw., vol. 7, no. 1, pp. 42–45, 1981. Lê Hồng Phương (HUS, VNU) 08/2012 55 / 57
  • 68. Một số thuật toán khác Tham khảo thêm một số thuật toán sinh các tập con khác trong: D. E. Knuth, The Art of Computer Programming: Introduction to Combinatorial Algorithms and Boolean Functions, 1st ed. Addison Wesley Publishing, 2008, vol. 4. F. Ruskey, “Adjacent interchange generation of combinations,” Journal of Algorithms, vol. 9, pp. 162–180, 1988. T. Hough and F. Ruskey, “An effcient implementation of the Eades, Hickey, Read adjacent interchange combination generation algorithm,” Journal of Combinatorial Mathematics and Combinatorial Computing, vol. 4, pp. 79–86, 1988. S. G. Akl, “A comparison of combination generation methods,” ACM Trans. Math. Softw., vol. 7, no. 1, pp. 42–45, 1981. Lê Hồng Phương (HUS, VNU) 08/2012 55 / 57
  • 69. Nội dung 1 Giới thiệu 2 Sinh các tập con Thuật toán cộng một Thuật toán đệ quy Thuật toán mã Gray 3 Sinh các tập con k phần tử Các hệ số nhị thức Thuật toán sinh theo thứ tự từ điển Một số thuật toán khác 4 Tóm lược Lê Hồng Phương (HUS, VNU) 08/2012 56 / 57
  • 70. Tóm lược Các nội dung chính của bài giảng: Biểu diễn các tập con của một tập hợp Ba thuật toán sinh các tập con của một tập hợp: Thuật toán cộng một Thuật toán đệ quy Thuật toán mã Gray (phương pháp đệ quy, phương pháp tính nhanh bằng xor, phương pháp đảo bít) Các tập con k phần tử: Các hệ số nhị thức Thuật toán sinh các tập con theo thứ tự từ điển Các bài tập lập trình để củng cố kiến thức Lê Hồng Phương (HUS, VNU) 08/2012 57 / 57