1. Trang chủ
  2. » Giáo án - Bài giảng

Cấu trúc Dữ liệu và giải thuật

332 651 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Cấu Trúc Dữ Liệu Và Giải Thuật
Tác giả Lê Minh Hoàng
Trường học Đại Học Sư Phạm Hà Nội
Thể loại Bài Giảng Chuyên Đề
Năm xuất bản 1999-2002
Thành phố Hà Nội
Định dạng
Số trang 332
Dung lượng 12,55 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài giải Cấu trúc dữ liệu và giải thuật. Các bạn sẽ tìm được đầy đủ thông tin và cách giải tại đây

Trang 1

LÊ MINH HOÀNG

Bài gi ng chuyên đ

i h c S ph m Hà N i, 1999-2002

Trang 2

Try not to become a man of success but rather to become a man of value

Albert Einstein

Trang 3

M C L C

PH N 1 BÀI TOÁN LI T KÊ 1

§1 NH C L I M T S KI N TH C I S T H P 2

1.1 CH NH H P L P 2

1.2 CH NH H P KHÔNG L P 2

1.3 HOÁN V 2

1.4 T H P 3

§2 PH NG PHÁP SINH (GENERATION) 4

2.1 SINH CÁC DÃY NH PHÂN DÀI N 5

2.2 LI T KÊ CÁC T P CON K PH N T 6

2.3 LI T KÊ CÁC HOÁN V 8

§3 THU T TOÁN QUAY LUI 12

3.1 LI T KÊ CÁC DÃY NH PHÂN DÀI N 12

3.2 LI T KÊ CÁC T P CON K PH N T 13

3.3 LI T KÊ CÁC CH NH H P KHÔNG L P CH P K 15

3.4 BÀI TOÁN PHÂN TÍCH S 16

3.5 BÀI TOÁN X P H U 18

§4 K THU T NHÁNH C N 24

4.1 BÀI TOÁN T I U 24

4.2 S BÙNG N T H P 24

4.3 MÔ HÌNH K THU T NHÁNH C N 24

4.4 BÀI TOÁN NG I DU L CH 25

4.5 DÃY ABC 27

PH N 2 C U TRÚC D LI U VÀ GI I THU T 33

§1 CÁC B C C B N KHI TI N HÀNH GI I CÁC BÀI TOÁN TIN H C 34

1.1 XÁC NH BÀI TOÁN 34

1.2 TÌM C U TRÚC D LI U BI U DI N BÀI TOÁN 34

1.3 TÌM THU T TOÁN 35

1.4 L P TRÌNH 37

1.5 KI M TH 37

1.6 T I U CH NG TRÌNH 38

§2 PHÂN TÍCH TH I GIAN TH C HI N GI I THU T 40

2.1 GI I THI U 40

2.2 CÁC KÝ PHÁP ÁNH GIÁ PH C T P TÍNH TOÁN 40

2.3 XÁC NH PH C T P TÍNH TOÁN C A GI I THU T 42

2.4 PH C T P TÍNH TOÁN V I TÌNH TR NG D LI U VÀO 45

2.5 CHI PHÍ TH C HI N THU T TOÁN 46

Trang 4

§3 QUY VÀ GI I THU T QUY 50

3.1 KHÁI NI M V QUY 50

3.2 GI I THU T QUY 50

3.3 VÍ D V GI I THU T QUY 51

3.4 HI U L C C A QUY 55

§4 C U TRÚC D LI U BI U DI N DANH SÁCH 58

4.1 KHÁI NI M DANH SÁCH 58

4.2 BI U DI N DANH SÁCH TRONG MÁY TÍNH 58

§5 NG N X P VÀ HÀNG I 64

5.1 NG N X P (STACK) 64

5.2 HÀNG I (QUEUE) 66

§6 CÂY (TREE) 70

6.1 NH NGH A 70

6.2 CÂY NH PHÂN (BINARY TREE) 71

6.3 BI U DI N CÂY NH PHÂN 73

6.4 PHÉP DUY T CÂY NH PHÂN 74

6.5 CÂY K_PHÂN 76

6.6 CÂY T NG QUÁT 77

§7 KÝ PHÁP TI N T , TRUNG T VÀ H U T 79

7.1 BI U TH C D I D NG CÂY NH PHÂN 79

7.2 CÁC KÝ PHÁP CHO CÙNG M T BI U TH C 79

7.3 CÁCH TÍNH GIÁ TR BI U TH C 79

7.4 CHUY N T D NG TRUNG T SANG D NG H U T 83

7.5 XÂY D NG CÂY NH PHÂN BI U DI N BI U TH C 86

§8 S P X P (SORTING) 87

8.1 BÀI TOÁN S P X P 87

8.2 THU T TOÁN S P X P KI U CH N (SELECTIONSORT) 89

8.3 THU T TOÁN S P X P N I B T (BUBBLESORT) 90

8.4 THU T TOÁN S P X P KI U CHÈN 90

8.5 SHELLSORT 92

8.6 THU T TOÁN S P X P KI U PHÂN O N (QUICKSORT) 93

8.7 THU T TOÁN S P X P KI U VUN NG (HEAPSORT) 99

8.8 S P X P B NG PHÉP M PHÂN PH I (DISTRIBUTION COUNTING) 102

8.9 TÍNH N NH C A THU T TOÁN S P X P (STABILITY) 103

8.10 THU T TOÁN S P X P B NG C S (RADIX SORT) 104

8.11 THU T TOÁN S P X P TR N (MERGESORT) 109

8.12 CÀI T 112

8.13 ÁNH GIÁ, NH N XÉT 119

§9 TÌM KI M (SEARCHING) 124

9.1 BÀI TOÁN TÌM KI M 124

9.2 TÌM KI M TU N T (SEQUENTIAL SEARCH) 124

9.3 TÌM KI M NH PHÂN (BINARY SEARCH) 124

9.4 CÂY NH PHÂN TÌM KI M (BINARY SEARCH TREE - BST) 125

Trang 5

9.5 PHÉP B M (HASH) 130

9.6 KHOÁ S V I BÀI TOÁN TÌM KI M 130

9.7 CÂY TÌM KI M S H C (DIGITAL SEARCH TREE - DST) 131

9.8 CÂY TÌM KI M C S (RADIX SEARCH TREE - RST) 134

9.9 NH NG NH N XÉT CU I CÙNG 139

PH N 3 QUY HO CH NG 141

§1 CÔNG TH C TRUY H I 142

1.1 VÍ D 142

1.2 C I TI N TH NH T 143

1.3 C I TI N TH HAI 144

1.4 CÀI T QUY 145

§2 PH NG PHÁP QUY HO CH NG 147

2.1 BÀI TOÁN QUY HO CH 147

2.2 PH NG PHÁP QUY HO CH NG 147

§3 M T S BÀI TOÁN QUY HO CH NG 151

3.1 DÃY CON N I U T NG DÀI NH T 151

3.2 BÀI TOÁN CÁI TÚI 156

3.3 BI N I XÂU 158

3.4 DÃY CON CÓ T NG CHIA H T CHO K 162

3.5 PHÉP NHÂN T H P DÃY MA TR N 166

3.6 BÀI T P LUY N T P 170

PH N 4 CÁC THU T TOÁN TRÊN TH 175

§1 CÁC KHÁI NI M C B N 176

1.1 NH NGH A TH (GRAPH) 176

1.2 CÁC KHÁI NI M 177

§2 BI U DI N TH TRÊN MÁY TÍNH 179

2.1 MA TR N K (ADJACENCY MATRIX) 179

2.2 DANH SÁCH C NH (EDGE LIST) 180

2.3 DANH SÁCH K (ADJACENCY LIST) 181

2.4 NH N XÉT 182

§3 CÁC THU T TOÁN TÌM KI M TRÊN TH 184

3.1 BÀI TOÁN 184

3.2 THU T TOÁN TÌM KI M THEO CHI U SÂU (DEPTH FIRST SEARCH) 185

3.3 THU T TOÁN TÌM KI M THEO CHI U R NG (BREADTH FIRST SEARCH) 187

3.4 PH C T P TÍNH TOÁN C A BFS VÀ DFS 190

§4 TÍNH LIÊN THÔNG C A TH 191

4.1 NH NGH A 191

4.2 TÍNH LIÊN THÔNG TRONG TH VÔ H NG 192

Trang 6

4.3 TH Y VÀ THU T TOÁN WARSHALL 192

4.4 CÁC THÀNH PH N LIÊN THÔNG M NH 195

§5 VÀI NG D NG C A DFS và BFS 206

5.1 XÂY D NG CÂY KHUNG C A TH 206

5.2 T P CÁC CHU TRÌNH C S C A TH 209

5.3 BÀI TOÁN NH CHI U TH 209

5.4 LI T KÊ CÁC KH P VÀ C U C A TH 213

§6 CHU TRÌNH EULER, NG I EULER, TH EULER 216

6.1 BÀI TOÁN 7 CÁI C U 216

6.2 NH NGH A 216

6.3 NH LÝ 216

6.4 THU T TOÁN FLEURY TÌM CHU TRÌNH EULER 217

6.5 CÀI T 218

6.6 THU T TOÁN T T H N 220

§7 CHU TRÌNH HAMILTON, NG I HAMILTON, TH HAMILTON 223

7.1 NH NGH A 223

7.2 NH LÝ 223

7.3 CÀI T 224

§8 BÀI TOÁN NG I NG N NH T 228

8.1 TH CÓ TR NG S 228

8.2 BÀI TOÁN NG I NG N NH T 228

8.3 TR NG H P TH KHÔNG CÓ CHU TRÌNH ÂM - THU T TOÁN FORD BELLMAN 230

8.4 TR NG H P TR NG S TRÊN CÁC CUNG KHÔNG ÂM - THU T TOÁN DIJKSTRA 232

8.5 THU T TOÁN DIJKSTRA VÀ C U TRÚC HEAP 235

8.6 TR NG H P TH KHÔNG CÓ CHU TRÌNH - S P X P TÔ PÔ 238

8.7 NG I NG N NH T GI A M I C P NH - THU T TOÁN FLOYD 241

8.8 NH N XÉT 243

§9 BÀI TOÁN CÂY KHUNG NH NH T 248

9.1 BÀI TOÁN CÂY KHUNG NH NH T 248

9.2 THU T TOÁN KRUSKAL (JOSEPH KRUSKAL - 1956) 248

9.3 THU T TOÁN PRIM (ROBERT PRIM - 1957) 253

§10 BÀI TOÁN LU NG C C I TRÊN M NG 257

10.1 CÁC KHÁI NI M 257

10.2 M NG TH NG D VÀ NG T NG LU NG 260

10.3 THU T TOÁN FORD-FULKERSON (L.R.FORD & D.R.FULKERSON - 1962) 263

10.4 THU T TOÁN PREFLOW-PUSH (GOLDBERG - 1986) 267

10.5 M T S M R NG 273

§11 BÀI TOÁN TÌM B GHÉP C C I TRÊN TH HAI PHÍA 280

11.1 TH HAI PHÍA (BIPARTITE GRAPH) 280

11.2 BÀI TOÁN GHÉP ÔI KHÔNG TR NG VÀ CÁC KHÁI NI M 280

11.3 THU T TOÁN NG M 281

11.4 CÀI T 282

Trang 7

§12 BÀI TOÁN TÌM B GHÉP C C I V I TR NG S C C TI U TRÊN TH HAI

PHÍA - THU T TOÁN HUNGARI 288

12.1 BÀI TOÁN PHÂN CÔNG 288

12.2 PHÂN TÍCH 288

12.3 THU T TOÁN 289

12.4 BÀI TOÁN TÌM B GHÉP C C I V I TR NG S C C I TRÊN TH HAI PHÍA 297

12.5 NÂNG C P 298

§13 BÀI TOÁN TÌM B GHÉP C C I TRÊN TH 304

13.1 CÁC KHÁI NI M 304

13.2 THU T TOÁN EDMONDS (1965) 305

13.3 THU T TOÁN LAWLER (1973) 307

13.4 CÀI T 309

13.5 PH C T P TÍNH TOÁN 313

TÀI LI U C THÊM 315

Trang 8

HÌNH V

Hình 1: Cây tìm ki m quay lui trong bài toán li t kê dãy nh phân 13

Hình 2: X p 8 quân h u 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 19

Hình 4: L u đ thu t gi i (Flowchart) 36

Hình 5: Ký pháp Θ l n, Ο l n và Ω l n 41

Hình 6: Tháp Hà N i 54

Hình 7: C u trúc nút c a danh sách n i đ n 59

Hình 8: Danh sách n i đ n 59

Hình 9: C u trúc nút c a danh sách n i kép 61

Hình 10: Danh sách n i kép 61

Hình 11: Danh sách n i vòng m t h ng 61

Hình 12: Danh sách n i vòng hai h ng 62

Hình 13: Dùng danh sách vòng mô t Queue 67

Hình 14: Di chuy n toa tàu 69

Hình 15: Di chuy n toa tàu (2) 69

Hình 16: Cây 70

Hình 17: M c c a các nút trên cây 71

Hình 18: Cây bi u di n bi u th c 71

Hình 19: Các d ng cây nh phân suy bi n 72

Hình 20: Cây nh phân hoàn ch nh và cây nh phân đ y đ 72

Hình 21: ánh s các nút c a cây nh phân đ y đ đ bi u di n b ng m ng 73

Hình 22: Nh c đi m c a ph ng pháp bi u di n cây b ng m ng 73

Hình 23: C u trúc nút c a cây nh phân 74

Hình 24: Bi u di n cây b ng c u trúc liên k t 74

Hình 25: ánh s các nút c a cây 3_phân đ bi u di n b ng m ng 76

Hình 26: Bi u di n cây t ng quát b ng m ng 77

Hình 27: C u trúc nút c a cây t ng quát 78

Hình 28: Bi u th c d i d ng cây nh phân 79

Hình 29: Vòng l p trong c a QuickSort 94

Hình 30: Tr ng thái tr c khi g i đ quy 95

Hình 31: Heap 100

Hình 32: Vun đ ng 100

Hình 33: o giá tr k[1] cho k[n] và xét ph n còn l i 101

Hình 34: Vun ph n còn l i thành đ ng r i l i đ o tr k[1] cho k[n-1] 101

Hình 35: ánh s các bit 104

Hình 36: Thu t toán s p x p tr n 109

Hình 37: Cài đ t các thu t toán s p x p v i d li u l n 121

Trang 9

Hình 38: Cây nh phân tìm ki m 126

Hình 39: Xóa nút lá cây BST 127

Hình 40 Xóa nút ch có m t nhánh con trên cây BST 128

Hình 41: Xóa nút có c hai nhánh con trên cây BST thay b ng nút c c ph i c a cây con trái 128

Hình 42: Xóa nút có c hai nhánh con trên cây BST thay b ng nút c c trái c a cây con ph i 128

Hình 43: ánh s các bit 131

Hình 44: Cây tìm ki m s h c 131

Hình 45: Cây tìm ki m c s 134

Hình 46: V i đ dài dãy bit z = 3, cây tìm ki m c s g m các khoá 2, 4, 5 và sau khi thêm giá tr 7 135

Hình 47: RST ch a các khoá 2, 4, 5, 7 và RST sau khi lo i b giá tr 7 136

Hình 48: Cây tìm ki m c s a) và Trie tìm ki m c s b) 138

Hình 49: Hàm đ quy tính s Fibonacci 149

Hình 50: Tính toán và truy v t 152

Hình 51: Truy v t 160

Hình 52: Ví d v mô hình đ th 176

Hình 53: Phân lo i đ th 177

Hình 54 180

Hình 55 181

Hình 56: th và đ ng đi 184

Hình 57: Cây DFS 187

Hình 58: Cây BFS 190

Hình 59: th G và các thành ph n liên thông G1, G2, G3 c a nó 191

Hình 60: Kh p và c u 191

Hình 61: Liên thông m nh và liên thông y u 192

Hình 62: th đ y đ 193

Hình 63: n đ th vô h ng và bao đóng c a nó 193

Hình 64: Ba d ng cung ngoài cây DFS 197

Hình 65: Thu t toán Tarjan "b " cây DFS 199

Hình 66: ánh s l i, đ o chi u các cung và duy t BFS v i cách ch n các đ nh xu t phát ng c l i v i th t duy t xong (th t 11, 10… 3, 2, 1) 204

Hình 67: th G và m t s ví d cây khung T1, T2, T3 c a nó 208

Hình 68: Cây khung DFS (a) và cây khung BFS (b) (M i tên ch chi u đi th m các đ nh) 208

Hình 69: Phép đ nh chi u DFS 211

Hình 70: Phép đánh s và ghi nh n cung ng c lên cao nh t 213

Hình 71: Mô hình đ th c a bài toán b y cái c u 216

Hình 72 217

Hình 73 217

Hình 74 223

Hình 75: Phép đánh l i ch s theo th t tôpô 238

Hình 76: Hai cây g c r 1 và r 2 và cây m i khi h p nh t chúng 249

Trang 10

Hình 77: M ng v i các kh n ng thông qua (1 phát, 6 thu) và m t lu ng c a nó v i giá tr 7 257

Hình 78: M ng G và m ng th ng d G f t ng ng (ký hi u f[u,v]:c[u,v] ch lu ng f[u, v] và kh n ng thông qua c[u, v] trên cung (u, v)) 261

Hình 79: M ng th ng d và đ ng t ng lu ng 262

Hình 80: Lu ng trên m ng G tr c và sau khi t ng 262

Hình 81: M ng gi c a m ng có nhi u đi m phát và nhi u đi m thu 273

Hình 82: Thay m t đ nh u b ng hai đ nh u in , u out 274

Hình 83: M ng gi c a m ng có kh n ng thông qua c a các cung b ch n hai phía 274

Hình 84: th hai phía 280

Hình 85: th hai phía và b ghép M 281

Hình 86: Mô hình lu ng c a bài toán tìm b ghép c c đ i trên đ th hai phía 285

Hình 87: Phép xoay tr ng s c nh 289

Hình 88: Thu t toán Hungari 292

Hình 89: Cây pha "m c" l n h n sau m i l n xoay tr ng s c nh và tìm đ ng 299

Hình 90: th G và m t b ghép M 304

Hình 91: Phép ch p Blossom 306

Hình 92: N Blossom đ dò đ ng xuyên qua Blossom 306

Trang 11

CH NG TRÌNH

P_1_02_1.PAS * Thu t toán sinh li t kê các dãy nh phân đ dài n 6

P_1_02_2.PAS * Thu t toán sinh li t kê các t p con k ph n t 8

P_1_02_3.PAS * Thu t toán sinh li t kê hoán v 9

P_1_03_1.PAS * Thu t toán quay lui li t kê các dãy nh phân đ dài n 12

P_1_03_2.PAS * Thu t toán quay lui li t kê các t p con k ph n t 14

P_1_03_3.PAS * Thu t toán quay lui li t kê các ch nh h p không l p ch p k 16

P_1_03_4.PAS * Thu t toán quay lui li t kê các cách phân tích s 17

P_1_03_5.PAS * Thu t toán quay lui gi i bài toán x p h u 21

P_1_04_1.PAS * K thu t nhánh c n dùng cho bài toán ng i du l ch 26

P_1_04_2.PAS * Dãy ABC 28

P_2_07_1.PAS * Tính giá tr bi u th c RPN 81

P_2_07_2.PAS * Chuy n bi u th c trung t sang d ng RPN 84

P_2_08_1.PAS * Các thu t toán s p x p 112

P_3_01_1.PAS * m s cách phân tích s n 143

P_3_01_2.PAS * m s cách phân tích s n 144

P_3_01_3.PAS * m s cách phân tích s n 144

P_3_01_4.PAS * m s cách phân tích s n 145

P_3_01_5.PAS * m s cách phân tích s n dùng đ quy 145

P_3_01_6.PAS * m s cách phân tích s n dùng đ quy 145

P_3_03_1.PAS * Tìm dãy con đ n đi u t ng dài nh t 152

P_3_03_2.PAS * C i ti n thu t toán tìm dãy con đ n đi u t ng dài nh t 154

P_3_03_3.PAS * Bài toán cái túi 157

P_3_03_4.PAS * Bi n đ i xâu 161

P_3_03_5.PAS * Dãy con có t ng chia h t cho k 163

P_3_03_6.PAS * Dãy con có t ng chia h t cho k 165

P_3_03_7.PAS * Nhân t i u dãy ma tr n 169

P_4_03_1.PAS * Thu t toán tìm ki m theo chi u sâu 185

P_4_03_2.PAS * Thu t toán tìm ki m theo chi u r ng 188

P_4_04_1.PAS * Thu t toán Warshall li t kê các thành ph n liên thông 195

P_4_04_2.PAS * Thu t toán Tarjan li t kê các thành ph n liên thông m nh 202

P_4_05_1.PAS * Li t kê các kh p và c u c a đ th 214

P_4_06_1.PAS * Thu t toán Fleury tìm chu trình Euler 218

P_4_06_2.PAS * Thu t toán hi u qu tìm chu trình Euler 221

P_4_07_1.PAS * Thu t toán quay lui li t kê chu trình Hamilton 224

P_4_08_1.PAS * Thu t toán Ford-Bellman 231

P_4_08_2.PAS * Thu t toán Dijkstra 233

P_4_08_3.PAS * Thu t toán Dijkstra và c u trúc Heap 235

Trang 12

P_4_08_4.PAS * ng đi ng n nh t trên đ th không có chu trình 239

P_4_08_5.PAS * Thu t toán Floyd 242

P_4_09_1.PAS * Thu t toán Kruskal 250

P_4_09_2.PAS * Thu t toán Prim 254

P_4_10_1.PAS * Thu t toán Ford-Fulkerson 265

P_4_10_2.PAS * Thu t toán Preflow-push 270

P_4_11_1.PAS * Thu t toán đ ng m tìm b ghép c c đ i 283

P_4_12_1.PAS * Thu t toán Hungari 295

P_4_12_2.PAS * Cài đ t ph ng pháp Kuhn-Munkres O(k 3 ) 300

P_4_13_1.PAS * Ph ng pháp Lawler áp d ng cho thu t toán Edmonds 310

Trang 15

PH N 1 BÀI TOÁN LI T KÊ

Có m t s bài toán trên th c t yêu c u ch rõ: trong m t t p các đ i

t ng cho tr c có bao nhiêu đ i t ng tho mãn nh ng đi u ki n nh t

đ nh Bài toán đó g i là bài toán đ m

Trong l p các bài toán đ m, có nh ng bài toán còn yêu c u ch rõ nh ng

c u hình tìm đ c tho mãn đi u ki n đã cho là nh ng c u hình nào Bài toán yêu c u đ a ra danh sách các c u hình có th có g i là bài toán li t

gi i bài toán li t kê, c n ph i xác đ nh đ c m t thu t toán đ có th

theo đó l n l t xây d ng đ c t t c các c u hình đang quan tâm Có nhi u ph ng pháp li t kê, nh ng chúng c n ph i đáp ng đ c hai yêu

th y l i gi i Qua đó, ta c ng nên bi t r ng ch nên dùng ph ng pháp

li t kê khi không còn m t ph ng pháp nào khác tìm ra l i gi i

Chính nh ng n l c gi i quy t các bài toán th c t không dùng ph ng pháp li t kê đã thúc đ y s phát tri n c a nhi u ngành toán h c

Trang 16

V y có th đ ng nh t f v i dãy giá tr (f(1), f(2), …, f(k)) và coi dãy giá tr này c ng là m t

ch nh h p l p ch p k c a S Nh ví d trên (E, C, E) là m t ch nh h p l p ch p 3 c a S D dàng ch ng minh đ c k t qu sau b ng quy n p ho c b ng ph ng pháp đánh giá kh n ng

Khi k = n M t ch nh h p không l p ch p n c a S đ c g i là m t hoán v các ph n t c a S

Ví d : m t hoán v : 〈A, D, C, E, B, F〉 c a S = {A, B, C, D, E, F}

f(i) A D C E B F

Trang 17

ý r ng khi k = n thì s ph n t c a t p X = {1, 2, …, n} đúng b ng s ph n t c a S Do tính ch t đôi m t khác nhau nên dãy f(1), f(2), …, f(n) s li t kê đ c h t các ph n t trong S

Nh v y f là toàn ánh M t khác do gi thi t f là ch nh h p không l p nên f là đ n ánh Ta có

L y m t t p con k ph n t c a S, xét t t c k! hoán v c a t p con này D th y r ng các hoán

v đó là các ch nh h p không l p ch p k c a S Ví d l y t p {A, B, C} là t p con c a t p S trong ví d trên thì: 〈A, B, C〉, 〈C, A, B〉, 〈B, C, A〉, … là các ch nh h p không l p ch p 3 c a

S i u đó t c là khi li t kê t t c các ch nh h p không l p ch p k thì m i t h p ch p k s

đ c tính k! l n V y s t h p ch p k c a t p g m n ph n t là n! n

kk!(n k)!

⎛ ⎞

= ⎜ ⎟

Trang 18

Trên các ki u d li u đ n gi n chu n, ng i ta th ng nói t i khái ni m th t Ví d trên

ki u s thì có quan h : 1 < 2; 2 < 3; 3 < 10; …, trên ki u ký t Char thì c ng có quan h 'A' < 'B'; 'C' < 'c'…

Xét quan h th t toàn ph n "nh h n ho c b ng" ký hi u "≤" trên m t t p h p S, là quan h hai ngôi tho mãn b n tính ch t:

Trên các dãy h u h n, ng i ta c ng xác đ nh m t quan h th t :

Xét a[1 n] và b[1 n] là hai dãy đ dài n, trên các ph n t c a a và b đã có quan h th t "≤" Khi đó a ≤ b n u nh

Ho c a[i] = b[i] v i ∀i: 1 ≤ i ≤ n

Ho c t n t i m t s nguyên d ng k: 1 ≤ k < n đ :

a[1] = b[1]

a[2] = b[2]

Trang 19

Th t đó g i là th t t đi n trên các dãy đ dài n

Khi đ dài hai dãy a và b không b ng nhau, ng i ta c ng xác đ nh đ c th t t đi n B ng cách thêm vào cu i dãy a ho c dãy b nh ng ph n t đ c bi t g i là ph n t ∅ đ đ dài c a a

và b b ng nhau, và coi nh ng ph n t ∅ này nh h n t t c các ph n t khác, ta l i đ a v xác

đ nh th t t đi n c a 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

M t dãy nh phân đ dài n là m t dãy x[1 n] trong đó x[i] ∈ {0, 1} (∀i : 1 ≤ i ≤ n)

D th y: m t dãy nh phân x đ dài n là bi u di n nh phân c a m t giá tr nguyên p(x) nào đó

n m trong đo n [0, 2n

- 1] S các dãy nh phân đ dài n = s các s t nhiên ∈ [0, 2n

- 1] = 2n

Ta s l p ch ng trình li t kê các dãy nh phân theo th t t đi n có ngh a là s li t kê l n

l t các dãy nh phân bi u di n các s nguyên theo th t 0, 1, …, 2n-1

Ví d : Khi n = 3, các dãy nh phân đ dài 3 đ c li t kê nh sau:

Trang 20

N u th y thì thay s 0 đó b ng s 1 và đ t t t c các ph n t phía sau v trí đó b ng 0

N u không th y thì thì toàn dãy là s 1, đây là c u hình cu i cùng

D li u vào (Input): nh p t file v n b n BSTR.INP ch a s nguyên d ng n ≤ 30

K t qu ra (Output): ghi ra file v n b n BSTR.OUT các dãy nh phân đ dài n

Assign(f, OutputFile); Rewrite(f);

FillChar(x, SizeOf(x), 0); {C u hình ban đ u x=00 0}

repeat {Thu t toán sinh}

for i := 1 to n do Write(f, x[i]); {In ra c u hình hi n t i}

WriteLn(f);

i := n; {x[i] là ph n t cu i dãy, lùi d n i cho t i khi g p s 0 ho c khi i = 0 thì d ng}

while (i > 0) and (x[i] = 1) do Dec(i);

if i > 0 then {Ch a g p ph i c u hình 11…1}

begin

x[i] := 1; {Thay x[i] b ng s 1}

FillChar(x[i + 1], (n - i) * SizeOf(x[1]), 0); { t x[i+1] = x[i+2] = … = x[n] := 0}

Trang 21

h n trên (giá tr l n nh t có th nh n) c a x[k] là n, c a x[k-1] là n - 1, c a x[k-2] là n - 2…

T ng quát: gi i h n trên c a x[i] = n - k + i;

Còn t t nhiên, gi i h n d i c a x[i] (giá tr nh nh t x[i] có th nh n) là x[i-1] + 1

Nh v y n u ta đang có m t dãy x đ i di n cho m t t p con, n u x là c u hình k t thúc có ngh a là t t c các ph n t trong x đ u đã đ t t i gi i h n trên thì quá trình sinh k t thúc, n u không thì ta ph i sinh ra m t dãy x m i t ng d n tho mãn v a đ l n h n dãy c theo ngh a không có m t t p con k ph n t nào chen gi a chúng khi s p th t t đi n

V y k thu t sinh t p con k ti p t t p đã có x có th xây d ng nh sau:

Tìm t cu i dãy lên đ u cho t i khi g p m t ph n t x[i] ch a đ t gi i h n trên n - k + i

N u tìm th y:

T ng x[i] đó lên 1

t t t c các ph n t phía sau x[i] b ng gi i h n d i

N u không tìm th y t c là m i ph n t đã đ t gi i h n trên, đây là c u hình cu i cùng

Input: file v n b n SUBSET.INP ch a hai s nguyên d ng n, k (1 ≤ k ≤ n ≤ 30) cách nhau ít

Trang 22

P_1_02_2.PAS * Thu t toán sinh li t kê các t p con k ph n t program Combination;

Assign(f, OutputFile); Rewrite(f);

for i := 1 to k do x[i] := i; {x := 12…k (C u hình kh i t o)}

i := k; {Xét t cu i dãy lên tìm x[i] ch a đ t gi i h n trên n - k + i}

while (i > 0) and (x[i] = n - k + i) do Dec(i);

Nh v y hoán v đ u tiên s là 〈1, 2, …, n〉 Hoán v cu i cùng là 〈n, n-1, …, 1〉

Hoán v s sinh ra ph i l n h n hoán v hi n t i, h n th n a ph i là hoán v v a đ l n h n hoán v hi n t i theo ngh a không th có m t hoán v nào khác chen gi a chúng khi s p th t

Gi s hoán v hi n t i là x = 〈3, 2, 6, 5, 4, 1〉, xét 4 ph n t cu i cùng, ta th y chúng đ c x p

gi m d n, đi u đó có ngh a là cho dù ta có hoán v 4 ph n t này th nào, ta c ng đ c m t hoán v bé h n hoán v hi n t i Nh v y ta ph i xét đ n x[2] = 2, thay nó b ng m t giá tr khác Ta s thay b ng giá tr nào?, không th là 1 b i n u v y s đ c hoán v nh h n, không

th là 3 vì đã có x[1] = 3 r i (ph n t sau không đ c ch n vào nh ng giá tr mà ph n t tr c

đã ch n) Còn l i các giá tr 4, 5, 6 Vì c n m t hoán v v a đ l n h n hi n t i nên ta ch n x[2] = 4 Còn các giá tr (x[3], x[4], x[5], x[6]) s l y trong t p {2, 6, 5, 1} C ng vì tính v a

đ l n nên ta s tìm bi u di n nh nh t c a 4 s này gán cho x[3], x[4], x[5], x[6] t c là 〈1, 2,

5, 6〉 V y hoán v m i s là 〈3, 4, 1, 2, 5, 6〉

Trang 23

Ta có nh n xét gì qua ví d này: o n cu i c a hoán v hi n t i đ c x p gi m d n, s x[5] =

4 là s nh nh t trong đo n cu i gi m d n tho mãn đi u ki n l n h n x[2] = 2 N u đ i ch x[5] cho x[2] thì ta s đ c x[2] = 4 và đo n cu i v n đ c s p x p gi m d n Khi đó mu n

bi u di n nh nh t cho các giá tr trong đo n cu i thì ta ch c n đ o ng c đo n cu i

Trong tr ng h p hoán v hi n t i là 〈2, 1, 3, 4〉 thì hoán v k ti p s là 〈2, 1, 4, 3〉 Ta c ng

có th coi hoán v 〈2, 1, 3, 4〉 có đo n cu i gi m d n, đo n cu i này ch g m 1 ph n t (4)

V y k thu t sinh hoán v k ti p t hoán v hi n t i có th xây d ng nh sau:

Xác đ nh đo n cu i gi m d n dài nh t, tìm ch s i c a ph n t x[i] đ ng li n tr c đo n cu i

đó i u này đ ng ngh a v i vi c tìm t v trí sát cu i dãy lên đ u, g p ch s i đ u tiên th a mãn x[i] < x[i+1]

N u tìm th y ch s i nh trên

Trong đo n cu i gi m d n, tìm ph n t x[k] nh nh t tho mãn đi u ki n x[k] > x[i] Do

đo n cu i gi m d n, đi u này th c hi n b ng cách tìm t cu i dãy lên đ u g p ch s k

đ u tiên tho mãn x[k] > x[i] (có th dùng tìm ki m nh phân)

o giá tr x[k] và x[i]

L t ng c th t đo n cu i gi m d n (t x[i+1] đ n x[k]) tr thành t ng d n

N u không tìm th y t c là toàn dãy đã s p gi m d n, đây là c u hình cu i cùng

Input: file v n b n PERMUTE.INP ch a s nguyên d ng n ≤ 12

Output: file v n b n PERMUTE.OUT các hoán v c a dãy (1, 2, …, n)

Trang 24

Assign(f, OutputFile); Rewrite(f);

while x[k] < x[i] do Dec(k); {Lùi d n k đ tìm g p x[k] đ u tiên l n h n x[i]}

Swap(x[k], x[i]); { i ch x[k] và x[i]}

a := i + 1; b := n; {L t ng c đo n cu i gi m d n, a: đ u đo n, b: cu i đo n}

while a < b do

begin

Swap(x[a], x[b]); { o giá tr x[a] và x[b]}

Inc(a); {Ti n a và lùi b, ti p t c cho t i khi a, b ch m nhau}

Các ch ng trình trên x lý không t t trong tr ng h p t m th ng, đó là tr ng h p n = 0

đ i v i ch ng trình li t kê dãy nh phân c ng nh trong ch ng trình li t kê hoán v , tr ng

h p k = 0 đ i v i ch ng trình li t kê t h p, hãy kh c ph c đi u đó

t ng ng v i m t ph n t đ c ch n trong t p Ví d v i t p {1, 2, 3, 4} thì dãy nh phân

1010 s t ng ng v i t p con {1, 3} Hãy l p ch ng trình in ra t t c các t p con c a {1,

2, …, n} theo hai ph ng pháp

Bài 6

Nh p vào danh sách tên n ng i, in ra t t c các cách x p n ng i đó vào m t bàn

Trang 25

Bài 7

Nh p vào danh sách n b n nam và n b n n , in ra t t c các cách x p 2n ng i đó vào m t bàn tròn, m i b n nam ti p đ n m t b n n

Bài 8

Ng i ta có th dùng ph ng pháp sinh đ li t kê các ch nh h p không l p ch p k Tuy nhiên

có m t cách khác là li t kê t t c các t p con k ph n t c a t p h p, sau đó in ra đ k! hoán v

c a nó Hãy vi t ch ng trình li t kê các ch nh h p không l p ch p k c a {1, 2, …, n} theo c hai cách

nh c đi m và ít tính ph d ng trong nh ng thu t toán duy t h n ch H n th n a, không

ph i c u hình ban đ u lúc nào c ng d tìm đ c, không ph i k thu t sinh c u hình k ti p cho m i bài toán đ u đ n gi n nh trên (Sinh các ch nh h p không l p ch p k theo th t t

đi n ch ng h n) Ta sang m t chuyên m c sau nói đ n m t ph ng pháp li t kê có tính ph

d ng cao h n, đ gi i các bài toán li t kê ph c t p h n đó là: Thu t toán quay lui (Back tracking)

Trang 26

§3 THU T TOÁN QUAY LUI

Thu t toán quay lui dùng đ gi i bài toán li t kê các c u hình M i c u hình đ c xây d ng

n) Xét t t c các giá tr x[n] có th nh n, th cho x[n] nh n l n l t các giá tr đó, thông báo

c u hình tìm đ c 〈x[1], x[2], …, x[n]〉

Trên ph ng di n quy n p, có th nói r ng thu t toán quay lui li t kê các c u hình n ph n t

d ng x[1 n] b ng cách th cho x[1] nh n l n l t các giá tr có th V i m i giá tr th gán cho x[1] bài toán tr thành li t kê ti p c u hình n - 1 ph n t x[2 n]

Mô hình c a thu t toán quay lui có th mô t nh sau:

{Th t c này th cho x[i] nh n l n l t các giá tr mà nó có th nh n}

procedure Try(i: Integer);

〈Ghi nh n vi c cho x[i] nh n giá tr V (n u c n)〉;

Try(i + 1); {G i đ quy đ ch n ti p x[i+1]}

〈N u c n, b ghi nh n vi c th x[i] := V đ th giá tr khác〉;

end;

end;

end;

Thu t toán quay lui s b t đ u b ng l i g i Try(1)

3.1 LI T KÊ CÁC DÃY NH PHÂN DÀI N

Input/Output v i khuôn d ng nh trong P_1_02_1.PAS

Bi u di n dãy nh phân đ dài N d i d ng x[1 n] Ta s li t kê các dãy này b ng cách th dùng các giá tr {0, 1} gán cho x[i] V i m i giá tr th gán cho x[i] l i th các giá tr có th gán cho x[i+1].Ch ng trình li t kê b ng thu t toán quay lui có th vi t:

P_1_03_1.PAS * Thu t toán quay lui li t kê các dãy nh phân đ dài n program BinaryStrings;

const

InputFile = 'BSTR.INP';

OutputFile = 'BSTR.OUT';

Trang 27

Input/Output có khuôn d ng nh trong P_1_02_2.PAS

li t kê các t p con k ph n t c a t p S = {1, 2, …, n} ta có th đ a v li t kê các c u hình x[1 n], đây các x[i] ∈ S và x[1] < x[2] < … < x[k] Ta có nh n xét:

Trang 28

P_1_03_2.PAS * Thu t toán quay lui li t kê các t p con k ph n t program Combination;

Trang 29

N u đ ý ch ng trình trên và ch ng trình li t kê dãy nh phân đ dài n, ta th y v c b n chúng ch khác nhau th t c Try(i) - ch n th các giá tr cho xi, ch ng trình li t kê dãy

nh phân ta th ch n các giá tr 0 ho c 1 còn ch ng trình li t kê các t p con k ph n t ta

th ch n x[i] là m t trong các giá tr nguyên t x[i-1] + 1 đ n n - k + i Qua đó ta có th th y tính ph d ng c a thu t toán quay lui: mô hình cài đ t có th thích h p cho nhi u bài toán, khác v i ph ng pháp sinh tu n t , v i m i bài toán l i ph i có m t thu t toán sinh k ti p riêng làm cho vi c cài đ t m i bài m t khác, bên c nh đó, không ph i thu t toán sinh k ti p nào c ng d cài đ t

3.3 LI T KÊ CÁC CH NH H P KHÔNG L P CH P K

li t kê các ch nh h p không l p ch p k c a t p S = {1, 2, …, n} ta có th đ a v li t kê các

c u hình x[1 k] đây các x[i] ∈ S và khác nhau đôi m t

Nh v y th t c Try(i) - xét t t c các kh n ng ch n x[i] - s th h t các giá tr t 1 đ n n, mà các giá tr này ch a b các ph n t đ ng tr c ch n Mu n xem các giá tr nào ch a đ c

ch n ta s d ng k thu t dùng m ng đánh d u:

Kh i t o m t m ng c[1 n] mang ki u logic boolean đây c[i] cho bi t giá tr i có còn t

do hay đã b ch n r i Ban đ u kh i t o t t c các ph n t m ng c là TRUE có ngh a là các

ph n t t 1 đ n n đ u t do

T i b c ch n các giá tr có th c a x[i] ta ch xét nh ng giá tr j có c[j] = TRUE có ngh a

là ch ch n nh ng giá tr t do

Tr c khi g i đ quy tìm x[i+1]: ta đ t giá tr j v a gán cho x[i] là đã b ch n có ngh a là

đ t c[j] := FALSE đ các th t c Try(i + 1), Try(i + 2)… g i sau này không ch n ph i giá

tr j đó n a

Sau khi g i đ quy tìm x[i+1]: có ngh a là s p t i ta s th gán m t giá tr khác cho x[i]

thì ta s đ t giá tr j v a th đó thành t do (c[j] := TRUE), b i khi xi đã nh n m t giá tr

khác r i thì các ph n t đ ng sau: x[i+1], x[i+2] … hoàn toàn có th nh n l i giá tr j đó

i u này hoàn toàn h p lý trong phép xây d ng ch nh h p không l p: x[1] có n cách ch n, x[2] có n - 1 cách ch n, …L u ý r ng khi th t c Try(i) có i = k thì ta không c n ph i đánh

d u gì c vì ti p theo ch có in k t qu ch không c n ph i ch n thêm ph n t nào n a

Input: file v n b n ARRANGE.INP ch a hai s nguyên d ng n, k (1 ≤ k ≤ n ≤ 20) cách nhau ít nh t m t d u cách

Output: file v n b n ARRANGE.OUT ghi các ch nh h p không l p ch p k c a t p {1, 2, …,

Trang 30

P_1_03_3.PAS * Thu t toán quay lui li t kê các ch nh h p không l p ch p k program Arrangement;

Try(i + 1); {Th t c này ch xét nh ng giá tr còn t do gán cho x[i+1]}

c[j] := True; {B đánh d u: j l i là t do, b i s p t i s th m t cách ch n khác c a x[i]}

Assign(f, OutputFile); Rewrite(f);

FillChar(c, SizeOf(c), True); {T t c các s đ u ch a b ch n}

Try(1); {Th các cách ch n giá tr c a x[1]}

Close(f);

end

Nh n xét: khi k = n thì đây là ch ng trình li t kê hoán v

3.4 BÀI TOÁN PHÂN TÍCH S

3.4.1 Bài toán

Cho m t s nguyên d ng n ≤ 30, hãy tìm t t c các cách phân tích s n thành t ng c a các s nguyên d ng, các cách phân tích là hoán v c a nhau ch tính là 1 cách

3.4.2 Cách làm:

Ta s l u nghi m trong m ng x, ngoài ra có m t m ng t M ng t xây d ng nh sau: t[i] s là

t ng các ph n t trong m ng x t x[1] đ n x[i]: t[i] := x[1] + x[2] + … + x[i]

Trang 31

Khi li t kê các dãy x có t ng các ph n t đúng b ng n, đ tránh s trùng l p ta đ a thêm ràng

bu c x[i-1] ≤ x[i]

Vì s ph n t th c s c a m ng x là không c đ nh nên th t c PrintResult dùng đ in ra 1 cách phân tích ph i có thêm tham s cho bi t s in ra bao nhiêu ph n t

Th t c đ quy Try(i) s th các giá tr có th nh n c a x[i] (x[i] ≥ x[i - 1])

Khi nào thì in k t qu và khi nào thì g i đ quy tìm ti p ?

L u ý r ng t[i - 1] là t ng c a t t c các ph n t t x[1] đ n x[i-1] do đó

Khi t[i] = n t c là (x[i] = n - t[i - 1]) thì in k t qu

Khi tìm ti p, x[i+1] s ph i l n h n ho c b ng x[i] M t khác t[i+1] là t ng c a các s t x[1] t i x[i+1] không đ c v t quá n V y ta có t[i+1] ≤ n ⇔ t[i-1] + x[i] + x[i+1] ≤ n ⇔ x[i] + x[i+1] ≤ n - t[i-1] t c là x[i] ≤ (n - t[i-1])/2 Ví d đ n gi n khi n = 10 thì ch n x[1] =

6, 7, 8, 9 là vi c làm vô ngh a vì nh v y c ng không ra nghi m mà c ng không ch n ti p x[2] đ c n a

M t cách d hi u: ta g i đ quy tìm ti p khi giá tr x[i] đ c ch n còn cho phép ch n thêm

m t ph n t khác l n h n ho c b ng nó mà không làm t ng v t quá n Còn ta in k t qu

ch khi x[i] mang giá tr đúng b ng s thi u h t c a t ng i-1 ph n t đ u so v i n

V y th t c Try(i) th các giá tr cho x[i] có th vi t nh sau: (đ t ng quát cho i = 1, ta đ t x[0] = 1 và t[0] = 0)

Xét các giá tr c a x[i] t x[i - 1] đ n (n - t[i-1]) div 2, c p nh t t[i] := t[i - 1] + x[i] và g i

đ quy tìm ti p

Cu i cùng xét giá tr x[i] = n - t[i-1] và in k t qu t x[1] đ n x[i]

Input: file v n b n ANALYSE.INP ch a s nguyên d ng n ≤ 30

Output: file v n b n ANALYSE.OUT ghi các cách phân tích s n

Trang 32

Xét bàn c t ng quát kích th c nxn M t quân h u trên bàn c có th n đ c các quân khác

n m t i các ô cùng hàng, cùng c t ho c cùng đ ng chéo Hãy tìm các x p n quân h u trên bàn c sao cho không quân nào n quân nào

Ví d m t cách x p v i n = 8:

Trang 33

Hình 2: X p 8 quân h u trên bàn c 8x8

3.5.2 Phân tích

Rõ ràng n quân h u s đ c đ t m i con m t hàng vì h u n đ c ngang, ta g i quân h u s

đ t hàng 1 là quân h u 1, quân h u hàng 2 là quân h u 2… quân h u hàng n là quân h u

n V y m t nghi m c a bài toán s đ c bi t khi ta tìm ra đ c v trí c t c a nh ng quân

h u

N u ta đ nh h ng ông (Ph i), Tây (Trái), Nam (D i), B c (Trên) thì ta nh n th y r ng:

M t đ ng chéo theo h ng ông B c - Tây Nam ( B-TN) b t k s đi qua m t s ô, các

ô đó có tính ch t: Hàng + C t = C (Const) V i m i đ ng chéo B-TN ta có 1 h ng s C

và v i m t h ng s C: 2 ≤ C ≤ 2n xác đ nh duy nh t 1 đ ng chéo B-TN vì v y ta có th đánh ch s cho các đ ng chéo B- TN t 2 đ n 2n

M t đ ng chéo theo h ng ông Nam - Tây B c ( N-TB) b t k s đi qua m t s ô, các

4

5 6 7 8

Trang 34

Ban đ u c 3 m ng đánh d u đ u mang giá tr TRUE (Các c t và đ ng chéo đ u t do)

Thu t toán quay lui:

Xét t t c các c t, th đ t quân h u 1 vào m t c t, v i m i cách đ t nh v y, xét t t c các cách đ t quân h u 2 không b quân h u 1 n, l i th 1 cách đ t và xét ti p các cách đ t quân h u 3…M i cách đ t đ c đ n quân h u n cho ta 1 nghi m

Khi ch n v trí c t j cho quân h u th i, thì ta ph i ch n ô(i, j) không b các quân h u đ t

tr c đó n, t c là ph i ch n c t j còn t do, đ ng chéo B-TN (i+j) còn t do, đ ng chéo N-TB(i-j) còn t do i u này có th ki m tra (a[j] = b[i+j] = c[i-j] = TRUE)

Khi th đ t đ c quân h u th i vào c t j, n u đó là quân h u cu i cùng (i = n) thì ta có

m t nghi m N u không:

Tr c khi g i đ quy tìm cách đ t quân h u th i + 1, ta đánh d u c t và 2 đ ng chéo

b quân h u v a đ t kh ng ch (a[j] = b[i+j] = c[i-j] := FALSE) đ các l n g i đ quy

ti p sau ch n cách đ t các quân h u k ti p s không ch n vào nh ng ô n m trên c t j

Hãy xem l i trong các ch ng trình li t kê ch nh h p không l p và hoán v v k thu t đánh

d u đây ch khác v i li t kê hoán v là: li t kê hoán v ch c n m t m ng đánh d u xem giá

tr có t do không, còn bài toán x p h u thì c n ph i đánh d u c 3 thành ph n: C t, đ ng chéo B-TN, đ ng chéo N- TB Tr ng h p đ n gi n h n: Yêu c u li t kê các cách đ t n quân xe lên bàn c nxn sao cho không quân nào n quân nào chính là bài toán li t kê hoán v

Input: file v n b n QUEENS.INP ch a s nguyên d ng n ≤ 12

Output: file v n b n QUEENS.OUT, m i dòng ghi m t cách đ t n quân h u

Trang 35

QUEENS.INP

5

QUEENS.OUT (1, 1); (2, 3); (3, 5); (4, 2); (5, 4);

b: array[2 2 * max] of Boolean;

c: array[1 - max max - 1] of Boolean;

FillChar(a, SizeOf(a), True); {M i c t đ u t do}

FillChar(b, SizeOf(b), True); {M i đ ng chéo ông B c - Tây Nam đ u t do}

FillChar(c, SizeOf(c), True); {M i đ ng chéo ông Nam - Tây B c đ u t do}

Trang 36

Tên g i thu t toán quay lui, đ ng trên ph ng di n cài đ t có th nên g i là k thu t vét c n

b ng quay lui thì chính xác h n, tuy nhiên đ ng trên ph ng di n bài toán, n u nh ta coi công vi c gi i bài toán b ng cách xét t t c các kh n ng c ng là 1 cách gi i thì tên g i Thu t toán quay lui c ng không có gì trái logic Xét ho t đ ng c a ch ng trình trên cây tìm ki m quay lui ta th y t i b c th ch n x[i] nó s g i đ quy đ tìm ti p x[i+1] có ngh a là quá trình

s duy t ti n sâu xu ng phía d i đ n t n nút lá, sau khi đã duy t h t các nhánh, ti n trình lùi

l i th áp đ t m t giá tr khác cho x[i], đó chính là ngu n g c c a tên g i "thu t toán quay lui"

Trang 37

Bài 9

Mã đi tu n: Cho bàn c t ng quát kích th c nxn và m t quân Mã, hãy ch ra m t hành trình

c a quân Mã xu t phát t ô đang đ ng đi qua t t c các ô còn l i c a bàn c , m i ô đúng 1 l n Bài 10

Chuy n t t c các bài t p trong bài tr c đang vi t b ng sinh tu n t sang quay lui

Bài 11

Xét s đ giao thông g m n nút giao thông đánh s t 1 t i n và m đo n đ ng n i chúng,

m i đo n đ ng n i 2 nút giao thông Hãy nh p d li u v m ng l i giao thông đó, nh p s

hi u hai nút giao thông s và d Hãy in ra t t c các cách đi t s t i d mà m i cách đi không

đ c qua nút giao thông nào quá m t l n

Trang 38

§4 K THU T NHÁNH C N

4.1 BÀI TOÁN T I U

M t trong nh ng bài toán đ t ra trong th c t là vi c tìm ra m t nghi m tho mãn m t s đi u

ki n nào đó, và nghi m đó là t t nh t theo m t ch tiêu c th , nghiên c u l i gi i các l p bài

toán t i u thu c v l nh v c quy ho ch toán h c Tuy nhiên c ng c n ph i nói r ng trong nhi u tr ng h p chúng ta ch a th xây d ng m t thu t toán nào th c s h u hi u đ gi i bài

toán, mà cho t i nay vi c tìm nghi m c a chúng v n ph i d a trên mô hình li t kê toàn b các

c u hình có th và đánh giá, tìm ra c u hình t t nh t Vi c li t kê c u hình có th cài đ t b ng các ph ng pháp li t kê: Sinh tu n t và tìm ki m quay lui D i đây ta s tìm hi u ph ng pháp li t kê b ng thu t toán quay lui đ tìm nghi m c a bài toán t i u

4.2 S BÙNG N T H P

Mô hình thu t toán quay lui là tìm ki m trên 1 cây phân c p N u gi thi t r ng ng v i m i nút t ng ng v i m t giá tr đ c ch n cho x[i] s ng v i ch 2 nút t ng ng v i 2 giá tr

mà x[i+1] có th nh n thì cây n c p s có t i 2n nút lá, con s này l n h n r t nhi u l n so v i

d li u đ u vào n Chính vì v y mà n u nh ta có thao tác th a trong vi c ch n x[i] thì s ph i

tr giá r t l n v chi phí th c thi thu t toán b i quá trình tìm ki m lòng vòng vô ngh a trong các b c ch n k ti p x[i+1], x[i+2], … Khi đó, m t v n đ đ t ra là trong quá trình li t kê l i

gi i ta c n t n d ng nh ng thông tin đã tìm đ c đ lo i b s m nh ng ph ng án ch c ch n không ph i t i u K thu t đó g i là k thu t đánh giá nhánh c n trong ti n trình quay lui

{Th t c này th ch n cho x[i] t t c các giá tr nó có th nh n}

procedure Try(i: Integer);

begin

for 〈M i giá tr V có th gán cho x[i]〉 do

begin

〈Th cho x[i] := V〉;

if 〈Vi c th trên v n còn hi v ng tìm ra c u hình t t h n BESTCONFIG〉 then

if 〈x[i] là ph n t cu i cùng trong c u hình〉 then

〈C p nh t BESTCONFIG〉

else

begin

〈Ghi nh n vi c th x[i] = V n u c n〉;

Try(i + 1); {G i đ quy, ch n ti p x[i+1]}

〈B ghi nh n vi c th cho x[i] = V (n u c n)〉;

end;

end;

end;

Trang 39

K thu t nhánh c n thêm vào cho thu t toán quay lui kh n ng đánh giá theo t ng b c, n u

t i b c th i, giá tr th gán cho x[i] không có hi v ng tìm th y c u hình t t h n c u hình BESTCONFIG thì th giá tr khác ngay mà không c n ph i g i đ quy tìm ti p hay ghi nh n

k t qu làm gì Nghi m c a bài toán s đ c làm t t d n, b i khi tìm ra m t c u hình m i (t t

h n BESTCONFIG - t t nhiên), ta không in k t qu ngay mà s c p nh t BESTCONFIG b ng

c u hình m i v a tìm đ c

4.4 BÀI TOÁN NG I DU L CH

4.4.1 Bài toán

Cho n thành ph đánh s t 1 đ n n và m tuy n đ ng giao thông hai chi u gi a chúng, m ng

l i giao thông này đ c cho b i b ng C c p nxn, đây C[i, j] = C[j, i] = Chi phí đi đo n

đ ng tr c ti p t thành ph i đ n thành ph j Gi thi t r ng C[i, i] = 0 v i ∀i, C[i, j] = +∞

n u không có đ ng tr c ti p t thành ph i đ n thành ph j

M t ng i du l ch xu t phát t thành ph 1, mu n đi th m t t c các thành ph còn l i m i thành ph đúng 1 l n và cu i cùng quay l i thành ph 1 Hãy ch ra cho ng i đó hành trình

v i chi phí ít nh t Bài toán đó g i là bài toán ng i du l ch hay bài toán hành trình c a m t

th ng gia (Traveling Salesman)

4.4.2 Cách gi i

Hành trình c n tìm có d ng x[1 n + 1] trong đó x[1] = x[n + 1] = 1 đây gi a x[i] và x[i+1]: hai thành ph liên ti p trong hành trình ph i có đ ng đi tr c ti p (C[i, j] ≠ +∞) và ngo i tr thành ph 1, không thành ph nào đ c l p l i hai l n Có ngh a là dãy x[1 n] l p thành 1 hoán v c a (1, 2, …, n)

Duy t quay lui: x[2] có th ch n m t trong các thành ph mà x[1] có đ ng đi t i (tr c ti p),

Sau th t c tìm ki m quay lui mà chi phí c a BestConfig v n b ng +∞ thì có ngh a là nó không tìm th y m t hành trình nào tho mãn đi u ki n đ bài đ c p nh t BestConfig, bài toán

Trang 40

không có l i gi i, còn n u chi phí c a BestConfig < +∞ thì in ra c u hình BestConfig - đó là hành trình ít t n kém nh t tìm đ c

Input: file v n b n TOURISM.INP

Dòng 1: Ch a s thành ph n (1 ≤ n ≤ 20) và s tuy n đ ng m trong m ng l i giao thông

m dòng ti p theo, m i dòng ghi s hi u hai thành ph có đ ng đi tr c ti p và chi phí đi trên quãng đ ng đó (chi phí này là s nguyên d ng ≤ 100)

Output: file v n b n TOURISM.OUT, ghi hành trình tìm đ c

3 4

1 2 1 3

P_1_04_1.PAS * K thu t nhánh c n dùng cho bài toán ng i du l ch program TravellingSalesman;

C: array[1 max, 1 max] of Integer; {Ma tr n chi phí}

X, BestWay: array[1 max + 1] of Integer; {X đ th các kh n ng, BestWay đ ghi nh n nghi m}

T: array[1 max + 1] of Integer; {T[i] đ l u chi phí đi t X[1] đ n X[i]}

Free: array[1 max] of Boolean; {Free đ đánh d u, Free[i]= True n u ch a đi qua tp i}

Ngày đăng: 26/08/2013, 12:37

HÌNH ẢNH LIÊN QUAN

Hình 3:  ng chéo  B-TN mang ch  s  10 và đ ng chéo  N-TB mang ch  s  0 - Cấu trúc Dữ liệu và giải thuật
Hình 3 ng chéo B-TN mang ch s 10 và đ ng chéo N-TB mang ch s 0 (Trang 33)
Hình 5 là bi u di n  đ  th  c a ký pháp Θ l n, Ο l n và Ω l n. D  th y r ng T(n) = Θ(g(n)) - Cấu trúc Dữ liệu và giải thuật
Hình 5 là bi u di n đ th c a ký pháp Θ l n, Ο l n và Ω l n. D th y r ng T(n) = Θ(g(n)) (Trang 55)
Hình 19: Các d ng cây nh  phân suy bi n - Cấu trúc Dữ liệu và giải thuật
Hình 19 Các d ng cây nh phân suy bi n (Trang 86)
Hình 20: Cây nh  phân hoàn ch nh và cây nh  phân  đ y  đ - Cấu trúc Dữ liệu và giải thuật
Hình 20 Cây nh phân hoàn ch nh và cây nh phân đ y đ (Trang 86)
Hình 23: C u trúc nút c a cây nh  phân - Cấu trúc Dữ liệu và giải thuật
Hình 23 C u trúc nút c a cây nh phân (Trang 88)
Hình 25:  ánh s  các nút c a cây 3_phân  đ  bi u di n b ng m ng - Cấu trúc Dữ liệu và giải thuật
Hình 25 ánh s các nút c a cây 3_phân đ bi u di n b ng m ng (Trang 90)
Hình 26: Bi u di n cây t ng quát b ng m ng - Cấu trúc Dữ liệu và giải thuật
Hình 26 Bi u di n cây t ng quát b ng m ng (Trang 91)
Hình 76: Hai cây g c r 1  và r 2  và cây m i khi h p nh t chúng - Cấu trúc Dữ liệu và giải thuật
Hình 76 Hai cây g c r 1 và r 2 và cây m i khi h p nh t chúng (Trang 263)
Hình 78: M ng G và m ng th ng d   G f   t ng  ng (ký hi u f[u,v]:c[u,v] ch  lu ng f[u, v] và kh   n ng  thông qua c[u, v] trên cung (u, v)) - Cấu trúc Dữ liệu và giải thuật
Hình 78 M ng G và m ng th ng d G f t ng ng (ký hi u f[u,v]:c[u,v] ch lu ng f[u, v] và kh n ng thông qua c[u, v] trên cung (u, v)) (Trang 275)
Hình 79: M ng th ng d  và đ ng t ng lu ng - Cấu trúc Dữ liệu và giải thuật
Hình 79 M ng th ng d và đ ng t ng lu ng (Trang 276)
Hình 80: Lu ng trên m ng G tr c và sau khi t ng - Cấu trúc Dữ liệu và giải thuật
Hình 80 Lu ng trên m ng G tr c và sau khi t ng (Trang 276)
Hình 88: Thu t toán Hungari - Cấu trúc Dữ liệu và giải thuật
Hình 88 Thu t toán Hungari (Trang 306)
Hình 89: Cây pha &#34;m c&#34; l n h n sau m i l n xoay tr ng s  c nh và tìm đ ng - Cấu trúc Dữ liệu và giải thuật
Hình 89 Cây pha &#34;m c&#34; l n h n sau m i l n xoay tr ng s c nh và tìm đ ng (Trang 313)
Hình 91: Phép ch p Blossom - Cấu trúc Dữ liệu và giải thuật
Hình 91 Phép ch p Blossom (Trang 320)
Hình 92: N  Blossom đ  dò đ ng xuyên qua Blossom - Cấu trúc Dữ liệu và giải thuật
Hình 92 N Blossom đ dò đ ng xuyên qua Blossom (Trang 320)

TỪ KHÓA LIÊN QUAN

w