Bài giảng Kỹ thuật phân tích giải thuật

Tài liệu Bài giảng Kỹ thuật phân tích giải thuật: Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................ Trang 1 1. Mөc tiêu 2. KiӃn thӭc cѫ bҧn cҫn có ÿӇ hӑc chѭѫng này 3. Tài liӋu tham khҧo có liên quan ÿӃn chѭѫng 4. Nӝi dung: I.1 - Sӵ cҫn thiӃt phҧi phân tích giҧi thuұt. I.2 - Thӡi gian thӵc hiӋn cӫa giҧi thuұt. I.3 - Tӹ suҩt tăng và ÿӝ phӭc tҥp cӫa giҧi thuұt. I.4 - Cách tính ÿӝ phӭc tҥp. I.5 - Phân tích các chѭѫng trình ÿӋ quy. 5. Vҩn ÿӅ nghiên cӭu cӫa trang kӃ tiӃp Trong chѭѫng này chúng ta sӁ nghiên cӭu các vҩn ÿӅ sau: · Sӵ cҫn thiӃt phҧi phân tích các giҧi thuұt. · Thӡi gian thӵc hiӋn cӫa chѭѫng trình. · Tӹ suҩt tăng và ÿӝ phӭc tҥp cӫa giҧi thuұt. · Tính thӡi gian thӵc hiӋn cӫa chѭѫng trình. · Phân tích các chѭѫng trình ÿӋ quy. I.1- SӴ CҪN THIӂT PHҦI PHÂN TÍCH GIҦI THUҰT Trong khi giҧi mӝt bài toán chúng ta có thӇ có mӝt sӕ giҧi thuұt khác nhau, vҩn ÿӅ là cҫn phҧi ÿánh giá các giҧi thuұt ÿó ÿӇ lӵ...

pdf83 trang | Chia sẻ: hunglv | Lượt xem: 1352 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu Bài giảng Kỹ thuật phân tích giải thuật, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................ Trang 1 1. Mөc tiêu 2. KiӃn thӭc cѫ bҧn cҫn có ÿӇ hӑc chѭѫng này 3. Tài liӋu tham khҧo có liên quan ÿӃn chѭѫng 4. Nӝi dung: I.1 - Sӵ cҫn thiӃt phҧi phân tích giҧi thuұt. I.2 - Thӡi gian thӵc hiӋn cӫa giҧi thuұt. I.3 - Tӹ suҩt tăng và ÿӝ phӭc tҥp cӫa giҧi thuұt. I.4 - Cách tính ÿӝ phӭc tҥp. I.5 - Phân tích các chѭѫng trình ÿӋ quy. 5. Vҩn ÿӅ nghiên cӭu cӫa trang kӃ tiӃp Trong chѭѫng này chúng ta sӁ nghiên cӭu các vҩn ÿӅ sau: · Sӵ cҫn thiӃt phҧi phân tích các giҧi thuұt. · Thӡi gian thӵc hiӋn cӫa chѭѫng trình. · Tӹ suҩt tăng và ÿӝ phӭc tҥp cӫa giҧi thuұt. · Tính thӡi gian thӵc hiӋn cӫa chѭѫng trình. · Phân tích các chѭѫng trình ÿӋ quy. I.1- SӴ CҪN THIӂT PHҦI PHÂN TÍCH GIҦI THUҰT Trong khi giҧi mӝt bài toán chúng ta có thӇ có mӝt sӕ giҧi thuұt khác nhau, vҩn ÿӅ là cҫn phҧi ÿánh giá các giҧi thuұt ÿó ÿӇ lӵa chӑn mӝt giҧi thuұt tӕt (nhҩt). Thông thѭӡng thì ta sӁ căn cӭ vào các tiêu chuҭn sau: 1.- Giҧi thuұt ÿúng ÿҳn. 2.- Giҧi thuұt ÿѫn giҧn. 3.- Giҧi thuұt thӵc hiӋn nhanh. Vӟi yêu cҫu (1), ÿӇ kiӇm tra tính ÿúng ÿҳn cӫa giҧi thuұt chúng ta có thӇ cài ÿһt giҧi thuұt ÿó và cho thӵc hiӋn trên máy vӟi mӝt sӕ bӝ dӳ liӋu mүu rӗi lҩy kӃt quҧ thu ÿѭӧc so sánh vӟi kӃt quҧÿã biӃt. Thӵc ra thì cách làm này không chҳc chҳn bӣi vì có thӇ giҧi thuұt ÿúng vӟi tҩt cҧ các bӝ dӳ liӋu chúng ta ÿã thӱ nhѭng lҥi sai vӟi mӝt bӝ dӳ liӋu nào ÿó. Vҧ lҥi cách làm này chӍ phát hiӋn ra giҧi thuұt sai chӭ chѭa chӭng minh ÿѭӧc là nó ÿúng. Tính ÿúng ÿҳn cӫa giҧi thuұt cҫn phҧi ÿѭӧc chӭng minh Eҵng toán hӑc. Tҩt nhiên ÿLӅu này không ÿѫn giҧn và do vұy chúng ta sӁ không ÿӅ cұp ÿӃn ӣÿây. Khi chúng ta viӃt mӝt chѭѫng trình ÿӇ sӱ dөng mӝt vài lҫn thì yêu cҫu (2) là quan trӑng nhҩt. Chúng ta cҫn mӝt giҧi thuұt dӉ viӃt chѭѫng trình ÿӇ nhanh chóng có ÿѭӧc kӃt qӫa , thӡi gian thӵc hiӋn chѭѫng trình không ÿѭӧc ÿӅ cao vì dù sao thì chѭѫng trình ÿó cNJng chӍ sӱ dөng mӝt vài lҫn mà thôi. Tuy nhiên khi mӝt chѭѫng trình ÿѭӧc sӱ dөng nhiӅu lҫn thì thì yêu cҫu tiӃït kiӋm thӡi gianUpload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................ Trang 2 thӵc hiӋn chѭѫng trình lҥi rҩt quan trӑng ÿһc biӋt ÿӕi vӟi nhӳng chѭѫng trình mà khi thӵc hiӋn cҫn dӳ liӋu nhұp lӟn do ÿó yêu cҫu (3) sӁÿѭӧc xem xét mӝt cách kӻ càng. Ta gӑi nó là hiӋu quҧ thӡi gian thӵc hiӋn cӫa giҧi thuұt. I.2- THӠI GIAN THӴC HIӊN CӪA GIҦI THUҰT I.2.1- Thӡi gian thӵc hiӋn chѭѫng trình. I.2.2- Ĉѫn vӏÿo thӡi gian thӵc hiӋn. I.2.3- Thӡi gian thӵc hiӋn trong trѭӡng hӧp xҩu nhҩt. Mӝt phѭѫng pháp ÿӇ xác ÿӏnh hiӋu quҧ thӡi gian thӵc hiӋn cӫa mӝt giҧi thuұt là lұp trình nó và ÿo Oѭӡng thӡi gian thӵc hiӋn cӫa hoҥt ÿӝng trên mӝt máy tính xác ÿӏnh ÿӕi vӟi tұp hӧp ÿѭӧc chӑn lӑc các Gӳ liӋu vào. Thӡi gian thӵc hiӋn không chӍ phө thuӝc vào giҧi thuұt mà còn phө thuӝc váo tұp các chӍ thӏ Fӫa máy tính, chҩt lѭӧng cӫa máy tính và kӻ xҧo cӫa ngѭӡi lұp trình. Sӵ thi hành cNJng có thӇÿLӅu chӍnh ÿӇ thӵc hiӋn tӕt trên tұp ÿһc biӋt các dӳ liӋu vào ÿѭӧc chӑn. ĈӇ vѭӧt qua các trӣ ngҥi này, các nhà khoa hӑc máy tính ÿã chҩp nhұn tính phӭc tҥp cӫa thӟi gian ÿѭӧc tiӃp cұn nhѭ mӝt sӵÿo lѭӡng cѫ Eҧn sӵ thӵc thi cӫa giҧi thuұt. Thuұt ngӳ tính hiӋu quҧ sӁÿӅ cұp ÿӃn sӵÿo lѭӡng này và ÿһc biӋt ÿӕi Yӟi sӵ phӭc tҥp thӡi gian trong trѭӡng hӧp xҩu nhҩt. I.2.1- Thӡi gian thӵc hiӋn chѭѫng trình. Thӡi gian thӵc hiӋn mӝt chѭѫng trình là mӝt hàm cӫa kích thѭӟc dӳ liӋu vào, ký hiӋu T(n) trong ÿó n là kích thѭӟc (ÿӝ lӟn) cӫa dӳ liӋu vào. Ví dө 1-1: Chѭѫng trình tính tәng cӫa n sӕ có thӡi gian thӵc hiӋn là T(n) = cn trong ÿó c là Pӝt hҵng sӕ. Thӡi gian thӵc hiӋn chѭѫng trình là mӝt hàm không âm, tӭc là T(n) ³0 "n³0. I.2.2- Ĉѫn vӏÿo thӡi gian thӵc hiӋn. Ĉѫn vӏ cӫa T(n) không phҧi là ÿѫn vӏÿo thӡi gian bình thѭӡng nhѭ giӡ, phút giây... mà thѭӡng ÿѭӧc xác ÿӏnh bӣi sӕ các lӋnh ÿѭӧc thӵc hiӋn trong mӝt máy tính lý tѭӣng. Ví dө 1-2: Khi ta nói thӡi gian thӵc hiӋn cӫa mӝt chѭѫng trình là T(n) = cn thì có nghƭa là chѭѫng trình ҩy cҫn cn chӍ thӏ thӵc thi. I.2.3- Thӡi gian thӵc hiӋn trong trѭӡng hӧp xҩu nhҩt. Nói chung thì thӡi gian thӵc hiӋn chѭѫng trình không chӍ phө thuӝc vào kích thѭӟc mà còn phө thuӝc vào tính chҩt cӫa dӳ liӋu vào. Nghƭa là dӳ liӋu vào có cùng kích thѭӟc nhѭng thӡi gian thӵc hiӋn chѭѫng trình có thӇ khác nhau. Chҷng hҥn chѭѫng trình sҳp xӃp dãy sӕ nguyên tăng dҫn, khi ta cho vào dãy có thӭ tӵ thì thӡi gian thӵc hiӋn khác vӟi khi ta cho vào dãy chѭa có thӭ tӵ, hoһc khi ta cho vào mӝt dãy ÿã có thӭ tӵ tăng thì thӡi gian thӵc hiӋn cNJng khác so vӟi khi ta cho vào mӝt dãy ÿã có thӭ tӵ giҧm. Vì vұy thѭӡng ta coi T(n) là thӡi gian thӵc hiӋn chѭѫng trình trong trѭӡng hӧp xҩu nhҩt trên Gӳ liӋu vào có kích thѭóc n, tӭc là: T(n) là thӡi gian lӟn nhҩt ÿӇ thӵc hiӋn chѭѫng trình ÿӕi vӟi mӑi dӳ liӋu vào có cùng kích thѭӟc n. I.3- TӸ SUҨT TĂNG VÀ ĈӜ PHӬC TҤP CӪA GIҦI THUҰT Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................ Trang 3 I.3.1- Tӹ suҩt tăng I.3.2- Khái niӋm ÿӝ phӭc tҥp cӫa giҧi thuұt I.3.1- Tӹ suҩt tăng Ta nói rҵng hàm không âm T(n) có Wӹ suҩt tăng (growth rate) f(n) nӃu tӗn tҥi các hҵng sӕ c và n0 sao cho T(n) ” f(n) vӟi mӑi n • n0. Ta có thӇ chӭng minh ÿѭӧc rҵng “Cho mӝt hàm không âm T(n) bҩt kǤ, ta luôn tìm ÿѭӧc tӹ suҩt tăng f(n) cӫa nó”. Ví dө 1-3: Giҧ sӱ T(0) = 1, T(1) = 4 và tәng quát T(n) = (n+1)2. Ĉһt n0 = 1 và c = 4 thì vӟi mӑi n • 1 chúng ta dӉ dàng chӭng minh rҵng T(n) = (n+1)2” 4n2 vӟi mӑi n • 1, tӭc là tӹ suҩt tăng cӫa T(n) là n2. Ví dө 1-4: Tӹ suҩt tăng cӫa hàm T(n) = 3n3 + 2n2 là n3. Thӵc vұy, cho n0 = 0 và c = 5 ta dӉ dàng chӭng minh rҵng vӟi mӑi n • 0 thì 3n3 + 2n2” 5n3 I.3.2- Khái niӋm ÿӝ phӭc tҥp cӫa giҧi thuұt Giҧ sӱ ta có hai giҧi thuұt P1 và P2 vӟi thӡi gian thӵc hiӋn tѭѫng ӭng là T1(n) = 100n2 (vӟi tӹ suҩt tăng là n2) và T2(n) = 5n3 (vӟi tӹ suҩt tăng là n3). Giҧi thuұt nào sӁ thӵc hiӋn nhanh hѫn? Câu trҧ Oӡi phө thuӝc vào kích thѭӟc dӳ liӋu vào. Vӟi n < 20 thì P2 sӁ nhanh hѫn P1 (T2<T1), do hӋ sӕ cӫa 5n3 nhӓ hѫn hӋ sӕ cӫa 100n2 (5 20 thì ngѭѫc lҥi do sӕ mNJ cӫa 100n2 nhӓ hѫn sӕ mNJ Fӫa 5n3 (220 vì khi n<20 thì thӡi gian thӵc hiӋn cӫa cҧ P1 và P2 ÿӅu không lӟn và sӵ khác biӋt giӳa T1 và T2 là không ÿáng kӇ.. Nhѭ vұy mӝt cách hӧp lý là ta xét tӹ suҩt tăng cӫa hàm thӡi gian thӵc hiӋn chѭѫng trình thay vì xét chính bҧn thân thӡi gian thӵc hiӋn. Cho mӝt hàm T(n), T(n) gӑi là có ÿӝ phӭc tҥp f(n) nӃu tӗn tҥi các hҵng c, N0 sao cho T(n) ” cf(n) vӟi mӑi n • N0 (tӭc là T(n) có tӹ suҩt tăng là f(n)) và kí hiӋu T(n) là O(f(n)) (ÿӑc là “ô cӫa f(n)”) Ví dө 1-5: T(n)= (n+1)2 có tӹ suҩt tăng là n2 nên T(n)= (n+1)2 là O(n2) Chú ý: O(c.f(n))=O(f(n)) vӟi c là hҵng sӕ. Ĉһc biӋt O(c)=O(1) Nói cách khác ÿӝ phӭc tҥp tính toán cӫa giҧi thuұt là mӝt hàm chһn trên cӫa hàm thӡi gian. Vì Kҵng nhân tӱ c trong hàm chһn trên không có ý nghƭa nên ta có thӇ bӓ qua vì vұy hàm thӇ hiӋn ÿӝ phӭc Wҥp có các dҥng thѭӡng gһp sau: log2n, n, nlog2n, n2, n3, 22, n!, nn. Ba hàm cuӕi cùng ta gӑi là dҥng hàm mNJ, các hàm khác gӑi là hàm ÿa thӭc. Mӝt giҧi thuұt mà thӡi gian thӵc hiӋn có ÿӝ phӭc tҥp là mӝt hàm ÿa thӭc thì chҩp nhұn ÿѭӧc tӭc là có thӇ cài ÿһt ÿӇ thӵc hiӋn, còn các giҧi thuұt có ÿӝ phӭc tҥp hàm mNJ thì phҧi tìm cách cҧi tiӃn giҧi thuұt. Khi nói ÿӃn ÿӝ phӭc tҥp cӫa giҧi thuұt là ta muӕn nói ÿӃn hiӋu quҧ cӫa thӡi gian thӵc hiӋn cӫa chѭѫng trình nên ta có thӇ xem viӋc xác ÿӏnh thӡi gian thӵc hiên cӫa chѭѫng trình chính là xác ÿӏnh ÿӝ phӭc tҥp cӫa giҧi thuұt. I.4- CÁCH TÍNH ĈӜ PHӬC TҤP I.4.1- Qui tҳc cӝng I.4.2- Qui tҳc nhân Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................ Trang 4 I.4.3- Qui tҳc tәng quát ÿӇ phân tích mӝt chѭѫng trình I.4.4- Ĉӝ phӭc tҥp cӫa chѭѫng trình có gӑi chѭѫng trình con không ÿӋ qui Cách tính ÿӝ phӭc tҥp cӫa mӝt giҧi thuұt bҩt kǤ là mӝt vҩn ÿӅ không ÿѫn giҧn. Tuy nhiên ta có thӇ tuân theo mӝt sӕ nguyên tҳc sau: I.4.1- Qui tҳc cӝng: NӃu T1(n) và T2(n) là thӡi gian thӵc hiӋn cӫa hai ÿRҥn chѭѫng trình P1 và P2; và T1(n)=O(f(n)), T2(n)=O(g(n) thì thӡi gian thӵc hiӋn cӫa ÿRҥn hai chѭѫng trình ÿó Qӕi tiӃp nhau là T(n)=O(max(f(n),g(n))) Ví dө 1-6: LӋnh gán x:=15 tӕn mӝt hҵng thӡi gian hay O(1) LӋnh ÿӑc dӳ liӋu READ(x) tӕn mӝt hҵng thӡi gian hay O(1) Vұy thӡi gian thӵc hiӋn cҧ hai lӋnh trên nӕi tiӃp nhau là O(max(1,1))=O(1) I.4.2- Qui tҳc nhân: NӃu T1(n) và T2(n) là thӡi gian thӵc hiӋn cӫa hai ÿRҥn chѭѫng trình P1và P2 và T1(n) = O(f(n)), T2(n) = O(g(n) thì thӡi gian thӵc hiӋn cӫa ÿRҥn hai ÿRҥn chѭѫng trình ÿó Oӗng nhau là T(n) = O(f(n).g(n)) I.4.3- Qui tҳc tәng quát ÿӇ phân tích mӝt chѭѫng trình: - Thӡi gian thӵc hiӋn cӫa mӛi lӋnh gán, READ, WRITE là O(1) - Thӡi gian thӵc hiӋn cӫa mӝt chuӛi tuҫn tӵ các lӋnh ÿѭӧc xác ÿӏnh bҵng qui tҳc cӝng. Nhѭ Yұy thӡi gian này là thӡi gian thi hành mӝt lӋnh nào ÿó lâu nhҩt trong chuӛi lӋnh. - Thӡi gian thӵc hiӋn cҩu trúc IF là thӡi gian lӟn nhҩt thӵc hiӋn lӋnh sau THEN hoһc sau ELSE và thӡi gian kiӇm tra ÿLӅu kiӋn. Thѭӡng thӡi gian kiӇm tra ÿLӅu kiӋn là O(1). - Thӡi gian thӵc hiӋn vòng lһp là tәng (trên tҩt cҧ các lҫn lһp) thӡi gian thӵc hiӋn thân vòng Oһp. NӃu thӡi gian thӵc hiӋn than vòng lһp không ÿәi thì thӡi gian thӵc hiӋn vòng lһp là tích cӫa sӕ lҫn Oһp vӟi thӡi gian thӵc hiӋn thân vòng lһp. Ví dө 1-7: Tính thӡi gian thӵc hiӋn cӫa ÿRҥn chѭѫng trình procedure Bubble (var a: array[1..n] of integer); var i,j,temp: integer; begin {1} for i:=1 to n-1 do {2} for j:=n downto i+1 do {3} if a[j-1]>a[j] then begin { ÿәi chә a[i], a[j] } {4} temp:=a[j-1]; {5} a[j-1]:=a[j]; {6} a[j]:=temp; end; end; Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................ Trang 5 Cҧ ba lӋnh ÿәi chӛ {4} {5} {6} tӕn O(1) thӡi gian, do ÿó lӋnh {3} tӕn O(1). Vòng lһp {2} thӵc hiӋn (n-i) lҫn, mӛi lҫn O(1) do ÿó vòng lһp {2} tӕn O((n-i).1)=O(n-i). Vòng lһp {1} lһp (n-1) lҫn vұy ÿӝ phӭc tҥp cӫa giҧi thuұt là: I.4.4- Ĉӝ phӭc tҥp cӫa chѭѫng trình có gӑi chѭѫng trình con không ÿӋ qui NӃu chúng ta có mӝt chѭѫng trình vӟi các chѭѫng trình con không ÿӋ quy, ÿӇ tính thӡi gian thӵc hiӋn cӫa chѭѫng trình, trѭӟc hӃt chúng ta tính thӡi gian thӵc hiӋn cӫa các chѭѫng trình con không Jӑi các chѭѫng trình con khác. Sau ÿó chúng ta tính thӡi gian thӵc hiӋn cӫa các chѭѫng trình con chӍ Jӑi các chѭѫng trình con mà thӡi gian thӵc hiӋn cӫa chúng ÿã ÿѭӧc tính. Chúng ta tiӃp tөc quá trình ÿánh giá thӡi gian thӵc hiӋn cӫa mӛi chѭѫng trình con sau khi thӡi gian thӵc hiӋn cӫa tҩt cҧ các chѭѫng trình con mà nó gӑi ÿã ÿѭӧc ÿánh giá. Cuӕi cùng ta tính thӡi gian cho chѭѫng trình chính. Giҧ sӱ ta cô mӝt hӋ thӕng các chѭѫng trình gӑi theo sѫÿӗ sau: Chѭѫng trình A gӑi hai chѭѫng trình con là B và C, chѭѫng trình B gӑi hai chѭѫng trình con là B1 và B2, chѭѫng trình B1 gӑi hai chѭѫng trình con là B11 và B12. ĈӇ tính thӡi gian thӵc hiӋn cӫa A, ta tính theo các bѭӟc sau: - Tính thӡi gian thӵc hiӋn cӫa C, B2, B11 và B12. - Tính thӡi gian thӵc hiӋn cӫa B1. - Tính thӡi gian thӵc hiӋn cӫa B. - Tính thӡi gian thӵc hiӋn cӫa A. Ví dө 1-8: Ta có thӇ viӃt lҥi chѭѫng trình sҳp xӃp bubble nhѭ sau: procedure Swap (var x, y: integer); var temp: integer; begin temp := x; x := y; y := temp; end; Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................ Trang 6 procedure Bubble (var a: array[1..n] of integer); var i,j :integer; begin {1} for i:=1 to n-1 do {2} for j:=n downto i+1 do {3} if a[j-1]>a[j] then Swap(a[j-1], a[j]); end; Trong cách viӃt trên, chѭѫng trình Bubble gӑi chѭѫng trình con Swap, do ÿó ÿӇ tính thӡi gian thӵc hiӋn cӫa Bubble, trѭӟc hӃt ta cҫn tính thӡi gian thӵc hiӋn cӫa Swap. DӉ thҩy thӡi gian thӵc hiӋn Fӫa Swap là O(1) vì nó chӍ bao gӗm 3 lӋnh gán. Trong Bubble, lӋnh {3} gӑi Swap nên chӍ tӕn O(1), lӋnh {2} thӵc hiӋn n-i lҫn, mӛi lҫn tӕn O(1) nên tӕn O(n-i). LӋnh {1} thӵc hiӋn n-1 lҫn nên I.5- PHÂN TÍCH CÁC CHѬѪNG TRÌNH Ĉӊ QUY I.5.1- Thành lұp phѭѫng trình ÿӋ quy I.5.2- Giҧi phѭѫng trình ÿӋ quy Vӟi các chѭѫng trình có gӑi các chѭѫng trình con ÿӋ quy, ta không thӇ áp dөng cách tính nhѭ Yӯa trình bày trong mөc I.4.4 bӣi vì mӝt chѭѫng trình ÿӋ quy sӁ gӑi chính bҧn thân nó. Vӟi các chѭѫng trình ÿӋ quy, trѭӟc hӃt ta cҫn thành lұp các phѭѫng trình ÿӋ quy, sau ÿó giҧi phѭѫng trình ÿӋ quy, nghiӋm cӫa phѭѫng trình ÿӋ quy sӁ là thӡi gian thӵc hiӋn cӫa chѭѫng trình ÿӋ quy. I.5.1- Thành lұp phѭѫng trình ÿӋ quy Phѭѫng trình ÿӋ quy là mӝt phѭѫng trình biӇu diӉn mӕi liên hӋ giӳa T(n) và T(k), trong ÿó T(n) là thӡi gian thӵc hiӋn chѭѫng trình vӟi kích thѭӟc dӳ liӋu nhұp là n, T(k) thӡi gian thӵc hiӋn chѭѫng trình vӟi kích thѭӟc dӳ liӋu nhұp là k, vӟi k < n. ĈӇ thành lұp ÿѭӧc phѭѫng trình ÿӋ quy, ta phҧi căn cӭ vào chѭѫng trình ÿӋ quy. Ví dө 1-9: Xét hàm tính giai thӯa viӃt bҵng giҧi thuұt ÿӋ quy nhѭ sau: function Giai_thua(n:integer): integer; begin if n=0 then Giai_thua :=1 else Giai_thua := n* Giai_thua(n-1); end; *ӑi T(n) là thӡi gian thӵc hiӋn viӋc tính n giai thӯa, thì T(n-1) là thӡi gian thӵc hiӋn viӋc tính n-1 giai thӯa. Trong trѭӡng hӧp n=0 thì chѭѫng trình chӍ thӵc hiӋn mӝt lӋnh gán Giai_thua:=1, nên tӕn O(1), do ÿó ta có T(0) = C1. Trong trѭӡng hӧp n>0 chѭѫng trình phҧi gӑi ÿӋ quy Giai_thua(n-1), viӋc Jӑi ÿӋ quy này tӕn T(n-1), sau khi có kӃt quҧ cӫa viӋc gӑi ÿӋ quy, chѭѫng trình phҧi nhân kӃt quҧÿó Yӟi n và gán cho Giai_thua. Thӡi gian ÿӇ thӵc hiӋn phép nhân và phép gán là mӝt hҵng C2. Vұy ta có Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................ Trang 7 Ĉây là phѭѫng trình ÿӋ quy ÿӇ tính thӡi gian thӵc hiӋn cӫa chѭѫng trình ÿӋ quy Giai_thua. Ví dө 1-10: Chúng ta xét thӫ tөc MergeSort mӝt cách phác thҧo nhѭ sau: function MergeSort (L:List ; n:integer) : List; var L1,L2 : List; begin if n = 1 then return(L) else begin Chia L thành 2 nӱa L1 và L2 , mӛi mӝt nӱa có ÿӝ dài n/2; return(Merge(MergeSort (L1 , n/2), MergeSort(L2, n/2))); end; end; Chҷng hҥn ÿӇ sҳp xӃp danh sách L gӗm 8 phҫn tӱ 7, 4, 8, 9, 3, 1, 6, 2 ta có mô hình minh hӑa Fӫa MergeSort nhѭ sau: Hàm MergeSort nhұn mӝt danh sách có ÿӝ dài n và trҧ vӅ mӝt danh sách ÿã ÿѭӧc sҳp xӃp. Thӫ Wөc Merge nhұn hai danh sách ÿã ÿѭӧc sҳp L1 và L2 mӛi danh sách có ÿӝ dài n/2, trӝn chúng lҥi vӟi nhau ÿӇÿѭӧc mӝt danh sách gӗm n phҫn tӱ có thӭ tӵ. Giҧi thuұt chi tiӃt cӫa Merge ta sӁ bàn sau, chúng ta chӍÿӇ ý rҵng thӡi gian ÿӇ Merge các danh sách có ÿӝ dài n/2 là O(n). Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................ Trang 8 Gӑi T(n) là thӡi gian thӵc hiӋn MergeSort mӝt danh sách n phҫn tӱ thì T(n/2) là thӡi gian thӵc hiӋn MergeSort mӝt danh sách n/2 phҫn tӱ , ta có thӇ viӃt phѭѫng trình ÿӋ quy nhѭ sau: Trong ÿó c1 là thӡi gian phҧi tӕn khi L có ÿӝ dài 1. Trong trѭӡng hӧp n > 1, thӡi gian cӫa MergeSort ÿѭӧc chia làm hai phҫn. Phҫn gӑi ÿӋ quy MergeSort mӝt danh sách có ÿӝ dài n/2 là T(n/2) do ÿó ta có 2T(n/2). Phҫn thӭ hai bao gӗm phép thӱ n >1, chia danh sách L thành hai nӱa bҵng nhau và Merge. Ba thao tác này lҩy thӡi gian không ÿәi ÿӕi vӟi phép thӱ hoһc tӹ lӋ vӟi n ÿӕi vӟi ngҳt và Merge. Nhѭ vұy hҵng c2ÿѭӧc chӑn và c2n là thӡi gian tәng ÿӇ làm các viӋc ÿó ngoҥi trӯ gӑi ÿӋ quy. I.5.2- Giҧi phѭѫng trình ÿӋ quy Có ba phѭѫng pháp giҧi phѭѫng trình ÿӋ quy: 1.- Phѭѫng pháp truy hӗi 2.- Phѭѫng pháp ÿoán nghiӋm. 3.- Lӡi giҧi tәng quát cӫa mӝt lӟp các phѭѫng trình ÿӋ quy. Phѭѫng pháp truy hӗi Dùng ÿӋ quy ÿӇ thay thӃ bҩt kǤ T(m) vӟi m < n vào phía phҧi cӫa phѭѫng trình cho ÿӃn khi tҩt Fҧ T(m) vӟi m > 1 ÿѭӧc thay thӃ bӣi biӇu thӭc cӫa các T(1). Vì T(1) luôn là hҵng nên chúng ta có công thӭc cӫa T(n) chӭa các sӕ hҥng chӍ liên quan ÿӃn n và các hҵng sӕ. Giҧi phѭѫng trình. Ví dө 1-10: Giҧi phѭѫng trình: Ta có: Giҧ sӱ n = 2k, quá trình suy rӝng sӁ kӃt thúc khi i =k, khi ÿó ta có: T(n) = 2kT(1) + kC2n Vì 2k = n nên k = logn và vӟi T(1) =C1 nên ta có Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................ Trang 9 T(n) = C1n + C2nlogn Hay T(n) là O(nlogn). Ĉoán nghiӋm Ta ÿoán mӝt nghiӋm f(n) và dùng chӭng minh quy nҥp ÿӇ chӭng tӓ rҵng T(n) ” f(n) vӟi mӑi n. Thông thѭӡng f(n) là mӝt trong các hàm quen thuӝc nhѭ logn, n, nlogn, n2, n3, 2n, n!, nn. Ĉôi khi chúng ta chӍÿoán dҥng cӫa f(n) trong ÿó có mӝt vài tham sӕ chѭa xác ÿӏnh (chҷng hҥn f(n) = an2 vӟi a chѭa xác ÿӏnh) và trong quá trình chӭng minh quy nҥp ta sӁ suy diӉn ra giá trӏ thích Kӧp cӫa các tham sӕ. Ví dө 1-11: Giҧi phѭѫng trình ÿӋ quy Giҧ sӱ chúng ta ÿoán f(n) = anlogn. Vӟi n = 1 ta thҩy rҵng cách ÿoán nhѭ vұy không ÿѭӧc bӣi vì anlog n có giá trӏ 0 không phө thuӝc vào giá trӏ cӫa a. Vì thӃ ta thӱ tiӃp theo f(n) = anlogn + b. Vӟi n = 1 ta có, T(1) = C1 và f(1) = b, muӕn T(1) ” f(1) thì b • C1 (*) Giҧ sӱ rҵng T(k) ” aklogk + b vӟi mӑi k < n (I.2).Ta sӁ chӭng minh T(n) ” anlogn + b Giҧ sӱ n • 2, tӯ (I.1) ta có T(n) = 2T(n/2) + C2n Áp dөng (I.2) vӟi k = n/2 < n ta có: T(n) = 2T(n/2) + C2n ” 2[an/2log(n/2) + b] + C2n T(n) ” anlogn - an + 2b + C2n T(n) ” (anlogn + b) + [b + (C2 - a)n] . NӃu lҩy a • C2 + b (**) ta ÿѭӧc T(n) ” (anlogn + b) + [b +(C2 - C2 - b )n ] T(n) ” (anlogn + b) + (1-n) b T(n) ” an logn + b. NӃu ta lҩy a và b sao cho cҧ (*) và (**) ÿӅu thoҧ mãn thì T(n) ” an logn + b vӟi mӑi n. DӉ dàng ta có b = C1 và a= C1 +C2 ta ÿѭӧc T(n) ” (C1 + C2)nlogn + C1 vӟi mӑi n.Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 10 Hay nói cách khác T(n) là O(nlogn). /ӡi giҧi tәng quát cho mӝt lӟp các phѭѫng trình ÿӋ quy ĈӇ giҧi bài toán kích thѭӟc n, ta chia bài toán ÿã cho thành a bài toán con, mӛi bài tóan con có kích thѭӟc n/b. Giҧi các bài toán con này và tәng hӧp kӃt quҧ lҥi ÿӇÿѭӧc kӃt quҧ cӫa bài toán ÿã cho. 9ӟi các bài toán con chúng ta cNJng làm nhѭ vұy. Kӻ thuұt này sӁ dүn chúng ta ÿӃn mӝt chѭѫng trình ÿӋ quy. Giҧ thiӃt rҵng mӛi bài toán con kích thѭӟc 1 lҩy mӝt ÿѫn vӏ thӡi gian và thӡi gian ÿӇ chia bài toán kích thѭӟc n thành các bài toán con kích thѭӟc n/b và tәng hӧp kӃt quҧ tӯ các bài toán con ÿӇ ÿѭӧc lӡi giҧi cӫa bài toán ban ÿҫu là d(n). (Chҷng hҥn ÿӕi vӟi thí dө MergeSort, chúng ta có a = b = 2, và d(n) = C2n/C1. Xem C1 là mӝt ÿѫn vӏ). Gӑi T(n) là thӡi gian ÿӇ giҧi bài toán kích thѭӟc n thì ta có phѭѫng trình ÿӋ quy: Ta sӱ dөng phѭѫng pháp truy hӗi ÿӇ giҧi phѭѫng trình này Giҧ sӱ n = bk ta ÿѭӧc: T(n/bk) = T(1) = 1. Thay vào trên vӟi i = k ta có: Hàm tiӃn triӇn, nghiӋm thuҫn nhҩt và nghiӋm riêng Trong phѭѫng trình ÿӋ quy (I.1) hàm thӡi gian d(n) ÿѭӧc gӑi là hàm tiӃn triӇn (driving function) Trong công thӭc (I.2), ak = nlogbaÿѭӧc gӑi là nghiӋm thuҫn nhҩt (homogeneous solutions). NghiӋm thuҫn nhҩt là nghiӋm chính xác khi d(n) = 0 vӟi mӑi n. Nói mӝt cách khác, nghiӋm thuҫn nhҩt biӇu diӉn thӡi gian ÿӇ giҧi tҩt cҧ các bài toán con. Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 11 Trong công thӭc (I.2), ÿѭӧc gӑi là nghiӋm riêng (particular solutions). NghiӋm riêng biӇu diӉn thӡi gian phҧi trҧÿӇ tҥo ra các bài toán con và tәng hӧp các kӃt quҧ Fӫa chúng. Nhìn vào công thӭc ta thҩy nghiӋm riêng phө thuӝc vào hàm tiӃn triӇn, sӕ lѭӧng và kích thѭӟc các bài toán con. Khi tìm nghiӋm cӫa phѭѫng trình (I,1), chúng ta phҧi tìm nghiӋm riêng và so sánh vӟi nghiӋm thuҫn nhҩt. NӃu nghiӋm nào lӟn hѫn, ta lҩy nghiӋm ÿó làm nghiӋm cӫa phѭѫng trình (I,1). ViӋc xác ÿӏnh nghiӋm riêng không ÿѫn giҧn chút nào, tuy vұy, chúng ta cNJng tìm ÿѭӧc mӝt lӟp các hàm tiӃn triӇn có thӇ dӉ dàng xác ÿӏnh nghiӋm riêng. Hàm nhân Mӝt hàm f(n) ÿѭӧc gӑi là hàm nhân (multiplicative function) nӃu f(m.n) = f(m).f(n) vӟi mӑi Vӕ nguyên dѭѫng m và n. Ví dө 1-12: Hàm f(n) = nk là mӝt hàm nhân, vì f(m.n) = (m.n)k = mk.nk = f(m) f(n) 1Ӄu d(n) trong (I.1) là mӝt hàm nhân thì theo tính chҩt cӫa hàm nhân ta có d(bk-j) = (d(b))k-j và nghiӋm riêng cӫa (I.2) là: Xét ba trѭӡng hӧp sau: 1.- NӃu a > d(b) thì nghiӋm riêng là O(ak) = O(nlogba). Nhѭ vұy nghiӋm riêng và nghiӋm thuҫn nhҩt bҵng nhau do ÿó T(n) là O(nlogba). Ta cNJng thҩy thӡi gian thӵc hiӋn chӍ phө thuӝc vào a, b mà không phө thuӝc vào hàm tiӃn triӇn d(n). Vì vұy ÿӇ cҧi tiӃn giҧi thuұt ta cҫn giҧm a hoһc tăng b. 2.- NӃu a < d(b) thì nghiӋm riêng là O(d(b)k) = O(nlogbd(b)). Trong trѭӡng hӧp này nghiӋm riêng Oӟn hѫn nghiӋm thuҫn nhҩt nên T(n) = O(nlogbd(b)). ĈӇ cҧi tiӃn giҧi thuұt chúng ta cҫn ÿӇ ý ÿӃn cҧ d(n), a và b cùng mӭc ÿӝ nhѭ nhau. Trѭӡng hӧp ÿһc biӋt quan trӑng khi d(n) = nĮ . Khi ÿó d(b) = bĮ và logb(bĮ) = Į. Vì thӃ nghiӋm riêng là O(nĮ) và do vұy T(n) là O(nĮ). 3.- NӃu a = d(b) thì công thӭc (I.5) không xác ÿinh nên ta tính trӵc tiӃp nghiӋm riêng: Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 12 Vì a= d(b) nên nghiӋm riêng là nlogbalogbn và nghiӋm này lӟn gҩp logbn lҫn nghiӋm thuҫn nhҩt. Do ÿó T(n) = O(nlogbalogbn). Trong trѭӡng hӧp ÿһc biӋt d(n) = nĮ ta ÿѭӧc T(n) = O(nĮlogn). Chú ý khi giҧi mӝt phѭѫng trình ÿӋ quy cө thӇ, ta phҧi xem phѭѫng trình ÿó có thuӝc dҥng phѭѫng trình tәng quát hay không. NӃu có thì phҧi xét xem hàm tiӃn triӇn có phҧi là hàm nhân không. 1Ӄu có thì ta xác ÿӏnh a, d(b) và dӵa vào sӵ so sánh giӳa a và d(b) mà vұn dөng mӝt trong ba trѭӡng Kӧp nói trên. Ví dө 1-13: Giҧi các phѭѫng trình ÿӋ quy sau vӟi T(1) = 1 và 1/- T(n) = 4T(n/2) + n 2/- T(n) = 4T(n/2) + n2 3/- T(n) = 4T(n/2) + n3 Trong mӛi trѭӡng hӧp, a=4, b=2 và nghiӋm thuҫn nhҩt là n2. Vӟi d(n) = n ta có d(b) = 2 vì a = 4 > d(b) nên nghiӋm riêng cNJng là n2 và T(n) = O(n2) trong phѭѫng trình (1). Trong phѭѫng trình (3), d(n) = n3, d(b) = 8 và a < d(b). Vì vұy nghiӋm riêng là O(nlogbd(b)) = O(n3) và T(n) cӫa (3) là O(n3). Trong phѭѫng trình (2) chúng ta có d(b) = 4 = a nên T(n) = O(n2logn). Các hàm tiӃn triӇn khác Ta xét hai trѭӡng hӧp dѭӟi dҥng hai ví dө, trѭӡng hӧp 1 là tәng quát hóa cӫa hàm bҩt kǤ là tích Fӫa mӝt hàm nhân vӟi mӝt hҵng lӟn hѫn hoһc bҵng 1. Trѭӡng hӧp thӭ hai là hàm tiӃn triӇn không phҧi là mӝt hàm nhân. Ví dө 1-14: Giҧi pgѭѫng trình ÿӋ quy sau : T(1) = 1 T(n) = 3T(n/2) + 2n1.5 Ӣÿây, 2n1.5 không phҧi là hàm nhân nhѭng n1.5 là hàm nhân. Ĉһt U(n) = T(n)/2 vӟi mӑi n thì U(1) = 1/2 U(n) = 3U(n/2) + n1.5 NghiӋm thuҫn nhҩt khi U(1) = 1 là nlog3 = n1.59; vì U(1) = 1/2 nên nghiӋm thuҫn nhҩt là n1.59/2 là O(n1.59). Vì a = 3 và b = 2 và b1.5 = 2.82 < a, nghiӋm riêng cNJng là O(n1.59) và do ÿó U(n) = O(n1.59) . Vì Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 13 T(n) = 2U(n) nên T(n) = O(n1.59) hay T(n) = O(nlog3). Ví dө 1-15: Giҧi phѭѫng trình ÿӋ quy sau : T(1) = 1 T(n) = 2T(n/2) + nlogn Vì a = b = 2 nên nghiӋm thuҫn nhҩt là n. Tuy nhiên, d(n) = nlogn không phҧi là hàm nhân ta phҧi tính nghiӋm riêng bҵng cách xét trӵc tiӃp: Vì k = logn chúng ta có nghiӋm riêng là O(nlog2n), nghiӋm này lӟn hѫn nghiӋm thuҫn nhҩt và T(n) = O(nlog2n). Bài 1: Tính thӡi gian thӵc hiӋn cӫa các ÿRҥn chѭѫng trình sau: a) Tính tәng cӫa các sӕ Sum := 0; for i:=1 to n do begin readln(x); Sum := Sum + x; end; b) Tính tích hai ma trұn vuông cҩp n C = A*B: for i := 1 to n do for j := 1 to n do begin c[i,j] := 0; for k := 1 to n do c[i,j] := c[i,j] + a[i,k] * b[k,j]; end; Bài 2: Giҧi các phѭѫng trình ÿӋ quy sau vӟi T(1) = 1 và a) T(n) = 3T(n/2) + n b) T(n) = 3T(n/2) + n2 c) T(n) = 8T(n/2) + n3 Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 14 Bài 3: Giҧi các phѭѫng trình ÿӋ quy sau vӟi T(1) = 1 và a) T(n) = 4T(n/3) + n b) T(n) = 4T(n/3) + n2 c) T(n) = 9T(n/3) + n2 Bài 4: Giҧi các phѭѫng trình ÿӋ quy sau vӟi T(1) = 1 và a) T(n) = T(n/2) + 1 b) T(n) = 2T(n/2) + logn c) T(n) = 2T(n/2) + n d) T(n) = 2T(n/2) + n2 Bài 5: Giҧi các phѭѫng trình ÿӋ quy sau bҵng phѭѫng pháp ÿoán nghiӋm: a) T(1) = 2 và T(n) = 2T(n-1) + 1 vӟi " n • 2 b) T(1) = 1 và T(n) = 2T(n-1) + n vӟi " n • 2 Bài 6: Cho mӝt mҧng n sӕ nguyên ÿѭӧc sҳp thӭ tӵ tăng. ViӃt hàm tìm mӝt sӕ nguyên trong Pҧng ÿó, nӃu tìm thҩy thì trҧ vӅ TRUE, ngѭӧc lҥi trҧ vӅ FALSE. 6ӱ dөng hai phѭѫng pháp tìm kiӃm tuҫn tӵ và tìm kiӃm nhӏ phân. Vӟi mӛi phѭѫng pháp hãy viӃt mӝt hàm tìm và tính thӡi gian thӵc hiӋn cӫa hàm ÿó. Bài 7: Tính thӡi gian thӵc hiӋn cӫa giҧi thuұt ÿӋ quy giҧi bài toán Tháp Hà nӝi vӟi n tҫng? Bài 8: Xét ÿӏnh nghƭa sӕ tә hӧp chұp k cӫa n nhѭ sau: a) ViӃt mӝt hàm ÿӋ quy ÿӇ tính sӕ tә hӧp chұp k cӫa n. Tính thӡi gian thӵc hiӋn cӫa giҧi thuұt nói trên. Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 15 1. Mөc tiêu 2. KiӃn thӭc cѫ bҧn cҫn có ÿӇ hӑc chѭѫng này 3. Tài liӋu tham khҧo có liên quan ÿӃn chѭѫng 4. Nӝi dung: II.1 - Bài toán sҳp xӃp. II.2 - Các phѭѫng pháp sҳp xӃp ÿѫn giҧn II.3 - Quicksort. II.4 - Heapsort. II.5 - Binsort. 5. Vҩn ÿӅ nghiên cӭu cӫa trang kӃ tiӃp Trong chѭѫng này chúng ta sӁ nghiên cӭu các vҩn ÿӅ sau: · Bài toán sҳp xӃp. · Mӝt sӕ giҧi thuұt sҳp xӃp ÿѫn giҧn. · QuickSort · HeapSort · BinSort II.1- BÀI TOÁN SҲP XӂP II.1.1 Tҫm quan trӑng cӫa bài toán sҳp xӃp II.1.2 Sҳp xӃp trong và sҳp xӃp ngoài II.1.3 Tә chӭc dӳ liӋu và ngôn ngӳ cài ÿһt II.1.1 Tҫm quan trӑng cӫa bài toán sҳp xӃp Sҳp xӃp mӝt danh sách các ÿӕi tѭӧng theo mӝt thӭ tӵ nào là mӝt bài toán thѭӡng ÿѭӧc vұn Gөng trong các ӭng dөng tin hӑc. Ví dө ta cҫn sҳp xӃp danh sách thí sinh theo tên vӟi thӭ tӵ Alphabet, hoһc sҳp xӃp danh sách sinh viên theo ÿLӇm trung bình vӟi thӭ tӵ tӯ cao ÿӃn thҩp. Mӝt ví dө khác là khi cҫn tìm kiӃm mӝt ÿӕi tѭӧng trong mӝt danh sách các ÿӕi tѭӧng bҵng giҧi thuұt tìm kiӃm nhӏ phân thì danh sách các ÿӕi tѭӧng này phҧi ÿѭӧc sҳp xӃp trѭӟc ÿó. Tóm lҥi sҳp xӃp là mӝt yêu cҫu không thӇ thiӃu trong khi thiӃt kӃ các phҫn mӅm. II.1.2 Sҳp xӃp trong và sҳp xӃp ngoài Sҳp xӃp trong là sӵ sҳp xӃp dӳ liӋu ÿѭӧc tә chӭc trong bӝ nhӟ trong cuҧ máy tính, ӣÿó ta có thӇ sӱ dөng khҧ năng truy nhұp ngүu nhiên cӫa bӝ nhӟ và do vұy sӵ thӵc hiӋn rҩt nhanh. Sҳp xӃp ngoài là sӵ sҳp xӃp ÿѭӧc sӱ dөng khi sӕ lѭӧng ÿӕi tѭӧng ÿѭӧc sҳp xӃp lӟn không thӇ Oѭu trӳ trong bӝ nhӟ trong mà phҧi lѭu trӳî trên bӝ nhӟ ngoài. Cө thӇ là ta sӁ sҳp xӃp dӳ liӋu ÿѭӧc lѭu trӳ trong các tұp tin. Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 16 Chѭѫng này tұp trung giҧi quyӃt vҩn ÿӅ sҳp xӃp trong còn sҳp xӃp ngoài sӁÿѭӧc nghiên cӭu trong chѭѫng IV. II.1.3 Tә chӭc dӳ liӋu và ngôn ngӳ cài ÿһt Các ÿӕi tѭӧng cҫn ÿѭӧc sҳp xӃp là các mҭu tin gӗm mӝt hoһc nhiӅu trѭӡng. Mӝt trong các trѭӡng ÿѭӧc gӑi là khóa (key), kiӇu cӫa nó là mӝt kiӇu có quan hӋ thӭ tӵ (nhѭ các kiӇu sӕ nguyên, sӕ thӵc, chuӛi ký tӵ...). Danh sách các ÿӕi tѭӧng cҫn sҳp xӃp sӁ là mӝt mҧng cӫa các mҭu tin vӯa nói ӣ trên. Mөc ÿích Fӫa viӋc sҳp xӃp là tә chӭc lҥi các mҭu tin sao cho các khóa cӫa chúng ÿѭӧc sҳp thӭ tӵ tѭѫng ӭng vӟi quy luұt sҳp xӃp. ĈӇ trình bày các ví dө minh hӑa chúng ta sӁ dùng PASCAL làm ngôn ngӳ thӇ hiӋn và sӱ dөng khai báo sau: const N = 100; type KeyType = integer; OtherType = real; RecordType = Record Key : KeyType; OtherFields : OtherType; end; var a : array[1..N] of RecordType; procedure Swap(var x,y:RecordType); var temp : RecordType; begin temp := x; x := y; y := temp; end; &ҫn thҩy rҵng thӫ tөc Swap lҩy O(1) thӡi gian vì chӍ thӵc hiӋn 3 lӋnh gán nӕi tiӃp nhau. II.2- CÁC PHѬѪNG PHÁP SҲP XӂP ĈѪN GIҦN II.2.1- Sҳp xӃp chӑn II.2.2- Sҳp xӃp xen II.2.3- Sҳp xӃp nәi bӑt Các giҧi thuұt ÿѫn giҧn thѭӡng lҩy O(n2) thӡi gian ÿӇ sҳp xӃp n ÿӕi tѭӧng và các giҧi thuұt này thѭӡng chӍ dùng ÿӇ sҳp các danh sách có ít ÿӕi tѭӧng. Vӟi mӛi giҧi thuұt chúng ta sӁ nghiên cӭu các phҫn: giҧi thuұt, ví dө, chѭѫng trình và phân tích ÿánh giá. Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 17 II.2.1- Sҳp xӃp chӑn (Selection Sort) Giҧi thuұt Ĉây là phѭѫng pháp sҳp xӃp ÿѫn giҧn nhҩt ÿѭӧc tiӃn hành nhѭ sau: · Ĉҫu tiên chӑn phҫn tӱ có khóa nhӓ nhҩt trong n phҫn tӱ tӯ a[1] ÿӃn a[n] và hoán vӏ nó Yӟi phҫn tӱ a[1]. · Chӑn phҫn tӱ có khóa nhӓ nhҩt trong n-1phҫn tӱ tӯ a[2] ÿӃn a[n] và hoán vӏ nó vӟi a[2]. · Tәng quát ӣ bѭӟc thӭ i, chӑn phҫn tӱ có khoá nhӓ nhҩt trong n-i+1 phҫn tӱ tӯ a[i] ÿӃn a[n] và hoán vӏ nó vӟi a[i]. · Sau n-1 bѭӟc này thì mҧng ÿã ÿѭӧc sҳp xӃp. Phѭѫng pháp này ÿѭӧc gӑi là phѭѫng pháp chӑn bӣi vì nó lһp lҥi quá trình chӑn phҫn tӱ nhӓ nhҩt trong sӕ các phҫn tӱ chѭa ÿѭӧc sҳp. Ví dө 2-1: Sҳp xӃp mҧng gӗm 10 mҭu tin có khóa là các sӕ nguyên: 5, 6, 2, 2, 10, 12, 9, 10, 9 và 3 Khoá %ѭӟc a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] Ban ÿҫu 5 6 2 2 10 12 9 10 9 3 %ѭӟc 1 2 6 5 2 10 12 9 10 9 3 %ѭӟc 2 2 5 6 10 12 9 10 9 3 %ѭӟc 3 3 6 10 12 9 10 9 5 %ѭӟc 4 5 10 12 9 10 9 6 %ѭӟc 5 6 12 9 10 9 10 %ѭӟc 6 9 12 10 9 10 %ѭӟc 7 9 10 12 10 %ѭӟc 8 10 12 10 %ѭӟc 9 10 12 .Ӄt quҧ 2 2 3 5 6 9 9 10 10 12 Hình 2-1: S̷p x͇p ch͕n Chѭѫng trình: procedure SelectionSort; var i,j,LowIndex: integer; LowKey: KeyType; begin (1) for i := 1 to n-1 do begin (2) LowIndex := i; (3) LowKey := a[i].key; (4) for j := i+1 to n do (5) if a[j].key < LowKey then Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 18 begin (6) LowKey := a[j].key; (7) LowIndex := j; end; (8) Swap(a[i] , a[LowIndex]); end; end; Ĉánh giá: Ph˱˯ng pháp s̷p x͇p ch͕n ḽy O(n2)ÿ͋ s̷p x͇p n ph̯n t͵. Trѭӟc hӃt ta có thӫ tөc Swap lҩy mӝt hҵng thӡi gian nhѭÿã nói ӣ mөc II.1.3. Các lӋnh (2), (3) ÿӅu lҩy O(1) thӡi gian. Vòng lһp for (4) - (7) thӵc hiӋn n-i lҫn, vì j chҥy tӯ i+1 ÿӃn n, mӛi lҫn lҩy O(1), nên lҩy O(n-i) thӡi gian. Do ÿó thӡi gian tәng cӝng là: II.2.2- Sҳp xӃp xen (Insertion Sort) Giҧi thuұt Trѭӟc hӃt ta xem phҫn tӱ a[1] là mӝt dãy ÿã có thӭ tӵ. · Bѭӟc 1, xen phҫn tӱ a[2] vào danh sách ÿã có thӭ tӵ a[1] sao cho a[1], a[2] là mӝt danh sách có thӭ tӵ. · Bѭӟc 2, xen phҫn tӱ a[3] vào danh sách ÿã có thӭ tӵ a[1], a[2] sao cho a[1], a[2], a[3] là Pӝt danh sách có thӭ tӵ. · Tәng quát, bѭӟc i, xen phҫn tӱ a[i+1] vào danh sách ÿã có thӭ tӵ a[1],a[2],..a[i] sao cho a[1], a[2],.. a[i+1] là mӝt danh sách có thӭ tӵ. · Phҫn tӱÿang xét a[j] sӁÿѭӧc xen vào vӏ trí thích hӧp trong danh sách các phҫn tӱÿã ÿѭӧc sҳp trѭӟc ÿó a[1],a[2],..a[j-1] bҵng cách so sánh khoá cӫa a[j] vӟi khoá cӫa a[j-1] ÿӭng ngay trѭӟc nó. NӃu khoá cӫa a[j] nhӓ hѫn khoá cӫa a[j-1] thì hoán ÿәi a[j-1] và a[j] cho nhau và tiӃp tөc so sánh khoá cӫa a[j-1] (lúc này a[j-1] chӭa nӝi dung cӫa a[j]) vӟi khoá cӫa a[j-2] ÿӭng ngay trѭӟc nó... Ví dө 2-2: Sҳp xӃp mҧng gӗm 10 mҭu tin ÿã cho trong ví dө 2-1. Khoá %ѭӟc a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] Ban ÿҫu 5 6 2 2 10 12 9 10 9 3 %ѭӟc 1 5 6 %ѭӟc 2 2 5 6 %ѭӟc 3 2 2 5 6 %ѭӟc 4 2 2 5 6 10 %ѭӟc 5 2 2 5 6 10 12 Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 19 %ѭӟc 6 2 2 5 6 9 10 12 %ѭӟc 7 2 2 5 6 9 10 10 12 %ѭӟc 8 2 2 5 6 9 9 10 10 12 %ѭӟc 9 2 2 3 5 6 9 9 10 10 12 Hình 2-2: S̷p x͇p xen Chѭѫng trình procedure InsertionSort; var i,j: integer; begin {1} for i := 2 to n do begin {2} J := i; {3} while (j>1) and (a[j].key < a[j-1].key) do begin {4} swap(a[j], a[j-1]); {5} j := j-1; end; end; end; Ĉánh giá: Ph˱˯ng pháp s̷p x͇p ch͕n ḽy O(n2)ÿ͋ s̷p x͇p n ph̯n t͵. Ta thҩy các lӋnh (4) và (5) ÿӅu lҩy O(1). Vòng lһp (3) chҥy nhiӅu nhҩt i-1 lҫn, mӛi lҫn tӕn O(1) nên (3) lҩy i-1 thӡi gian. LӋnh (2) và (3) là hai lӋnh nӕi tiӃp nhau, lӋnh (2) lҩy O(1) nên cҧ hai OӋnh này lҩy i-1. Vòng lһp (1) có i chҥy tӯ 2 ÿӃn n nên nӃu gӑi T(n) là thӡi gian ÿӇ sҳp n phҫn tӱ thì ta có II.2.3- Sҳp xӃp nәi bӑt (Bubble Sort) Giҧi thuұt Chúng ta tѭӣng tѭӧng rҵng các mҭu tin ÿѭӧc lѭu trong mӝt mҧng dӑc, qua quá trình sҳp, mҭu tin nào có khóa “nhҽ” sӁÿѭӧc nәi lên trên. Chúng ta duyӋt tòan mҧng, tӯ dѭӟi lên trên. NӃu hai phҫn Wӱӣ cҥnh nhau mà không ÿúng thӭ tӵ tӭc là nӃu phҫn tӱ “nhҽ hѫn” lҥi nҵm dѭӟi thì phҧi cho nó “nәi lên” bҵng cách ÿәi chӛ hai phҫn tӱ này cho nhau. Cө thӇ là: · Bѭӟc 1: Xét các phҫn tӱ tӯ a[n] ÿӃn a[2], vӟi mӛi phҫn tӱ a[j], so sánh khoá cӫa nó vӟi khoá cӫa phҫn tӱ a[j-1] ÿӭng ngay trѭӟc nó. NӃu khoá cӫa a[j] nhӓ hѫn khoá cӫa a[j-1] thì hoán ÿәi a[j] và a[j-1] cho nhau. · Bѭӟc 2: Xét các phҫn tӱ tӯ a[n] ÿӃn a[3], và làm tѭѫng tӵ nhѭ trên. · Tәng quát ӣ bѭӟc thӭ i, ta sӁ xét các phҫn tӱ tӯ a[n] ÿӃn a[i+1]. Sau n bѭӟc ta thu ÿѭӧc mҧng có thӭ tӵ Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 20 Ví dө 2-3: Sҳp xӃp mҧng gӗm 10 mҭu tin ÿã cho trong ví dө 2-1. Khoá %ѭӟc a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] Ban ÿҫu 5 6 2 2 10 12 9 10 9 3 %ѭӟc 1 2 5 6 2 3 10 12 9 10 9 %ѭӟc 2 2 5 6 3 9 10 12 9 10 %ѭӟc 3 3 5 6 9 9 10 12 10 %ѭӟc 4 5 6 9 9 10 10 12 %ѭӟc 5 6 9 9 10 10 12 %ѭӟc 6 9 9 10 10 12 %ѭӟc 7 9 10 10 12 %ѭӟc 8 10 10 12 %ѭӟc 9 10 12 .Ӄt quҧ 2 2 3 5 6 9 9 10 10 12 Hình 2-3: S̷p x͇p n͝i b͕t Chѭѫng trình procedure BubbleSort; var i,j: integer; begin (1) for i := 1 to n-1 do (2) for j := n downto i+1 do (3) if a[j].key < a[j-1].key then (4) Swap(a[j],a[j-1]); end; Ĉánh giá: Ph˱˯ng pháp s̷p x͇p n͝i b͕t ḽy O(n2)ÿ͋ s̷p n ph̯n t͵. Dòng lӋnh (3) lҩy mӝt hҵng thӡi gian. Vòng lһp (2) thӵc hiӋn (n-i) bѭӟc, mӛi bѭӟc lҩy O(1) nên lҩy O(n-i) thӡi gian. Nhѭ vұy ÿӕi vӟi toàn bӝ chѭѫng trình ta có: II.3- QUICKSORT II.3.1- Ý tѭӣng II.3.2- ThiӃt kӃ giҧi thuұt II.3.3- Cài ÿһt giҧi thuұt II.3.4- Thӡi gian thӵc hiӋn cӫa QuickSort Trong phҫn này chúng ta sӁ nghiên cӭu mӝt giҧi thuұt sҳp xӃp ÿѭӧc dùng mӝt cách phә biӃn là Quick Sort do A.R. Hoare phát minh vào năm 1960. Quick Sort ÿѭӧc ÿánh giá tӕt nhӡ vào sӵ phân tích toán hӑc và các khҷng ÿӏnh vӅ khҧ năng cӫa nó. Quick Sort ÿã ÿѭӧc cҧi tiӃn ÿӇ trӣ thành phѭѫng pháp ÿѭӧc chӑn trong các ӭng dөng sҳp xӃp thӵc tӃ khác nhau. Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 21 II.3.1- Ý tѭӣng Chúng ta vүn xét mҧng a các mҭu tin a[1]..a[n]. Giҧ sӱ v là 1 giá trӏ khóa mà ta gӑi là chӕt (pivot). Ta phân hoҥch dãy a[1]..a[n] thành hai mҧng con "bên trái" và "bên phҧi". Mҧng con "bên trái" bao gӗm các phҫn tӱ có khóa nhӓ hѫn chӕt, mҧng con "bên phҧi" bao gӗm các phҫn tӱ có khóa lӟn hѫn hoһc bҵng chӕt. Sҳp xӃp mҧng con “bên trái” và mҧng con “bên phҧi” thì mҧng ÿã cho sӁÿѭӧc sҳp bӣi vì tҩt cҧ các khóa trong mҧng con “bên trái “ ÿӅu nhӓ hѫn các khóa trong mҧng con “bên phҧi”. ViӋc sҳp xӃp các mҧng con “bên trái” và “bên phҧi” cNJng ÿѭӧc tiӃn hành bҵng phѭѫng pháp nói trên. Mӝt mҧng chӍ gӗm mӝt phҫn tӱ hoһc gӗm nhiӅu phҫn tӱ có khóa bҵng nhau thì xem nhѭÿã có thӭ tӵ. II.3.2- ThiӃt kӃ giҧi thuұt 9ҩn ÿӅ chӑn chӕt Chӑn khóa lӟn nhҩt trong hai phҫn tӱ có khóa khác nhau ÿҫu tiên kӇ tӯ trái qua. NӃu mҧng chӍ Jӗm mӝt phҫn tӱ hay gӗm nhiӅu phҫn tӱ có khóa bҵng nhau thì không có chӕt. 9ҩn ÿӅ phҫn hoҥch ĈӇ phân hoҥch mҧng ta dùng 2 "con nháy" L và R trong ÿó L tӯ bên trái và R tӯ bên phҧi, ta cho L chҥy sang phҧi cho tӟi khi gһp phҫn tӱ có khóa • chӕt và cho R chҥy sang trái cho tӟi khi gһp phҫn tӱ có khóa < chӕt. Tҥi chӛ dӯng cӫa L và R nӃu L<R thì hoán vӏ a[L],a[R]. Lһp lҥi quá trình dӏch sang phҧi, sang trái cӫa 2 "con nháy" L và R cho ÿӃn khi L>R. Khi ÿó L sӁ là ÿLӇm phân hoҥch, cө thӇ là a[L] là phҫn tӱÿҫu tiên cӫa mҧng con “bên phҧi”. Giҧi thuұt QuickSort ĈӇ sҳp xӃp mҧng a[i]..a[j] ta tiӃn hành các bѭӟc sau: · Xác ÿӏnh chӕt, · Phân hoҥch mҧng ÿã cho thành hai mҧng con a[i]..a[k-1] và a[k]..a[j]. · Sҳp xӃp mҧng a[i]..a[k-1] (ĈӋ quy). · Sҳp xӃp mҧng a[k]..a[j] (ĈӋ quy). Quá trình ÿӋ quy sӁ dӯng khi không còn tìm thҩy chӕt. Ví dө 2-4: Ta cҫn sҳp mӝt mҧng mà khóa là các sӕ nguyên ÿã ÿѭӧc trình bày trong ví dө 2-1. Hai phҫn tӱÿҫu tiên có khóa khác nhau là 5 và 6, ta chӑn 6 làm chӕt và tiӃn hành phân hoҥch mҧng ban ÿҫu làm hai mҧng con và ÿӋ quy cho hai mҧng con này. Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 22 II.3.3- Cài ÿһt giҧi thuұt Hàm FindPivot Ta thiӃt kӃ hàm FindPivot ÿӇ xác ÿӏnh trong dãy a[i]..a[j] xem có hay không hai phҫn tӱ có khóa khác nhau. NӃu không tìm thҩy hai phҫn tӱ có khóa khác nhau thì trҧ vӅ giá trӏ 0 (không tìm thҩy chӕt), ngѭӧc lҥi hàm trҧ vӅ giá trӏ là chӍ sӕ cӫa phҫn tӱ có khóa lӟn hѫn trong hai phҫn tӱ có khóa khác nhau ÿҫu tiên. Khóa lӟn hѫn này sӁ trӣ thành phҫn tӱ chӕt mà ta sӁ xác ÿӏnh trong thӫ tөc QuickSort. ĈӇ tiӋn so sánh ta sӱ dөng biӃn FirstKey ÿӇ lѭu giӳ khóa cӫa phҫn tӱÿҫu tiên trong mҧng a[i]..a[j] (FirstKey chính là a[i].key). Ta sӁ dùng mӝt chӍ sӕ k ÿӇ dò tìm trong mҧng a[i]..a[j], kӇ tӯ vӏ trí i+1 ÿӃn hӃt mҧng, mӝt phҫn Wӱ a[k] mà a[k].key FirstKey. NӃu không tìm thҩy mӝt a[k] nhѭ thӃ thì hoһc là mҧng chӍ gӗm mӝt phҫn tӱ hoһc gӗm nhiӅu phҫn tӱ có khóa bҵng nhau. Trong trѭӡng hӧp ÿó thì không tìm thҩy chӕt và hàm FindPivot sӁ trҧ vӅ 0. Ngѭӧc lҥi ta sӁ phҧi xét xem a[k].key có lӟn hѫn FirstKey hay không, nӃu ÿúng nhѭ thӃ thì chӕt sӁ là khóa cӫa a[k] và hàm FindPivot sӁ trҧ vӅ k, nӃu không thì hàm FindPivot sӁ trҧ vӅ i. Function FindPivot(i,j:integer): integer; var FirstKey : KeyType; k : integer; begin k := i+1; FirstKey := a[i].key; while (k<=j) and (a[k].key = FirstKey) do k:= k+1; if k > j then FindPivot := 0 else if a[k].key > FirstKey then FindPivot := k else FindPivot := i; end; Hàm Partition Hàm Partition nhұn vào ba tham sӕ i, j và Pivot ÿӇ thӵc hiӋn viӋc phân hoҥch theo mҧng a[i]..a[j] theo chӕt Pivot và trҧ vӅ giá trӏ l là chӍ sӕÿҫu tiên cӫa mҧng “bên phҧi”. Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 23 Hai con nháy L, R sӁÿѭӧc sӱ dөng ÿӇ thӵc hiӋn viӋc phân hoҥch nhѭÿã trình bày trong phҫn II.3.2. Function Partition(i,j:integer; pivot :KeyType):integer ; var l,r : integer; begin l := i; {Ĉһt con nháy L ӣì bên trái} r := j; {Ĉһt con nháy R ӣì bên phҧi} while l <= r do begin {L tiӃn sang phҧi} while a[l].key < pivot do l := l+1; {R tiӃn sang trái} while a[r].key >= pivot do r := r-1; if l <r then Swap(a[l],a[r]); end; Partition :=l; end; QuickSort Bây giӡ chúng ta trình bày thӫ tөc cuӕi cùng có tên là QuickSort và chú ý rҵng ÿӇ sҳp xӃp Pҧng A các record gӗm n phҫn tӱ cӫa kiӇu Recordtype ta chӍ cҫn gӑi QuickSort(1,n). Ta sӁ sӱ dөng biӃn PivotIndex ÿӇ lѭu giӳ kӃt quҧ trҧ vӅ cӫa hàm FindPivot, nӃu biӃn PivotIndex nhұn ÿѭӧc mӝt giá trӏ khác 0 thì mӟi tiӃn hành phân hoҥch mҧng. BiӃn Pivot sӁÿѭӧc sӱ Gөng ÿӇ lѭu giӳ giá trӏ chӕt và biӃn k ÿӇ lѭu giӳ giá trӏ cӫa ÿLӇm phân hoҥch do hàm Partition trҧ vӅ. Sau khia ÿã phân hoҥch xong ta sӁ gӑi ÿӋ quy QuickSort cho mҧng con “bên trái” a[i]..a[k-1] và mҧng con “bên phҧi” a[k]..a[j]. procedure Quicksort(i,j:integer); var Pivot : KeyType; PivotIndex, k : integer; begin (1) PivotIndex := FindPivot(i,j); (2) if PivotIndex 0 then begin (3) Pivot := a[PivotIndex].key; (4) k := Partition(i,j,Pivot); (5) QuickSort(i,k-1); (6) QuickSort(k,j); end; end; II.3.4- Thӡi gian thӵc hiӋn cӫa QuickSort QuickSort ḽy O(nlogn) thͥi gian ÿ͋ s̷p x͇p n ph̯n t͵ trong tr˱ͥng hͫp t͙t nh̭t và O(n2). trong tr˱ͥng hͫp x̭u nh̭t. Hàm Partition lҩy thӡi gian tӹ lӋ vӟi sӕ phҫn tӱ cӫa mҧng. Nhѭ vұy nӃu mҧng có n phҫn tӱ thì Partition lҩy P(n)= n ÿѫn vӏ thӡi gian. Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 24 Gӑi T(n) là thӡi gian thӵc hiӋn cӫa QuickSort thì T(n) phҧi là tәng cӫa P(n) và thӡi gian QuickSort ÿӋ quy cho hai mҧng con. Giҧ sӱ các giá trӏ khóa cӫa mҧng khác nhau. Trong trѭӡng hӧp xҩu nhҩt là ta luôn chӑn phҧi phҫn tӱ có khóa lӟn nhҩt làm chӕt, lúc bҩy giӡ viӋc phân hoҥch bӏ lӋch tӭc là mҧng bên phҧi chӍ gӗm Pӝt phҫn tӱ chӕt, còn mҧng bên trái gӗm n-1 phҫn tӱ còn lҥi. Khi ÿó ta có thӇ thành lұp phѭѫng trình ÿӋ quy nhѭ sau: Giҧi phѭѫng trình này bҵng phѭѫng pháp truy hӗi Ta có T(n) = T(n-1) + T(1) +n = T(n-1) + (n+1) = [T(n-2) + T(1) +(n-1)] + (n+1) = T(n-2) + n + (n+1) = [T(n-3) + T(1) +(n-2)] + n + (n+1) = T(n-3) +(n-1) + n + (n+1) . . . . . . . . . . . . . . . . . = T(n-i) + (n-i+2) + (n-i+3) + ... + n + (n+1) = T(n-i) + Quá trình trên kӃt thúc khi i=n-1, khi ÿó ta có Trong trѭӡng hӧp tӕt nhҩt khi ta chӑn ÿѭӧc chӕt sao cho hai mҧng con có kích thѭӟc bҵng nhau và bҵng n/2. Lúc ÿó ta có phѭѫng trình ÿӋ quy nhѭ sau: Giҧi phѭѫng trình ÿӋ quy này (xem I.4.2) ta ÿѭӧc T(n) = O(nlogn). Ngѭӡi ta cNJng chӭng minh ÿѭӧc rҵng trong trѭӡng hӧp trung bình QuickSort lҩy T(n) = O(nlogn). II.4- HEAPSORT II.4.1- Heap II.4.2- Ý tѭӣng II.4.3- ThiӃt kӃ và cài ÿһt giҧi thuұt II.4.4- Phân tích HeapSort Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 25 II.4.1- Heap Cây sҳp thӭ tӵ bӝ phұn hay còn gӑi là heap là cây nhӏ phân mà giá trӏ tҥi mӛi nút (khác nút lá) ÿӅu không lӟn hѫn giá trӏ cӫa các con cӫa nó. Ta có nhұn xét rҵng nút gӕc a[1] cӫa cây sҳp thӭ tӵ bӝ phұn có giá trӏ nhӓ nhҩt. Ví dө 2-5: Cây sau là mӝt heap. II.4.2- Ý tѭӣng (1) Xem mҧng ban ÿҫu là mӝt cây nhӏ phân. Mӛi nút trên cây lѭu trNJ mӝt phҫn tӱ mҧng, trong ÿó a[1] là nút gӕc và mӛi nút không là nút lá a[i] có con trái là a[2i] và con phҧi là a[2i+1]. Vӟi cách tә chӭc này thì cây nhӏ phân thu ÿѭӧc sӁ có các nút trong là các nút a[1],..,a[n DIV 2]. Tҩt cҧ các nút trong ÿӅu có 2 con, ngoҥi trӯ nút a[n DIV 2] có thӇ chӍ có mӝt con trái (trong trѭӡng hӧp n là mӝt Vӕ chҹn). (2) Sҳp xӃp cây ban ÿҫu thành mӝt heap căn cӭ vào giá trӏ khoá cӫa các nút. (3) Hoán ÿәi a[1] cho cho phҫn tӱ cuӕi cùng. (4) 6ҳp lҥi cây sau khi ÿã bӓÿi phҫn tӱ cuӕi cùng ÿӇ nó trӣ thành mӝt heap mӟi. Lһp lҥi quá trình (3) và (4) cho tӟi khi cây rӛng ta sӁÿѭӧc mҧng sҳp theo thӭ tӵ giҧm. II.4.3- ThiӃt kӃ và cài ÿһt giҧi thuұt Thӫ tөc PushDown Giҧ sӱ a[first],..,a[last] ÿã ÿúng vӏ trí (giá trӏ khoá tҥi mӛi nút nhӓ hѫn hoһc bҵng giá trӏ khoá Wҥi các nút con cӫa nó) ngoҥi trӯ a[first]. PushDown dùng ÿӇÿҭy phҫn tӱ a[first] xuӕng ÿúng vӏ trí cӫa nó trong cây (và có thӇ gây ra viӋc ÿҭy xuӕng các phҫn tӱ khác). Xét a[first], có hai khҧ năng có thӇ xҧy ra: · NӃu a[first] có khoá lӟn hѫn con trái cӫa nó (a[first].key > a[2*first].key) và khoá cӫa con trái không lӟn hѫn khoá cӫa con phҧi (a[2*first].key ” a[2*first+1].key) thì hoán ÿәi a[first] cho con trái a[2*first] cӫa nó, viӋc này có thӇ gây ra tình trҥng con trái sӁ không ÿúng vӏ trí nên phҧi xem xét lҥi con trái. Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 26 · Ngѭӧc lҥi, nӃu a[first] có khoá lӟn hѫn khoá cӫa con phҧi cӫa nó (a[first].key > a[2*first+1].key ) và khoá cӫa con phҧi nhӓ hѫn khoá cӫa con trái (a[2*first+1].key < a[2*first].key) thì hoán ÿәi a[first] cho con phҧi a[2*first+1] cӫa nó, viӋc này có thӇ gây ra tình trҥng con phҧi sӁ không ÿúng vӏ trí nên phҧi tiӃp tөc xem xét con phҧi. · NӃu cҧ hai trѭӡng trên ÿӅu không xҭy ra thì a[first] ÿã ÿúng vӏ trí. · Nhѭ trên ta thҩy viӋc ÿҭy a[first] xuӕng có thӇ gây ra viӋc ÿҭy xuӕng mӝt sӕ phҫn tӱ khác, nên tәng quát là ta sӁ xét viӋc ÿҭy xuӕng cӫa mӝt phҫn tӱ a[r] bҩt kǤ, bҳt ÿҫu tӯ a[first]. procedure PushDown(first,last:integer); var r:integer; begin r:= first; {Xét nút a[first] trѭӟc hӃt} while r <= last div 2 do {Trong khi a[r] còn là nút trong} if last = 2*r then begin {nút r chӍ có con trái } if a[r].key > a[last].key then swap(a[r],a[last]); r:=last; end else if (a[r].key>a[2*r].key)and(a[2*r].key ” a[2*r+1].key)then begin swap(a[r],a[2*r]); r := 2*r ; {Xét tiӃp nút con trái } end else if (a[r].key > a[2*r+1].key) and (a[2*r+1].key < a[2*r].key) then begin swap(a[r],a[2*r+1]); r := 2*r+1 ; {Xét tiӃp nút con phҧi } end else r := last; {Nút r ÿã ÿúng vӏ trí } end; Thӫ tөc HeapSort · ViӋc sҳp xӃp cây ban ÿҫu thành mӝt heap ÿѭӧc tiӃn hành bҵng cách sӱ dөng thӫ tөc PushDown ÿӇÿҭy tҩt cҧ các nút trong chѭa ÿúng vӏ trí xuӕng ÿúng vӏ trí cӫa nó, khӣi ÿҫu tӯ nút a[n DIV 2], lҫn ngѭӧc tӟi gӕc. · Lһp lҥi viӋc hoán ÿәi a[1] cho a[i], sҳp xӃp cây a[1]..a[i-1] thành heap, i chҥy tӯ n ÿӃn 2. procedure HeapSort; var i:integer; begin (1) for i := (n div 2) downto 1 do (2) PushDown(i,n); (3) for i := n downto 2 do begin (4) swap(a[1],a[i]); Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 27 (5) pushdown(1,i-1); end; end; Ví dө 2-6: Sҳp xӃp mҧng bao gӗm 10 phҫn tӱ có khoá là các sӕ nguyên nhѭ trong các ví dө trѭӟc: Khoá a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] Ban ÿҫu 5 6 2 2 10 12 9 10 9 3 Mҧng này ÿѭӧc xem nhѭ là mӝt cây nhӏ phân ban ÿҫu nhѭ sau: Trong cây trên, giá trӏ ghi trong các nút là khoá cӫa các phân tӱ mҧng, giá trӏ ghi bên ngoài các nút là chӍ sӕ cӫa các phҫn tӱ mҧng. ViӋc sҳp xӃp cây này thành mӝt heap sӁ bҳt ÿҫu tӯ viӋc ÿҭy xuӕng nút a[5] (vì 5 = 10 DIV 2) Xét nút 5 ta thҩy a[5] chӍ có mӝt con trái và giá trӏ khóa tѭѫng ӭng cӫa nó lӟn hѫn con trái cӫa nó nên ta ÿәi hai nút này cho nhau và do con trái cӫa a[5] là a[10] là mӝt nút lá nên viӋc ÿҭy xuӕng cӫa a[5] kӃt thúc. Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 28 Nút 4 và nút 3 ÿã ÿúng vӏ trí nên không phҧi thӵc hiӋn sӵ hoán ÿәi. Tҥi nút 2, giá trӏ khóa cӫa nó lӟn hѫn khoá con trái và khoá cӫa con trái nhӓ hѫn khoá cӫa con phҧi nên ta hóan ÿәi nút 2 cho con trái cӫa nó (nút 4), sau khi hoán ÿәi, ta xét lҥi nút 4, thҩy nó vүn ÿúng vӏ trí nên kӃt thúc viӋc ÿҭy xuӕng cӫa nút 2. Cuӕi cùng ta xét nút 1, ta thҩy giá trӏ khoá cӫa nút 1 lӟn hѫn khoá cӫa con trái và con trái có khoá bҵng khoá cӫa con phҧi nên hóan ÿәi nút 1 cho con trái cӫa nó (nút 2). Sau khi thӵc hiӋn phép hóan ÿәi nút 1 cho nút 2, ta thҩy nút 2 có giá trӏ khoá lӟn hѫn khoá cӫa con phҧi cӫa nó (nút 5) và con phҧi có khoá nhӓ hѫn khoá cӫa con trái nên phҧi thӵc hiӋn phép hoán ÿәi nút 2 cho nút 5. Xét lҥi nút 5 thì nó vүn ÿúng vӏ trí nên ta ÿѭӧc cây mӟi trong hình 2-9. Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 29 Cây này là mӝt heap tѭѫng ӭng vӟi mҧng Khoá a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] Heap 2 3 2 6 5 12 9 10 9 10 Tӯ heap ÿã có ӣ trên, hoán ÿәi a[1] cho a[10] ta có a[10] là nút có khóa nhӓ nhҩt, cҳt bӓ nút a[10] ra khӓi cây. Nhѭ vұy phҫn cuӕi mҧng chӍ gӗm mӝt phҫn tӱ a[10] ÿã ÿѭӧc sҳp. Thӵc hiӋn viӋc ÿҭy a[1] xuӕng ÿúng vӏ trí cӫa nó trong cây a[1]..a[9] ta ÿѭӧc cây: Hoán ÿәi a[1] cho a[9] và cҳt a[9] ra khӓi cây. Ta ÿѭӧc phҫn cuӕi mҧng bao gӗm hai phҫn tӱ a[9]..a[10] ÿã ÿѭӧc sҳp. Thӵc hiӋn viӋc ÿҭy a[1] xuӕng ÿúng vӏ trí cӫa nó trong cây a[1]..a[8] ta ÿѭӧc cây Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 30 TiӃp tөc quá trình trên ta sӁÿѭӧc mӝt mҧng có thӭ tӵ giҧm. II.4.4- Phân tích HeapSort Thӡi gian thӵc hiӋn cӫa HeapSort là O(n logn) Trong thӫ tөc PushDown mӛi lҫn lһp, r có ít nhҩt 2 giá trӏ, vì r bҳt ÿҫu bҵng first nên sau i lҫn Oһp, chúng ta có r • first * 2i. Thӫ tөc dӯng khi r > last/2 do vұy khi thӫ tөc dӯng thì ta có first*2i > last/2 hay 2i+1 > last/first. Suy ra i > log(last/first) - 1 tӭc là sӕ lҫn lһp nhiӅu nhҩt cӫa thӫ tөc PushDown là log(last/first). Vì first •1 và last ” n trong mӛi lҫn gӑi PushDown cӫa thӫ tөc HeapSort tҥi dòng (2) hoһc (5) nên sӕ lҫn lһp ” logn, mӛi bѭӟc lһp lҩy mӝt thӡi gian O(1) nên thӡi gian thӵc hiӋn cӫa PushDown là O(logn). Trong thӫ tөc HeapSort dòng lӋnh (1)-(2) lһp n/2 lҫn mà mӛi lҫn lҩy O(logn) nên thӡi gian thӵc hiӋn (1)-(2) là O(n logn). Vòng lһp (3)-(4)-(5) lһp n-1 lҫn, mӛi lҫn lҩy O(logn) nên thӡi gian thӵc hiӋn (3)-(4)-(5) là O(n logn). Tóm lҥi thӡi gian thӵc hiӋn HeapSort là O(n logn) II.5- BINSORT II.5.1- Giҧi thuұt II.5.2- Phân tích Bin Sort II.5.3- Sҳp xӃp tұp giá trӏ có khoá lӟn II.5.1- Giҧi thuұt Nói chung các giҧi thuұt ÿã trình bày ӣ trên ÿӅu có ÿӝ phӭc tҥp là O(n2) hoһc O(nlogn). Tuy nhiên khi kiӇu dӳ liӋu cӫa trѭӡng khoá là mӝt kiӇu ÿһc biӋt , viӋc sҳp xӃp có thӇ chӍ chiӃm O(n) thӡi gian. Sau ÿây ta sӁ xét mӝt sӕ trѭӡng hӧp. Trѭӡng hӧp ÿѫn giҧn: Giҧ sӱ ta phҧi sҳp xӃp mӝt mҧng A gӗm n phҫn tӱ có khoá là các sӕ nguyên có giá trӏ khác nhau và là các giá trӏ tӯ 1 ÿӃn n. Ta sӱ dөng B là mӝt mҧng cùng kiӇu vӟi A và phân phӕi vào phҫn tӱ b[j] mӝt phҫn tӱ a[i] mà a[i].key = j. Khi ÿó mҧng B lѭu trӳ kӃt quҧÿã ÿѭӧc sҳp [Ӄp cӫa mҧng A. Ví dө 2-7: Sҳp xӃp mҧng A gӗm 10 phҫn tӱ có khoá là các sӕ nguyên có giá trӏ là các sӕ 4, 5, Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 31 2, 1, 7, 8, 10, 9, 6 và 3 Ta sӱ dөng mҧng B có cùng kiӇu vӟi A và thӵc hiӋn viӋc phân phӕi a[1] vào b[4] vì a[1].key = 4, a[2] vào b[5] vì a[2].key = 5, a[3] vào b[2] vì a[3].key = 2,... ĈӇ thӵc hiӋn viӋc phân phӕi này ta chӍ cҫn mӝt lӋnh lһp: for i:=1 to n do B[A[i].key] := A[i] Ĉây cNJng là lӋnh chính trong chѭѫng trình sҳp xӃp. LӋnh này lҩy O(n) thӡi gian. Các phҫn tӱ b[j] ÿѭӧc gӑi là các bin và phѭѫng pháp sҳp xӃp này ÿѭӧc gӑi là bin sort. Trѭӡng hӧp tәng quát: Là trѭӡng hӧp có thӇ có nhiӅu phҫn tӱ có chung mӝt giá trӏ khóa, chҷng hҥn ÿӇ sҳp mӝt mҧng A có n phҫn tӱ mà các giá trӏ khóa cӫa chúng là các sӕ nguyên lҩy giá trӏ trong khoҧng 1..m vӟi m ” n. Trong trѭӡng hӧp này ta không thӇ sӱ dөng các phҫn tӱ cӫa mҧng B làm bin ÿѭӧc vì nӃu có hai phҫn tӱ cӫa mҧng A có cùng mӝt khoá thì không thӇ lѭu trӳ trong cùng mӝt bin. ĈӇ giҧi quyӃt sӵÿөng ÿӝ này ta chuҭn bӏ mӝt cҩu trúc có m bin, mӛi bin có thӇ lѭu trӳ nhiӅu Kѫn mӝt phҫn tӱ. Cө thӇ là bin thӭ j sӁ lѭu các phҫn tӱ có khóa là j (1 ” j ” m) sau ÿó ta sӁ nӕi các bin Oҥi vӟi nhau ÿӇÿѭӧc mӝt dãy các phҫn tӱÿѭӧc sҳp. Cách tӕt nhҩt là ta thiӃt kӃ mӛi bin là mӝt danh sách liên kӃt cӫa các phҫn tӱ mà mӛi phҫn tӱ có kiӇu RecordType. Ta sӁ gӑi kiӇu cӫa danh sách này là ListType. Ta có thӇ tҥo kiӇu ListType bҵng cách ghép RecordType vӟi mӝt con trӓÿӇ trӓ tӟi phҫn tӱ kӃ tiӃp. Lҩy B là mӝt mҧng kiӇu Array[KeyType] of ListType. Nhѭ vұy B là mҧng các bin, mӛi bin là Pӝt danh sách. B ÿѭӧc ÿánh chӍ sӕ bӣi KeyType, nhѭ thӃ có ít nhҩt mӝt bin cho mӛi giá trӏ khoá. Ta vүn sӁ phân phӕi phҫn tӱ a[i] vào bin b[j] nӃu j = a[i]key. Dƭ nhiên mӛi bin b[j] có thӇ chӭa nhiӅu phҫn tӱ cӫa mҧng A. Các phҫn tӱ mӟi sӁÿѭӧc ÿѭa vào cuӕi danh sách b[j]. Sau khi tҩt cҧ các phҫn tӱ cӫa mҧng A ÿã ÿѭӧc phân phӕi vào trong các bin, công viӋc cuӕi cùng là ta phҧi nӕi các bin lҥi vӟi nhau, ta sӁÿѭӧc mӝt danh sách có thӭ tӵ. Ta sӁ dùng thӫ tөc concatenate(L1,L2) ÿӇ nӕi hai danh sách L1, L2. Nó thay thӃ danh sách L1 bӣi danh sách nӕi L1L2. ViӋc Qӕi sӁÿѭӧc thӵc hiӋn bҵng cách gҳn con trӓ cӫa phҫn tӱ cuӕi cùng cӫa L1 vào ÿҫu cӫa L2. Ta biӃt rҵng ÿӇÿӃn ÿѭӧc phҫn tӱ cuӕi cùng cӫa danh sách liên kӃt L1 ta phҧi duyӋt qua tҩt cҧ các phҫn tӱ cӫa nó. ĈӇ cho có hiӋu quҧ, ta thêm mӝt con trӓ nӳa, trӓÿӃn phҫn tӱ cuӕi cùng cӫa mӛi danh sách, ÿLӅu này giúp ta ÿi thҷng tӟi phҫn tӱ cuӕi cùng mà không phҧi duyӋt qua toàn bӝ danh sách. Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 32 Hình 2-13 minh hӑa viӋc nӕi hai danh sách. Sau khi nӕi thì header và end cӫa danh sách L2 không còn tác dөng nӳa. Ví dө 2-8: Sҳp xӃp mҧng A gӗm 10 phҫn tӱ có khoá là các sӕ nguyên có giá trӏ là các sӕ 2, 4, 1, 5, 4, 2, 1, 4, 1, 5. A a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] Khoá cӫa A 2 4 1 5 4 2 1 4 1 5 Ta thҩy các giá trӏ khoá nҵm trong khoҧng 1..5. Ta tә chӭc mӝt mҧng B gӗm 5 phҫn tӱ, mӛi phҫn tӱ là mӝt con trӓ, trӓÿӃn mӝt danh sách liên kӃt . Chѭѫng trình sӱ dөng cҩu trúc danh sách liên kӃt làm các bin VAR A: array[1..n] of RecordType; Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 33 B: array[keytype] of ListType; {Ta giҧ thiӃt keytype là kiӇu miӅn con 1..m } procedure BinSort; var i:integer; j: KeyType; begin {1}for i:=1 to n do INSERT(A[i], END(B[A[i].key]), B[A[i}.key]); {2}for j:= 2 to m do CONCATENATE(B[1], B[j]); end; II.5.2- Phân tích Bin Sort Bin sort ḽy O(n) thͥi gian ÿ͋ s̷p x͇p m̫ng g͛m n ph̯n t͵. Trѭӟc hӃt thӫ tөc INSERT cҫn mӝt thӡi gian O(1) ÿӇ xen mӝt phҫn tӱ vào trong danh sách. Do cách tә chӭc danh sách có giNJ con trӓÿӃn phҫn tӱ cuӕi cùng nên viӋc nӕi hai danh sách bҵng thӫ tөc CONCATENATE cNJng chӍ mҩt O(1) thӡi gian. Ta thҩy vòng lһp {1} thӵc hiӋn n lҫn, mӛi lҫn tӕn O(1) = 1 nên lҩy O(n) ÿѫn vӏ thӡi gian. Vòng lһp {2} thӵc hiӋn m-1 lҫn, mӛi lҫn O(1) nên tӕn O(m) ÿѫn vӏ thӡi gian. Hai lӋnh {1} và {2} nӕi tiӃp nhau nên thӡi gian thӵc hiӋn cӫa BinSort là T(n) = O(max(n,m)) = O(n) vì m ” n. II.5.3- Sҳp xӃp tұp giá trӏ có khoá lӟn NӃu m sӕ các khoá không lӟn hѫn n sӕ các phҫn tӱ cҫn sҳp xӃp, khi ÿó O(max(n,m)) thӵc sӵ là O(n). NӃu giҧ sӱ m = n2 khi ÿó O(max(n, n2)) là O(n2) nhѭ vұy Bin sort lҩy O(n2) thӡi gian. Tuy nhiên ta vүn có thӇ tәng quát hoá kӻ thuұt bin sort ÿӇ nó vүn lҩy O(n) thӡi gian. Giҧ sӱ ta cҫn sҳp xӃp n phҫn tӱ có các giá trӏ khoá thuӝc 0..n2-1. Ta sӁ sӱ dөng n bin B[0], B[1],...B[n-1] và tiӃn hành viӋc sҳp xӃp trong hai kǤ. KǤ 1: Phân phӕi phҫn tӱ a[i] vào bin B[j] mà j = a[i].key MOD n. KǤ 2: Phân phӕi các phân tӱ trong danh sách kӃt quҧ cӫa kǤ 1 vào các bin. Phҫn tӱ a[i] sӁÿѭӧc phân phӕi vào bin B[j] mà j = a[i].key DIV n. Chú ý rҵng trong cҧ hai kǤ, ta xen các phҫn tӱ mӟi ÿѭӧc phân phӕi vào cuӕi danh sách. Ví dө 2-9: Cҫn sҳp xӃp mҧng gӗm 10 phҫn tӱ có khoá là các sӕ nguyên: 36, 9, 0, 25, 1, 49, 64, 16, 81 và 4. Ta sӱ dөng 10 bin ÿѭӧc ÿánh sӕ tӯ 0 ÿӃn 9. KǤ mӝt ta phân phӕi phҫn tӱ a[i] vào bin có chӍ sӕ a[i].key MOD 10. Nӕi các bin lҥi vӟi nhau ta ÿѭӧc danh sách có khóa là: 0 1 81 64 4 25 36 16 9 49. KǤ hai sӱ dөng kӃt quҧ cӫa kǤ 1 ÿӇ sҳp tiӃp. Phân phӕi phҫn tӱ a[i] vào bin có chӍ sӕ a[i].key DIV 10. Nӕi các bin lҥi vӟi nhau ta ÿѭӧc danh sách có thӭ tӵ. .Ǥ 1 KǤ 2 Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 34 Bin Bin 0 0 0 0 1 4 9 1 1 81 1 16 2 2 25 3 3 36 4 64 4 4 49 5 25 5 6 36 16 6 64 7 7 8 8 81 9 9 49 9 Hình 2-13: S̷p x͇p theo hai kǤ Theo sӵ phân tích giҧi thuұt Bin Sort thì mӛi kǤ lҩy O(n) thӡi gian, hai kǤ này nӕi tiӃp nhau nên thӡi gian tәng cӝng là O(n). Chӭng minh giҧi thuұt ÿúng ĈӇ thҩy tính ÿúng ÿҳn cӫa giҧi thuұt ta xem các các giá trӏ khóa nguyên tӯ 0 ÿӃn n2-1 nhѭ các Vӕ có hai chӳ sӕ trong hӋÿӃm cѫ sӕ n. Xét hai sӕ k = sn + t và l = un + v trong ÿó s, t, u, v là các sӕ 0..n-1. Giҧ sӱ k < l, ta cҫn chӭng minh rҵng sau 2 kǤ sҳp thì k phҧi ÿӭng trѭӟc l. Vì k < l nên s ” u. NӃu s < u thì k ÿӭng trѭӟc l trong danh sách kӃt qӫa vì k ÿѭӧc sҳp vào bin b[s] và l ÿѭӧc sҳp vào bin b[u] mà b[s] ÿӭng trѭӟc b[u]. NӃu s=u thì t<v. Sau kǤ 1 thì k ÿӭng trѭӟc l, vì k ÿѭӧc sҳp vào trong bin b[t] và l trong bin b[v]. ĈӃn kǤ 2 mһc dù cҧ k và l ÿӅu ÿѭӧc sҳp vào trong bin b[s], nhѭng k ÿѭӧc xen vào trѭӟc l nên kӃt quҧ là k ÿӭng trѭӟc l. Chú ý 7ӯ chӭng minh trên ta thҩy ÿӇ sҳp các phҫn tӱ có khóa là các sӕ nguyên (hӋÿӃm cѫ sӕ 10) tӯ 0 ÿӃn 99 ta dùng 10 bin có chӍ sӕ tӯ 0 ÿӃn 9. ĈӇ sҳp các phҫn tӱ có khóa là các sӕ nguyên tӯ 0 ÿӃn 999 ta dùng 100 bin có chӍ sӕ tӯ 0 ÿӃn 99... Bài 1: Sɬp xɼp mɠng g͓m 12 phɤn tͭ có khóa là các s͑ nguyên : 5, 15, 12, 2, 10, 12, 9, 1, 9, 3, 2, 3 Eɮng cách sͭ dͥng: a) Sɬp xɼp ch͍n. b) Sɬp xɼp xen. c) Sɬp xɼp n͕i b͍t. d) QuickSort. e) HeapSort. Bài 2: Có m͙t biɼn thʀ cͧa sɬp xɼp ch͍n nhɉ sau: Trong bɉ͛c thͩ i ta ch͍n m͙t phɤn tͭ có Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 35 khóa nh͏ nhɢt và m͙t phɤn tͭ có khóa l͛n nhɢt trong a[i]...a[n-i+1] và hóan ÿ͕i phɤn tͭ nh͏ nhɢt cho a[i] và phɤn tͭ l͛n nhɢt cho a[n-i+1]. Hãy viɼt thͧ tͥc sɬp xɼp ch͍n theo giɠi thuɪt này và tính th͝i gian thͱc hiʄn. Bài 3: Viɼt thͧ tͥc sɬp xɼp tr͙n (xem giɠi thuɪt thô trong chɉɇng 1). Bài 4: Có m͙t biɼn thʀ cͧa QuickSort nhɉ sau: Ch͍n ch͑t là khóa cͧa phɤn tͭ nh͏ nhɢt trong hai phɤn tͭ có khóa khác nhau ÿɤu tiên. Mɠng con bên trái g͓m các phɤn tͭ có khóa nh͏ hɇn hoɴc bɮng ch͑t, mɠng con bên phɠi g͓m các phɤn tͭ có khóa l͛n hɇn ch͑t. Hãy viɼt lɞi các thͧ tͥc Fɤn thiɼt cho biɼn thʀ này. Bài 5: M͙t biɼn thʀ khác cͧa QuickSort là ch͍n khóa cͧa phɤn tͭÿɤu tiên làm ch͑t. Hãy viɼt lɞi các thͧ tͥc cɤn thiɼt cho biɼn thʀ này. Bài 6: Hãy viɼt lɞi thͧ tͥc PushDown trong HeapSort ÿʀ có thʀ sɬp xɼp theo thͩ tͱ tăng. Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 36 1. Mөc tiêu 2. KiӃn thӭc cѫ bҧn cҫn có ÿӇ hӑc chѭѫng này 3. Tài liӋu tham khҧo có liên quan ÿӃn chѭѫng 4. Nӝi dung: III.1 - Giҧi thuұt chia ÿӇ trӏ III.2 - Quy hoҥch ÿӝng III.3 - Kӻ thuұt "tham ăn" III.4 - Kӻ thuұt quay lui III.5 - Kӻ thuұt tìm kiӃm ÿӏa phѭѫng 5. Vҩn ÿӅ nghiên cӭu cӫa trang kӃ tiӃp Nói chung khi thiӃt kӃ mӝt giҧi thuұt chúng ta thѭӡng dӵa vào mӝt sӕ kӻ thuұt nào ÿó. Chѭѫng này sӁ trình bày mӝt sӕ kӻ thuұt quan trӑng ÿӇ thiӃt kӃ giҧi thuұt nhѭ: Chia ÿӇ trӏ (Divide-and- Conquer), quy hoҥch ÿӝng (dynamic programming), kӻ thuұt tham ăn (greedy techniques), quay lui (backtracking) và tìm kiӃm ÿӏa phѭѫng (local search). Các kӻ thuұt này ÿѭӧc áp dөng vào mӝt lӟp Uӝng các bài toán, trong ÿó có nhӳng bài toán nәi tiӃng nhѭ bài toán tìm ÿѭӡng ÿi ngҳn nhҩt cӫa ngѭӡi giao hàng, bài toán cây phӫ tӕi tiӇu... III.1- GIҦI THUҰT CHIA Ĉӆ TRӎ III.1.1- Nӝi dung kӻ thuұt III.1.2- Nhìn nhұn lҥi giҧi thuұt MergeSort và QuickSort III.1.3- Bài toán nhân các sӕ nguyên lӟn III.1.4- XӃp lӏch thi ÿҩu thӇ thao III.1.5- Bài toán con cân bҵng III.1.1- Nӝi dung kӻ thuұt Có thӇ nói rҵng kӻ thuұt quan trӑng nhҩt, ÿѭӧc áp dөng rӝng rãi nhҩt ÿӇ thiӃt kӃ các giҧi thuұt có hiӋu quҧ là kӻ thuұt "chia ÿӇ trӏ" (divide and conquer). Nӝi dung cӫa nó là: ĈӇ giҧi mӝt bài toán kích thѭӟc n, ta chia bài toán ÿã cho thành mӝt sӕ bài toán con có kích thѭóc nhӓ hѫn. Giҧi các bài toán con này rӗi tәng hӧp kӃt quҧ lҥi ÿӇÿѭӧc lӡi giҧi cӫa bài toán ban ÿҫu. Ĉӕi vӟi các bài toán con, chúng ta lҥi sӱ dөng kӻ thuұt chia ÿӇ trӏÿӇ có ÿѭӧc các bài toán kích thѭӟc nhӓ hѫn nӳa. Quá trình trên VӁ dүn ÿӃn nhӳng bài toán mà lӡi giҧi chúng là hiӇn nhiên hoһc GӉ dàng thӵc hiӋn, ta gӑi các bài toán này là bài toán cѫ sӣ. Tóm lҥi kӻ thuұt chia ÿӇ trӏ bao gӗm hai quá trình: Phân tích bài toán ÿã cho thành các bài toán cѫ sӣ và Wәng hӧp kӃt quҧ tӯ bài toán cѫ sӣÿӇ có lӡi giҧi cӫa bài toán ban ÿҫu. Tuy nhiên ÿӕi vӟi Pӝt sӕ bài toán, thì quá trình phân tích ÿã chӭa ÿӵng viӋc tәng hӧp kӃt quҧ do ÿó nӃu chúng ta ÿã giҧi xong các bài toán cѫ sӣ thì bài toán ban ÿҫu cNJng ÿã ÿѭӧc giҧi quyӃt. Ngѭӧc lҥi có nhӳng bài toán mà quá trình phân tích thì ÿѫn giҧn nhѭng viӋc tәng hӧp kӃt quҧ lҥi rҩt khó khăn. Trong các phҫn tiӃp sau ta sӁ trình bày mӝt sӕ ví dөÿӇ thҩy rõ hѫn ÿLӅu này. .ӻ thuұt này sӁ cho chúng ta mӝt giҧi thuұt ÿӋ quy mà viӋc xác ÿӏnh ÿӝ phӭc tҥp cӫa nó sӁ phҧi giҧi mӝt phѭѫng trình ÿӋ quy nhѭ trong chѭѫng I ÿã trình bày. Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 37 III.1.2 Nhìn nhұn lҥi giҧi thuұt MergeSort và QuickSort Hai giҧi thuұt sҳp xӃp ÿã ÿѭӧc trình bày trong các chѭѫng trѭӟc (MergeSort trong chѭѫng I và QuickSort trong chѭѫng II) thӵc chҩt là ÿã sӱ dөng kӻ thuұt chia ÿӇ trӏ. 9ӟi MergeSort, ÿӇ sҳp mӝt danh sách L gӗm n phҫn tӱ, chúng ta chia L thành hai danh sách con L1 và L2 mӛi danh sách có n/2 phҫn tӱ. Sҳp xӃp L1, L2 và trӝn hai danh sách ÿã ÿѭӧc sҳp này ÿӇ ÿѭӧc mӝt danh sách có thӭ tӵ. Quá trình phân tích ӣÿây là quá trình chia ÿôi mӝt danh sách, quá trình này sӁ dүn ÿӃn bài toán sҳp xӃp mӝt danh sách có ÿӝ daì bҵng 1, ÿây chính là bài toán cѫ sӣ vì viӋc sҳp [Ӄp danh sách này là “không làm gì cҧ”. ViӋc tәng hӧp các kӃt quҧӣÿây là “trӝün 2 danh sách ÿã ÿѭӧc sҳp ÿӇÿѭӧc mӝt danh sách có thӭ tӵ”. 9ӟi QuickSort, ÿӇ sҳp xӃp mӝt danh sách gӗm n phҫn tӱ, ta tìm mӝt giá trӏ chӕt và phân hoҥch danh sách ÿã cho thành hai danh sách con “bên trái” và “bên phҧi “. Sҳp xӃp “bên trái” và “bên phҧi” thì ta ÿѭӧc danh sách có thӭ tӵ. Quá trình phân chia sӁ dүn ÿӃn các bài toán sҳp xӃp mӝt danh sách chӍ Jӗm mӝt phҫn tӱ hoһc gӗm nhiӅu phҫn tӱ có khoá bҵng nhau, ÿó chính là các bài toán cѫ sӣ, vì bҧn thân chúng ÿã có thӭ tӵ rӗi. Ӣÿây chúng ta cNJng không có viӋc tәng hӧp kӃt quҧ mӝt cách tѭӡng minh, vì viӋc ÿó ÿã ÿѭӧc thӵc hiӋn trong quá trình phân hoҥch. III.1.3- Bài toán nhân các sӕ nguyên lӟn Xét bài toán nhân hai sӕ nguyên n chӳ sӕ X và Y. Theo giҧi thuұt nhân hai sӕ thông thѭӡng thì Fҫn n2 phép nhân và n phép cӝng nên tӕn O(n2) thӡi gian. Áp dөng kӻ thuұt "chia ÿӇ trӏ" vào phép nhân các sӕ nguyên, ta chia mӛi sӕ nguyên X và Y thành các sӕ nguyên có n/2 chӳ sӕ. ĈӇÿѫn giҧn ta giҧ sӱ n là luӻ thӯa cӫa 2 X = A10n/2 + B Y = C10n/2 + D Trong ÿó A, B, C, D là các sӕ nguyên có n/2 chӳ sӕ. Chҷng hҥn vӟi X = 1234 thì A = 12 và B = 34 bӣi vì X = 12 *102 + 34. Tích cӫa X và Y có thӇÿѭӧc viӃt thành: XY = AC10n+(AD + BC)10n/2 + BD (III.1) 9ӟi mӛi sӕ có n/2 chӳ sӕ, chúng ta lҥi tiӃp tөc phân tích theo cách trên, quá trình phân tích sӁ Gүn ÿӃn bài toán cѫ sӣ là nhân các sӕ nguyên chӍ gӗm mӝt chӳ sӕ mà ta dӉ dàng thӵc hiӋn. ViӋc tәng Kӧp kӃt quҧ chính là thӵc hiӋn các phép toán theo công thӭc (III.1). Theo (III.1) thì chúng ta phҧi thӵc hiӋn 4 phép nhân các sӕ nguyên n/2 chӳ sӕ (AC, AD, BC, BD), sau ÿó tәng hӧp kӃt quҧ bҵng 3 phép cӝng các sӕ nguyên n chӳ sӕ và 2 phép nhân vӟi 10n và 10n/2. Các phép cӝng các sӕ nguyên n chӳ sӕ dƭ nhiên chӍ cҫn O(n). Phép nhân vӟi 10n có thӇ thӵc hiӋn mӝt cách ÿѫn giҧn bҵng cách thêm vào n chӳ sӕ 0 và do ÿó cNJng chӍ lҩy O(n). Gӑi T(n) là thӡi gian ÿӇ nhân hai sӕ nguyên, mӛi sӕ có n chӳ sӕ thì tӯ (III.1) ta có: T(1) = 1 T(n) = 4T(n/2) + cn (III.2) Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 38 Giҧi (III.1) ta ÿѭӧc T(n) = O(n2). Nhѭ vұy thì chҷng cҧi tiӃn ÿѭӧc chút nào so vӟi giҧi thuұt nhân hai sӕ bình thѭӡng. ĈӇ cҧi thiӋn tình hình, chúng ta có thӇ viӃt lҥi (III.1) thành dҥng: XY = AC10n + [(A-B)(D-C) + AC + BD] 10n/2+ BD (III.3) Công thӭc (III.3) chӍÿòi hӓi 3 phép nhân cӫa các sӕ nguyên n/2 chӳ sӕ là: AC, BD và (A- B)(D-C), 6 phép cӝng trӯ và 2 phép nhân vӟi 10n. Các phép toán này ÿӅu lҩy O(n) thӡi gian. Tӯ (III.3) ta có phѭѫng trình ÿӋ quy: T(1) = 1 T(n) = 3T(n/2) + cn Giҧi phѭѫng trình ÿӋ quy này ta ÿѭӧc nghiӋm T(n) = O(nlog3) = O(n1.59). Giҧi thuұt này rõ ràng ÿã ÿѭӧc cҧi thiӋn rҩt nhiӅu. Giҧi thuұt thô ÿӇ nhân hai sӕ nguyên (dѭѫng hoһc âm) n chӳ sӕ là: function Mult(x,y:integer; n:integer) : integer; var m1,m2,m3,A,B,C,D: integer; s:integer;{Lѭu trӳ dҩu cӫa tích xy} begin s := sign(x)*sign(y); {Hàm sign có giá trӏ 1 nӃu x dѭѫng và –1 nӃu x âm} x := ABS(x);{Lҩy trӏ tuyӋt ÿӕi cӫa x} y := ABS(y); if n = 1 then mult:=x*y*s else begin A := left( x, n DIV 2); B := right(x, n DIV 2); C := left(y, n DIV 2); D := right(y, n DIV 2); m1 := mult(A,C, n DIV 2); m2 := mult(A-B,D-C, n DIV 2); m3 := mult(B,D, n DIV 2); mult := (s * (m1 * 10n + (m1+m2+m3)* 10 n DIV 2 + m3)); end end; III.1.4- XӃp lӏch thi ÿҩu thӇ thao Kӻ thuұt chia ÿӇ trӏ không nhӳng chӍ có ӭng dөng trong thiӃt kӃ giҧi thuұt mà còn trong nhiӅu Oƭnh vӵc khác cӫa cuӝc sӕng. Chҷng hҥn xét viӋc xӃp lӏch thi ÿҩu thӇ thao theo thӇ thӭc ÿҩu vòng tròn 1 Oѭӧt cho n cҫu thӫ. Mӛi cҫu thӫ phҧi ÿҩu vӟi các cҫu thӫ khác, và mӛi cҫu thӫ chӍÿҩu nhiӅu nhҩt mӝt trұn mӛi ngày. Yêu cҫu là xӃp mӝt lӏch thi ÿҩu sao cho sӕ ngày thi ÿҩu là ít nhҩt. Ta dӉ dàng thҩy rҵng Wәng sӕ trұn ÿҩu cӫa toàn giҧi là n(n-1)/2. Nhѭ vұy nӃu n là mӝt sӕ chҹn thì ta có thӇ sҳp n/2 cһp thi ÿҩu trong mӝt ngày và do ÿó cҫn ít nhҩt n-1 ngày. Ngѭӧc lҥi nӃu n là mӝt sӕ lҿ thì n-1 là mӝt sӕ chҹn nên ta có thӇ sҳp (n-1)/2 cһp thi ÿҩu trong mӝt ngày và do ÿó ta cҫn n ngày. Giҧ sӱ n = 2k thì n là mӝt sӕ chҹnUpload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 39 và do ÿó cҫn tӕi thiӇu n-1 ngày. Lӏch thi ÿҩu là mӝt bҧng n dòng và n-1 cӝt. Các dòng ÿѭӧc ÿánh sӕ tӯ 1 ÿӃn n và các cӝt ÿѭӧc ÿánh sӕ tӯ 1 ÿӃn n-1, trong ÿó dòng i biӇu diӉn cho cҫu thӫ i, cӝt j biӇu diӉn cho ngày thi ÿҩu j và ô(i,j) ghi cҫu thӫ phҧi thi ÿҩu vӟi cҫu thӫ i trong ngày j. ChiӃn lѭӧc chia ÿӇ trӏ xây dӵng lӏch thi ÿҩu nhѭ sau: ĈӇ sҳp lӏch cho n cҫu thӫ, ta sӁ sҳp lӏch cho n/2 cҫu thӫ, ÿӇ sҳp lӏch cho n/2 cҫu thӫ, ta sӁ sҳp lӏch cho n/4 cҫu thӫ... Quá trình này sӁ dүn ÿӃn bài toán cѫ sӣ là sҳp lӏch thi ÿҩu cho 2 cҫu thӫ. Hai cҫu thӫ này sӁ thi ÿҩu mӝt trұn trong mӝt ngày, lӏch thi ÿҩu cho hӑ thұt dӉ sҳp. Khó khăn chính là ӣ chӛ tӯ các lӏch thi ÿҩu cho hai cҫu thӫ, ta tәng hӧp lҥi ÿӇÿѭӧc lӏch thi ÿҩu cӫa 4 cҫu thӫ, 8 cҩu thӫ, ... Xuҩt phát tӯ lӏch thi ÿҩu cho hai cҫu thӫ ta có thӇ xây dӵng lӏch thi ÿҩu cho 4 cҫu thӫ nhѭ sau: /ӏch thi ÿҩu cho 4 cҫu thӫ sӁ là mӝt bҧng 4 dòng, 3 cӝt. Lӏch thi ÿҩu cho 2 cҫu thӫ 1 và 2 trong ngày thӭ 1 chính là lӏch thi ÿҩu cӫa hai cҫu thӫ (bài toán cѫ sӣ). Nhѭ vұy ta có Ô(1,1) = “2” và Ô(2,1) = “1”. 7ѭѫng tӵ ta có lӏch thi ÿҩu cho 2 cҫu thӫ 3 và 4 trong ngày thӭ 1. Nghƭa là Ô(3,1) =”4” và Ô(4,1) = “3”. (Ta cӕ thӇ thҩy rҵng Ô(3,1) = Ô(1,1) + 2 và Ô(4,1) = Ô(2,1) + 2 ). Bây giӡÿӇ hoàn thành lӏch thi ÿҩu cho 4 cҫu thӫ, ta lҩy góc trên bên trái cӫa bҧng lҳp vào cho góc dѭӟi bên phҧi và lҩy góc dѭӟi bên trái lҳp cho góc trên bên phҧi. Lӏch thi ÿҩu cho 8 cҫu thӫ là mӝt bҧng gӗm 8 dòng, 7 cӝt. Góc trên bên trái chính là lӏch thi ÿҩu trong 3 ngày ÿҫu cӫa 4 cҫu thӫ tӯ 1 ÿӃn 4. Các ô cӫa góc dѭӟi bên trái sӁ bҵng các ô tѭѫng ӭng cӫa góc trên bên trái cӝng vӟi 4. Ĉây chính là lӏch thi ÿҩu cho 4 cҫu thӫ 5, 6, 7 và 8 trong 3 ngày ÿҫu. Bây giӡ chúng ta hoàn thành viӋc sҳp lӏch bҵng cách lҩp ÿҫy góc dѭӟi bên phҧi bӣi góc trên bên trái và góc trên bên phҧi bӣi góc dѭӟi bên trái. III.1.5- Bài toán con cân bҵng (Balancing Subproblems) Ĉӕi vӟi kӻ thuұt chia ÿӇ trӏ, nói chung sӁ tӕt hѫn nӃu ta chia bài toán cҫn giҧi thành các bài toán con có kích thѭӟc gҫn bҵng nhau. Ví dө, sҳp xӃp trӝn (MergeSort) phân chia bài toán thành hai bài toán con có cùng kích thѭӟc n/2 và do ÿó thӡi gian cӫa nó chӍ là O(nlogn). Ngѭӧc lҥi trong trѭӡng hӧp [ҩu nhҩt cӫa QuickSort, khi mҧng bӏ phân hoҥch lӋch thì thӡi gian thӵc hiӋn là O(n2). Nguyên tҳc chung là chúng ta tìm cách chia bài toán thành các bài toán con có kích thѭӟc xҩp xӍ bҵng nhau thì hiӋu suҩt sӁ cao hѫn. III.2- QUY HOҤCH ĈӜNG Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 40 III.2.1- Nӝi dung kӻ thuұt III.2.2- Bài toán tính sӕ tә hӧp III.2.1- Nӝi dung kӻ thuұt Nhѭ trong III.1 chúng ta ÿã nói, kӻ thuұt chia ÿӇ trӏ thѭӡng dүn chúng ta tӟi mӝt giҧi thuұt ÿӋ quy. Trong các giҧi thuұt ÿó, có thӇ có mӝt sӕ giҧi thuұt thӡi gian mNJ. Tuy nhiên, thѭӡng chӍ có mӝt sӕ ÿa thӭc các bài toán con, ÿLӅu ÿó có nghƭa là chúïng ta ÿã phҧi giҧi mӝt sӕ bài toán con nào ÿó trong nhiӅu lҫn. ĈӇ tránh viӋc giҧi dѭ thӯa mӝt sӕ bài toán con, chúng ta tҥo ra mӝt bҧng lѭu tҩt cҧ kӃt quҧ Fӫa các bài toán con và khi cҫn chúng ta chӍ cҫn tham khҧo tӟi kӃt quҧÿã ÿѭӧc lѭu trong bҧng mà không cҫn phҧi giҧi lҥi bài toánÿó. Lҩp ÿҫy bҧng kӃt quҧ các bài toán con theo mӝt quy luұt nào ÿó ÿӇ nhұn ÿѭӧc kӃt quҧ cӫa bài toán ban ÿҫu (cNJng ÿã ÿѭӧc lѭu trong mӝt ô nào ÿó cӫa bҧng) ÿѭӧc gӑi là quy hoҥch ÿӝng. III.2.2- Bài toán tính sӕ tә hӧp Mӝt bài toán khá quen thuӝc vӟi chúng ta là tính sӕ tә hӧp chұp k cӫa n theo công thӭc: Ckn = 1 nӃu k=0 hoһc k = n Ckn = Ck-1n-1 + Ckn-1 nӃu 0 < k < n Công thӭc trên ÿã gӧi ý cho chúng ta mӝt giҧi thuұt ÿӋ quy nhѭ sau: function Comb(n,k : integer) : Integer; begin if (k=0) or (k=n) then Comb := 1 else Comb := Comb(n-1, k-1) + Comb(n-1,k); end; Gӑi T(n) là thӡi gian ÿӇ tính sӕ tә hӧp chұp k cӫa n, thì ta có phѭѫng trình ÿӋ quy: T(1) = C1 T(n) = 2T(n-1) + C2 Giҧi phѭѫng trình này ta ÿѭӧc T(n) = O(2n), nhѭ vұy là mӝt giҧi thuұt thӡi gian mNJ, trong khi chӍ có mӝt ÿa thӭc các bài toán con. ĈLӅu ÿó chӭng tӓ rҵng có nhӳng bài toán con ÿѭӧc giҧi nhiӅu lҫn. Chҷng hҥn ÿӇ tính Comb(4,2) ta phҧi tính Comb(3,1) và Comb(3,2). ĈӇ tính Comb(3,1) ta phҧi tính Comb(2,0) và Comb(2,1). ĈӇ tính Comb(3,2) ta phҧi tính Comb(2,1) và Comb(2,2). Nhѭ vұy ÿӇ tính Comb(4,2) ta phҧi tính Comb(2,1) hai lҫn. Hình 3-2 sau minh hoҥ rõ ÿLӅu ÿó. Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 41 Áp dөng kӻ thuұt quy hoҥch ÿӝng ÿӇ khҳc phөc tình trҥng trên, ta xây dӵng mӝt bҧng gӗm n+1 dòng (tӯ 0 ÿӃn n) và n+1 cӝt (tӯ 0 ÿӃn n) và ÿLӅn giá trӏ cho O(i,j) theo quy tҳc sau: (Quy tҳc tam giác Pascal): O(0,0) = 1; O(i,0) =1; O(i,i) = 1 vӟi 0 < i ( n; O(i,j) = O(i-1,j-1) + O(i-1,j) vӟi 0 < j < i £ n. Chҷng hҥn vӟi n = 4 ta có bҧng bên. O(n,k) chính là Comb(n,k) và ta có giҧi thuұt nhѭ sau: function Comb(n, k : Integer) : Integer var C: array[0..n, 0..n] of integer; i,j : integer; begin {1} C[0,0] := 1; {2} for i := 1 to n do begin {3} C[i,0] := 1; {4} C[i,i] := 1; {5} for j := 1 to i-1 do C[i,j] := C[i-1,j-1] + C[i-1,j]; end; {6} Comb := C[n,k]; end; Vòng lһp {5} thӵc hiӋn i-1 lҫn, mӛi lҫn O(1). Vòng lһp {2} có i chҥy tӯ 1 ÿӃn n, nên nӃu gӑi T(n) là thӡi gian thӵc hiӋn giҧi thuұt thì ta có: III.3- KӺ THUҰT "THAM ĂN" III.3.1- Bài toán tӕi ѭu tә hӧp III.3.2- Nӝi dung kӻ thuұt tham ăn III.3.3- Bài toán ÿѭӡng ÿi cӫa ngѭӡi giao hàng III.3.4- Bài toán cái ba lô Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 42 III.3.1- Bài toán tӕi ѭu tә hӧp Là mӝt dҥng cӫa bài toán tӕi ѭu, nó có dҥng tәng quát nhѭ sau: · Cho phiӃm hàm xác ÿӏnh trên mӝt tұp hӳu hҥn các phҫn tӱ D. Hàm f(X) ÿѭӧc gӑi là hàm mөc tiêu. · Mӛi phҫn tӱ X D có dҥng X= (x1, x2, .. xn) ÿѭӧc gӑi là mӝt phѭѫng án. · Cҫn tìm mӝt phѭѫng án X D sao cho hàm f(X) ÿҥt min (max). Phѭѫng án X nhѭ thӃÿѭӧc Jӑi là phѭѫng án tӕi ѭu. Ta có thӇ tìm thҩy phѭѫng án tӕi ѭu bҵng phѭѫng pháp “vét cҥn” nghƭa là xét tҩt cҧ các phѭѫng án trong tұp D (hӳu hҥn) ÿӇ xác ÿinh phѭѫng án tӕt nhҩt. Mһc dù tұp hӧp D là hӳu hҥn nhѭng ÿӇ tìm phѭѫng án tӕi ѭu cho mӝt bài toán kích thѭӟc n bҵng phѭѫng pháp “vét cҥn” ta có thӇ cҫn mӝt thӡi gian mNJ. Các phҫn tiӃp theo cӫa chѭѫng này sӁ trình bày mӝt sӕ kӻ thuұt giҧi bài toán tӕi ѭu tә hӧp mà thӡi gian có thӇ chҩp nhұn ÿѭӧc. III.3.2- Nӝi dung kӻ thuұt tham ăn Kӻ thuұt tham ăn thѭӡng ÿѭӧc vұn dөng ÿӇ giҧi bài toán tӕi ѭu tә hӧp bҵng cách xây dӵng mӝt phѭѫng án X. Phѭѫng án X ÿѭӧc xây dӵng bҵng cách lӵa chӑn tӯng thành phҫn xi cӫa X cho ÿӃn khi hoàn chӍnh (ÿӫ n thành phҫn). Vӟi mӛi xi , ta sӁ chӑn xi tӕi ѭu. Vӟi cách này thì có thӇӣ bѭӟc cuӕi cùng ta không còn gì ÿӇ chӑn mà phҧi chҩp nhұn mӝt giá trӏ cuӕi cùng còn lҥi. Áp dөng kӻ thuұt tham ăn sӁ cho mӝt giҧi thuұt thӡi gian ÿa thӭc, tuy nhiên nói chung chúng ta chӍÿҥt ÿѭӧc mӝt phѭѫng án tӕt chӭ không phҧi là tӕi ѭu. Có rҩt nhiӅu bài toán mà ta có thӇ giҧi bҵng kӻ thuұt này, sau ÿây là mӝt sӕ ví dө. III.3.3- Bài toán ÿѭӡng ÿi cӫa ngѭӡi giao hàng Chúng ta sӁ xét mӝt bài toán rҩt nәi tiӃng có tên là bài toán tìm ÿѭӡng ÿi cӫa ngѭӡi giao hàng (TSP - Traveling Salesman Problem): Có mӝt ngѭӡi giao hàng cҫn ÿi giao hàng tҥi n thành phӕ. Xuҩt phát tӯ mӝt thành phӕ nào ÿó, ÿi qua các thành phӕ khác ÿӇ giao hàng và trӣ vӅ thành phӕ ban ÿҫu. Mӛi thành phӕ chӍÿӃn mӝt lҫn, khoҧng cách tӯ mӝt thành phӕÿӃn các thành phӕ khác là xác ÿӏnh ÿѭӧc. Khoҧng cách giӳa hai thành phӕ có thӇ là khoҧng cách ÿӏa lý, có thӇ là cѭӟc phí di chuyӇn hoһc thӡi gian di chuyӇn. Ta gӑi chung là ÿӝ dài. Hãy tìm mӝt chu trình (mӝt ÿѭӡng ÿi khép kín thӓa mãn ÿLӅu kiӋn trên) sao cho tәng ÿӝ dài các cҥnh là nhӓ nhҩt. Hay còn nói là tìm mӝt phѭѫng án có giá nhӓ nhҩt. Bài toán này cNJng ÿѭӧc gӑi là bài toán ngѭӡi du lӏch. Vӟi phѭѫng pháp vét cҥn ta xét tҩt cҧ các chu trình, mӛi chu trình tính tәng ÿӝ dài các cҥnh Fӫa nó rӗi chӑn mӝt chu trình có tәng ÿӝ dài nhӓ nhҩt. Tuy nhiên chúng ta cҫn xét tҩt cҧ là chu trình. Thӵc vұy, do mӛi chu trình ÿӅu ÿi qua tҩt cҧ các ÿӍnh (thành phӕ) nên ta có thӇ cӕÿӏnh mӝt ÿӍnh. 7ӯÿӍnh này ta có n-1 cҥnh tӟi n-1 ÿӍnh khác, nên ta có n-1 cách chӑn cҥnh ÿҫu tiên cӫa chu trình. Sau khi ÿã chӑn ÿѭӧc cҥnh ÿҫu tiên, chúng ta còn n-2 cách chӑn cҥnh thӭ hai, do ÿó ta có (n-1)(n-2) cách Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 43 chӑn hai cҥnh. Cӭ lý luұn nhѭ vұy ta sӁ thҩy có (n-1)! cách chӑn mӝt chu trình. Tuy nhiên vӟi mӛi chu trình ta chӍ quan tâm ÿӃn tәng ÿӝ dài các cҥnh chӭ không quan tâm ÿӃn hѭӟïng ÿi theo chiӅu dѭѫng hay âm vì vұy có tҩt cҧ phѭѫng án. Ĉó là mӝt giҧi thuұt thӡi gian mNJ !!!. .ӻ thuұt tham ăn áp dөng vào ÿây là: 1. Tính ÿӝ dài cӫa tҩt cҧ các cҥnh (có tҩt cҧ Fҥnh). 2. Xét các cҥnh có ÿӝ dài tӯ nhӓÿӃn lӟn ÿӇÿѭa vào chu trình. 3. Mӝt cҥnh sӁÿѭӧc ÿѭa vào chu trình nӃu cҥnh ÿó thӓa mãn hai ÿLӅu kiӋn sau: · Không tҥo thành mӝt chu trình thiӃu (không ÿi qua ÿӫ n ÿӍnh) · Không tҥo thành mӝt ÿӍnh có cҩp • 3 (tӭc là không ÿѭӧc có nhiӅu hѫn hai cҥnh xuҩt phát Wӯ mӝt ÿӍnh, do yêu cҫu cӫa bài toán là mӛi thành phӕ chӍÿѭӧc ÿӃn mӝt lҫn: mӝt lҫn ÿӃn và mӝt lҫn ÿi) 4. Lһp lҥi bѭӟc 3 cho ÿӃn khi xây dӵng ÿѭӧc mӝt chu trình. Vӟi kӻ thuұt này ta chӍ cҫn n(n-1)/2 phép chӑn nên ta có mӝt giҧi thuұt cҫn O(n2) thӡi gian. Ví dө 3-1: Cho bài toán TSP vӟi 6 ÿӍnh ÿѭӧc cho bӣi các tӑa ÿӝ nhѭ sau: Do có 6 ÿӍnh nên có tҩt cҧ 15 cҥnh. Ĉó là các cҥnh: ab, ac, ad, ae, af, bc, bd, be, bf, cd, ce, cf, de, df và ef. Ĉӝ dài các cҥnh ӣÿây là khoҧng cách Euclide. Trong 15 cҥnh này thì de = 3 là nhӓ nhҩt, nên de ÿѭӧc chӑn vào chu trình. KӃÿӃn là 3 cҥnh ab, bc và ef ÿӅu có ÿӝ dài là 5. Cҧ 3 cҥnh ÿӅu thӓa mãn hai ÿLӅu kiӋn nói trên, nên ÿӅu ÿѭӧc chӑn vào chu trình. Cҥnh có ÿӝ dài nhӓ kӃ tiӃp là ac = 7.08, nhѭng không thӇÿѭa cҥnh này vào chu trình vì nó sӁ tҥo ra chu trình thiӃu (a-b-c-a). Cҥnh df cNJng bӏ loҥi vì lý do tѭѫng tӵ. Cҥûnh be ÿѭӧc xem xét nhѭng rӗi cNJng bӏ loҥi do tҥo ra ÿӍnh b và ÿӍnh e có cҩp 3. Tѭѫng tӵ chúng ta cNJng loҥi bd. cd là cҥnh tiӃp theo ÿѭӧc xét và ÿѭӧc chӑn. Cuӕi cùng ta có chu trình a-b-c-d-e-f-a vӟi tәng ÿӝ dài là 50. Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 44 Ĉây chӍ là mӝt phѭѫng án tӕt. Phѭѫng án tӕi ѭu là chu trình a-c-d-e-f-b-a vӟi tәng ÿӝ dài là 48.39. Giҧi thuұt sѫ bӝ nhѭ sau: procedure TSP; begin {E là tұp các cҥnh } {Sҳp xӃp các cҥnh trong E theo thӭ tӵ tăng cӫa ÿӝ dài } Chu_Trinh := F; Gia := 0.0; while E F do begin if cҥnh e có thӇ chӑn then begin Chu_Trinh := Chu_Trinh + e ; Gia := Gia + ÿӝ dài cӫa e; end; E := E-e; end ; end; Mӝt cách tiӃp cұn khác cӫa kӻ thuұt tham ăn vào bài toán này là: 1. Xuҩt phát tӯ mӝt ÿӍnh bҩt kǤ, chӑn mӝt cҥnh có ÿӝ dài nhӓ nhҩt trong tҩt cҧ các cҥnh ÿi ra tӯ ÿӍnh ÿó ÿӇÿӃn ÿӍnh kӃ tiӃp. 2. TӯÿӍnh kӃ tiӃp ta lҥi chӑn mӝt cҥnh có ÿӝ dài nhӓ nhҩt ÿi ra tӯÿӍnh này thoҧ mãn hai ÿLӅu kiӋn nói trên ÿӇÿi ÿӃn dӍnh kӃ tiӃp. 3. Lһp lҥi bѭӟc 2 cho ÿӃn khi ÿi tӟi ÿӍnh n thì quay trӣ vӅÿӍnh xuҩt phát. III.3.4- Bài toán cái ba lô Cho mӝt cái ba lô có thӇÿӵng mӝt trӑng lѭӧng W và n loҥi ÿӗ vұt, mӛi ÿӗ vұt i có mӝt trӑng lѭӧng gi và mӝt giá trӏ vi. Tҩt cҧ các loҥi ÿӗ vұt ÿӅu có sӕ lѭӧng không hҥn chӃ. Tìm Pӝt cách lӵa chӑn các ÿӗ vұt ÿӵng vào ba lô, chӑn các loҥi ÿӗ vұt nào, mӛi loҥi lҩy bao nhiêu sao cho Wәng trӑng lѭӧng không vѭӧt quá W và tәng giá trӏ là lӟn nhҩt. Theo yêu cҫu cӫa bài toán thì ta cҫn nhӳng ÿӗ vұt có giá trӏ cao mà trӑng lѭӧng lҥi nhӓÿӇ sao cho có thӇ mang ÿѭӧc nhiӅu “ÿӗ quý”, sӁ là hӧp lý khi ta quan tâm ÿӃn yӃu tӕ “ÿѫn giá” cӫa tӯng loҥi ÿӗ vұt tӭc là tӹ lӋ giá trӏ/trӑng lѭӧng. Ĉѫn giá càng cao thì ÿӗ càng quý. Tӯÿó ta có kӻ thuұt greedy ápUpload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 45 Gөng cho bài toán này là: 1. Tính ÿѫn giá cho các loҥi ÿӗ vұt. 2. Xét các loҥi ÿӗ vұt theo thӭ tӵÿѫn giá tӯ lӟn ÿӃn nhӓ. 3. Vӟi mӛi ÿӗ vұt ÿѭӧc xét sӁ lҩy mӝt sӕ lѭӧng tӕi ÿa mà trӑng lѭӧng còn lҥi cӫa ba lô cho phép. 4. Xác ÿӏnh trӑng luӧng còn lҥi cӫa ba lô và quay lҥi bѭӟc 3 cho ÿӃn khi không còn có thӇ chӑn ÿѭӧc ÿӗ vұt nào nӳa. Ví dө 3-2: Ta có mӝt ba lô có trӑng lѭӧng làì 37 và 4 loҥi ÿӗ vұt vӟi trӑng lѭӧng và giá trӏ Wѭѫng ӭng ÿѭӧc cho trong bҧng (hình 3-6) Tӯ bҧng ÿã cho ta tính ÿѫn giá cho các loҥi ÿӗ vұt và sҳp xӃp các loҥi ÿӗ vұt này theo thӭ tӵ ÿѫn giá giҧm dҫn ta có bҧng (hình 3-7). Theo ÿó thì thӭ tӵѭu tiên ÿӇ chӑn ÿӗ vұt là là B, A, D và cuӕi cùng là C. Vұt B ÿѭӧc xét ÿҫu tiên và ta chӑn tӕi ÿa 3 cái vì mӛi cái vì trӑng lѭӧng mӛi cái là 10 và ba lô có trӑng lѭӧng 37. Sau khi ÿã chӑn 3 vât loҥi B, trӑng lѭӧng còn lҥi trong ba lô là 37 - 3*10 = 7. Ta xét ÿӃn vұt A, vì A có trӑng lѭӧng 15 mà trӑng lѭӧng còn lҥi cӫa balô chӍ còn 7 nên không thӇ chӑn vұt A. Xét vұt D và ta thҩy có thӇ chӑn 1 vұt D, khi ÿó trӑng lѭӧng còn lҥi cӫa ba lô là 7-4 = 3. Cuӕi cùng ta chӑn ÿѭӧc mӝt vұt C. Nhѭ vұy chúng ta ÿã chӑn 3 cái loҥi B, mӝt cái loҥi D và 1 cái loҥi C. Tәng trӑng lѭѫng là 3*10 + 1*4 + 1*2 = 36 và tәng giá trӏ là 3*25+1*6+1*2 = 83. Chú ý có mӝt sӕ biӃn thӇ cӫa bài toán cái ba lô nhѭ sau: 1. Mӛi ÿӗ vұt i chӍ có mӝt sӕ lѭӧng si. Vӟi bài toán này khi lӵa chӑn vұt i ta không ÿѭӧc lҩy Pӝt sӕ lѭӧng vѭӧt quá si. Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 46 2. Mӛi ÿӗ vұt chӍ có mӝt cái. Vӟi bài toán này thì vӟi mӛi ÿӗ vұt ta chӍ có thӇ chӑn hoһc không chӑn. III.4- KӺ THUҰT QUAY LUI III.4.1- Ĉӏnh trӏ cây biӇu thӭc sӕ hӑc III.4.2- Kӻ thuұt cҳt tӍa Alpha-Beta III.4.3- Kӻ thuұt nhánh cұn Kӻ thuұt quay lui (backtracking) nhѭ tên gӑi cӫa nó, là mӝt quá trình phân tích ÿi xuӕng. Tҥi Pӛi bѭӟc phân tích chúng ta chѭa giҧi quyӃt ÿѭӧc vҩn ÿӅ do còn thiӃu cӭ liӋu nên cӭ phҧi phân tích cho tӟi các ÿLӇm dӯng, nѫi chúng ta xác ÿӏnh ÿѭӧc lӡi giҧi cӫa chúng hoһc là xác ÿӏnh ÿѭӧc là không thӇ (hoһc không nên) tiӃp tөc theo hѭӟng này. Tӯ các ÿLӇm dӯng này chúng ta quay ngѭӧc trӣ lҥi theo con ÿѭӡng mà chúng ta ÿã ÿi qua ÿӇ giҧi quyӃt các vҩn ÿӅ còn tӗn ÿӑng và cuӕi cùng ta sӁ giҧi quyӃt ÿѭӧc vҩn ÿӅ ban ÿҫu. Ӣÿây chúng ta sӁ xét 3 kӻ thuұt quay lui: “vét cҥn” là kӻ thuұt phҧi ÿi tӟi tҩt cҧ các ÿLӇm dӯng Uӗi mӟi quay lui. “Cҳt tӍa Alpha-Beta” và “Nhánh-Cұn” là hai kӻ thuұt cho phép chúng ta không cҫn thiӃt phҧi ÿi tӟi tҩt cҧ các ÿLӇm dӯng, mà chӍ cҫn ÿi ÿӃn mӝt sӕÿLӇm nào ÿó và dӵa vào mӝt sӕ suy luұn ÿӇ có thӇ quay lui sӟm. Các kӻ thuұt này sӁÿѭӧc trình bày thông qua mӝt sӕ bài toán cө thӇ sau. III.4.1- Ĉӏnh trӏ cây biӇu thӭc sӕ hӑc Trong các ngôn ngӳ lұp trình ÿӅu có các biӇu thӭc sӕ hӑc, viӋc dӏch các biӇu thӭc này ÿòi hӓi phҧi ÿánh giá (ÿӏnh trӏ) chúng. ĈӇ làm ÿѭӧc ÿLӅu ÿó cҫn phҧi có mӝt biӇu diӉn trung gian cho biӇu thӭc. Mӝt trong các biӇu diӉn trung gian cho biӇu thӭc là cây biӇu thӭc. Cây biӇu thӭc sӕ hӑc là mӝt cây nhӏ phân, trong ÿó các nút lá biӇu diӉn cho các toán hҥng, các nút trong biӇu diӉn cho các toán tӱ. Ví dө 3-3: BiӇu thӭc 5 + 2 * 3 - 4 sӁÿѭӧc biӇu diӉn bӣi cây trong hình 3-8: Trӏ cӫa mӝt nút lá chính là trӏ cӫa toán hҥng mà nút ÿó biӇu diӉn. Trӏ cӫa mӝt nút trong có ÿѭӧc bҵng cách lҩy toán tӱ mà nút ÿó biӇu diӉn áp dөng vào các con cӫa nó. Trӏ cӫa nút gӕc chính là trӏ cӫa biӇu thӭc. Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 47 Nhѭ vұy ÿӇÿӏnh trӏ cho nút gӕc, chúng ta phҧi ÿӏnh trӏ cho hai con cӫa nó, ÿӕi vӟi mӛi con ta xem nó có phҧi là nút lá hay không, nӃu không phҧi ta lҥi phҧi xét hai con cӫa nút ÿó. Quá trình cӭ tiӃp Wөc nhѭ vұy cho tӟi khi gһp các nút lá mà giá trӏ cӫa chúng ÿã ÿѭӧc biӃt, quay lui ÿӇÿӏnh trӏ cho các nút cha cӫa các nút lá và cӭ nhѭ thӃ mà ÿӏnh trӏ cho tә tiên cӫa chúng. Ĉó chính là kӻ thuұt quay lui vét Fҥn, vì chúng ta phҧi lҫn ÿӃn tҩt cҧ các nút lá mӟi ÿӏnh trӏÿѭӧc cho các nút trong và do thӃ mӟi ÿӏnh trӏ ÿѭӧc cho nút gӕc. Ví dө 3-4: Vӟi cây biӇu thӭc trong ví dө 3-3. ĈӇÿӏnh trӏ cho nút - chúng ta phҧi ÿӏnh trӏ cho nút + và nút 4. Nút 4 là nút lá nên giá trӏ cӫa nó là 4. ĈӇÿӏnh trӏ cho nút + ta phҧi ÿӏnh trӏ cho nút 5 và nút *. Nút 5 là nút lá nên giá trӏ cӫa nó là 5. ĈӇÿӏnh trӏ cho nút *, ta phҧi ÿӏnh trӏ cho nút 2 và nút 3. Cҧ hai nút này ÿӅu là lá nên giá trӏ cӫa chúng tѭѫng ӭng là 2 và 3. Quay lui lҥi nút *, lҩy toán tӱ * áp dөng cho hai con cӫa nó là 2 và 3 ta ÿѭӧc trӏ cӫa nút * là 6. Quay lui vӅ nút +, lҥi áp dөng toán tӱ + vào hai con cӫa nó là 5 và 6 ÿѭӧc trӏ cӫa nút + là 11. Cuӕi cùng quay vӅ nút -, áp dөng toán tӱ - vào hai con Fӫa nó là 11 và 4 ta ÿѭӧc trӏ cӫa nút - (nút gӕc) là 7. Ĉó chính là trӏ cӫa biӇu thӭc. Trong hình 3-9, mNJi tên nét ÿӭt minh hӑa quá trình ÿi tìm nút lá và mNJi tên nét liӅn minh hӑa quá trình quay lui ÿӇÿӏnh trӏ cho các nút, các sӕ bên phҧi Pӛi nút là trӏ cӫa nút ÿó. Giҧi thuұt sѫ bӝÿӇÿӏnh trӏ mӝt nút bҩt kǤ nhѭ sau: function Eval(n : node): real; begin if n là lá then return (trӏ cӫa toán hҥng trong n) else return (Toán tӱ trong n (Eval (Con trái cӫa n), Eval (Con phҧi cӫa n)) ); end; Muӕn ÿӏnh trӏ cho cây biӇu thӭc T, ta gӑi Eval(ROOT(T)). III.4.2- Kӻ thuұt cҳt tӍa Alpha-Beta Cây trò chѫi Xét mӝt trò chѫi trong ÿó hai ngѭӡi thay phiên nhau ÿi nѭӟc cӫa mình nhѭ Fӡ vua, cӡ tѭӟng, carô,... Trò chѫi có mӝt trҥng thái bҳt ÿҫu và mӛi nѭӟc ÿi sӁ biӃn ÿәi trҥng thái hiӋn hành thành mӝt trҥng thái mӟi. Trò chѫi sӁ kӃt thúc theo mӝt quy ÿӏnh nào ÿó, theo ÿó thì cuӝc chѫi sӁUpload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 48 Gүn ÿӃn mӝt trҥng thái phҧn ánh có mӝt ngѭӡi thҳng cuӝc hoһc mӝt trҥng thái mà cҧ hai ÿҩu thӫ không thӇ phát triӇn ÿѭӧc nѭӟc ÿi cӫa mình, ta gӑi nó là trҥng thái hòa cӡ. Ta tìm cách phân tích xem tӯ mӝt trҥng thái nào ÿó sӁ dүn ÿӃn ÿҩu thӫ nào sӁ thҳng vӟi ÿLӅu kiӋn cҧ hai ÿҩu thӫÿӅu có trình ÿӝ nhѭ nhau. Mӝt trò chѫi nhѭ vұy có thӇÿѭӧc biӇu diӉn bӣi mӝt cây, gӑi là cây trò chѫi. Mӛi mӝt nút cӫa cây biӇu diӉn cho mӝt trҥng thái. Nút gӕc biӇu diӉn cho trҥng thái bҳt ÿҫu cӫa cuӝc chѫi. Mӛi nút lá biӇu diӉn cho mӝt trҥng thái kӃt thúc cӫa trò chѫi (trҥng thái thҳng thua hoһc hòa). NӃu trҥng thái x ÿѭӧc biӇu diӉn bӣi nút n thì các con cӫa n biӇu diӉn cho tҩt cҧ các trҥng thái kӃt quҧ cӫa các nѭӟc ÿi có thӇ xuҩt phát tӯ trҥng thái x. Ví dө 3-5: Xét trò chѫi carô có 9 ô. Hai ngѭӡi thay phiên nhau ÿi X hoһc O. Ngѭӡi nào ÿi ÿѭӧc 3 ô thҷng hàng (ngang, dӑc, xiên) thì thҳng cuӝc. NӃu ÿã hӃt ô ÿi mà chѭa phân thҳng bҥi thì hai ÿҩu thӫ hòa nhau. Mӝt phҫn cӫa trò chѫi này ÿѭӧc biӇu diӉn bӣi cây sau: Trong cây trò chѫi trên, các nút lá ÿѭӧc tô nӅn và viӅn khung ÿôi ÿӇ dӉ phân biӋt vӟi các nút khác. Ta có thӇ gán cho mӛi nút lá mӝt giá trӏÿӇ phҧn ánh trҥng thái thҳng thua hay hòa cӫa các ÿҩu thӫ. Chҷng hҥn ta gán cho nút lá các giá trӏ nhѭ sau: · 1 nӃu tҥi ÿó ngѭӡi ÿi X ÿã thҳng, · -1 nӃu tҥi ÿó ngѭӡi ÿi X ÿã thua và Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 49 · 0 nӃu hai ÿҩu thӫÿã hòa nhau. Nhѭ vұy tӯ mӝt trҥng thái bҩt kǤ, ÿӃn lѭӧt mình, ngѭӡi ÿi X sӁ chӑn cho mình mӝt nѭӟc ÿi sao cho dүn ÿӃn trҥng thái có giá trӏ lӟn nhҩt (trong trѭӡng hӧp này là 1). Ta nói X chӑn nѭӟc ÿi MAX, nút mà tӯÿó X chӑn nѭӟc ÿi cӫa mình ÿѭӧc gӑi là nút MAX. Ngѭӡi ÿi O ÿӃn lѭӧt mình sӁ chӑn mӝt nѭӟc ÿi sao cho dүn ÿӃn trҥng thái có giá trӏ nhӓ nhҩt (trong trѭӡng hӧp này là -1, khi ÿó X sӁ thua và do ÿó O sӁ thҳng). Ta nói O chӑn nѭӟc ÿi MIN, nút mà tӯÿó O chӑn nѭӟc ÿi cӫa mình ÿѭӧc gӑi là nút MIN. Do hai ÿҩu thӫ luân phiên nhau ÿi nѭӟc cӫa mình nên các mӭc trên cây trò chѫi cNJng luân phiên nhau là MAX và MIN. Cây trò chѫi vì thӃ còn có tên là cây MIN-MAX. Ta có thӇÿѭa ra mӝt quy tҳc ÿӏnh trӏ cho các nút trên cây ÿӇ phҧn ánh tình trҥng thҳng thua hay hòa và khҧ năng thҳng cuӝc cӫa hai ÿҩu thӫ. NӃu mӝt nút là nút lá thì trӏ cӫa nó là giá trӏÿã ÿѭӧc gán cho nút ÿó. Ngѭӧc lҥi, nӃu nút là nút MAX thì trӏ cӫa nó bҵng giá trӏ lӟn nhҩt cӫa tҩt cҧ các trӏ cӫa các con cӫa nó. NӃu nút là nút MIN thì trӏ Fӫa nó là giá trӏ nhӓ nhҩt cӫa tҩt cҧ các trӏ cӫa các con cӫa nó. Quy tҳc ÿӏnh trӏ này cNJng gҫn giӕng vӟi quy tҳc ÿӏnh trӏ cho cây biӇu thӭc sӕ hӑc, ÿLӇm khác biӋt ӣÿây là các toán tӱ là các hàm lҩy max hoһc min và mӛi nút có thӇ có nhiӅu con. Do vұy ta có thӇ dùng kӻ thuұt quay lui ÿӇÿӏnh trӏ cho các nút cӫa cây trò chѫi. ĈӇ cài ÿһt ta có mӝt sӕ giҧ thiӃt sau: · Ta có mӝt hàm Payoff nhұn vào mӝt nút lá và cho ta giá trӏ cӫa nút lá ÿó. · Các hҵng ’ và -’ tѭѫng ӭng là các trӏ Payoff lӟn nhҩt và nhӓ nhҩt. · Khai báo kiӇu ModeType = (MIN, MAX) ÿӇ xác ÿӏnh ÿӏnh trӏ cho nút là MIN hay MAX. · Mӝt kiӇu NodeType ÿѭӧc khai báo mӝt cách thích hӧp ÿӇ biӇu diӉn cho mӝt nút trên cây phҧn ánh mӝt trҥng thái cӫa cuӝc chѫi. · Ta có mӝt hàm is_leaf ÿӇ xác ÿӏnh xem mӝt nút có phҧi là nút lá hay không? · Hàm max và min tѭѫng ӭng lҩy giá trӏ lӟn nhҩt và giá trӏ nhӓ nhҩt cӫa hai giá trӏ. Giҧi thuұt vét cҥn ÿӏnh trӏ cây trò chѫi Hàm Search nhұn vào mӝt nút n và kiӇu mode cӫa nút ÿó (MIN hay MAX) trҧ vӅ giá trӏ cӫa nút. NӃu nút n là nút lá thì trҧ vӅ giá trӏÿã ÿѭӧc gán cho nút lá. Ngѭӧc lҥi ta cho n mӝt giá trӏ tҥm value là -’ hoһc ’ tùy thuӝc n là nút MAX hay MIN và xét con cӫa n. Sau khi mӝt con cӫa n có giá trӏ V thì ÿһt lҥi value = max(value,V) nӃu n là nút MAX và value = min(value,V) nӃu n là nút MIN. Khi Wҩt cҧ các con cӫa n ÿã ÿѭӧc xét thì giá trӏ tҥm value cӫa n trӣ thành giá trӏ cӫa nó. function Search(n : NodeType; mode: ModeType): real; var C : NodeType ; { C là mӝt nút con cӫa nút n} Value : real; {Lúc ÿҫu ta cho value mӝt giá trӏ tҥm, sau khi ÿã xét hӃt tҩt cҧ các con cӫa nút n thì value là giáUpload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 50 trӏ cӫa nút n } begin if is_leaf(n) then return ( Payoff(n) ) else begin {Khӣi tҥo giá trӏ tҥm cho n } if mode = MAX then value := -’ else value := ’; {Xét tҩt cҧ các con cӫa n, mӛi lҫn xác ÿӏnh ÿѭӧc giá trӏ cӫa mӝt nút con, ta phҧi ÿһt lҥi giá trӏ Wҥm value. Khi ÿã xét hӃt tҩt cҧ các con thì value là giá trӏ cӫa n} for vӟi mӛi con C cӫa n do if mode = MAX then Value := max(Value, Search(C, MIN) ) else Value := min(Value, Search(C, MAX) ); return (value); end; end; .ӻ thuұt cҳt tӍa Alpha-Beta (Alpha-Beta Pruning) Trong giҧi thuұt vét cҥn ӣ trên, ta thҩy ÿӇÿӏnh trӏ cho mӝt nút nào ÿó, ta phҧi ÿӏnh trӏ cho tҩt cҧ các nút con cháu cӫa nó, và muӕn ÿӏnh trӏ cho nút gӕc ta phҧi ÿӏnh trӏ cho tҩt cҧ các nút trên cây. Sӕ Oѭӧng các nút trên cây trò chѫi tuy hӳu hҥn nhѭng không phҧi là ít. Chҷng hҥn trong cây trò chѫi ca rô nói trên, nӃu ta có bàn cӡ bao gӗm n ô thì có thӇ có tӟi n! nút trên cây (trong trѭӡng hӧp trên là 9!). Ĉӕi vӟi các loҥi cӡ khác nhѭ cӡ vua chҷng hҥn, thì sӕ lѭӧng các nút còn lӟn hѫn nhiӅu. Ta gӑi là mӝt Vӵ bùng nә tә hӧp các nút. Chúng ta cӕ gҳng tìm mӝt cách sao cho khi ÿӏnh trӏ mӝt nút thì không nhҩt thiӃt phҧi ÿӏnh trӏ cho tҩt cҧ các nút con cháu cӫa nó. Trѭӟc hӃt ta có nhұn xét nhѭ sau: NӃu P là mӝt nút MAX và ta ÿang xét mӝt nút con Q cӫa nó (dƭ nhiên Q là nút MIN). Giҧ sӱ Vp là mӝt giá trӏ tҥm cӫa P, Vq là mӝt giá trӏ tҥm cӫa Q và nӃu ta có Vp • Vq thì ta không cҫn xét các con chѭa xét cӫa Q nӳa. Vì nӃu có xét thì giá trӏ cӫa Q cNJng sӁ nhӓ hѫn hoһc bҵng Vq và do ÿó không ҧnh hѭӣng gì ÿӃn Vp. Tѭѫng tӵ nӃu P là nút MIN (tҩt nhiên Q là nút MAX) và Vp ” Vq thì ta cNJng không cҫn xét ÿӃn các con chѭa xét cӫa Q nӳa. ViӋc không xét tiӃp các con chѭa ÿѭӧc xét cӫa nút Q Jӑi là viӋc cҳt tӍa Alpha-Beta các con cӫa nút Q. Trên cѫ sӣ nhұn xét ÿó, ta nêu ra quy tҳc ÿӏnh trӏ cho mӝt nút không phҧi là nút lá trên cây nhѭ sau: 1. Khӣi ÿҫu nút MAX có giá trӏ tҥm là -’ và nút MIN có giá trӏ tҥm là ’. 2. NӃu tҩt cҧ các nút con cӫa mӝt nút ÿã ÿѭӧc xét hoһc bӏ cҳt tӍa thì giá trӏ tҥm cӫa nút ÿó trӣ thành giá trӏ cӫa nó. 3. NӃu mӝt nút MAX n có giá trӏ tҥm là V1 và mӝt nút con cӫa nó có giá trӏ là V2 thì ÿһt giá trӏ Wҥm mӟi cӫa n là max (V1,V2). NӃu n là nút MIN thì ÿһt giá trӏ tҥm mӟi cӫa n là min (V1,V2). 4. Vұn dөng quy tҳc cҳt tӍa Alpha-Beta nói trên ÿӇ hҥn chӃ sӕ lѭӧng nút phҧi xét.Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 51 function cat_tia(Q: NodeType; mode: ModeType; Vp: real): real; var C : NodeType ; { C là mӝt nút con cӫa nút Q} Vq : real; {Vq là giá trӏ tҥm cӫa Q, sau khi tҩt cҧ các con cӫa nút Q ÿã xét hoһc bӏ cҳt tӍa thì Vq là giá trӏ Fӫa nút Q} begin if is_leaf(Q) then return ( Payoff(Q) ) else begin { Khӣi tҥo giá trӏ tҥm cho Q } if mode = MAX then Vq := -’ else Vq := ’; {Xét các con cӫa Q, mӛi lҫn xác ÿӏnh ÿѭӧc giá trӏ cӫa mӝt nút con cӫa Q, ta phҧi ÿһt lҥi giá trӏ Wҥm Vq và so sánh vӟi Vp ÿӇ có thӇ cҳt tӍa hay không} Xét C là con trái nhҩt cӫa Q; while C là con cӫa Q DO if mode = MAX then begin Vq:= max(Vq, Cat_tia(C, MIN, Vq)); if Vp ” Vq then return(Vq); end else begin Vq := min(Vq, Cat_tia(C, MAX, Vq)); if Vp • Vq then return(Vq); end; return (Vq); end; end; Ví dө 3-6: Vұn dөng quy tҳc trên ÿӇÿӏnh trӏ cho nút A trong cây trò chѫi trong ví dө 3-5. A là nút MAX, lúc ÿҫu nó có giá trӏ tҥm là -’, xét B là con cӫa A, B là nút lá nên giá trӏ cӫa nó là giá trӏÿã ÿѭӧc gán 1, giá trӏ tҥm cӫa A bây giӡ là max (-’,1) = 1. Xét con C cӫa A, C là nút MIN, giá trӏ tҥm lúc ÿҫu cӫa C là ’. Xét con E cӫa C, E là nút MAX, giá trӏ tҥm cӫa E là -’. Xét con I cӫa E, I là nút lá nên giá trӏ cӫa nó là 0. Quay lui lҥi E, giá trӏ tҥm cӫa E bây giӡ là max (-’,0) = 0. Vì E chӍ có Pӝt con là I ÿã xét nên giá trӏ tҥm 0 trӣ thành giá trӏ cӫa E. Quay lui lҥi C, giá trӏ tҥm mӟi cӫa C là min ’,0) = 0. A là nút MAX có giá trӏ tҥm là 1, C là con cӫa A, có giá trӏ tҥm là 0, 1>0 nên ta không cҫn xét con F cӫa C nӳa. Nút C có hai con là E và F, trong ÿó E ÿã ÿѭӧc xét, F ÿã bӏ cҳt, vұy giá trӏ tҥm 0 Fӫa C trӣ thành giá trӏ cӫa nó. Sau khi có giá trӏ cӫa C, ta phҧi ÿһt lҥi giá trӏ tҥm cӫa A, nhѭng giá trӏ Wҥm này không thay ÿәi vì max (1,0) = 1. TiӃp tөc xét nút D, D là nút MIN nên giá trӏ tҥm là ’, xét nút con G cӫa D, G là nút MAX nên giá trӏ tҥm cӫa nó là -’, xét nút con J cӫa G. Vì J là nút lá nên có giá trӏ 0. Quay lui lҥi G, giá trӏ tҥm cӫa G bây giӡ là max (-’,0) = 0 và giá trӏ tҥm này trӣ thành giá trӏ cӫa G vì G chӍ có mӝt con J ÿã xét. Quay lui vӅ D, giá trӏ tҥm cӫa D bây giӡ là min (’,0) = 0. Giá trӏ tҥm này cӫa D nhӓ hѫn giá trӏ tҥm cӫa nút A MAX là cha cӫa nó nên ta cҳt tӍa con H chѭa ÿѭӧc xét cӫa D và lúc này D có giá trӏ là 0. Quay lui vӅ A, giá trӏ tҥm cӫa nó vүn không thay ÿәi, nhѭng lúc này cҧ 3 con cӫa A ÿӅu ÿã ÿѭӧc xét nên giá trӏ tҥm 1 trӣ thành giá trӏ cӫa A. KӃt quҧÿѭӧc minh hӑa trong hình sau: Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 52 III.4.3-Kӻ thuұt nhánh cұn Vӟi các bài toán tìm phѭѫng án tӕi ѭu, nӃu chúng ta xét hӃt tҩt cҧ các phѭѫng án thì mҩt rҩt nhiӅu thӡi gian, nhѭng nӃu sӱ dөng phѭѫng pháp tham ăn thì phѭѫng án tìm ÿѭӧc chѭa hҷn ÿã là phѭѫng án tӕi ѭu. Nhánh cұn là kӻ thuұt xây dӵng cây tìm kiӃm phѭѫng án tӕi ѭu, nhѭng không xây Gӵng toàn bӝ cây mà sӱ dөng giá trӏ cұn ÿӇ hҥn chӃ bӟt các nhánh. Cây tìm kiӃm phѭѫng án có nút gӕc biӇu diӉn cho tұp tҩt cҧ các phѭѫng án có thӇ có, mӛi nút lá biӇu diӉn cho mӝt phѭѫng án nào ÿó. Nút n có các nút con tѭѫng ӭng vӟi các khҧ năng có thӇ lӵa chӑn tұp phѭѫng án xuҩt phát tӯ n. Kӻ thuұt này gӑi là phân nhánh. Vӟi mӛi nút trên cây ta sӁ xác ÿӏnh mӝt giá trӏ cұn. Giá trӏ cұn là mӝt giá trӏ gҫn vӟi giá cӫa các phѭѫng án. Vӟi bài toán tìm min ta sӁ xác ÿӏnh Fұn dѭӟi còn vӟi bài toán tìm max ta sӁ xác ÿӏnh Fұn trên. Cұn dѭӟi là giá trӏ nhӓ hѫn hoһc bҵng giá cӫa phѭѫng án, ngѭӧc lҥi cұn trên là giá trӏ lӟn hѫn hoһc bҵng giá cӫa phѭѫng án. ĈӇ dӉ hình dung ta sӁ xét hai bài toán quen thuӝc là bài toán TSP và bài toán cái ba lô. Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 53 Bài toán ÿѭӡng ÿi cӫa ngѭӡi giao hàng Phân nhánh Cây tìm kiӃm phѭѫng án là cây nhӏ phân trong ÿó: · Nút gӕc là nút biӇu diӉn cho cҩu hình bao gӗm tҩt cҧ các phѭѫng án. · Mӛi nút sӁ có hai con, con trái biӇu diӉn cho cҩu hình bao gӗm tҩt cҧ các phѭѫng án chӭa Pӝt cҥnh nào ÿó, con phҧi biӇu diӉn cho cҩu hình bao gӗm tҩt cҧ các phѭѫng án không chӭa cҥnh ÿó (các cҥnh ÿӇ xét phân nhánh ÿѭӧc thành lұp tuân theo mӝt thӭ tӵ nào ÿó, chҷng hҥn thӭ tӵ tӯÿLӇn). · Mӛi nút sӁ kӃ thӯa các thuӝc tính cӫa tә tiên cӫa nó và có thêm mӝt thuӝc tính mӟi (chӭa hay không chӭa mӝt cҥnh nào ÿó). · Nút lá biӇu diӉn cho mӝt cҩu hình chӍ bao gӗm mӝt phѭѫng án. · ĈӇ quá trình phân nhánh mau chóng tӟi nút lá, tҥi mӛi nút ta cҫn có mӝt quyӃt ÿӏnh bә sung dӵa trên nguyên tҳc là mӑi ÿӍnh trong chu trình ÿӅu có cҩp 2 và không tҥo ra mӝt chu trình thiӃu. Ví dө 3-7: Xét bài toán TSP có 5 ÿӍnh vӟi ÿӝ dài các cҥnh ÿѭӧc cho trong hình 3-12. Các cҥnh theo thӭ tӵ tӯÿLӇn ÿӇ xét là: ab, ac, ad, ae, bc, bd, be, cd, ce và de. Nút gӕc A cӫa cây bao gӗm tҩt cҧ các phѭѫng án. Hai con cӫa A là B và C, trong ÿó B bao gӗm tҩtcҧ các phѭѫng án chӭa cҥnh ab, C bao gӗm tҩt Fҧ các phѭѫng án không chӭa ab. Hai con cӫa B là D và E. Nút D bao gӗm tҩt cҧ các phѭѫng án chӭa ac. Vì các phѭѫng án này Yӯa chӭa ab (kӃ thӯa cӫa B) vӯa chӭa ac nên ÿӍnh a ÿã ÿӫ cҩp hai nên D không thӇ chӭa ad và ae. Nút E bao gӗm tҩt cҧ các phѭѫng án không chӭa ac.. Ta ÿѭӧc cây (chѭa ÿҫy ÿӫ ) trong hình 3-13 Upload by Kenhdaihoc.com . Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Giɠi Thuɪt – ĈɝI +͌C CɣN THɆ ........................................................................Trang 54 Trong ÿó ký hiӋu có nghƭa là không chӭa cҥnh ab. Tính cұn dѭӟi Ĉây là bài toán tìm min nên ta sӱ dөng Fұn dѭӟi. Cұn dѭӟi tҥi mӛi nút là mӝt sӕ nhӓ hѫn hoһc Eҵng giá cӫa tҩt cҧ các phѭѫng án ÿѭӧc biӇu diӉn bӣi nút ÿó. Giá cӫa mӝt phѭѫng án ӣÿây là tәng ÿӝ dài cӫa mӝt chu trình. ĈӇ tính cұn dѭӟi cӫa nút gӕc, mӛi ÿӍnh ta chӑn hai cҥnh có ÿӝ dài nhӓ nhҩt. Cұn dѭӟi cӫa nút Jӕc bҵng tәng ÿӝ dài tҩt cҧ các cҥnh ÿѭӧc chӑn chia cho 2. Ví dө 3-8: Vӟi sӕ liӋu cho trong ví dө 3-7 nói trên, ta tính

Các file đính kèm theo tài liệu này:

  • pdfGiao trinh phan tich Giai thuat.pdf
Tài liệu liên quan