L
L
Ê
Ê
M
M
I
I
N
N
H
H
HOÀ
HOÀ
N
N
G
G
(A.K.A DSAP Textbook)
i hc S phm Hà Ni, 1999-2002
Try not to become a man of success
but rather to become a man of value.
Albert Einstein
i
MC LC
PHN 1. BÀI TOÁN LIT KÊ 1
§1. NHC LI MT S KIN THC I S T HP 2
1.1. CHNH HP LP 2
1.2. CHNH HP KHÔNG LP 2
1.3. HOÁN V 2
1.4. T HP 3
§2. PHNG PHÁP SINH (GENERATION) 4
2.1. SINH CÁC DÃY NH PHÂN DÀI N 5
2.2. LIT KÊ CÁC TP CON K PHN T 6
2.3. LIT KÊ CÁC HOÁN V 8
§3. THUT TOÁN QUAY LUI 12
3.1. LIT KÊ CÁC DÃY NH PHÂN DÀI N 12
3.2. LIT KÊ CÁC TP CON K PHN T 13
3.3. LIT KÊ CÁC CHNH HP KHÔNG LP CHP K 15
3.4. BÀI TOÁN PHÂN TÍCH S 17
3.5. BÀI TOÁN XP HU 19
§4. K THUT NHÁNH CN 24
4.1. BÀI TOÁN TI U 24
4.2. S BÙNG N T HP 24
4.3. MÔ HÌNH K THUT NHÁNH CN 24
4.4. BÀI TOÁN NGI DU LCH 25
4.5. DÃY ABC 27
PHN 2. CU TRÚC D LIU VÀ GII THUT 33
§1. CÁC BC C BN KHI TIN HÀNH GII CÁC BÀI TOÁN TIN HC 34
1.1. XÁC NH BÀI TOÁN 34
1.2. TÌM CU TRÚC D LIU BIU DIN BÀI TOÁN 34
1.3. TÌM THUT TOÁN 35
1.4. LP TRÌNH 37
1.5. KIM TH 37
1.6. TI U CHNG TRÌNH 38
§2. PHÂN TÍCH THI GIAN THC HIN GII THUT 40
2.1. GII THIU 40
2.2. CÁC KÝ PHÁP ÁNH GIÁ PHC TP TÍNH TOÁN 40
2.3. XÁC NH PHC TP TÍNH TOÁN CA GII THUT 42
2.4. PHC TP TÍNH TOÁN VI TÌNH TRNG D LIU VÀO 45
2.5. CHI PHÍ THC HIN THUT TOÁN 46
ii
§3. QUY VÀ GII THUT QUY 50
3.1. KHÁI NIM V QUY 50
3.2. GII THUT QUY 50
3.3. VÍ D V GII THUT QUY 51
3.4. HIU LC CA QUY 55
§4. CU TRÚC D LIU BIU DIN DANH SÁCH 58
4.1. KHÁI NIM DANH SÁCH 58
4.2. BIU DIN DANH SÁCH TRONG MÁY TÍNH 58
§5. NGN XP VÀ HÀNG I 64
5.1. NGN XP (STACK) 64
5.2. HÀNG I (QUEUE) 66
§6. CÂY (TREE) 70
6.1. NH NGHA 70
6.2. CÂY NH PHÂN (BINARY TREE) 71
6.3. BIU DIN CÂY NH PHÂN 73
6.4. PHÉP DUYT CÂY NH PHÂN 74
6.5. CÂY K_PHÂN 76
6.6. CÂY TNG QUÁT 77
§7. KÝ PHÁP TIN T, TRUNG T VÀ HU T 79
7.1. BIU THC DI DNG CÂY NH PHÂN 79
7.2. CÁC KÝ PHÁP CHO CÙNG MT BIU THC 79
7.3. CÁCH TÍNH GIÁ TR BIU THC 79
7.4. CHUYN T DNG TRUNG T SANG DNG HU T 83
7.5. XÂY DNG CÂY NH PHÂN BIU DIN BIU THC 86
§8. SP XP (SORTING) 88
8.1. BÀI TOÁN SP XP 88
8.2. THUT TOÁN SP XP KIU CHN (SELECTIONSORT) 90
8.3. THUT TOÁN SP XP NI BT (BUBBLESORT) 91
8.4. THUT TOÁN SP XP KIU CHÈN (INSERTIONSORT) 91
8.5. SP XP CHÈN VI DÀI BC GIM DN (SHELLSORT) 93
8.6. THUT TOÁN SP XP KIU PHÂN ON (QUICKSORT) 94
8.7. THUT TOÁN SP XP KIU VUN NG (HEAPSORT) 101
8.8. SP XP BNG PHÉP M PHÂN PHI (DISTRIBUTION COUNTING) 104
8.9. TÍNH N NH CA THUT TOÁN SP XP (STABILITY) 105
8.10. THUT TOÁN SP XP BNG C S (RADIX SORT) 106
8.11. THUT TOÁN SP XP TRN (MERGESORT) 111
8.12. CÀI T 114
8.13. ÁNH GIÁ, NHN XÉT 122
§9. TÌM KIM (SEARCHING) 126
9.1. BÀI TOÁN TÌM KIM 126
9.2. TÌM KIM TUN T (SEQUENTIAL SEARCH) 126
9.3. TÌM KIM NH PHÂN (BINARY SEARCH) 126
9.4. CÂY NH PHÂN TÌM KIM (BINARY SEARCH TREE - BST) 127
iii
9.5. PHÉP BM (HASH) 132
9.6. KHOÁ S VI BÀI TOÁN TÌM KIM 132
9.7. CÂY TÌM KIM S HC (DIGITAL SEARCH TREE - DST) 133
9.8. CÂY TÌM KIM C S (RADIX SEARCH TREE - RST) 136
9.9. NHNG NHN XÉT CUI CÙNG 141
PHN 3. QUY HOCH NG 143
§1. CÔNG THC TRUY HI 144
1.1. VÍ D 144
1.2. CI TIN TH NHT 145
1.3. CI TIN TH HAI 147
1.4. CÀI T QUY 147
§2. PHNG PHÁP QUY HOCH NG 149
2.1. BÀI TOÁN QUY HOCH 149
2.2. PHNG PHÁP QUY HOCH NG 149
§3. MT S BÀI TOÁN QUY HOCH NG 153
3.1. DÃY CON N IU TNG DÀI NHT 153
3.2. BÀI TOÁN CÁI TÚI 158
3.3. BIN I XÂU 160
3.4. DÃY CON CÓ TNG CHIA HT CHO K 164
3.5. PHÉP NHÂN T HP DÃY MA TRN 169
3.6. BÀI TP LUYN TP 172
PHN 4. CÁC THUT TOÁN TRÊN TH 177
§1. CÁC KHÁI NIM C BN 178
1.1. NH NGHA TH (GRAPH) 178
1.2. CÁC KHÁI NIM 179
§2. BIU DIN TH TRÊN MÁY TÍNH 181
2.1. MA TRN K (ADJACENCY MATRIX) 181
2.2. DANH SÁCH CNH (EDGE LIST) 182
2.3. DANH SÁCH K (ADJACENCY LIST) 183
2.4. NHN XÉT 184
§3. CÁC THUT TOÁN TÌM KIM TRÊN TH 186
3.1. BÀI TOÁN 186
3.2. THUT TOÁN TÌM KIM THEO CHIU SÂU (DEPTH FIRST SEARCH) 187
3.3. THUT TOÁN TÌM KIM THEO CHIU RNG (BREADTH FIRST SEARCH) 189
3.4. PHC TP TÍNH TOÁN CA BFS VÀ DFS 192
§4. TÍNH LIÊN THÔNG CA TH 193
4.1. NH NGHA 193
4.2. TÍNH LIÊN THÔNG TRONG TH VÔ HNG 194
iv
4.3. TH Y VÀ THUT TOÁN WARSHALL 194
4.4. CÁC THÀNH PHN LIÊN THÔNG MNH 197
§5. VÀI NG DNG CA DFS và BFS 208
5.1. XÂY DNG CÂY KHUNG CA TH 208
5.2. TP CÁC CHU TRÌNH C S CA TH 211
5.3. BÀI TOÁN NH CHIU TH 211
5.4. LIT KÊ CÁC KHP VÀ CU CA TH 215
§6. CHU TRÌNH EULER, NG I EULER, TH EULER 219
6.1. BÀI TOÁN 7 CÁI CU 219
6.2. NH NGHA 219
6.3. NH LÝ 219
6.4. THUT TOÁN FLEURY TÌM CHU TRÌNH EULER 220
6.5. CÀI T 221
6.6. THUT TOÁN TT HN 223
§7. CHU TRÌNH HAMILTON, NG I HAMILTON, TH HAMILTON 226
7.1. NH NGHA 226
7.2. NH LÝ 226
7.3. CÀI T 227
§8. BÀI TOÁN NG I NGN NHT 231
8.1. TH CÓ TRNG S 231
8.2. BÀI TOÁN NG I NGN NHT 231
8.3. TRNG HP TH KHÔNG CÓ CHU TRÌNH ÂM - THUT TOÁN FORD BELLMAN 233
8.4. TRNG HP TRNG S TRÊN CÁC CUNG KHÔNG ÂM - THUT TOÁN DIJKSTRA 235
8.5. THUT TOÁN DIJKSTRA VÀ CU TRÚC HEAP 238
8.6. TRNG HP TH KHÔNG CÓ CHU TRÌNH - SP XP TÔ PÔ 241
8.7. NG I NGN NHT GIA MI CP NH - THUT TOÁN FLOYD 244
8.8. NHN XÉT 246
§9. BÀI TOÁN CÂY KHUNG NH NHT 251
9.1. BÀI TOÁN CÂY KHUNG NH NHT 251
9.2. THUT TOÁN KRUSKAL (JOSEPH KRUSKAL - 1956) 251
9.3. THUT TOÁN PRIM (ROBERT PRIM - 1957) 256
§10. BÀI TOÁN LUNG CC I TRÊN MNG 260
10.1. CÁC KHÁI NIM 260
10.2. MNG THNG D VÀ NG TNG LUNG 263
10.3. THUT TOÁN FORD-FULKERSON (L.R.FORD & D.R.FULKERSON - 1962) 266
10.4. THUT TOÁN PREFLOW-PUSH (GOLDBERG - 1986) 270
10.5. MT S M RNG 276
§11. BÀI TOÁN TÌM B GHÉP CC I TRÊN TH HAI PHÍA 283
11.1. TH HAI PHÍA (BIPARTITE GRAPH) 283
11.2. BÀI TOÁN GHÉP ÔI KHÔNG TRNG VÀ CÁC KHÁI NIM 283
11.3. THUT TOÁN NG M 284
11.4. CÀI T 285
v
§12. BÀI TOÁN TÌM B GHÉP CC I VI TRNG S CC TIU TRÊN TH HAI
PHÍA - THUT TOÁN HUNGARI 291
12.1. BÀI TOÁN PHÂN CÔNG 291
12.2. PHÂN TÍCH 291
12.3. THUT TOÁN 292
12.4. BÀI TOÁN TÌM B GHÉP CC I VI TRNG S CC I TRÊN TH HAI PHÍA 301
12.5. NÂNG CP 301
§13. BÀI TOÁN TÌM B GHÉP CC I TRÊN TH 307
13.1. CÁC KHÁI NIM 307
13.2. THUT TOÁN EDMONDS (1965) 308
13.3. THUT TOÁN LAWLER (1973) 310
13.4. CÀI T 312
13.5. PHC TP TÍNH TOÁN 316
TÀI LIU C THÊM 319
vi
HÌNH V
Hình 1: Cây tìm kim quay lui trong bài toán lit kê dãy nh phân 13
Hình 2: Xp 8 quân hu trên bàn c 8x8 19
Hình 3: ng chéo B-TN mang ch s 10 và đng chéo N-TB mang ch s 0 20
Hình 4: Lu đ thut gii (Flowchart) 36
Hình 5: Ký pháp Θ ln, Ο ln và Ω ln 41
Hình 6: Tháp Hà Ni 54
Hình 7: Cu trúc nút ca danh sách ni đn 59
Hình 8: Danh sách ni đn 59
Hình 9: Cu trúc nút ca danh sách ni kép 61
Hình 10: Danh sách ni kép 61
Hình 11: Danh sách ni vòng mt hng 61
Hình 12: Danh sách ni vòng hai hng 62
Hình 13: Dùng danh sách vòng mô t Queue 67
Hình 14: Di chuyn toa tàu 69
Hình 15: Di chuyn toa tàu (2) 69
Hình 16: Cây 70
Hình 17: Mc ca các nút trên cây 71
Hình 18: Cây biu din biu thc 71
Hình 19: Các dng cây nh phân suy bin 72
Hình 20: Cây nh phân hoàn chnh và cây nh phân đy đ 72
Hình 21: ánh s các nút ca cây nh phân đy đ đ biu din bng mng 73
Hình 22: Nhc đim ca phng pháp biu din cây bng mng 73
Hình 23: Cu trúc nút ca cây nh phân 74
Hình 24: Biu din cây bng cu trúc liên kt 74
Hình 25: ánh s các nút ca cây 3_phân đ biu din bng mng 76
Hình 26: Biu din cây tng quát bng mng 77
Hình 27: Cu trúc nút ca cây tng quát 78
Hình 28: Biu thc di dng cây nh phân 79
Hình 29: Vòng lp trong ca QuickSort 95
Hình 30: Trng thái trc khi gi đ quy 96
Hình 31: Heap 102
Hình 32: Vun đng 102
Hình 33: o giá tr k[1] cho k[n] và xét phn còn li 103
Hình 34: Vun phn còn li thành đng ri li đo tr k[1] cho k[n-1] 103
Hình 35: ánh s các bit 106
Hình 36: Thut toán sp xp trn 111
vii
Hình 37: Máy Pentium 4, 3.2GHz, 2GB RAM t ra chm chp khi sp xp 10
8
khoá ∈ [0 7.10
7
] cho dù nhng
thut toán sp xp tt nht đã đc áp dng 123
Hình 38: Cây nh phân tìm kim 128
Hình 39: Xóa nút lá cây BST 129
Hình 40. Xóa nút ch có mt nhánh con trên cây BST 130
Hình 41: Xóa nút có c hai nhánh con trên cây BST thay bng nút cc phi ca cây con trái 130
Hình 42: Xóa nút có c hai nhánh con trên cây BST thay bng nút cc trái ca cây con phi 130
Hình 43: ánh s các bit 133
Hình 44: Cây tìm kim s hc 133
Hình 45: Cây tìm kim c s 136
Hình 46: Vi đ dài dãy bit z = 3, cây tìm kim c s gm các khoá 2, 4, 5 và sau khi thêm giá tr 7 137
Hình 47: RST cha các khoá 2, 4, 5, 7 và RST sau khi loi b giá tr 7 138
Hình 48: Cây tìm kim c s a) và Trie tìm kim c s b) 140
Hình 49: Hàm đ quy tính s Fibonacci 151
Hình 50: Tính toán và truy vt 154
Hình 51: Truy vt 163
Hình 52: Ví d v mô hình đ th 178
Hình 53: Phân loi đ th 179
Hình 54 182
Hình 55 183
Hình 56: th và đng đi 186
Hình 57: Cây DFS 189
Hình 58: Cây BFS 192
Hình 59: th G và các thành phn liên thông G1, G2, G3 ca nó 193
Hình 60: Khp và cu 193
Hình 61: Liên thông mnh và liên thông yu 194
Hình 62: th đy đ 195
Hình 63: n đ th vô hng và bao đóng ca nó 195
Hình 64: Ba dng cung ngoài cây DFS 199
Hình 65: Thut toán Tarjan “b” cây DFS 201
Hình 66: ánh s li, đo chiu các cung và duyt BFS vi cách chn các đnh xut phát ngc li vi th t
duyt xong (th t 11, 10… 3, 2, 1) 206
Hình 67: th G và mt s ví d cây khung T1, T2, T3 ca nó 210
Hình 68: Cây khung DFS (a) và cây khung BFS (b) (Mi tên ch chiu đi thm các đnh) 210
Hình 69: Phép đnh chiu DFS 213
Hình 70: Phép đánh s và ghi nhn cung ngc lên cao nht 215
Hình 71: Mô hình đ th ca bài toán by cái cu 219
Hình 72 220
Hình 73 220
Hình 74 226
viii
Hình 75: Phép đánh li ch s theo th t tôpô 241
Hình 76: Hai cây gc r
1
và r
2
và cây mi khi hp nht chúng 252
Hình 77: Mng vi các kh nng thông qua (1 phát, 6 thu) và mt lung ca nó vi giá tr 7 260
Hình 78: Mng G và mng thng d G
f
tng ng (ký hiu f[u,v]:c[u,v] ch lung f[u, v] và kh nng thông qua
c[u, v] trên cung (u, v)) 264
Hình 79: Mng thng d và đng tng lung 265
Hình 80: Lung trên mng G trc và sau khi tng 265
Hình 81: Mng gi ca mng có nhiu đim phát và nhiu đim thu 276
Hình 82: Thay mt đnh u bng hai đnh u
in
, u
out
277
Hình 83: Mng gi ca mng có kh nng thông qua ca các cung b chn hai phía 277
Hình 84: th hai phía 283
Hình 85: th hai phía và b ghép M 284
Hình 86: Mô hình lung ca bài toán tìm b ghép cc đi trên đ th hai phía 288
Hình 87: Phép xoay trng s cnh 292
Hình 88: Thut toán Hungari 295
Hình 89: Cây pha “mc” ln hn sau mi ln xoay trng s cnh và tìm đng 302
Hình 90: th G và mt b ghép M 307
Hình 91: Phép chp Blossom 309
Hình 92: N Blossom đ dò đng xuyên qua Blossom 309
ix
CHNG TRÌNH
P_1_02_1.PAS * Thut toán sinh lit kê các dãy nh phân đ dài n 6
P_1_02_2.PAS * Thut toán sinh lit kê các tp con k phn t 8
P_1_02_3.PAS * Thut toán sinh lit kê hoán v 9
P_1_03_1.PAS * Thut toán quay lui lit kê các dãy nh phân đ dài n 12
P_1_03_2.PAS * Thut toán quay lui lit kê các tp con k phn t 14
P_1_03_3.PAS * Thut toán quay lui lit kê các chnh hp không lp chp k 16
P_1_03_4.PAS * Thut toán quay lui lit kê các cách phân tích s 18
P_1_03_5.PAS * Thut toán quay lui gii bài toán xp hu 21
P_1_04_1.PAS * K thut nhánh cn dùng cho bài toán ngi du lch 26
P_1_04_2.PAS * Dãy ABC 28
P_2_07_1.PAS * Tính giá tr biu thc RPN 81
P_2_07_2.PAS * Chuyn biu thc trung t sang dng RPN 84
P_2_08_1.PAS * Các thut toán sp xp 114
P_3_01_1.PAS * m s cách phân tích s n 145
P_3_01_2.PAS * m s cách phân tích s n 146
P_3_01_3.PAS * m s cách phân tích s n 146
P_3_01_4.PAS * m s cách phân tích s n 147
P_3_01_5.PAS * m s cách phân tích s n dùng đ quy 147
P_3_01_6.PAS * m s cách phân tích s n dùng đ quy 148
P_3_03_1.PAS * Tìm dãy con đn điu tng dài nht 154
P_3_03_2.PAS * Ci tin thut toán tìm dãy con đn điu tng dài nht 156
P_3_03_3.PAS * Bài toán cái túi 159
P_3_03_4.PAS * Bin đi xâu 163
P_3_03_5.PAS * Dãy con có tng chia ht cho k 165
P_3_03_6.PAS * Dãy con có tng chia ht cho k 167
P_3_03_7.PAS * Nhân ti u dãy ma trn 171
P_4_03_1.PAS * Thut toán tìm kim theo chiu sâu 187
P_4_03_2.PAS * Thut toán tìm kim theo chiu rng 190
P_4_04_1.PAS * Thut toán Warshall lit kê các thành phn liên thông 197
P_4_04_2.PAS * Thut toán Tarjan lit kê các thành phn liên thông mnh 204
P_4_05_1.PAS * Lit kê các khp và cu ca đ th 216
P_4_06_1.PAS * Thut toán Fleury tìm chu trình Euler 221
P_4_06_2.PAS * Thut toán hiu qu tìm chu trình Euler 224
P_4_07_1.PAS * Thut toán quay lui lit kê chu trình Hamilton 227
P_4_08_1.PAS * Thut toán Ford-Bellman 234
P_4_08_2.PAS * Thut toán Dijkstra 236
P_4_08_3.PAS * Thut toán Dijkstra và cu trúc Heap 239
x
P_4_08_4.PAS * ng đi ngn nht trên đ th không có chu trình 242
P_4_08_5.PAS * Thut toán Floyd 245
P_4_09_1.PAS * Thut toán Kruskal 253
P_4_09_2.PAS * Thut toán Prim 257
P_4_10_1.PAS * Thut toán Ford-Fulkerson 268
P_4_10_2.PAS * Thut toán Preflow-push 273
P_4_11_1.PAS * Thut toán đng m tìm b ghép cc đi 286
P_4_12_1.PAS * Thut toán Hungari 298
P_4_12_2.PAS * Cài đt phng pháp Kuhn-Munkres O(k
3
) 303
P_4_13_1.PAS * Phng pháp Lawler áp dng cho thut toán Edmonds 313
BNG CÁC KÝ HIU C S DNG
x
⎢⎥
⎣⎦
Floor of x: S nguyên ln nht ≤ x
x
⎡⎤
⎢⎥
Ceiling of x: S nguyên nh nht ≥ x
nk
P
S chnh hp không lp chp k ca n phn t =
n!
(n k)!−
n
k
⎛⎞
⎜⎟
⎝⎠
Binomial coefficient: H s ca hng t
k
x trong đa thc
()
n
x1+
= S t hp chp k ca n phn t =
()
n!
k! n k !−
()
O.
Ký pháp ch O ln
()
.Θ
Ký pháp Θ ln
()
.Ω
Ký pháp Ω ln
()
o.
Ký pháp ch o nh
()
.ω
ký pháp ω nh
[
]
ai j
Các phn t trong mng a tính t ch s i đn ch s j
n!
n factorial: Giai tha ca n = 1.2.3…n
ab↑
b
a
ab↑↑
m
a
a
b
copies of a
a
a
log x
Logarithm to base a of x: Logarithm c s a ca x (
b
a
log a b
=
)
lg x
Logarithm nh phân (c s 2) ca x
ln x
Logarithm t nhiên (c s e) ca x
*
a
log x S ln ly logarithm c s a đ thu đc s ≤ 1 t x (
*
a
log (a b) b↑↑ = )
*
lg x
*
2
log x
*
ln x
*
e
log x
P
P
H
H
N
N
1
1
.
.
B
B
À
À
I
I
T
T
O
O
Á
Á
N
N
L
L
I
I
T
T
K
K
Ê
Ê
Có mt s bài toán trên thc t yêu cu ch rõ: trong mt tp các đi
tng cho trc có bao nhiêu đi tng tho mãn nhng điu kin nht
đnh. Bài toán đó gi là bài toán đm.
Trong lp các bài toán đm, có nhng bài toán còn yêu cu ch rõ nhng
cu hình tìm đc tho mãn điu kin đã cho là nhng cu hình nào. Bài
toán yêu cu đa ra danh sách các cu hình có th có gi là bài toán lit
kê.
gii bài toán lit kê, cn phi xác đnh đc mt thut toán đ có th
theo đó ln lt xây dng đc tt c các cu hình đang quan tâm. Có
nhiu phng pháp lit kê, nhng chúng cn phi đáp ng đc hai yêu
cu di đây:
• Không đc lp li mt cu hình
• Không đc b sót mt cu hình
Có th nói rng, phng pháp lit kê là phng k cui cùng đ gii
đc mt s bài toán t hp hin nay. Khó khn chính ca phng pháp
này chính là s bùng n t hp dn ti s đòi hi ln v không gian và
thi gian thc hin chng trình. Tuy nhiên cùng vi s phát trin ca
máy tính đin t, bng phng pháp lit kê, nhiu bài toán t hp đã tìm
thy li gii. Qua đó, ta cng nên bit rng ch nên dùng phng pháp
lit kê khi không còn mt phng pháp nào khác tìm ra li gii.
Chính nhng n lc gii quyt các bài toán thc t không dùng phng
pháp lit kê đã thúc đy s phát trin ca nhiu ngành toán hc.
2 Chuyên đ
HSPHN 1999-2004
§1.
NHC LI MT S KIN THC I S T HP
Cho S là mt tp hu hn gm n phn t và k là mt s t nhiên.
Gi X là tp các s nguyên dng t 1 đn k: X = {1, 2, …, k}
1.1.
CHNH HP LP
Mi ánh x f: X → S. Cho tng ng vi mi i ∈ X, mt và ch mt phn t f(i) ∈ S.
c gi là mt chnh hp lp chp k ca S.
Nhng do X là tp hu hn (k phn t) nên ánh x f có th xác đnh qua bng các giá tr f(1),
f(2), …, f(k).
Ví d: S = {A, B, C, D, E, F}; k = 3. Mt ánh x f có th cho nh sau:
i 1 2 3
f(i) E C E
Vy có th đng nht f vi dãy giá tr (f(1), f(2), …, f(k)) và coi dãy giá tr này cng là mt
chnh hp lp chp k ca S. Nh ví d trên (E, C, E) là mt chnh hp lp chp 3 ca S. D
dàng chng minh đc kt qu sau bng quy np hoc bng phng pháp đánh giá kh nng
la chn:
S chnh hp lp chp k ca tp gm n phn t là
k
n
1.2.
CHNH HP KHÔNG LP
Khi f là đn ánh có ngha là vi ∀i, j ∈ X ta có f(i) = f(j) ⇔ i = j. Nói mt cách d hiu, khi
dãy giá tr f(1), f(2), …, f(k) gm các phn t thuc S khác nhau đôi mt thì f đc gi là mt
chnh hp không lp chp k ca S. Ví d mt chnh hp không lp (C, A, E):
i 1 2 3
f(i) C A E
S chnh hp không lp chp k ca tp gm n phn t là:
nk
n!
P n(n 1)(n 2) (n k 1)
(n k)!
=−− −+=
−
1.3.
HOÁN V
Khi k = n. Mt chnh hp không lp chp n ca S đc gi là mt hoán v các phn t ca S.
Ví d: mt hoán v: 〈A, D, C, E, B, F〉 ca S = {A, B, C, D, E, F}
i 1 2 3 4 5 6
f(i) A D C E B F
Bài toán lit kê 3
Lê Minh Hoàng
ý rng khi k = n thì s phn t ca tp X = {1, 2, …, n} đúng bng s phn t ca S. Do
tính cht đôi mt khác nhau nên dãy f(1), f(2), …, f(n) s lit kê đc ht các phn t trong S.
Nh vy f là toàn ánh. Mt khác do gi thit f là chnh hp không lp nên f là đn ánh. Ta có
tng ng 1-1 gia các phn t ca X và S, do đó f là song ánh. Vy nên ta có th đnh ngha
mt hoán v ca S là mt song ánh gia {1, 2, …, n} và S.
S hoán v ca tp gm n phn t = s chnh hp không lp chp n = n!
1.4.
T HP
Mt tp con gm k phn t ca S đc gi là mt t hp chp k ca S.
Ly mt tp con k phn t ca S, xét tt c k! hoán v ca tp con này. D thy rng các hoán
v đó là các chnh hp không lp chp k ca S. Ví d ly tp {A, B, C} là tp con ca tp S
trong ví d trên thì: 〈A, B, C〉, 〈C, A, B〉, 〈B, C, A〉, … là các chnh hp không lp chp 3 ca
S. iu đó tc là khi lit kê tt c các chnh hp không lp chp k thì mi t hp chp k s
đc tính k! ln. Vy s t hp chp k ca tp gm n phn t là
n
n!
k
k!(n k)!
⎛⎞
=
⎜⎟
−
⎝⎠
4 Chuyên đ
HSPHN 1999-2004
§2.
PHNG PHÁP SINH (GENERATION)
Phng pháp sinh có th áp dng đ gii bài toán lit kê t hp đt ra nu nh hai điu kin
sau tho mãn:
Có th xác đnh đc mt th t trên tp các cu hình t hp cn lit kê. T đó có th bit
đccu hình đu tiên và cu hình cui cùng trong th t đó.
Xây dng đc thut toán t mt cu hình cha phi cu hình cui, sinh ra đc cu hình
k tip nó.
Phng pháp sinh có th mô t nh sau:
〈Xây dng cu hình đu tiên〉;
repeat
〈
a ra cu hình đang có〉;
〈
T cu hình đang có sinh ra cu hình k tip nu còn〉;
until 〈
ht cu hình〉;
Th t t đin
Trên các kiu d liu đn gin chun, ngi ta thng nói ti khái nim th t. Ví d trên
kiu s thì có quan h: 1 < 2; 2 < 3; 3 < 10; …, trên kiu ký t Char thì cng có quan h 'A' <
'B'; 'C' < 'c'…
Xét quan h th t toàn phn “nh hn hoc bng” ký hiu “≤“ trên mt tp hp S, là quan h
hai ngôi tho mãn bn tính cht:
Vi ∀a, b, c ∈ S
Tính ph bin: Hoc là a ≤ b, hoc b ≤ a;
Tính phn x: a ≤ a
Tính phn đi xng: Nu a ≤ b và b ≤ a thì bt buc a = b.
Tính bc cu: Nu có a ≤ b và b ≤ c thì a ≤ c.
Trong trng hp a ≤ b và a ≠ b, ta dùng ký hiu “<” cho gn, (ta ngm hiu các ký hiu nh
≥, >, khi phi đnh ngha)
Ví d nh quan h “≤” trên các s nguyên cng nh trên các kiu vô hng, lit kê là quan h
th t toàn phn.
Trên các dãy hu hn, ngi ta cng xác đnh mt quan h th t:
Xét a[1 n] và b[1 n] là hai dãy đ dài n, trên các phn t ca a và b đã có quan h th t “≤”.
Khi đó a ≤ b nu nh
Hoc a[i] = b[i] vi ∀i: 1 ≤ i ≤ n.
Hoc tn ti mt s nguyên dng k: 1 ≤ k < n đ:
a[1] = b[1]
a[2] = b[2]
Bài toán lit kê 5
Lê Minh Hoàng
…
a[k-1] = b[k-1]
a[k] = b[k]
a[k+1] < b[k+1]
Trong trng hp này, ta có th vit a < b.
Th t đó gi là th t t đin trên các dãy đ dài n.
Khi đ dài hai dãy a và b không bng nhau, ngi ta cng xác đnh đc th t t đin. Bng
cách thêm vào cui dãy a hoc dãy b nhng phn t đc bit gi là phn t ∅ đ đ dài ca a
và b bng nhau, và coi nhng phn t ∅ này nh hn tt c các phn t khác, ta li đa v xác
đnh th t t đin ca hai dãy cùng đ dài. Ví d:
〈1, 2, 3, 4〉 < 〈5, 6〉
〈a, b, c〉 < 〈a, b, c, d〉
'calculator' < 'computer'
2.1.
SINH CÁC DÃY NH PHÂN DÀI N
Mt dãy nh phân đ dài n là mt dãy x[1 n] trong đó x[i] ∈ {0, 1} (∀i : 1 ≤ i ≤ n).
D thy: mt dãy nh phân x đ dài n là biu din nh phân ca mt giá tr nguyên p(x) nào đó
nm trong đon [0, 2
n
- 1]. S các dãy nh phân đ dài n = s các s t nhiên ∈ [0, 2
n
- 1] = 2
n
.
Ta s lp chng trình lit kê các dãy nh phân theo th t t đin có ngha là s lit kê ln
lt các dãy nh phân biu din các s nguyên theo th t 0, 1, …, 2
n
-1.
Ví d: Khi n = 3, các dãy nh phân đ dài 3 đc lit kê nh sau:
p(x) 0 1 2 3 4 5 6 7
x 000 001 010 011 100 101 110 111
Nh vy dãy đu tiên s là 00…0 và dãy cui cùng s là 11…1. Nhn xét rng nu dãy x =
x[1 n] là dãy đang có và không phi dãy cui cùng cn lit kê thì dãy k tip s nhn đc
bng cách cng thêm 1 ( theo c s 2 có nh) vào dãy hin ti.
Ví d khi n = 8:
Dãy đang có: 10010000 Dãy đang có: 10010111
cng thêm 1: + 1 cng thêm 1: + 1
⎯⎯⎯⎯
⎯⎯⎯⎯
Dãy mi: 10010001 Dãy mi: 10011000
Nh vy k thut sinh cu hình k tip t cu hình hin ti có th mô t nh sau: Xét t cui
dãy v đu (xét t hàng đn v lên), tìm s 0 gp đu tiên
6 Chuyên đ
HSPHN 1999-2004
Nu thy thì thay s 0 đó bng s 1 và đt tt c các phn t phía sau v trí đó bng 0.
Nu không thy thì thì toàn dãy là s 1, đây là cu hình cui cùng
D liu vào (Input): nhp t file vn bn BSTR.INP cha s nguyên dng n ≤ 100
Kt qu ra (Output): ghi ra file vn bn BSTR.OUT các dãy nh phân đ dài n.
BSTR.INP
3
BSTR.OUT
000
001
010
011
100
101
110
111
P_1_02_1.PAS * Thut toán sinh lit kê các dãy nh phân đ dài n
{$MODE DELPHI} (*This program uses 32-bit Integer [-2
31
2
31
- 1]*)
program Binary_Strings;
const
InputFile = 'BSTR.INP';
OutputFile = 'BSTR.OUT';
max = 100;
var
x: array[1 max] of Integer;
n, i: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n);
Close(f);
Assign(f, OutputFile); Rewrite(f);
FillChar(x, SizeOf(x), 0); {Cu hình ban đu x=00 0}
repeat {Thut toán sinh}
for i := 1 to n do Write(f, x[i]); {In ra cu hình hin ti}
WriteLn(f);
i := n; {x[i] là phn t cui dãy, lùi dn i cho ti khi gp s 0 hoc khi i = 0 thì dng}
while (i > 0) and (x[i] = 1) do Dec(i);
if i > 0 then {Cha gp phi cu hình 11…1}
begin
x[i] := 1; {Thay x[i] bng s 1}
FillChar(x[i + 1], (n - i) * SizeOf(x[1]), 0); {t x[i+1] = x[i+2] = … = x[n] := 0}
end;
until i = 0; {ã ht cu hình}
Close(f);
end.
2.2.
LIT KÊ CÁC TP CON K PHN T
Ta s lp chng trình lit kê các tp con k phn t ca tp {1, 2, …, n} theo th t t đin
Ví d: vi n = 5, k = 3, ta phi lit kê đ 10 tp con:
1.{1, 2, 3} 2.{1, 2, 4} 3.{1, 2, 5} 4.{1, 3, 4} 5.{1, 3, 5}
6.{1, 4, 5} 7.{2, 3, 4} 8.{2, 3, 5} 9.{2, 4, 5} 10.{3, 4, 5}
Nh vy tp con đu tiên (cu hình khi to) là {1, 2, …, k}.
Cu hình kt thúc là {n - k + 1, n - k + 2, …, n}.
Nhn xét: Ta s in ra tp con bng cách in ra ln lt các phn t ca nó theo th t tng dn.
Biu din mi tp con là mt dãy x[1 k] trong đó x[1] < x[2] < … < x[k]. Ta nhn thy gii
Bài toán lit kê 7
Lê Minh Hoàng
hn trên (giá tr ln nht có th nhn) ca x[k] là n, ca x[k-1] là n - 1, ca x[k-2] là n - 2…
Tng quát: gii hn trên ca x[i] = n - k + i;
Còn tt nhiên, gii hn di ca x[i] (giá tr nh nht x[i] có th nhn) là x[i-1] + 1.
Nh vy nu ta đang có mt dãy x đi din cho mt tp con, nu x là cu hình kt thúc có
ngha là tt c các phn t trong x đu đã đt ti gii hn trên thì quá trình sinh kt thúc, nu
không thì ta phi sinh ra mt dãy x mi tng dn tho mãn va đ ln hn dãy c theo ngha
không có mt tp con k phn t nào chen gia chúng khi sp th t t đin.
Ví d: n = 9, k = 6. Cu hình đang có x = 〈1, 2, 6, 7, 8, 9
〉. Các phn t x[3] đn x[6] đã đt ti
gii hn trên nên đ sinh cu hình mi ta không th sinh bng cách tng mt phn t trong s
các x[6], x[5], x[4], x[3] lên đc, ta phi tng x[2] = 2 lên thành x[2] = 3. c cu hình mi
là x = 〈1, 3, 6, 7, 8, 9〉. Cu hình này đã tho mãn ln hn cu hình trc nhng cha tho
mãn tính cht va đ ln mun vy ta li thay x[3], x[4], x[5], x[6] bng các gii hn di
ca nó. Tc là:
x[3] := x[2] + 1 = 4
x[4] := x[3] + 1 = 5
x[5] := x[4] + 1 = 6
x[6] := x[5] + 1 = 7
Ta đc cu hình mi x = 〈1, 3, 4, 5, 6, 7
〉 là cu hình k tip. Nu mun tìm tip, ta li nhn
thy rng x[6] = 7 cha đt gii hn trên, nh vy ch cn tng x[6] lên 1 là đc x = 〈1, 3, 4,
5, 6, 8〉.
Vy k thut sinh tp con k tip t tp đã có x có th xây dng nh sau:
Tìm t cui dãy lên đu cho ti khi gp mt phn t x[i] cha đt gii hn trên n - k + i.
Nu tìm thy:
Tng x[i] đó lên 1.
t tt c các phn t phía sau x[i] bng gii hn di.
Nu không tìm thy tc là mi phn t đã đt gii hn trên, đây là cu hình cui cùng
Input: file vn bn SUBSET.INP cha hai s nguyên dng n, k (1 ≤ k ≤ n ≤ 100) cách nhau
ít nht mt du cách
Output: file vn bn SUBSET.OUT các tp con k phn t ca tp {1, 2, …, n}
SUBSET.INP
5 3
SUBSET.OUT
{1, 2, 3}
{1, 2, 4}
{1, 2, 5}
{1, 3, 4}
{1, 3, 5}
{1, 4, 5}
{2, 3, 4}
{2, 3, 5}
{2, 4, 5}
{3, 4, 5}
8 Chuyên đ
HSPHN 1999-2004
P_1_02_2.PAS * Thut toán sinh lit kê các tp con k phn t
{$MODE DELPHI} (*This program uses 32-bit Integer [-2
31
2
31
- 1]*)
program Combination;
const
InputFile = 'SUBSET.INP';
OutputFile = 'SUBSET.OUT';
max = 100;
var
x: array[1 max] of Integer;
n, k, i, j: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n, k);
Close(f);
Assign(f, OutputFile); Rewrite(f);
for i := 1 to k do x[i] := i; {Khi to x := (1, 2, …, k)}
repeat
{In ra cu hình hin ti}
Write(f, '{');
for i := 1 to k - 1 do Write(f, x[i], ', ');
WriteLn(f, x[k], '}');
{Sinh tip}
i := k; {Xét t cui dãy lên tìm x[i] cha đt gii hn trên n - k + i}
while (i > 0) and (x[i] = n - k + i) do Dec(i);
if i > 0 then {Nu cha lùi đn 0 có ngha là cha phi cu hình kt thúc}
begin
Inc(x[i]); {Tng x[i] lên 1, t các phn t đng sau x[i] bng gii hn di ca nó}
for j := i + 1 to k do x[j] := x[j - 1] + 1;
end;
until i = 0; {Lùi đn tn 0 có ngha là tt c các ph
n t đã đt gii hn trên - ht cu hình}
Close(f);
end.
2.3.
LIT KÊ CÁC HOÁN V
Ta s lp chng trình lit kê các hoán v ca {1, 2, …, n} theo th t t đin.
Ví d vi n = 4, ta phi lit kê đ 24 hoán v:
1.1234 2.1243 3.1324 4.1342 5.1423 6.1432
7.2134 8.2143 9.2314 10.2341 11.2413 12.2431
13.3124 14.3142 15.3214 16.3241 17.3412 18.3421
19.4123 20.4132 21.4213 22.4231 23.4312 24.4321
Nh vy hoán v đu tiên s là 〈1, 2, …, n〉. Hoán v cui cùng là 〈n, n-1, …, 1〉.
Hoán v s sinh ra phi ln hn hoán v hin ti, hn th na phi là hoán v va đ ln hn
hoán v hin ti theo ngha không th có mt hoán v nào khác chen gia chúng khi sp th t.
Gi s hoán v hin ti là x = 〈3, 2, 6, 5, 4, 1
〉, xét 4 phn t cui cùng, ta thy chúng đc xp
gim dn, điu đó có ngha là cho dù ta có hoán v 4 phn t này th nào, ta cng đc mt
hoán v bé hn hoán v hin ti. Nh vy ta phi xét đn x[2] = 2, thay nó bng mt giá tr
khác. Ta s thay bng giá tr nào?, không th là 1 bi nu vy s đc hoán v nh hn, không
th là 3 vì đã có x[1] = 3 ri (phn t sau không đc chn vào nhng giá tr mà phn t trc
đã chn). Còn li các giá tr 4, 5, 6. Vì cn mt hoán v va đ ln hn hin ti nên ta chn
x[2] = 4. Còn các giá tr (x[3], x[4], x[5], x[6]) s ly trong tp {2, 6, 5, 1}. Cng vì tính va
Bài toán lit kê 9
Lê Minh Hoàng
đ ln nên ta s tìm biu din nh nht ca 4 s này gán cho x[3], x[4], x[5], x[6] tc là 〈1, 2,
5, 6〉. Vy hoán v mi s là 〈3, 4, 1, 2, 5, 6〉.
Ta có nhn xét gì qua ví d này: on cui ca hoán v hin ti đc xp gim dn, s x[5] =
4 là s nh nht trong đon cui gim dn tho mãn điu kin ln hn x[2] = 2. Nu đi ch
x[5] cho x[2] thì ta s đc x[2] = 4 và đon cui vn đc sp xp gim dn. Khi đó mun
biu din nh nht cho các giá tr trong đon cui thì ta ch cn đo ngc đon cui.
Trong trng hp hoán v hin ti là 〈2, 1, 3, 4〉 thì hoán v k tip s là 〈2, 1, 4, 3〉. Ta cng
có th coi hoán v 〈2, 1, 3, 4〉 có đon cui gim dn, đon cui này ch gm 1 phn t (4)
Vy k thut sinh hoán v k tip t hoán v hin ti có th xây dng nh sau:
Xác đnh đon cui gim dn dài nht, tìm ch s i ca phn t x[i] đng lin trc đon cui
đó. iu này đng ngha vi vic tìm t v trí sát cui dãy lên đu, gp ch s i đu tiên tha
mãn x[i] < x[i+1].
Nu tìm thy ch s i nh trên
Trong đon cui gim dn, tìm phn t x[k] nh nht tho mãn điu kin x[k] > x[i]. Do
đon cui gim dn, điu này thc hin bng cách tìm t cui dãy lên đu gp ch s k
đu tiên tho mãn x[k] > x[i] (có th dùng tìm kim nh phân).
o giá tr x[k] và x[i]
Lt ngc th t đon cui gim dn (t x[i+1] đn x[k]) tr thành tng dn.
Nu không tìm thy tc là toàn dãy đã sp gim dn, đây là cu hình cui cùng
Input: file vn bn PERMUTE.INP cha s nguyên dng n ≤ 100
Output: file vn bn PERMUTE.OUT các hoán v ca dãy (1, 2, …, n)
PERMUTE.INP
3
PERMUTE.OUT
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
P_1_02_3.PAS * Thut toán sinh lit kê hoán v
{$MODE DELPHI} (*This program uses 32-bit Integer [-2
31
2
31
- 1]*)
program Permutation;
const
InputFile = 'PERMUTE.INP';
OutputFile = 'PERMUTE.OUT';
max = 100;
var
n, i, k, a, b: Integer;
x: array[1 max] of Integer;
f: Text;
procedure Swap(var X, Y: Integer); {Th tc đo giá tr hai tham bin X, Y}
var
Temp: Integer;
begin
Temp := X; X := Y; Y := Temp;
end;
10 Chuyên đ
HSPHN 1999-2004
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n);
Close(f);
Assign(f, OutputFile); Rewrite(f);
for i := 1 to n do x[i] := i; {Khi to cu hình đu: x[1] := 1; x[2] := 2; …, x[n] := n}
repeat
for i := 1 to n do Write(f, x[i], ' '); {In ra cu hình hoán v hin ti}
WriteLn(f);
i := n - 1;
while (i > 0) and (x[i] > x[i + 1]) do Dec(i);
if i > 0 then {Cha gp phi hoán v cui (n, n-1, …, 1)}
begin
k := n; {x[k] là phn t cui dãy}
while x[k] < x[i] do Dec(k); {Lùi dn k đ tìm gp x[k] đu tiên ln hn x[i]}
Swap(x[k], x[i]); {i ch x[k] và x[i]}
a := i + 1; b := n; {Lt ngc đon cui gim dn, a: đu đon, b: cui đon}
while a < b do
begin
Swap(x[a], x[b]); {o giá tr x[a] và x[b]}
Inc(a); {Tin a và lùi b, tip tc cho ti khi a, b chm nhau}
Dec(b);
end;
end;
until i = 0; {Toàn dãy là dãy gim dn - không sinh tip đc - ht cu hình}
Close(f);
end.
Bài tp:
Bài 1
Các chng trình trên x lý không tt trong trng hp tm thng, đó là trng hp n = 0
đi vi chng trình lit kê dãy nh phân cng nh trong chng trình lit kê hoán v, trng
hp k = 0 đi vi chng trình lit kê t hp, hãy khc phc điu đó.
Bài 2
Lit kê các dãy nh phân đ dài n có th coi là lit kê các chnh hp lp chp n ca tp 2 phn
t {0, 1}. Hãy lp chng trình:
Nhp vào hai s n và k, lit kê các chnh hp lp chp k ca {0, 1, …, n -1}.
Hng dn: thay h c s 2 bng h c s n.
Bài 3
Hãy lit kê các dãy nh phân đ dài n mà trong đó cm ch s “01” xut hin đúng 2 ln.
Bài 4.
Nhp vào mt danh sách n tên ngi. Lit kê tt c các cách chn ra đúng k ngi trong s n
ngi đó.
Bài 5
Lit kê tt c các tp con ca tp {1, 2, …, n}. Có th dùng phng pháp lit kê tp con nh
trên hoc dùng phng pháp lit kê tt c các dãy nh phân. Mi s 1 trong dãy nh phân
tng ng vi mt phn t đc chn trong tp. Ví d vi tp {1, 2, 3, 4} thì dãy nh phân
Bài toán lit kê 11
Lê Minh Hoàng
1010 s tng ng vi tp con {1, 3}. Hãy lp chng trình in ra tt c các tp con ca {1,
2, …, n} theo hai phng pháp.
Bài 6
Nhp vào danh sách tên n ngi, in ra tt c các cách xp n ngi đó vào mt bàn
Bài 7
Nhp vào danh sách n bn nam và n bn n, in ra tt c các cách xp 2n ngi đó vào mt bàn
tròn, mi bn nam tip đn mt bn n.
Bài 8
Ngi ta có th dùng phng pháp sinh đ lit kê các chnh hp không lp chp k. Tuy nhiên
có mt cách khác là lit kê tt c các tp con k phn t ca tp hp, sau đó in ra đ k! hoán v
ca nó. Hãy vit chng trình lit kê các chnh hp không lp chp k ca {1, 2, …, n} theo c
hai cách.
Bài 9
Lit kê tt c các hoán v ch cái trong t MISSISSIPPI theo th t t đin.
Bài 10
Lit kê tt c các cách phân tích s nguyên dng n thành tng các s nguyên dng, hai cách
phân tích là hoán v ca nhau ch tính là mt cách.
Cui cùng, ta có nhn xét, mi phng pháp lit kê đu có u, nhc đim riêng và phng
pháp sinh cng không nm ngoài nhn xét đó. Phng pháp sinh không th sinh ra đc cu
hình th p nu nh cha có cu hình th p - 1, chng t rng phng pháp sinh t ra u đim
trong trng hp lit kê toàn b mt s lng nh cu hình trong mt b d liu ln thì li có
nhc đim và ít tính ph dng trong nhng thut toán duyt hn ch. Hn th na, không
phi cu hình ban đu lúc nào cng d tìm đc, không phi k thut sinh cu hình k tip
cho mi bài toán đu đn gin nh trên (Sinh các chnh hp không lp chp k theo th t t
đin chng hn). Ta sang mt chuyên mc sau nói đn mt phng pháp lit kê có tính ph
dng cao hn, đ gii các bài toán lit kê phc tp hn đó là: Thut toán quay lui (Back
tracking).