1. Trang chủ
  2. » Công Nghệ Thông Tin

Giải thuật và lập trình

332 756 5
Tài liệu được quét OCR, nội dung có thể không chính xác
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 đề Giải thuật và lập trình
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
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

Giải thuật và lập trình

Trang 1

Bài giảng chuyên dé

Đạ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

LY 1 Oo

MUC LUC

PHAN 1 BAT TOAN LIET KE - <5 < S2 SE 9EeEs se xe: 1

§1 NHAC LẠI MỘT SÓ KIÊN THỨC ĐẠI SÓ TỎ HỢP .5 <5 5< < «se ssesezses 2

1.1 CHỈNH HỢP LẶP - - SE 1 1EE11151E1111111111111 111111 1111101211111 111111 H1 HH nhe 2 1.2 CHỈNH HỢP KHÔNG LẶP - 5c 1E xEE5E1211112111121111 1111111111111 ro 2 1.3 HOÁN VỊ c c x11 11 12111 1 2 1E 1n tr tt tt tt tro 2 1.4 TỔ HỢP - cS E111 2111 2111121111111 111111 1E11E 1E n 1n HH tt tro 3

§2 PHƯƠNG PHÁP SINH (GENERRA TIO) .o- << << << SE xe cseeseeesee 4 2.1 SINH CAC DAY NHI PHAN ĐỘ DÀI[N 5-5 s1 12111121211 21211 21211 1E EErrrrye 5 2.2 LIET KE CAC TAP CON K PHAN TU ooeeeccecccccccscsscsesscsesecsesecsesecssecsesecsesecsesecsesevsusevsesevsesecsesevivsesinsessesees 6 2.3 LIET KE CAC HOAN VI oiececceccccccsscsesscsesscsesecsesecssecssecsesecsesecsusecsusarsesecsesessesevsusavsusevsesevsnsevsnsevinsevinsevsneess 8

§3 THUẬT TOÁN QUAY LLLU l_ 2- 5° << 5£ SE E9 SE 5 9924 253 se se re 12

3.1 LIET KE CAC DAY NHI PHAN ĐỘ DÀI[N - - 5S 21 1E 121211211121 1121 11 E.EEEErrrrrree 12 3.2 LIỆT KÊ CÁC TAP CON K PHAN TỦỬ - c5 1 ESE12E1712111121112111 211121111 E.1E.EEEErrrexe 13 3.3 LIỆT KẼ CÁC CHỈNH HỢP KHÔNG LẶP CHẬP K - 1S 1 11E5512115151115115111511511111111E1 11t 15 3.4 BAL TOAN PHAN TICH SO oo.ceececccccccscsccscsscsesscsvsecsesecsesecsesecsusecssecsesecsesectesessesessesecsesevsvsevsnsevsnsevinsevsesees 16 3.5 BÀI TOÁN XÉP HẬU 5-5 1 1EE12E5E121112111121111 1111111111111 rrrrrxe 18

§4 KỸ THUẬT NHÁNH (CẬTN .2 << % SG SE E2 E9 9g 9 xe cueeersre 24

4.1 BÀI TOÁN TÓI ƯU 52t E1 1EE121511211112111111111T111 111111111 EE11EE11EE1EEE1EE1 E1 EH nh gr ng 24 4.2 SỰ BÙNG NỎ TỔ HỢP SG ST 1 E111111211111T1110T1110111 11111 E1 1111111 En1 Tnhh ru 24 4.3 MÔ HÌNH KỸ THUẬT NHÁNH CẬN - 2c s21 1EE121E2111E711171111111TE11 111111 E111EE1EEEEEn reo 24 4.4 BÀI TOÁN NGƯỜI DU LỊCH G5 1 ESEE2EEE12EEE521E2121E11117111 711111111111 TE11ET11ET11EE11EEEEnErro 25 4.5 DẦY ABC C111 111 1 121111111110 1111111111111 1111111111111 n1 111111111 g 27

PHAN 2 CẤU TRÚC DỮ LIEU VÀ GIẢI THUẬTT s- 33

§1 CÁC BƯỚC CƠ BẢN KHI TIEN HÀNH GIẢI CÁC BÀI TOÁN TIN HỌC 34

1.1 XÁC ĐỊNH BÀI TOÁN - c t T21EE12121121211212111 1212111 E111 n1 n1 n1 H1 r1 ngu 34 1.2 TÌM CÂU TRÚC DỮ LIỆU BIÊU DIỄN BÀI TOÁN -.- 5 1 1 31E121211511121151111115111111E 1E tre 34 1.3 TÌM THUẬT TOÁN 5c c T21 E12111121211212112121111 121221111111 E111 E111 EE1 E1 n1 ng ru 35 1.4 LẬP TRÌNH 5 S1 1E 1EE121E712111511111T111 T1 EE11E111 E111 11EE 1E En 1H11 n1 HH ng 37 1.5 KIỂM THỦỬ - SE ESE1215712117121115111211111T111.TE11TT1ET11 E1 11E11 E111 E111 EE1 E1 HH nh ru 37 1.6 TÔI ƯU CHƯƠNG TRÌNH 5-1 1 1E 1EE12117121171211111 T111 1111111111111 E1 EEEnEn reo 38

§2 PHÂN TÍCH THỜI GIAN THỰC HIỆN GIẢI THUẬ TT . 5- << s2 se se =ses5s 40

2.1 GIG] THIEU o.ceccccccccccccccsecscsscscsscsesecsvsecsvsucsvsucsvsecsvsucevsusevsussvsisevsusevsusevsesevsusevsusevsusevssevssevsesevsisevsesevsetes 40 2.2 CAC KY PHAP DE DANH GIA DO PHUC TAP TINH TOAN .cccccccsscsseescsrsesecsesesscsveneesevensetevsneneees 40 2.3 XÁC ĐỊNH ĐỘ PHỨC TẠP TÍNH TOÁN CỦA GIẢI THUẬTT - +52 E2E£E2E£EE2EEEEEEEEEkerrree 42 2.4 ĐỘ PHỨC TẠP TÍNH TOÁN VOI TINH TRẠNG DỮ LIỆU VÀO -:Ss s21 2121111115115111 5x12 sxe 45

2.5 CHI PHÍ THỰC HIỆN THUẬT TOÁN - ST 211115 15111515115 11111115115 111111151 111 E5 Hee 46

Trang 4

LY 11

§3 ĐỆ QUY VÀ GIẢI THUẬT ĐỆ QU Y .- 2 5£ ° << SE e9 2e sex essseeseze 50

3.1 KHAI NIEM VE DE QUY occcccccccscccsscsscscscsvssescsvsucecevsucacsvsnsussvsveasavavsusavsvsnsassvssasaestsusevevssavevsneasevsneneeeeee 50

3.3 VÍ DỤ VỀ GIẢI THUẬT ĐỆ QUY 5 c1 E1 1211512111151111115111151111111E1E1E111111112E1EEE.EEE.rree 51 3.4 HIỆU LỰC CUA DE QUY ooocececccccccscsscsssvsnsssecscscsvsvsvsusucececevevsvsvsususacevecevevsvsususacavevevevevsususasavevavevevsvenseeeees 55

§4 CAU TRUC DU LIEU BIEU DIỄN DANH SÁCH .2- << 5° s52 << sess s52 58

4.1 KHAI NIEM DANH SACH .ccceccccssscsssscssesvsscevsucsvsucsvsucevsucevsusevsusevsucevsusevsessvsusevsasevsavevsesevsesevsesevseceees 58 4.2 BIEU DIEN DANH SACH TRONG MAY TINH 00 ceccccccsccscsscssescssssesecsvsecsvsecevsussvsecsesevevsesevsesevsecevsesevees 58

§7 KÝ PHÁP TIÊN TÓ, TRUNG TÓ VÀ HẬU TỒ 2.5° <5 2 se S92 EsseEsesssesese 79

7.1 BIEU THUC DƯỚI DẠNG CÂY NHỊ PHẦN - 5 1 SE EEE121171211112111211121111111.11EtEEttrrrd 79 7.2 CÁC KÝ PHÁP CHO CÙNG MỘT BIẾU THỨC 2 S1 ESEE2EEE12EEE1215712171211121111111EE1EtErr 79 7.3 CÁCH TÍNH GIÁ TRỊ BIÊU THỨC 2 + s2S‡EE2E9EE2EEEE2EEEEEEEEEEEEEE211121112111111111111Et1EE tr 79 7.4 CHUYÊN TỪ DẠNG TRUNG TÓ SANG DẠNG HẬU TỔ - 22t 2 EEE1215112127121171211151ExeEctx 83 7.5 XÂY DỰNG CÂY NHỊ PHẦN BIÊU DIỄN BIẾU THỨC 2- SE E2 EEE2EEEE2EEEE2EEEE2EEEEEEEErkered 86

8.7 0.90 (1907:4001 Ô 87

8.1 BÀI TOÁN SẮP XÉP St 211211121111 1110111111111 1n H1 n1 n1 nh re 87 8.2 THUAT TOAN SAP XÉP KIỂU CHỌN (SELECTIONSORITT) 2s 22x E2E1211171E2111E2111EEEEtree 89 8.3 THUAT TOÁN SẮP XEP NOI BOT (BUBBLESORT) ccccccscssessesessesessessevssevssevsesevsesevstsevstsevseeees 90 8.4 THUAT TOAN SAP XEP KIEU CHEN 0 cceccccscccssssscsesscsesevsesecssevsecevsusevssevssevsusevsisevssevsusevstsevsnsevseeees 90 8.5 SHELLSORIT -. St E12E12117122121111 1121111111211 T111 T111 r1 tr re 92 8.6 THUẬT TOÁN SẮP XÉP KIỂU PHẦN ĐOẠN (QUICKSORTT) 2c St 1E 2E 2221211 E11 crtre 93 8.7 THUAT TOAN SAP XÉP KIỂU VUN ĐÓNG (HEAPSORTT) c5: t2 1211122112111 Etree 99 8.8 SẮP XÉP BẰNG PHÉP DEM PHAN PHOI (DISTRIBUTION COUNTING) 75 cccscczsxcrs2 102 8.9 TINH ON DINH CUA THUẬT TOÁN SẮP XÉP (STABILITY) 52c CS EE2EEE2EEEE2EEEekerekered 103 8.10 THUẬT TOÁN SAP XEP BANG CO SO (RADIX SORT) o.ccececsccscssessesessesessesesscsvsecevseceesecevseseveeeeees 104 8.11 THUAT TOAN SAP XEP TRON (MERGESORT) cccccsscssssessesessesesecsesecsvsecevsecevsecevsucevsecevsesevseseeees 109 8.12 CAL DAT ooccceccccccccccccscsscsesecsesecsesecssecsesecssecsusecsesecsusecssacssecsesacsvsavsvsacsesecsvsecsesevevsacevsevevsecevsecevsecevseseeees 112 8.13 DANH GIA, NHAN XET.oieeccccccccccccscsscsvsecsesecsesecsvsecsesecsvsecsesecsvsecsvsecsesecsesecsesecsvsacsvsecevsacevsesevsecevseseees 119

§9 TIM KIEM (SEARCHING) ccccccscsssssssssssesssssssssssesssssssssssessssssessssssssssessssssssssessssssessssesesssseseses 124

9.1 BAI TOAN TIM KIEM u.cccccccccscsscsssscssesvsucscsusevsucevsusevsucevsussvsusevsusevsusevsusavsusevsusevsusevsusevsusevsesevsesevsecevees 124 9.2 TIM KIEM TUAN TU (SEQUENTIAL SEARCH) .ccccccscsscssssessssessesesecsesecsvsssevsessvsecevsusevsesevsesevsesevees 124 9.3 TIM KIEM NHI PHAN (BINARY SEARCH) ccccsccsssscssssessesvsssscsecsvsusevsucevsueevsusevsecevsusevsesevsesevseseeees 124 9.4 CAY NHI PHAN TIM KIEM (BINARY SEARCH TREE - BST) c.ccscsscssssessssesecsvsecsvsecevsecsvsesevseeevees 125

Trang 5

9.5 PHEP BAM (HASH) cccccsscssssessscsessesscsvsucsvsusevsucevsusevsusevsusevsussvsusevsusevsusevsusevsusevsusevssevssevsesevssevseeees 130 9.6 KHOA SO VOI BAI TOAN TIM KIEM 0.0 cccecccscsscssesessssvssesvsessvsuesvsusevsusevsusevsusevsusevssevsnsevsesevssevsees 130 9.7 CAY TIM KIEM SO HOC (DIGITAL SEARCH TREE - DST)) cccscssssscsessesessesssesessvssevsesevsteeveseee 131 9.8 CAY TIM KIEM CO SO (RADIX SEARCH TREE - RST) S2 S221 EE121121E2111E2111 E11 1E Etree 134 9.9 NHỮNG NHẬN XÉT CUÓI CÙNG c2 1 212112111211111111 111111111111 E111 EnErrgryng 139

PHAN 3 QUY HOẠCH ĐỘNG 5-5c555< <Sscseseseeseseseeeseseseseesee 141

§1 CÔNG THỨC TIRUY HÒỒ[ 2 << £ 9E 9% 2 E924 d2 2 924 seo 142

LL VI DU cocececcccccccccccscsccsesscsesecsececsusevsusevsusevsusevsusevsusevsusevsusevsusevsusevsusevsusevsusevssevsusevssevsesevsusevsusevsnsevsnsevseses 142 1.2 CAL TIEN THU NHAT oooecccccccccccccccccsccecsesecscecsecscsecevsucecsucevsusevsusevsusevsusevsusevsusevsusevsisevsusevssevsnsevsnsevsesees 143 1.3 CAL TIEN THU HAL cccecccccccccccccccccscsscsesecssecsussvsecevsusecsucevsusevsusevsusevsusevssevssevsusevsisevstsevsisevsnsevsnsevsees 144 1.4 CAL DAT DE QUY oioceccccccccccccsssscsesscssecsusecsusevsussvsucevsusecsusevsusevsusevsusevsusevsusevssevssevsnsevsusevsisevsesevstsevsesees 145

§2 PHƯƠNG PHÁP QUY HOẠCH ĐỘNGG, ° «se se xESeEx sese esersssese 147

2.1 BÀI TOÁN QUY HOẠCH c5 1 EE1EE111E111111111111 1111111111111 greg 147 2.2 PHƯƠNG PHÁP QUY HOẠCH ĐỘNG - 5 n2 1111211221 11 121 1E tre 147

§3 MỘT SÓ BÀI TOÁN QUY HOẠCH ĐỘNG .- 5 5£ 5° <2 eeveExcseseseeserssese 151

3.1 DAY CON DON DIEU TANG DAI NHAT ounce ceccccccscssescsvsseessesucecsvsueucsesususecsvsusassvsnsusevsveneavsvesasaveneetees 151 3.2 BAL TOAN CAI TUL cecccceccccscsscssscssssvsscsvsucsvsusevsucevsssevsusevsusevsusevsusevsusevsusevsusevsusevsisevsusevssevsesevsisevssees 156 3.3 BIEN DOL XAU wooceececccccccccsesessesesecsvsussvsucsvsucsvsusevsucevsusevsusevsusevsusevsucevsusevsusevsusevsusevsesevssevssevsesevensevseees 158 3.4 DAY CON CO TONG CHIA HET CHO K ooecececceccscsccsssscsessesesecsesecsesecsesevsesevsnsevsusevsnsevstsevsnsevinsevsnsevsess 162 3.5 PHÉP NHÂN TO HỢP DÃY MA TRẬN - 2c 1 E111121111711111117111 111111111111 Ereryeo 166 3.6 BAL TAP LUYEN TAP io.cecccceccccscsscssssesecsesucscsussvsucevsusevsusevsusevsusevsusevsusevsusevsusevsusevsisevssevsnsevsesevsnsevseeees 170

PHAN 4 CÁC THUẬT TOÁN TRÊN ĐỎ THỊ .-.2-e.ec.- [75

N90 (0.47900000690079 .Ô 176

1.1 ĐỊNH NGHĨA ĐÔ THỊ (GR.APH) - + SE 1 112111111 11 11 1 1 1 1 1 1 nh nh ng gu hiếu 176

§2 BIÊU DIỄN ĐỎ THỊ TRÊN MÁYY TÍNHH 5< s° SE se se se vsesecre 179

2.1 MA TRẬN KẺ (ADJACENCY MATRIX) 5 1 SE 11181111 11 11 11 1 101 1 1 1 1 ng rêu 179 2.2 DANH SÁCH CANH (EDGE LIST) o.cccceccecccssssessssscsesscsesscsesevsucecsucecsusevsusevssevssevsusevsesevsesevsnsevsnsevssees 180 2.3 DANH SACH KE (ADJACENCY LIST) o cccccccccscssesscsssscsesecsesevsesecsusevsusevssevsusevssevsesevsnsevsnsevsnsevsses 181

§3 CÁC THUẬT TOÁN TÌM KIÊM TRÊỀN ĐỎ THỊ .- 2< s2 se se se =sezssezscse 184

3.1 BÀI TOÁN cá c1 21121211 1 1 1t n1 1 n1 1 n1 ng n1 1 n1 tt trai 184 3.2 THUẬT TOÁN TÌM KIEM THEO CHIEU SÂU (DEPTH FIRST SEARCH) 5- + ssczszxezsez 185 3.3 THUẬT TOÁN TÌM KIEM THEO CHIEU RỘNG (BREADTH FIRST SEARCH) - 187 3.4 ĐỘ PHỨC TẠP TÍNH TOÁN CỦA BFS VÀ DES 2s 1211 EE111221112711 110211 11x 190

§4 TÍNH LIÊN THÔNG CA ĐỎ THỊ . 5° 5° <£ << Ss£Es£SsE2# E28 se £Ss£seEseEsezseszeserse 191

4.1 ĐỊNH NGHĨA S2 121 E221215121121212111121211112121111 1211211111211 21 2111121111211121111 21kg 191

4.2 TÍNH LIÊN THÔNG TRONG ĐÔ THỊ VÔ HƯỚNG ST ST T1 11511515 1115151 11111118151 nre 192

Trang 6

L iy

4.3 DO THI DAY ĐỦ VÀ THUẬT TOÁN WARSHALLLL - 5-21 SE EEE1215212171211151111E111ExEEerrk 192 4.4 CÁC THÀNH PHÂN LIÊN THONG MANH 0 ccccccccssssssesessescscsusecscssecscevsucecsvsusecevsusersvsueasevavsneesevenees 195

§5 VÀI ỨNG DỤNG CỦA DES và BES 5< << % E2 xe Em gxg eExcseerxeeerecee 206

5.1 XÂY DỰNG CÂY KHUNG CỦA ĐỒ THỊ - 5 s1 EE2EEE121EE121712111211121111111111 E11 206 5.2 TẬP CÁC CHU TRÌNH CƠ SỞ CỦA ĐỎ THỊ, - -Ss tE EEE12111121112111211121115111 E11 209 5.3 BÀI TOÁN ĐỊNH CHIẾU DO THI ccccccccccsscscssscsessescsvsueecsesessevsversacsvsusecscsususavsususacsvensavsvsneasevsvenseveee 209 5.4 LIET KE CAC KHOP VA CAU CUA ĐỎ THỊ - St 2EEE1215E1211121112111211111111EE1EEnrre 213

§6 CHU TRINH EULER, ĐƯỜNG ĐI EULER, ĐỎ THỊ EULER - 5-5-5 <2 216

6.1 BÀI TOÁN 7 CÁI CẦU - s21 1 2111121111111111 E111 2111112111111 11 n1 1tr roi 216 6.2 ĐỊNH NGHĨA - 5 ST 111111111E1211111111111101 1111111111110 2111111111101 11111111111 216

6.4 THUẬT TOÁN FLEURY TÌM CHU TRÌNH EULER - 5 St 123 E1 515155151112551515E25113111511x 5E te 217 6.5 CÀI ĐẶTT c S112 11E211111117111 1111 T111 21111111 En 1H11 H1 H1 tt H11 tre ri 218 6.6 THUAT TOAN TOT HON occ ccccccscsscssescssesvssesvsuesvsusevsucevsucevsusevsusevsussvsusevsucevsusevsusevsssevsusevsasevsesevseeeees 220

§7 CHU TRINH HAMILTON, DUONG DI HAMILTON, ĐỎ THỊ HAMILTON 223

7.1 ĐỊNH NGHĨA 5-5 E1 1111111E1211111111111 011 211111111010 E 1111111111111 11H11 223 7.2 DINH LY ooececceccccscsscsssscsssvssssvsusevsusevsusevsusevsucevsusevsucevsusevsusevsucsvsusavsuvevsucevsusevsusevsusevsusevsesevsusevsesevsesevseseeees 223 7.3 CAL DAT viecccccccccsesscsesscssevsusevsusevsusevsusevsusevsusevsusevsusevsusevsucevsusevsusevsusevsusevsusevsusevsusevsusevsucevsesevsesevsesevseseeees 224

§8 BÀI TOÁN ĐƯỜNG ĐI NGẮN NIHẤTT 5£ << s9 SE e2 xe se ssese 228

8.1 ĐỎ THỊ CÓ TRỌNG SỐ S1 1T 1212121212121 1212111 111 11t 1111 tri 228 8.2 BAI TOAN DUONG DI NGAN NHAT ooooecccccccccsccscsscsesscsvsecsesecsesecsvsecsesecsesucsvsesevsassvsecevsecevsevevsecevseseees 228 8.3 TRƯỜNG HỢP ĐÔ THỊ KHÔNG CO CHU TRINH ẨM - THUẬT TOÁN FORD BELLMAN 230 8.4 TRƯỜNG HỢP TRỌNG SO TREN 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 5-1 SE E2EEE121EE121E7121715171211E51E1E1EEEeEcre 235 8.6 TRUONG HOP BO THI KHONG CO CHU TRÌNH - SẮP XÉP TÔ PÔ - 2c tt 2 22x Esrrree 238 8.7 DUONG DI NGAN NHẬT GIỮA MOI CAP DINH - THUAT TOÁN FLOYD 5cccccssxers2 241 8.8 NHẬN XÉTT c1 St 1 T1 121121112121121T1 2111111111111 1111 tr n1 t1 111tr ri 243

§9 BÀI TOÁN CÂY KHUNG NHỎ NHẤTT 2-< o° SE 9s se eeseveovee 248

9.1 BÀI TOÁN CÂY KHUNG NHỎ NHẤTT - 1-22 1 2 1EE12152111E71117111111111112111111E11EE11E-Enerre 248 9.2 THUẬT TOÁN KRUSKAL (JOSEPH KRUSK.AL - 956) 55-5225 1E EE121171E712E1211EEEE2EEEcErrrre 248 9.3 THUAT TOAN PRIM (ROBERT PRIM - 1957) cccccsssssssessesessessesecsessesevsscsvssessesssesevsessesevsseeesetseeeeveees 253

§10 BÀI TOÁN LUÒNG CỰC ĐẠI TRÊN MẠNG 5° 5 5< 52s se se sseseesessereesesssee 257

10.1 CÁC KHÁI NIỆM - S2 1 E11EE121E2111E1111E111 111.1111111 E1 E1 HH go 257 10.2 MẠNG THẶNG DƯ VÀ ĐƯỜNG TĂNG LUÔNG - St SE 2E 112111121211 E1E11 xe rerrye 260 10.3 THUẬT TOÁN FORD-FULKERSON (L.R.FORD & D.R.FULKERSON - 1962) -sccs- 263 10.4 THUẬT TOÁN PREFLOW-PUSH (GOLDBERG - 1986) - S52 1E 2211211112212 xEtrrrrree 267 10.5 MỘT SỐ MỞ RỘNG - c1 21121 11212112 n 111 n1 1 ng reo 273

§11 BÀI TOÁN TÌM BỘ GHÉP CỰC ĐẠI TRÊN ĐỎ THỊ HAI PHÍA . 280

11.1 DO THI HAI PHÍA (BIPARTITE GR.APH), 5-5: SE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEerrerrre 280 11.2 BÀI TOÁN GHÉP ĐÔI KHÔNG TRỌNG VÀ CÁC KHÁI NIỆM 5 cccctcEEcEEerrkerrrre 280 11.3 THUẬT TOÁN ĐƯỜNG MỞ - S1 1 2 1 2112121121 11 1 11111111 ryo 281

11.4 CÀI ĐẶTT TT T211 1111115151511 1 n5 5E HH HH HH HH HH Hường 282

Trang 7

§13 BÀI TOÁN TÌM BỘ GHÉP CUC DALI TREN ĐỎ 'THỊ - 5° 5 5< se =sess se ss<e 304

13.1 CÁC KHÁI NIỆM - - 5 s5 1 E21E2111211112111 E111 T111 11T ng 1 ng rung 304 13.2 THUẬT TOÁN EDMONDS (1965) - c 2s S21 1127121111 1122121 1101021111 Errrrrrrrrererd 305 13.3 THUẬT TOÁN LAWLER ((19/73) 5 s21 211 171221211111 11 1121110111111 EEEEEEEErrrrrerrrererd 307 13.4 CÀI ĐẶTT -s St n1 1 E1 1 1E 1E 1E 11H n1 nh 1 tt HH T1 1n 1kg 309 13.5 ĐỘ PHỨC TẠP TÍNH TOÁN c1 s12 152121171211111 T111 T111.111E111ET11EE11EEEEEE1En reo 313

IV 000I908)09080:)0) 8 315

Trang 8

Ký pháp © lớn, O lớn và € lớn c1 221 21 1220112111211 1111111111111 011 011 011 011 111 H1 H111 1g kg HH 4] INT.)58sL:8) ai 54 Cau tric nut cla danh sach n6i dom c.ceccccsccccscscsscssssessesvssevsussvsucevsussvsusevsussvsssvsssvstsevsnsevstsavsnsavenseessees 59 Danh sách nối đơn - 5 + 1S 12E215111511121112111121111 2111111211211 111 11111111 111tr re 59 Cấu trúc nút của danh sách nối kép St 1E EEE111E15E11151E71115111111111111 1111111111111 eo 61 : Danh sách nối kép -¿- + 1 k+EÉE1121EE11121E11111111111111111111 1111111111111 E111 111tr rye 61 : Danh sách nối vòng một hướng - + St 1 1 1É E12EEE11121E111111111111111111 111111 E1111E111EnErrre 61 : Danh sách nối vòng hai hướng -c- 1S 1E EEEE11E15211121E1111111111111111111 1111101110111 11Enree 62

: Di chuyển toa tảu c T11 1111111111111 111110111111 1111111111111 H1 tre 69 : Di chuyển toa tàu (2) c1 1 1EE111111111111111101111 11 1111111111111 1H tre 69

r CÂN Q.00 Q.00 H1 HH TH TH vn 1 TH tk KHE KH KH K TK KH K E101 181111811110 1k 70

> Mire cia CAC MUt HON CAY “sạn a ốốốốốằỀ.ằỀ 71 : Cây biểu diễn biG thre oo cecccscscsscsvevsecevsvsececsvsssecsvsusecevssesevsveavevsvsusecevssevevsesevevsesvevevssecevsesevers 71 : Cac dang cay nhi phan sury bi6ti e.ce cece ceccccecscsesscsesseecsesesecscsusecevsvsesevsvsesecevssevevsesevevsesesevsvstsevevsesevens 72 : Cay nhi phan hoan chinh va cay nhi phan day dt ccccccccccccecscsescsecsesesecscsesesscsesevevsvssecevssevevsesesees 72 : Danh s6 cac nut cua cay nhi phan day du dé biéu dién bang MANY oo ce cecceeeeeeeeseeeseeseeteesseseeeeees 73 : Nhược điểm của phương pháp biêu diễn cây băng mảng - 52 SE 1E EEEEE1EEEEEE1121E2111 1E txe 73 : Cầu trúc nút của cây nhị phân - 2k SE1 1 EEEEE2EEE11121E11111111111111111111 11111 E11111E1111E1Erre 74 : Biểu diễn cây băng cầu trúc liên kẾt ¿- 1S 1 1EE11121E11111111111111111111 1111111111011 Errrye 74 : Đánh số các nút của cây 3_ phân đề biêu diễn băng mảng - S2 SE E23 EEEEEEEEEEE11121E211151EE1txe 76 : Biểu diễn cây tổng quát bằng mảng c1 SE 1 15111121E111111 1111110111111 E111E1111 11t 77 : Cầu trúc nút của cây tổng quát - + t1 E1 1 15E11121E11111111111111111111111 111111111111 rrre 78 : Biểu thức đưới dạng cây nhị phân - + SE x2EEE1121EE1111111111211111111 111111 E11111E111EEErrre 79 : Vòng lặp trong của QuICkSOF - - c 1 2201212211 111211 1112011111511 1 112011111 n K1 k TH KH KH KH KH kg 94

¬ 1 vee ccceccccecscsececsesececsesscecsvsvsecevsvsecevsvsuvevevsusavevsvsevevsvsavevevsusevevsvsasevsvssevevsvsavevsvsavevivsesevevsvsevevses 100 : Đảo giá trị k[1] cho k[n] và xét phần còn lại - 5c s1 EEE EEEEEEE121EE11121E2111111111111E111 re 101 : Vun phân còn lại thành đống rồi lại đảo trị k[I] cho k[n- Í] 5-5-5225 SE ‡EE‡E‡E£EEE‡E£EtEEzEeEersrkerees 101

: Thuật toán sắp xếp II ceeeeeccccccccccceseeeceeeccccecccuusueeeeeeccceeeeauuseseesecececeeeuaaueseeesecceeeeeauauttesecececesenauanes 109

: Cài đặt các thuật toán sắp xếp với dữ liệu lớn - 5: t1 1 EEE11121E111151E1111111111111 11111 Enree 121

Trang 9

Hình 38: Cây nhị phân tìm kiếm oo ce ceccccccccececececscsececsvsscecsvsvcecevsvsesecsvsusecsvsusevevsvsavevsvsesevsvssecevsveavevsvsevevsveeees 126 Hình 39: Xóa nút lá ở cây BSÏT - -.- c1 01221 112111211101110111111 111110111011 011 91119119111 HH KH Hệt 127

Hình 40 Xóa nút chỉ có một nhánh con trên cây BSTT” - - 2 1122211111221 111511 11158111115 111118111118 1111 grkg 128

Hinh 41: X6a nut c6 ca hai nhanh con trén cay BST thay bang nut cue phai clia cay CON thi ecco 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 5- 128

Hình 43: Đánh số các bít 25 221 221222121112211211121112111111111211121 111111221111 rree 131

Hình 44: Cây tìm kiếm số học ¿c1 SE 1 1EE11121E11111111111111111 1111111 1111111101111 1 11111 ty 131 Hình 45: Cây tìm kiếm cơ SỐ - 5c c1 SE 1E15111121E1111111111111111101211111 1111111111111 En 1tr 134 Hình 46: Với độ dài dãy bít 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ỏ g1á trỊ 7 . - 5 222 2+2 *‡+zvEcseeeeeeres 136 Hình 48: Cây tìm kiếm cơ số a) và Trie tìm kiếm cơ số b) - 1S 1 1 EE121E111111111121111111 11111101111 rte 138 Hình 49: Hàm đệ quy tính số FiboniaCCI c1 9 1 EEEEE121E1E111121111111111111 1111111111111 E1 11111111 rryg 149 Hình 50: Tính toán và truy VẾ - St tt 1EE1112111111111111111111101211111 1111111110111 152 Hình 51: Truy VẾT - 5c 1 1 1EE1121111111111111 111111 1111111110111 11111 pH H111 ra 160

Hình 52: Ví dụ về mô hình đồ thị - 5:25: 222t22312211221122112111211121112111111111211121112111211.1111 1e 176 Hình 53: Phân loại đỗ thị - 2: 55225+221221122112211271122112111211121112111211111111 1112112111111 177

ISPI1:®Ÿ aaiiẳiẳaiaiẢ 180

0 na 181 Hình 56: Đồ thị và đường đi 5c s1 1E 1 1111121111111 1111111111111 1111 1111111111111 ryg 184

IBU0in1.300.ì05):sE:aaađadđaidđiadiaiaaiiaaiaiaa 190 Hình 59: Đồ thị G và các thành phần liên thông G1, G2, G3 của nó . 5c 12t SE 12EEE1121E11111111111 E1 te 191 Hình 60: Khớp và cầu -. - - S1 1 1EE11121E1111111111111 111111 1111101111 1111111Ẹ11 111111 111tr ri 191 Hình 61: Liên thông mạnh và liên thông yếu - ¿2 St E23 EEEE1E£EEEEE121E111111E1111111111111111111 1111111111 nte 192 Hình 62: Đồ thị đầy đủ - c cct E11 11E121111 1211112122 111111111 E1 1 1111 Hung 193 Hình 63: Đơn đồ thị vô hướng và bao đóng của nó - c1 SE 1 1EE11121E1111111111111111111 111111111110 193 Hình 64: Ba dạng cung ngoài cây IDFS - 0002220111121 1 112511 1115111110111 190 1k1 KT KH KT KH KH kg 197 Hình 65: Thuật toan Tarjan "bé" cay DES c0 02201101221 111 1211111511111 01111150111 n HT KH KH KT KH kg 199 Hình 66: Đánh số lại, đảo chiều các cung và duyệt BES 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ự I1, 10 3, 2, Ï)) 2 2c 1211211121111 1111110111011 111 011 011 111 911g KH KH HH 204

Hình 67: Đồ thị G và một số ví dụ cây khung TÌI, T2, T3 của nó -.- 2 1222111122111 112 1111181111511 kg 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) 5-5-5552 208 Hình 69: Phép định chiều DES G1 S3 1 3EE11121E211121E1111111111111111111 1111111010111 1 11111 grryg 211 Hình 70: Phép đánh số và ghi nhận cung ngược lên cao nhất .- 5-1-5 1 E3 E2EEEEEEEE2EEE1112121111111111 11 1e 213 Hình 71: Mô hình đồ thị của bài toán bảy cái cầu - 5 1 SE 1 1111121111111 1111101111111 111101111 erryg 216

10722 eee cccccescceseceseeeseceseceseceseceseeeseeesseesecesseessecssecsseessessseessessseessesssesesesesessseeeseesssesseessseessesssectseesseesseeses 217 Hình 73 oo ccccccccccccscecseeeseessceeseceseceseeeseceseeesseeseceseesseeessecssecssesssecsesseessesssesesesesessseesseeessesseeessessesssessseesseesseests 217 Fit 74 ooo ccc cece cesccesccesceeseeeseceseesseeeseeeseeesseesecesseeseeessecssecssessseesesseeseeseceseseseesseessseessesseesseessesseetseesseenseeses 223 Hình 75: Phép đánh lại chỉ số theo thứ tự tÔpÔ - 5-52 113 191 E15E51151E1111111111111111111 11111111 238 Hình 76: Hai cây gốc r¡ và r› và cây mới khi hợp nhất chúng -. - + EE2EEEEEEEE£EEEEEEEEEEEEEEEEEEEEEEEEEErkekered 249

Trang 10

L? Vill

Hình 77: Mạng với các khả năng thông qua (1 phát, 6 thu) va mét lung cla nO VOI gid thi 7 257 Hình 78: Mang G và mạng thặng dư G; tương ứng (ký hiệu f[u.v]:c[u.v] chi lung fu, v] va kha nang théng qua

Hình 79: Mạng thặng dư và đường tăng luồng - - S1 1 EEE1112151111111111111 1111011112111 ra 262 Hình 80: Luồng trên mạng G trước và sau khi tăng 5+ s SE 1 1EE11151521112111111111111111111 111111 262 Hình 81: Mạng giả của mạng có nhiều điểm phát và nhiều điểm thu 5-5-5 2E E‡EEEE‡EEEEEE2EEEEEEEEEEEExrkrree 273 Hinh 82: Thay mét dinh u bang hai dimh uj, Uputecscscscccsesccscsesessesesesecsessecsvsssecsvsesecsvsvsesevsesesevsvssecevsvsesevsessevsen 274 Hinh 83: Mang gia cua mang co kha nang thong qua của các cung bị chặn hai phía - 255555555: 274 Hinh 84: D6 thi hai pha c.c.ccccccccccccsccscscsecscsececscsesececsvsesevsvsusecsvsusecevsesesevsvsusevsvssevevsvsesevsesesevsvsesevevsusevevsvsevevses 280 Hình 85: Đồ thị hai phia va b6 ghép M oo.ceccccccccccscsescscsesecsvssecscssecevsvsesevsvsssecevsusevevsesevevsesevevsvssecevsisesevsveesevses 281

Hinh 86: M6 hinh luỗng của bài toán tìm bộ ghép cực đại trên đồ thị hai phía -. - ccc S22 sec 285

Hinh 87: Phép xoay trong $6 amb .c.cccccccccscscsccsssesecsesesecsvssecscssecevsesesevsvsusevsvssevevsusesevsesevevsvsesevevsusevevsvsevevsess 289

Hinh 88: Thuật toan Hungarrt 00.ccc ccc cccccccccscccesecceeseeecesseeecesseecesseeeceseeesesseeecesseeeesseeecesseecesseeeceseesesseeeseies 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 duOng oo cece eececcsceeeeseeseeeeeeseeeeeeeees 299 Hình 90: Đồ thị G và một bộ ghép ÌM ¿+ SE 1 1EE11121E111111E1111111111111111111T11111E111111 1111 En ru 304 i8 0081) 8i:i980s199 17 e.aaddaliiD 306 Hình 92: Nở Blossom đề dò đường xuyên qua Blossom ¿+ SE 1 EEEE12EEEE111E1111121111151E111111 E111 gree 306

Trang 11

L? 1X Yo

CHUONG TRINH

P_1 02 I.PAS * Thuật toán sinh liệt kê các dãy nhị phân độ dài n .- 2 222211122221 11121125EEE2xxrrei 6 P_1 02 2.PAS * Thuật toán sinh liệt kê các tập con k phần tử - 2s SE EEE111E15E11121211111 11111 tre 8

P_1 02 3.PAS * Thuật toán sinh liệt kê hoán vỊ . - - c 1 2201122201 1112211 1112111158111 1 1511111811111 k KH kh khe 9

PI 03 I.PAS * Thuật toán quay lui liệt kê các dãy nhị phân độ dài n 25 222 2222 * 222 EE+zverrserxes 12

P 1 03 2.PAS * Thuật toán quay lui liệt kê các tập con k phân tử - ¿+ S212 ‡EEEE2E£EEEEEEEEEEEEEEEEEEErkrkerrrkd 14 P_I 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 - - -5 25 22222 *‡++‡+sscss 16 P_1 03 4.PAS * Thuật toán quay lui liệt kê các cách phân tích SỐ .- ¿5-1-5 2 1 EEEE2E2EEE11121E211111 111111 E1 17

P 1 03 5.PAS * Thuật toán quay lui giải bài toán xếp hậu . 5 SE 121 EEEE111E1E111121E111111 1111111 Enrtk 21

PI 01 I.PAS * Kỹ thuật nhánh cận dùng cho bài toán người du lịch ccccccccesscceeseecessseeeesseeeeesaes 26 P.1 04 2.PAS * Dãy ABC Q20 012011211121 1111 1111111111111 1 0111111111111 11 11kg KH kg kg ru 28

P 2 07 I.PAS * Tính giá trị biểu thức RPN 5.5 s1 E11 1 111111111111212111111 1111011111011 1tr 81

P 2 07 2.PAS * Chuyén biểu thức trung tô sang dạng RPN 1S 1 1E EE111E1E111121E111111 1111 1n 84

P 2 08 _1.PAS * Cac thuat toan sap X€p cccccccccccsccscscsccscsesecsvsesesecsesececsvsusecevsusecevsvsevevsvsesevsvssevevsvsavevsvsevevsvseees 112

P 3 01_1.PAS * Đếm số cách phân tích $6 1o cececcccccscsscsesesscsessecsesesecsesececsvssecevsesevevsvsesecevssecevsvsavevsvsevevseseees 143

P 3 01 2.PAS * Đếm số cách phân tích sỐ n - 5 St E21 EEEE1EEEEEEEE21EE11121E1111111111111111111 11111111111 nte 144

P 3 01 3.PAS * Đếm số cách phân tích sỐ n - 2 St E21 EEEEEEEEEEEEE2EEE11111E11111111111111111111 1111111111 nte 144

P 3 01 4.PAS * Đếm số cách phân tích sỐ n - - S121 EEEE1EEEEEEEE21EE11121E1111111111111111111 111110111 nte 145

P 3 01 5.PAS * Đếm số cách phân tích số n dùng đệ quy . - - 5+ 1E EEEEEEEEE11121E211111111111 E111 tt 145

P 3 01 6.PAS * Đếm số cách phân tích số n dùng đệ quy - - 5+ 1E 3E EEEEEE11121E211151E211111 111.1 145

P 3 03 _1.PAS * Tìm dãy con đơn điệu tăng dài nhất (2 SE 1 EEEE121E11111121111151111111 1111110111 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 5 52c tE 2E EEEEEEEEEEEErkerrred 154

P 3 03 3.PAS * Bài toán cải tÚI L0 11 221122111211121 110111112011 1011 0111011191119 111111111 11H Hệt 157

P 3 03 4.PAS * Biến đổi xâu - - ST 1 1111121111111 1111110111101 11111 11111111111 ty 161

P 3 03 _5.PAS * Day con c6 tong chia hét Cho k o.cccececcccccccsccscsesecsessecsesscecsvssecevsvsesevsvsesevsvssecevsvsavevsvsevevseseees 163

P 3 03 6.PAS * Dãy con có tông chia hết cho k 5 c1 SE 1 1EE11121E1111111111111111111 111111 1111101 Erteg 165

P 3 03 _7.PAS * Nhân tối ưu dãy ma trận +: 2t EEEEEE21E1EE1112151111111111111111111111111 11111111110 169

P 4 03 _1.PAS * Thuật toán tìm kiếm theo chiều sâu .-.- 2-5 S2 E21 EEE2EEEEE11121E111121211111111111 111111 185

P 4 03 2.PAS * Thuật toán tìm kiếm theo chiều rộng . 5-52 SE E23 EEEEE21E1E111151E211111111111 111x111 188

P 4 04 _1.PAS * Thuật toán Warshall liệt ké cac thanh phan lién thong 0.0.0 cc ccccccecsccsesesessesescevsveesevsvseseeseeeees 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 - 5-52 s2S‡E‡EE+E£EvEEEzEeErxd 202

P 4 05 1.PAS * Liệt kê các khớp và cầu của đỗ thị - 5c 1 s1 1121E111111E1111111111111 1111110111110 1rtea 214

P 4 06 I.PAS * Thuật toán Fleury tìm chu trình EUÏer - - - c1 22220111223 1111511 1115811111511 1 581111151111 kg 218

P 4 06 2.PAS * Thuật toán hiệu quả tìm chu trình EuUÏer - c1 22c 1122211111251 11 1351111581111 11 151112 ket 221

P 4 07 I.PAS * Thuật toán quay lui liệt kê chu trình HamnÌfon .- 22 22 22222112 222EE22EEEE+srexessrka 224

P 4 08 I.PAS * Thuật toán Ford-Bellman c2 1122211 1112211 1115111115111 1181111150111 19 1111k KH kg 231

P 4 08 2.PAS * Thuật toán DIJkstra - 0 2201 121112111211121 1111112111211 1111111101 1101111111111 911111 Hệt 233

P 4 08 3.PAS * Thuật toán Dijkstra và cầu trúc Heap 1S 1 1EE5E121E1111121111111 1111110111110 rrea 235

Trang 12

LP X Do

P 4 08 4.PAS * Đường đi ngắn nhất trên đồ thị không có chư trình - 5-5-5 scxcE‡E‡E‡EEESEE2EEEEEEEEEErrxrkrree 239

P 4 08 5.PAS * Thuật toán FÏoyd - c2 21121 12111211211 1111111 111111 111111 111111 11111111111 11111111 E111 T111 242

P 4 09 1.PAS * Thuật toán KruskaÌL - - c1 c1 2112111211211 111 1111 1111111111111 111111 11111111111 111111111111 T111 250

P 4 09 2.PAS * Thuật toán PrIm - c2: 211211211121 1211 1111111111111 1 111111 111111 111111111 111111 111111 11111 11111 He 254

P 4 10 1.PAS * Thuật toán Ford-Fulkersom - - 2c 1c 1122211112221 1115111115111 1181111150111 1811119111 vn ket 265

P 4 10 `0 ái 0x20 an e 270

P 4 1I 1.PAS * Thuật toán đường mở tìm bộ ghép cực đạt - c 1 2112221111112 11 15 1111581111511 115k kee 283

P 4 12 1.PAS * Thuật toán Hungarl - - - c2 220111222113 2211 1112111115111 1150111118111 1501 11H kg KH vn ket 295

P 4 12 2.PAS * Cài đặt phương pháp Kuhn-Munkres O(k) -.-5 5c tt E2 2EEEEEEE2E 211212 EEtErrtye 300

P 4 13 1.PAS * Phương pháp Lawler áp dụng cho thuật toán Edmonds - ¿+ 2 + 2+2 ++zeeccssexss 310

Trang 13

atb

attb

BANG CAC KY HIEU DUOC SU DUNG

Floor ofx: Số nguyên lớn nhất < x

Ceiling ofx: Số nguyên nhỏ nhất > x

|

Số chỉnh hợp khong lap chap k cua n phan tir (=7 m „ n —K):

Binomial coefficient: Hệ số của hạng tử x" trong đa thức (1+x)"

Cac phan tir trong mang a tính từ chỉ số ¡ đến chỉ số j

n factorial: Giai thtra cua n = 1.2.3 n

Logarithm to base a of x: Logarithm co sé a cia x (log,a” = b)

Logarithm nhi phan (cơ số 2) của x

Logarithm tự nhiên (cơ số e) của x

Số lần lấy logarithm co sé a dé thu được số < 1 tirx (log (a TT b) =b) log, x

log, x

Trang 15

PHAN 1 BAI TOAN LIET KE

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 dé 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 cầu dưới đây:

e Không được lặp lại một câu hình

e Không được bỏ sót một câu hình

Có thể nói rằng, phương pháp liệt kê là phương kế cuối cùng để giải được một số bài toán tổ hợp hiện nay Khó khăn chính của phương pháp này chính là sự bùng nồ tổ hợp dẫn tới sự đòi hỏi lớn về không gian và thời gian thực hiện chương trình Tuy nhiên cùng với sự phát triển của máy tính điện tử, băng phương pháp liệt kê, nhiều bài toán tổ hợp đã tìm 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

2 2 eo Chuyén dé

§1 NHAC LAI MOT SO KIEN THUC DAI SO TO HOP

Cho S là một tập hữu hạn gồm n phân tứ và k là một số tự nhiên

Gọi X là tập các số nguyên đương tir 1 dén k: X = {1, 2, ., k}

1.1 CHÍNH HỢP LẶP

Mỗi ánh xạ f: X —> S Cho tương ứng với mỗi ¡ e X, một và chỉ một phần tử f(¡) e S

Được gọi là một chỉnh hợp lặp chập k của S

Nhung do X là tập hữu hạn (k phân tử) nên ánh xạ f có thể xác định qua bảng các giá trị f(1), f(2), ., f(k)

Vi du: S = {A, B, C, D, E, F}; k= 3 M6t anh xa f co thé cho nhu sau:

lựa chọn:

Số chỉnh hợp lặp chập k của tập gồm n phân tử là n*

1.2 CHINH HOP KHONG LAP

Khi f là đơn ánh có nghĩa là với Vĩ, j e X ta có f(¡) = f) ©1= j Nói một cách dễ hiểu, khi dãy giá trị f(1), f2), , fk) gồm các phần tử thuộc S khác nhau đôi một thì f được gọi là một chỉnh hợp không lặp chập k của S Ví dụ một chỉnh hợp không lặp (C, A, E):

Khi k=n Một chỉnh hợp không lặp chập n của Š được gọi là một hoán vị các phần tử của S

Ví dụ: một hoan vi: (A, D, C, E, B, F) cua S = {A, B, C, D, E, F}

| i 2[3 |) 4] 5/6

0 |A|D|C|E|BIF

DHSPHN 1999-2004

Trang 17

Bài toán liệt kê 2 3 Do

Đề ý 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ó tương ứng 1-1 giữa các phần tử của X và S, do đó f là song ánh Vậy nên ta có thể định nghĩa

một hoán vị của S là một song ánh giữa {], 2, , n} và S

Số hoán vị của tập gồm n phân tử = số chỉnh hợp không lặp chập n = nỊ

1.4 TÔ HỢP

Một tập con gồm k phản tử của S được gọi là một tổ hợp chập k của S

Lay 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} 1a tap con cua tap S trong ví dụ trên thì: (A, B, 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ẽ

Trang 18

& 4 eo Chuyén dé

§2 PHƯƠNG PHÁP SINH (GENERATION)

Phương pháp sinh có thể áp dụng để giải bài toán liệt kê tổ hợp đặt ra nêu như hai điều kiện sau thoả mãn:

s* Có thể xác định được một thứ tự trên tập các câu hình tổ hợp cần liệt kê Từ đó có thê biết

đượccấu hình đâu tiên và câu hình cuối cùng trong thứ tự đó

s* Xây dựng được thuật toán từ một câu hình chưa phải câu hình cuối, sinh ra được câu hình

kế tiếp nó

Phương pháp sinh có thể mô tả như sau:

(Xây dựng cấu hình đầu tiên);

repeat

(Đưa ra cấu hình đang cô);

(Từ cấu hình đang có sinh ra cấu hình kế tiếp nếu còn);

until (hét cau hinh);

Thứ tự từ điển

Trên các kiểu đữ 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:

Trong trường hợp a < b và a # b, ta dùng ký hiệu "<" cho gọn, (ta ngầm hiểu các ký hiệu như

>, >, khỏi phải định nghĩa)

Vi dụ như quan hệ "<" trên các số nguyên cũng như trên các kiêu vô hướng, liệt kê là quan hệ thứ tự toàn phân

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 day d6 dai n, trên các phần tử của a và b đã có quan hệ thứ tự "<" Khi đó a < b nêu như

Hoac afi] = b[i] voi Vi: l <1< n

Hoặc tồn tại một số nguyên duong k: 1 <k<n dé:

a[1] = b[1]

a[2] = b[2]

DHSPHN 1999-2004

Trang 19

Bài toán liệt kê 2 5 Do

a[k-1] = b[k-1]

a[k] = b[k]

a[k+1] < b[k+1]

Trong trường hợp này, ta có thê viết a < b

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 CAC DAY NHI PHAN DO DAIN

Một dãy nhị phân độ dài n là mot day x[1 n] trong do x[i] € {0, 1} (Vi: 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, 2" - 1] Số các dãy nhị phân độ dài n = số các số tự nhiên e [0, 2"- 1]= 2"

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, I, , 2"-1

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

Vi du khin= 8:

Day đang có: 10010000 Day đang có: 10010111

Như vậy kỹ thuật sinh câu hình kế tiếp từ câu hình hiện tại có thể mô tả như sau: Xét từ cuối

dãy về đầu (xét từ hàng đơn vị lên), tìm số 0 gặp đầu tiên

Lê Minh Hoàng

Trang 20

LP 6 eo Chuyén dé

* Nếu thây thì thay số 0 đó băng số 1 và đặt tat cả các phần tử phía sau vị trí đó băng 0 s* Nếu khong thay thi 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 qua 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); {Cau hinh ban dau x=00 0}

repeat {Thudt toan sinh}

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

WriteIn (f) ;

i :=n; {xii] là phần tủ cuối dãy, lùi dần ¡ cho tới khi gặp số 0 hoặc khi ¡ = 0 thì dùng}

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

if ¡ > 0 then {Chua gặp phải cấu hình 1/1}

begin

x[i] := 1; {Thay x[i] bang sé 1}

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

end;

until i = 0; {DA nat cau hinh}

Close (f) ;

end

2.2 LIET KE CAC TAP CON K PHAN TU

Ta sẽ lập chương trình liệt kê các tập con k phần tử của tập ƒ1, 2, ., n} theo thứ tự từ điền

Ví dụ: với n= 5, k=3, ta phải liệt kê đủ 10 tập con:

Trang 21

Bài toán liệt kê œ©) 7 t® hạn trên (giá trị lớn nhất có thể nhận) của x[k] là n, của x[k-I] 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[ï] (giá trị nhỏ nhất x[¡] có thể nhận) là x[i-I] + 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ự tir dién

Ví dụ:n=9, k= 6 Câu hình đang có x = (1, 2, 6, 7 8 9) Các phần tử x[3] đến x[6] đã đạt tới giới hạn trên nên để sinh câu hình mới ta không thê sinh bằng cách tăng một phân tử trong số các x[6] x[5] x4] x[3] lên được, ta phải tăng x[2] = 2 lên thành x[2] = 3 Được câu hình mới

la x = (1, 3, 6, 7, 8, 9) Câu hình này đã thoả mãn lớn hơn câu hình trước nhưng chưa thoả mãn tính chất vừa đủ lớn muốn vậy ta lại thay x[3] x[4] x[5] x[6] băng các giới hạn dưới của nó Tức 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 duoc cau hình mới x = (1, 3, 4 5, 6 7) là câu hình kế tiếp Nếu muốn tìm tiếp, ta lại nhận

thầy răng x[6] = 7 chưa đạt giới hạn trên, như vậy chỉ cần tăng x[6] lên 1 là được x = (1, 3, 4,

5, 6, 8)

Vay 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[¡] chưa đạt giới hạn trên n - k + ¡

* Nếu tìm thấy:

> Tang x[i] do lén 1

> Dat tat cả cdc phan tir phia sau x[i] bang gidi han dudi

“+ 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

nhất một dấu cách

Output: file vin ban SUBSET.OUT cac tap con k phan tir cia tap {1, 2, ., n}

SUBSET INP | SUBSET OUT

3, 4, 5}

Lê Minh Hoàng

Trang 22

2 8 eo Chuyén dé

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

for i := 1 tok do x[i] := ai; {x := 12.k (Câu hình khởi tao) }

i :=k; (Xét tù cuối dãy lên tìm x[i] chua đạt giới hạn trên n - k + i}

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

if ¡ > 0 then {Nếu chua lùi đến 0 có nghĩa là chưa phải cấu hình kết thúc}

begin

Ine(x[i]); (Tăng x[ij lên 1, Đặt các phần tủ đứng sau x[i] bằng giới hạn dưới của nó]

for ] :=i+1 tok do x[j] :=x[j - 1] + 1;

end;

until i = 0; {Lui đến tan 0 cé nghia 1a tat ca cdc phan tủ đã đạt giới hạn trên - hết cấu hình)

Close (f) ;

end

2.3 LIET KE CAC HOAN VI

Ta sé lap chương trình liệt kê các hoán vị của { 1, 2, ., n} theo thứ tự từ điển

Ví dụ với n = 4, ta phải liệt 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ư vậy hoán vị đầu tiên sẽ là (1, 2, ., n) Hoan vi cuéi cing 1a (n, n-1, ., 1)

Hoan vi sé sinh ra phai 16n hon hoan vi hién tai, hon 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 vi hiện tại là x = (3, 2, 6 5 4, 1), xét 4 phan tir cudi cung, ta thay chung duoc 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 no bang mot gia tri

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 gia tri 4, 5, 6 Vi 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ẽ lay trong tap {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à 41, 2,

5, 6) Vậy hoán vi moi sé 1a (3, 4, 1, 2, 5, 6)

DHSPHN 1999-2004

Trang 23

Bài toán liệt kê 2 9 Bo

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á frỊ trong đoạn cuối thì ta chỉ cần đảo ngược đoạn cudi

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é 1a (2, 1, 4, 3) Ta cũng

có thể coi hoán vị @, 1, 3, 4) có đoạn cuối giảm dân, đoạn cuối này chỉ gồm 1 phan tir (4)

Vậy kỹ thuật sinh hoan vi 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ố ¡ 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ố ¡ đầu tiên thỏa man x[i] < x[i+1]

* Nếu tìm thây chỉ số ¡ 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[ï]| 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 dau tién thoa man x[k] > x[i] (có thê dùng tìm kiếm nhị phân)

> Dao giá trị x[k] và x1]

> 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 van ban PERMUTE.OUT cac hoan vi của dãy (1, 2, ., n)

PERMUTE.INP || PERMUTE.OUT

Trang 24

« |0 $® Chuyên đề

Assign(f, OutputFlle); Rewrite (f) ;

for ¡ :=1 ton do x[i] :=i; (Xhỏi tạo câu hình đầu: x[1] := 1; x[2] := 2; „ xịn] := n}

repeat

for ¡ :=1 ton do Write(f, x[i], ' !}; (In ra câu hình hoán vị hiện tạ!)

WriteIn (f) ;

1 :zn- 1H;

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

if i > 0 then {Chua gap phai hoan vi cudi (n, n-1, , 1}}

begin

k :=n; {x[k] la phan tt cudi day}

while x[k] < x[i] do Dec(k); {Lui dan k dé tim gap x{k] dau tién lén hon x[{i]}

Swap(x[k], x[i]); (Đổi chỗ x[ki 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ị xia] và x[b))

Ine(a}; (Tiến a và lài b, tiếp tục cho tới khi a, b chạm nhau}

Bài 2

Liệt kê các dãy nhị phân độ dài n có thể coi là liệt kê các chỉnh hợp lặp chập n của tap 2 phan

tử {0, I} Hãy lập chương trình:

Nhập vào hai số n và k, liệt kê các chỉnh hợp lặp chập k của ƒ0, 1, ., n -1}

Hướng dẫn: thay hệ cơ số 2 bằng hệ cơ số n

1010 sẽ tương ứng với tập con {I, 3} Hãy lập chương trình in ra tat 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

DHSPHN 1999-2004

Trang 25

Bài toán liệt kê œ | ] $® 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ữ

Bai 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 tap con k phan tử của tập hợp, sau đó in ra du k! hoan vi

của nó Hãy viết chương trình liệt kê các chỉnh hop không lặp chập k của {1, 2, , n} theo cả hai cách

trong trường hợp liệt kê toàn bộ một số lượng nhỏ câu hình trong một bộ dữ liệu lớn thì lại có

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 dau 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ừ dién chang 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)

Lé Minh Hoang

Trang 26

& 12 oe Chuyén dé

§3 THUAT TOAN 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 băng cách xây dựng từng phân tử, mỗi phan tir duoc chon bang cách thử tất cả các khả năng Giả sử câu hình cần liệt kê có dạng x[1 n], khi đó thuật toán quay lui thực hiện qua các bước: L) Xét tất cả các giá trị x[1] có thê nhận, thử cho x[1] nhận lần lượt các giá trị đó Với mỗi giá tri thy gan cho x[1] ta sé:

2) Xét tất cả các giá trị x[2| có thể nhận, lại thử cho x[2| nhận lần lượt các giá trị đó Với mỗi

giá trị thử gán cho x[2] lại xét tiếp các khả năng chọn x[3] cứ tiếp tục như vậy đến bước:

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[I 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ị thir gan 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(1: Integer) ;

begin

for (mọi giá trị V có thể gán cho x[i]} do

begin

(Thử cho x[i] := V);

if (@x[i] là phần tử cuối cùng trong cấu hình) then

(Thông báo cấu hình tìm được)

else

begin

(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+i]]}

(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 LIET KE CAC DAY NHI PHAN DO DAIN

Input/Output v6i khu6én dang như trong P_1 02 1.PAS

Biéu dién dãy nhị phân độ dài N dưới dang x[1 n] Ta sẽ liệt kê các dãy này băng cách thử dung cac gia tri {0, 1} gan cho x[i] Voi moi gia tri thu gán cho x[I] lại thử các giá trị có thê gan cho x[it+1].Chuong trinh liệt kê bang thuật toán quay lui có thê việt:

Trang 27

Bài toán liệt kê œ |3 $®

x[1] := J; {Thu dat x[i}}

if i =n then PrintResult {Néu i =n thi in két qua}

else Try(i + 1); {Néu i chua phai 1a phan ti cudi thi tim tiép x[itl]}

Hinh 1; Cay tim kiém quay lui trong bai toan liét ké day nhi phan

3.2 LIET KE CAC TAP CON K PHAN TU

Input/Output cé khu6én dang nhw trong P_ 1 02 2.PAS

Dé liét ké cdc tap con k phan tir cia tap S = {1, 2, ., n} ta c6 thé dua vé liét ké cac cau hinh x[1 n], 6 day cac x[i] e S và x[1] < x[2]| < < x[k] Ta có nhận xét:

Lê Minh Hoàng

Trang 28

& 14 $® Chuyén dé x[k] <n

Trang 29

Bài toán liệt kê we 15 Néu dé y chuong trinh trén va chuong trinh liét ké day nhi phan d6 dai n, ta thay vé cơ bản chúng chỉ khác nhau ở thủ tục Try(1) - chọn thử các gia tri cho xi, 6 chương trình liệt kê day 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[ï] là một trong các giá trị nguyên từ x[i-I] + 1 đến n - k + ¡ 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 LIET KE CAC CHINH HOP KHONG LAP CHAP 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] e S và khác nhau đôi một

Như vậy thủ tục Try(ï) - xét tất cả các khả năng chọn x[{ï] - 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:

“+ Khoi tao mot mảng c[1 n] mang kiéu logic boolean O day c[i] cho biét gid tri i cd 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 phan tử từ 1 đến n đều tự do

s* Tại bước chọn các giá trị có thê của x[ï] ta chỉ xét những giá trị j co c[j] = TRUE có nghĩa

là chỉ chọn những gia tri tu do

s* Trước khi gọi đệ quy tìm x[i+1]: ta dat gia tri j va gan cho x[i] la da bi chon có nghĩa là đặt c[j] := FALSE để các thủ tục Try(¡ + 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+I]: có nghĩa là sắp tới ta sẽ thử gán một giá trị khác cho x[ï] thì ta sẽ đặt giá trị J vừa thử đó thành tự do (c[J] :E TRUE), bởi khi xi đã nhận một gia tri khác rồi thì các phần tử đứng sau: x[i+I1], 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() có ¡ = 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) cach

nhau ít nhất mot dau cach

Output: file van ban ARRANGE.OUT ghi cac chinh hop khéng lap chap k cua tap {1, 2, .,

Lé Minh Hoang

Trang 30

&? 16 $® Chuyén dé

e[j] := False; (Đánh dấu: ] đã bị chọn}

Try(1 + 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: ] 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, OutputFlle); Rewrite (f) ;

FillChar(c, SizeOf(c), True); {Tat ca cdc sé déu chua bi chon}

Try(1); (Thủ các cách chọn giá trị của x[1])

Trang 31

Bài toán liệt kê we 17 &

Thủ tục đệ quy Try() sẽ thử các giá trị có thể nhận của x[{ï] (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 ?

Luu y rang t[i - 1] 1a tong ctia tat cả các phân tử từ x[1] đến x[i-1] do đó

s* Khi t[i] = n tức là (x[i] = n - t[¡ - 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[I] tới x[I+T] không được vượt quá n Vậy ta có t[I+T] <n © t[I-1J + x[I] + x[Ir1] <n<> x[i| + x[I+T] < n - t[I-1J tức là x[I] < (n - t[i-I])⁄2 Ví dụ đơn giản khi n = T0 thi chon x[1] =

6, 7, §, 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 goi dé quy tim tiếp khi gia tri 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 qua chi khi x[i] mang gia tri đúng băng sô thiêu hụt của tông i-I phan tw dau so voi n

Vay thu tuc Try(i) thir cdc gia tri cho x[ï] có thể viết như sau: (để tổng quát cho ¡ = 1, ta đặt x[0]= 1 vàt[0]= 0)

s* Xét các giá trị của x[i] từ x{[i - 1] đến (n - t[i-1]) điv 2, cập nhật t[i| := t[i - 1] + x[i] va goi

đệ quy tìm tiệp

s* Cuối cùng xét giá tri x[i] =n - t[i-1] và in kết quả từ x[1] đến x[ï]

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

ANALYSR.INP || ANALYSE.OUT

Trang 32

& 18 we Chuyén dé t: array[0 max] of Integer;

Bây giờ ta xét tiếp một ví dụ kinh điển của thuật toán quay lui:

3.5 BÀI TOÁN XÉP HẬU

3.5.1 Bài toán

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:

DHSPHN 1999-2004

Trang 33

Bai toan liét ke & 19 &

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 nhat 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

ô đó có tính chất: Hàng - Cột = C (Const) Với mỗi đường chéo ĐN-TB ta có 1 hăng sô C

và với một hăng sô C: l -n <ŒC <n- I1 xác định duy nhat I đường chéo ĐN-TB vì vậy ta

có thê đánh chỉ số cho các đường chéo ĐN- TB từ 1 - n đến n - 1

Hình 3: Đường chéo ĐB-TN mang chỉ số 10 và đường chéo ĐN-TB mang chỉ số 0

Lé Minh Hoang

Trang 34

& 2() eo Chuyén dé Cai dat:

s* 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 l1 ăn, lại thử l 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

s* Khi chọn vị trí cột j cho quân hậu thứ ¡, 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 (1I+J) còn tự do, đường chéo ĐN-TB(-j) còn tự do Điều này có thể kiểm tra (a[j] = b[i+j] = c[i-j] = TRUE)

s* Khi thử đặt được quân hậu thứ ¡ vào cột j, nễu đó là quân hậu cuối cùng (¡ = 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ứ ¡ + 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

và những đường chéo này nữa

> Sau khi gọi đệ quy tìm cách đặt quân hậu thứ ¡ + 1, có nghĩa là sắp tới ta lại thử một

cách đặt khác cho quân hậu thứ 1, ta bỏ đánh dấu cột và 2 đường chéo bị quân hậu vừa

thử đặt khống chế (a[j] = b[i+j] = c[i-j] := TRUE) tức là cột và 2 đường chéo đó lại

thành tự do, bởi khi đã đặt quân hậu 1 sang vị trí khác rồi thì cột và 2 đường chéo đó

hoàn toàn có thể gán cho một quân hậu khác

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

dau O đâ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 dau 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 Truong 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 vi

* Input: file văn bản QUEENS.INP chứa số nguyên dương n < 12

“+ Output: file van bản QUEENS.OUT, mỗi dòng ghi một cách đặt n quân hậu

DHSPHN 1999-2004

Trang 35

Bài toán liệt kê 2] &

QUEENS INP || QUEENS OUT

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

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

FillChar(a, SizeOf(a), True); {Moi c6t déu ty do}

FillChar(b, SizeOf(b), True); {Moi dudng chéo Béng Bac - Tay Nam déu ty do}

FillChar(c, $izeOf(c), True}; (Mọi đường chéo Đông Nam - Tây Bắc déu ty do}

a[j] := False; bli + j] := False; cli - j] := False; {Ddnh dau}

Try(1 + 1); (Tìm các cách đặt quân hậu thứ ¡ + 1}

a[j] := True; bli + j] := True; c[i - j] := True; {Bd ddnh dau}

Trang 36

& 27 eo Chuyén dé

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[¡], đó chính là nguồn gốc của tên gọi "thuật toán quay lui"

Cho hai số nguyên dương I, n Hãy liệt kê các xâu nhị phân độ dài n có tinh chat, bat ky hai

xâu con nào độ dài I liền nhau đều khác nhau

Mot day x[1 n] gọi là một hoán vị hoàn toàn của tập {l, 2, ., n} nếu nó là một hoán vị và

thoả mãn x[ï]| # ¡ với Vi: l <¡ < n Hãy viết chương trình liệt kê tất cả các hoán vị hoản toàn của tập trên (n vào từ bàn phím)

Trang 37

Bài toán liệt kê œ@› 23 q® 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

Bai 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

Lê Minh Hoàng

Trang 38

& 24 Le Chuyén dé

§4 KY THUAT NHANH CAN

4.1 BÀI TOÁN TOI UU

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 dé 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 gia tri được chọn cho x[I] sẽ ứng với chỉ 2 nút tương ứng với 2 giá frỊ

mà x[i+I] có thể nhận thì cây n cấp sẽ có tới 2" 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[{ï] thì sẽ phải trả gid rat 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(1: Integer) ;

begin

for (Mọi giá trị V có thể gán cho x[i]} do

begin

(Thử cho x[i] := V);

if @iệc thử trên vẫn còn hi vọng tìm ra cấu hình tốt hơn BESTCONFTG}) 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+i]}

(Bỏ ghi nhận việc thử cho x[i] = V (nếu cần));

Trang 39

Bài toán liệt kê 225 q®

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ố ¡ đến thành phó j Giả thiết rang Ci, i] = 0 với Vi, CỊi, j]= +œ nếu không có đường trực tiếp từ thành phó ¡ đế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 thuong 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[I1 n] lập thành 1

hoan vi cua (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), với mỗi cách thử chọn x[2] như vậy thì x[3] có thể chọn một trong các thành phó mà x[2] có đường đi tới (ngoài x[I]) Tổng quát: x[ï] có thể chọn 1 trong các thành phố chưa đi qua mà

từ x{[i-I] có đường đi trực tiếp tới (1 < ¡ < n)

Nhánh cận: Khởi tạo câu hình BestConfig có chi phí = + Với mỗi bước thử chọn x[¡] xem chi phí đường đi cho tới lúc đó có < Chi phí của câu hình BestConfig?, nêu không nhỏ hơn thì thử giá trị khác ngay bởi có đi tiếp cũng chỉ tốn thêm Khi thử được một giá trị x[n] ta kiêm tra xem x[n] có đường đi trực tiếp về 1 không ? Nếu có đánh giá chi phí đi từ thành phó 1 đến thành phố x[n] cộng với chi phí từ x[n] đi trực tiếp về 1, nếu nhỏ hơn chi phí của đường đi BestConfig thì cập nhật lại BestConfig băng cách đi mới

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

Lê Minh Hoàng

Trang 40

&2 26 eo Chuyén dé 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 van ban TOURISM.INP

s* 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

TOURISM INP | TOURISM.OUT

C: array[1 max, 1 max] of Integer; {Ma tran chi phi}

X, BestWay: array[1 max + 1] of Integer; {X dé thi cdc kha nang, BestWay dé ghi nhan nghiém}

T: array[1 max + 1] of Integer; {T{i] dé luu chi phi đi từ X[1] đến Xii]}

Free: array[1 max] of Boolean; {Free dé dénh dau, *rzeeii]= True nếu chưa đi qua tp 1}

FillChar (Free, n, True);

Free[l] := False; (Các thành phố là chua đi qua ngoại trù thành phố 1}

X[1] := 1; (Xuất phát tù thành phố ¡}

T[1] := 0; (Chỉ phí tại thành phố xuất phát là 0}

DHSPHN 1999-2004

Ngày đăng: 26/10/2012, 14:08

HÌNH ẢNH LIÊN QUAN

Hình  19:  Các  dạng  cây  nhị  phân  suy  biến - Giải thuật và lập trình
nh 19: Các dạng cây nhị phân suy biến (Trang 86)
Hình  37:  Cài  đặt  các  thuật  toán  sắp  xếp  với  dữ  liệu  lớn - Giải thuật và lập trình
nh 37: Cài đặt các thuật toán sắp xếp với dữ liệu lớn (Trang 135)
Hình  48:  Cây  tìm  kiếm  cơ  số  a)  và  Trie  tìm  kiếm  cơ  số  b) - Giải thuật và lập trình
nh 48: Cây tìm kiếm cơ số a) và Trie tìm kiếm cơ số b) (Trang 152)
Hình  53:  Phân  loại  đồ  thị - Giải thuật và lập trình
nh 53: Phân loại đồ thị (Trang 191)
Hình 63: Đơn đồ thị vô hướng và bao đóng của nó - Giải thuật và lập trình
Hình 63 Đơn đồ thị vô hướng và bao đóng của nó (Trang 207)
Hình 64: Ba dạng cung ngoài cây DFS - Giải thuật và lập trình
Hình 64 Ba dạng cung ngoài cây DFS (Trang 211)
Hình 65: Thu ậ t toán Tarjan &#34;b ẻ &#34; cây DFS - Giải thuật và lập trình
Hình 65 Thu ậ t toán Tarjan &#34;b ẻ &#34; cây DFS (Trang 213)
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) - Giải thuật và lập trình
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) (Trang 222)
Hình 69: Phép định chiều DFS - Giải thuật và lập trình
Hình 69 Phép định chiều DFS (Trang 225)
Hình 70: Phép đánh số và ghi nhận cung ngược lên cao nhất - Giải thuật và lập trình
Hình 70 Phép đánh số và ghi nhận cung ngược lên cao nhất (Trang 227)
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)) - Giải thuật và lập trình
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 - Giải thuật và lập trình
Hình 79 Mạng thặng dư và đường tăng luồng (Trang 276)
Hình 88: Thuật toán Hungari - Giải thuật và lập trình
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 - Giải thuật và lập trình
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 - Giải thuật và lập trình
Hình 91 Phép chập Blossom (Trang 320)

TỪ KHÓA LIÊN QUAN

w