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

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

332 649 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

Định dạng
Số trang 332
Dung lượng 12,55 MB

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

LÊ MINH HOÀNG BÀI GI NG CHUYÊN : GI I THU T VÀ L P TRÌNH Bài gi ng chuyên i h c S ph m Hà N i, 1999-2002 Try not to become a man of success but rather to become a man of value Albert Einstein i M CL C PH N BÀI TOÁN LI T KÊ §1 NH C L I M T S KI N TH C IS T H P 1.1 CH NH H P L P 1.2 CH NH H P KHÔNG L P 1.3 HOÁN V 1.4 T H P §2 PH NG PHÁP SINH (GENERATION) 2.1 SINH CÁC DÃY NH PHÂN DÀI N 2.2 LI T KÊ CÁC T P CON K PH N T 2.3 LI T KÊ CÁC HOÁN V §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 TỐ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 C U TRÚC D §1 CÁC B CC LI U VÀ GI I THU T 33 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 TỐ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 TỐ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 TỐN V I TÌNH TR NG D LI U VÀO 45 2.5 CHI PHÍ TH C HI N THU T TỐN 46 ii §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 TỐ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 iii 9.5 PHÉP B M (HASH) 130 9.6 KHOÁ S V I BÀI TỐ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 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 CÁC THU T TỐN TRÊN §1 CÁC KHÁI NI M C TH 175 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 TỐN TÌM KI M TRÊN TH 184 3.1 BÀI TOÁN 184 3.2 THU T TỐN TÌM KI M THEO CHI U SÂU (DEPTH FIRST SEARCH) 185 3.3 THU T TỐN TÌM KI M THEO CHI U R NG (BREADTH FIRST SEARCH) 187 3.4 PH C T P TÍNH TỐ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 iv 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 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 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 TỐN FORD BELLMAN 230 8.4 TR NG H P TR NG S TRÊN CÁC CUNG KHƠNG ÂM - THU T TỐ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 TỐ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 TỐ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 TỐ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 v §12 BÀI TỐ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 TỐ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 TỐ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 TỐN 313 TÀI LI U C THÊM 315 vi HÌNH V Hình 1: Cây tìm ki m quay lui tốn li t kê dãy nh phân .13 Hình 2: X p quân h u bàn c 8x8 .19 Hình 3: ng chéo B-TN mang ch s 10 Hình 4: L u ng chéo N-TB mang ch s 19 thu t gi i (Flowchart) 36 Hình 5: Ký pháp l n, l n 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 Hình 8: Danh sách n i n 59 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 nút 71 Hình 18: Cây bi u di n bi u th c 71 Hình 19: Các d ng nh phân suy bi n 72 Hình 20: Cây nh phân hồn ch nh nh phân y Hình 21: ánh s nút c a nh phân bi u di n b ng m ng 73 Hình 22: Nh c i m c a ph y .72 ng pháp bi u di n b ng m ng .73 Hình 23: C u trúc nút c a nh phân .74 Hình 24: Bi u di n b ng c u trúc liên k t .74 Hình 25: ánh s nút c a 3_phân bi u di n b ng m ng 76 Hình 26: Bi u di n t ng quát b ng m ng 77 Hình 27: C u trúc nút c a t ng quát 78 Hình 28: Bi u th c d i d ng nh phân 79 Hình 29: Vịng l p c a QuickSort 94 Hình 30: Tr ng thái tr c g i quy 95 Hình 31: Heap 100 Hình 32: Vun Hình 33: ng 100 o giá tr k[1] cho k[n] xét ph 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 bit .104 Hình 36: Thu t tốn s p x p tr n .109 Hình 37: Cài t thu t toán s p x p v i d li u l n 121 vii Hình 38: Cây nh phân tìm ki m 126 Hình 39: Xóa nút BST 127 Hình 40 Xóa nút ch có m t nhánh BST 128 Hình 41: Xóa nút có c hai nhánh BST thay b ng nút c c ph i c a trái 128 Hình 42: Xóa nút có c hai nhánh BST thay b ng nút c c trái c a ph i 128 Hình 43: ánh s 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, tìm ki m c s g m khoá 2, 4, sau thêm giá tr 135 Hình 47: RST ch a khoá 2, 4, 5, RST sau lo i b giá tr 136 Hình 48: Cây tìm ki m c s a) 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 tốn truy v t 152 Hình 51: Truy v t 160 Hình 52: Ví d v mơ hình Hình 53: Phân lo i th 176 th 177 Hình 54 180 Hình 55 181 Hình 56: th ng i 184 Hình 57: Cây DFS 187 Hình 58: Cây BFS 190 Hình 59: th G thành ph n liên thơng G1, G2, G3 c a 191 Hình 60: Kh p c u 191 Hình 61: Liên thơng m nh liên thơng y u 192 Hình 62: th Hình 63: n y 193 th vơ h ng bao óng c a 193 Hình 64: Ba d ng cung DFS 197 Hình 65: Thu t toán Tarjan "b " DFS 199 Hình 66: ánh s l i, o chi u cung t BFS v i cách ch n nh xu t phát ng c l i v i th t t xong (th t 11, 10… 3, 2, 1) 204 Hình 67: th G m t s ví d khung T1, T2, T3 c a 208 Hình 68: Cây khung DFS (a) khung BFS (b) (M i tên ch chi u i th m Hình 69: Phép nh) 208 nh chi u DFS 211 Hình 70: Phép ánh s ghi nh n cung ng Hình 71: Mơ hình c lên cao nh t 213 th c a toán b y 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 g c r1 r2 m i h p nh t chúng 249 viii Hình 77: M ng v i kh n ng thông qua (1 phát, thu) m t lu ng c a v i giá tr 257 Hình 78: M ng G m ng th ng d Gf t ng ng (ký hi u f[u,v]:c[u,v] ch lu ng f[u, v] kh n ng thông qua c[u, v] cung (u, v)) 261 Hình 79: M ng th ng d Hình 80: Lu ng m ng G tr ng t ng lu ng 262 c sau t ng 262 Hình 81: M ng gi c a m ng có nhi u i m phát nhi u i m thu 273 Hình 82: Thay m t nh u b ng hai nh uin, uout 274 Hình 83: M ng gi c a m ng có kh n ng thơng qua c a cung b ch n hai phía 274 Hình 84: th hai phía 280 Hình 85: th hai phía b ghép M .281 Hình 86: Mơ hình lu ng c a tốn tìm b ghép c c i 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 tìm Hình 90: ng 299 th G 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 304 Chun §13 BÀI TỐN TÌM B GHÉP C C I TRÊN TH 13.1 CÁC KHÁI NI M Xét th G = (V, E), m t b ghép chung Bài tốn tìm b ghép c c Cho m t i th G m t t p c nh m t khơng có th t ng qt phát bi u nh sau: th G, ph i tìm m t b ghép c c V i m t b ghép M c a Nh ng c nh thu c M nh i G (b ghép có nhi u c nh nh t) th G, ta g i: c g i c nh ã ghép hay c nh Nh ng c nh không thu c M m c g i c nh ch a ghép hay c nh nh t Nh ng nh u mút c a c nh nh ch a ghép m c g i nh ã ghép, nh ng nh l i g i M t ng i c b n ( ng i khơng có nh l p l i) c g i ng pha n u b t u b ng m t c nh nh t ti p theo c nh m, nh t n m n i ti p xen k M t chu trình c b i qua nh t m, nh t n m n i c g i nh c ng m m t ghép Ví d : V i n (chu trình khơng có nh l p l i) c g i m t Blossom n u nh, b t u k t thúc b ng c nh nh t d c chu trình, c nh ti p xen k nh xu t phát c a chu trình (c ng nh k t thúc) s (base) c a Blossom ng pha b t u m t nh ch a ghép k t thúc m t nh ch a th G b ghép M Hình 90: ng (8, 1, 2, 5, 6, 4) m t ng pha Chu trình (2, 3, 4, 6, 5, 2) m t Blossom ng (8, 1, 2, 3, 4, 6, 5, 7) m t ng m ng (8, 1, 2, 3, 4, 6, 5, 2, 1, 9) có c nh m/nh t xen k nh ng không ph i pha (và t t nhiên không ph i ng m ) ây khơng ph i ng i c b n ng Hình 90: th G m t b ghép M Ta d dàng suy c tính ch t sau: HSPHN 1999-2004 Lý thuy t th ng m c ng nh Blossom c nh m úng c nh 305 u ng i Trong m i Blossom, nh ng nh khơng ph i v i nh ó c ng ph i thu c Blossom dài l v i s c nh nh t nhi u h n s nh c s u nh ã ghép nh ghép Vì Blossom m t chu trình nên m i Blossom, nh ng nh không ph i nh c s u t n t i hai ng pha t nh c s i n nó, m t ng k t thúc b ng c nh m m t ng k t thúc b ng c nh nh t, hai ng pha c hình thành b ng cách i d c theo chu trình theo hai h ng ng c Nh ví d Hình 90, nh có hai ng pha i nh c s i t i: (2, 3, 4) ng pha k t thúc b ng c nh m (2, 5, 6, 4) ng pha k t thúc b ng c nh nh t 13.2 THU T TOÁN EDMONDS (1965) C s c a thu t toán nh lý (C.Berge): M t b ghép M c a không t n t i ng m i v i M th G c c i ch Thu t toán Edmonds: M := ; nh u ch a ghép) for ( if Tìm ng m xu t phát t u then D c ng m : Lo i b nh ng c nh Tr v M b ghép c c i G ; m kh i M; Thêm vào M nh ng c nh nh t ; i u khó nh t thu t toán Edmonds ph i xây d ng thu t tốn tìm ng m xu t phát t m t nh ch a ghép Thu t tốn ó c xây d ng b ng cách k t h p m t thu t tốn tìm ki m th v i phép ch p Blossom Xét nh ng ng pha xu t phát t m t nh x ch a ghép Nh ng nh có th n b ng m t ng pha k t thúc c nh nh t c gán nhãn "nh t", nh ng nh có th t x b ng m t ng pha k t thúc c nh m c gán nhãn " m" ct x n c V i m t Blossom, ta nh ngh a phép ch p (shrink) phép thay th nh Blossom b ng m t nh nh t Nh ng c nh n i gi a m t nh thu c Blossom t i m t nh v ó khơng thu c Blossom c thay th b ng c nh n i gi a nh ch p v i v gi nguyên tính m/nh t D th y r ng sau m i phép ch p, c nh m v n c m b o b ghép th m i: Lê Minh Hoàng 306 Chuyên Shrink Shrink Blossom Blossom = = nh c s c a blossom nh ch p t blossom Hình 91: Phép ch p Blossom Thu t tốn tìm Tr ch t ng m xu t phát t nh xu t phát x nh x có th phát bi u nh sau c gán nhãn m Ti p theo thu t toán tìm ki m th b t u t x, theo nguyên t c: t nh m ch c phép i ti p theo c nh nh t t nh nh t ch c i ti p theo c nh m M i th m t i m t nh, ta gán nhãn m/nh t cho nh ó ti p t c thao tác tìm ki m th nh bình th ng C ng trình tìm ki m, m i phát hi n th y m t c nh nh t n i hai nh m, ta d ng l i n u gán nhãn ti p s g p tình tr ng m t nh có c hai nhãn m/nh t, tr ng h p này, Blossom c phát hi n (xem tính ch t c a Blossom) b ch p thành m t nh, thu t toán cb t ul iv i th m i cho t i tr l i c câu h i: "có t n t i ng m xu t phát t x hay khơng?" N u ng m tìm c khơng i qua nh ch p ta ch vi c t ng c p d c theo ng m N u ng m có i qua m t nh ch p ta l i n nh ch p ó thành Blossom thay nh ch p ng m b ng m t o n ng xuyên qua Blossom: Expand Hình 92: N Blossom dị Expand ng xuyên qua Blossom HSPHN 1999-2004 Lý thuy t th 307 L u ý r ng không ph i Blossom c ng b ch p, ch nh ng Blossom nh h ng t i trình tìm ng m m i ph i ch p m b o r ng ng m tìm c ng i c b n Tuy nhiên vi c cài t tr c ti p phép ch p Blossom n nh r c r i, òi h i m t ch ng trình v i ph c t p O(n ) D i ây ta s trình bày m t ph ng pháp cài t hi u qu h n v i ph c t p O(n3), ph ng pháp cài t không ph c t p, nh ng yêu c u ph i hi u r t rõ b n ch t thu t tốn 13.3 THU T TỐN LAWLER (1973) Trong thu t toán Edmonds, sau ch p m i Blossom thành m t nh nh ó hoàn toàn l i có th n m m t Blossom m i b ch p ti p Thu t toán Lawler ch quan tâm n nh ch p cu i cùng, i di n cho Blossom nh t (Outermost Blossom), nh ch p cu i c nh danh ( ánh s ) b ng nh c s c a Blossom nh t C ng thao tác ch p/n nói mà ta c n m r ng khái ni m Blossom, có th coi m t Blossom m t t p nh n t m t nh ch p ch không n thu n ch m t chu trình pha c b n n a Xét m t Blossom B có nh c s nh r V i v B, v r, ta l u l i hai ng pha t r t i v, m t ng k t thúc b ng c nh m m t ng k t thúc b ng c nh nh t, nh v y có hai lo i v t gãn cho m i nh v (hai v t c c p nh t trình tìm ng): S[v] nh li n tr c v lo i S[v] = ng pha k t thúc b ng c nh m, n u không t n t i ng pha T[v] nh li n tr c v lo i T[v] = ng pha k t thúc b ng c nh nh t, n u không t n t i ng pha Bên c nh hai nhãn S T, m i nh v cịn có thêm: Nhãn b[v] nh c s c a Blossom ch a v Hai nh u v thu c m t Blossom b[u] = b[v] Nhãn match[v] nh ghép v i Khi ó thu t tốn tìm B nh v N u v ch a ghép match[v] = ng m b t ut nh x ch a ghép có th phát bi u nh sau: c 1: (Init) Hàng i Queue dùng V im i Gán S[x] ch a nh ng nh m ch t, ban nh u, kh i gán b[u] = u match[u] = v i u V i u x, gán S[u] = V i v: gán T[v] = B c 2: (BFS) L p l i b V im i nh Lê Minh Hoàng c sau cho t i hàng i r ng: m u l y t Queue, xét nh ng c nh nh t (u, v): u ch g m m t nh m x 308 Chuyên N u v ch a th m: N u: v nh ch a ghép v nh ã ghép Tìm th y th m v ng m k t thúc v, d ng th m match[v] y match[v] vào Queue L u v t: C p nh t hai nhãn S T N u v ã th m N u v nh nh t ho c b[v] = b[u] N u v nh m b[v] b qua b[u] ta phát hi n c blossom m i ch a u v, ó: Phát hi n nh c s : Truy v t ng i ng c t hai nh m u v theo hai ng pha v nút g c, ch n l y nh a nh m chung g p u tiên trình truy v t ng c Khi ó Blossom m i phát hi n s có nh c s a Gán l i v t: G i (a = i[1], i[2], …, i[p] = u) (a = j[1], j[2], …, j[q] = v) l n l t hai ng pha d n t a t i u v Khi ó (a = i[1], i[2], …, i[p] = u, j[q] = v, j[q1], …, j[1] = a) m t chu trình pha i t a t i u v r i quay tr v a B ng cách i d c theo chu trình theo hai h ng ng c nhau, ta có th gán l i t t c nhãn S T c a nh ng nh chu trình L u ý r ng không c gán l i nhãn S T cho nh ng nh k mà b[k] = a, v i nh ng nh k có b[k] nhãn S T theo chu trình b t k S[k] T[k] tr Ch p Blossom: Xét nh ng c t t i (ch a bao gi ti p t i nh ng b c sau c nh y vào Queue) 0) mà ch a y v vào Queue ch t ng m tr v ng m , n u b c khơng tìm th y i r ng k t lu n khơng tìm th y ng m Sau ây m t s ví d v tr ng h p t nh ng m m u xét c nh nh t (u, v): ng h p 1: v ch a th m ch a ghép: S:2 x S:2 T:3 u u v x v T:1 T:1 Tìm th y Tr m (có nhãn S[v] c 3: N u b c tìm hàng Tr c ó ã có hay ch a nh v mà b[v] {b[i[1]], b[i[2]], …, b[i[p]], b[j[1]], b[j[2]], …, b[j[q]]}, gán l i b[v] = a N u v B a b t bu c ph i gán l i ng m ng h p 2: v ch a th m ã ghép HSPHN 1999-2004 Lý thuy t th 309 S:2 S:2 S:4 v u x T:3 v u x T:1 T:1 Th m c v l n match[v], gán nhãn T[v] S[match[v]] ng h p 3: v ã th m, Tr nh m thu c blossom v i u T:3 S:5 T:7 S:4 u x T:1 S:2 T:3 S:7 v T:5 S:6 b[.] = Không xét, b qua ng h p 4: v ã th m, Tr nh T:3 m b[u] b[v] T:3 S:5 T:7 S:4 S:4 a x T:1 S:2 x S:6 Phát hi n Blossom, tìm nh S:2 T:3 T:1 T:3 S:7 nh c s a = 3, gán l i nhãn S T d c chu trình pha m m i 4, vào hàng i, T i nh ng b c sau, t t i nh 6, s tìm th y m k t thúc 8, truy v t theo nhãn S T tìm c ng (1, 2, 3, 4, 5, 7, 6, 8) T:5 S:6 y hai ng T t ng c a ph ng pháp Lawler dùng nhãn b[v] thay cho thao tác ch p tr c ti p Blossom, dùng nhãn S T truy v t tìm ng m , tránh thao tác n Blossom Ph ng pháp d a m t nh n xét: M i tìm ng m , n u ng m ó xuyên qua m t Blossom ngồi nh t ch c ch n ph i i vào Blossom t nút c s thoát kh i Blossom b ng m t c nh nh t 13.4 CÀI Ta s cài T t ph ng pháp Lawler v i khuôn d ng Input/Output nh sau: Input: file v n b n GMATCH.INP Lê Minh Hồng 310 Chun Dịng 1: Ch a hai s n, m l n l cách (n t s c nh s nh c a 100) m dòng ti p theo, m i dòng ch a hai s u, v t ng tr ng cho m t c nh (u, v) c a Output: file v n b n GMATCH.OUT, ghi b ghép c c 10 Ch th cách nh t m t d u ng trình s a i m t chút mơ hình cài v m t nh m N u v nh i tìm th c GMATCH.INP 10 11 12 16 24 28 34 36 56 59 10 78 79 GMATCH.OUT 1) 2) 3) 4) 10 5) t d a vào nh n xét: v = x ho c match[v] m t nh nh t m S[v] = match[v] V y ta khơng c n ph i s d ng riêng m t m ng nhãn S[v], t i m i b s a nhãn v t T[v] mà ki m tra m t ki m tra b ng i u ki n: match[v] có khơng Ch nh v x có ph i nh c s a v t, ta ch c n m hay khơng, ta có th nh nh t hay khơng, hay T[match[v]] có khác hay ng trình s d ng bi n v i vai trò nh sau: match[v] b[v] nh ghép v i nh v nh c s c a Blossom ch a v T[v] nh li n tr c v ng pha t nh xu t phát t i v k t thúc b ng c nh nh t, T[v] = n u trình BFS ch a xét t i nh nh t v InQueue[v] bi n Boolean, InQueue[v] = True v nh m ã c y vào Queue ch t start finish: N i b t u k t thúc ng m P_4_13_1.PAS * Ph ng pháp Lawler áp d ng cho thu t toán Edmonds program MatchingInGeneralGraph; const InputFile = 'GMATCH.INP'; OutputFile = 'GMATCH.OUT'; max = 100; var a: array[1 max, max] of Boolean; match, Queue, b, T: array[1 max] of Integer; InQueue: array[1 max] of Boolean; n, Front, Rear, start, finish: Integer; procedure Enter; var i, m, u, v: Integer; HSPHN 1999-2004 Lý thuy t th 311 f: Text; begin Assign(f, InputFile); Reset(f); FillChar(a, SizeOf(a), False); ReadLn(f, n, m); for i := to m begin ReadLn(f, u, v); a[u, v] := True; a[v, u] := True; end; Close(f); end; procedure Init; {Kh i t o b ghép r ng} begin FillChar(match, SizeOf(match), 0); end; procedure InitBFS; {Th t c cgi kh i t o tr c tìm var i: Integer; begin {Hàng i ch g m m t nh m start} Front := 1; Rear := 1; Queue[1] := start; FillChar(InQueue, SizeOf(InQueue), False); InQueue[start] := True; {Các nhãn T c kh i gán = 0} FillChar(T, SizeOF(T), 0); {Nút c s c a outermost blossom ch a i i} for i := to n b[i] := i; finish := 0; {finish = ngh a ch a tìm th y ng m } end; procedure Push(v: Integer); { y m t begin Inc(Rear); Queue[Rear] := v; InQueue[v] := True; end; nh function Pop: Integer; {L y m t begin Pop := Queue[Front]; Inc(Front); end; m kh i hàng nh m v vào hàng ng m xu t phát t start} i} i, tr v k t qu hàm} {Khó nh t c a ph ng pháp Lawler th t c này: Th t c x lý g p c nh nh t n i hai procedure BlossomShrink(p, q: Integer); var i, NewBase: Integer; Mark: array[1 max] of Boolean; {Th t c tìm nút c s b ng cách truy v t ng c theo ng pha t p q} function FindCommonAncestor(p, q: Integer): Integer; var InPath: array[1 max] of Boolean; begin FillChar(InPath, SizeOf(Inpath), False); repeat {Truy v t t p} p := b[p]; {Nh y t i nút c s c a Blossom ch a p, phép nh y t ng t c InPath[p] := True; { ánh d u nút ó} Lê Minh Hoàng nh truy v t} m p, q} 312 Chuyên if p = start then Break; {N u ã truy v n n i xu t phát d ng} p := T[match[p]]; {N u ch a v n start truy lùi ti p hai b c, theo c nh m r i theo c nh nh t} until False; repeat {Truy v t t q, t ng t nh i v i p} q := b[q]; if InPath[q] then Break; {Tuy nhiên n u ch m vào ng pha c a p d ng ngay} q := T[match[q]]; until False; FindCommonAncestor := q; {Ghi nh n nh c s m i} end; procedure ResetTrace(x: Integer); {Gán l i nhãn v t d c ng pha t start t i x} var u, v: Integer; begin v := x; while b[v] NewBase {Truy v t ng pha t start t i nh m x} begin u := match[v]; Mark[b[v]] := True; { ánh d u nhãn blossom c a nh ng i} Mark[b[u]] := True; v := T[u]; if b[v] NewBase then T[v] := u; {Ch t l i v t T[v] n u b[v] không ph i nút c s m i} end; end; begin {BlossomShrink} FillChar(Mark, SizeOf(Mark), False); {T t c nhãn b[v] u ch a b ánh d u} NewBase := FindCommonAncestor(p, q); {xác nh nút c s } {Gán l i nhãn} ResetTrace(p); ResetTrace(q); if b[p] NewBase then T[p] := q; if b[q] NewBase then T[q] := p; {Ch p blossom gán l i nhãn b[i] n u blossom b[i] b ánh d u} for i := to n if Mark[b[i]] then b[i] := NewBase; {Xét nh ng nh m i ch a c a vào Queue n m Blossom m i, y i Queue for i := to n if not InQueue[i] and (b[i] = NewBase) then Push(i); end; ch t sau} {Th t c tìm ng m } procedure FindAugmentingPath; var u, v: Integer; begin InitBFS; {Kh i t o} repeat {BFS} u := Pop; {Xét nh ng nh v ch a t, k v i u, không n m Blossom v i u} for v := to n if (T[v] = 0) and (a[u, v]) and (b[u] b[v]) then {d nhiên T[v] = (u, v) c nh nh t r i} begin if match[v] = then {N u v ch a ghép ghi nh n nh k t thúc ng m thoát ngay} begin T[v] := u; finish := v; Exit; end; {N u v nh m gán l i v t, ch p Blossom …} if (v = start) or (T[match[v]] 0) then BlossomShrink(u, v) HSPHN 1999-2004 Lý thuy t th else {N u khơng ghi v t begin T[v] := u; Push(match[v]); end; end; until Front > Rear; end; procedure Enlarge; {N i r ng b ghép b i var v, next: Integer; begin repeat v := T[finish]; next := match[v]; match[v] := finish; match[finish] := v; finish := next; until finish = 0; end; 313 ng i, th m v, th m c match[v] ng m b t u t start, k t thúc procedure Solve; {Thu t toán Edmonds} var u: Integer; begin for u := to n if match[u] = then begin start := u; {V i m i nh ch a ghép start} FindAugmentingPath; {Tìm ng m b t u t start} if finish then Enlarge; {N u th y n i r ng b ghép theo end; end; y ti p match[v] vào Queue} finish} ng m này} procedure Result; {In b ghép tìm c} var u, count: Integer; f: Text; begin Assign(f, OutputFile); Rewrite(f); count := 0; for u := to n if match[u] > u then {V a tránh s trùng l p (u, v) (v, u), v a lo i nh ng begin Inc(count); WriteLn(f, count, ') ', u, ' ', match[u]); end; Close(f); end; nh không ghép c (match=0)} begin Enter; Init; Solve; Result; end 13.5 PH C T P TÍNH TỐN Th t c BlossomShrink có ph c t p O(n) Th t c FindAugmentingPath c n không n l n g i th t c BlossomShrink, c ng thêm chi phí c a thu t tốn tìm ki m theo chi u r ng, có Lê Minh Hồng 314 Chun ph c t p O(n2) Ph ng pháp Lawler c n không n l n g i th t c FindAugmentingPath nên có ph c t p tính tốn O(n3) Cho n nay, ph ng pháp t t nh t gi i tốn tìm b ghép t ng qt bi t n c a Micali Vazizani (1980), có th c ph c t p tính tốn O( n.m) B n có th tham kh o tài li u khác HSPHN 1999-2004 TÀI LI U C THÊM D i ây hai cu n sách có th nói kinh i n mà h u h t tài li u v thu t tốn trích d n nhi u t hai cu n sách Các b n nên tìm m i cách c Title: The Art of Computer Programming Author: Donald E Knuth Volume 1: Fundamental Algorithms Volume 2: Seminumerical Algorithms Volume 3: Sorting and Searching Volume 4: Combinatorial Algorithms (in preparation) Volume 5: Syntactic Algorithms (in preparation) Title: Introduction to Algorithms Authors: Thomas H.Cormen, Charles E.Leiserson, Ronald L.Rivest u ... b c xây d ng c u trúc d li u không th tách r i b c tìm ki m thu t tốn gi i quy t v n HSPHN 1999-2004 C u trúc d li u gi i thu t 35 Các tiêu chu n l a ch n c u trúc d li u C u trúc d li u tr toán... {1, 2, …, n} theo hai ph ng pháp Bài Nh p vào danh sách tên n ng i, in t t c cách x p n ng i ó vào m t bàn HSPHN 1999-2004 Bài toán li t kê 11 Bài Nh p vào danh sách n b n nam n b n n , in t t... 27 PH N C U TRÚC D §1 CÁC B CC LI U VÀ GI I THU T 33 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

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

TỪ KHÓA LIÊN QUAN

w