các khái niệm cơ bản về phân tích giải thuật

18 354 0
các khái niệm cơ bản về phân tích giải thuật

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

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

Thông tin tài liệu

Chng 2. Các khái nim c bn Nguyn V Quc Hng-Nguyn Qunh Dip 7 CHNG 2 CÁC KHÁI NIM C BN V PHÂN TÍCH GII THUT 2.1. BƠi toán vƠ th hin (Problems and Instances) Trong phn trên, chúng ta đã nghiên cu mt s ví d v nhân 2 s nguyên dng, chng hn nhân 981 và 1234. Tuy vy, các nguyên tc chính ca gii thut đó không ch cung cp nhng cách thc nhân 2 s đc bit, thc t chúng ta có mt gii pháp tng quát cho bài toán nhân 2 s nguyên dng. Chúng ta nói rng (981, 1234) là mt th hin (instance) ca bài toán nh vy. Tuy nhiên, (-12, 83.7) không phi là th hin ca bài toán này vì -12 không là s nguyên dng và 83.7 không phi là s nguyên. (D nhiên, chúng là th hin ca mt bài toán khác, tng quát hn bài toán này). Bài toán hay nht là bài toán có tp th hin không có gii hn. Nhng cng có nhng ngoi l. Chng hn, bài toán chi c, có ch mt th hin, đc cho bi mt tp hp v trí chung nht đ xut phát, ngoài ra ch có mt s hu hn các th hin con (các bc đi, các v trí trung gian hp l). Nhng không th nói rng bài toán này không có gii thut hay. Mt gii thut cn phi làm vic đúng vi tt c các th hin ca mình, cn phi chng minh điu đó.  ch ra mt gii thut không đúng, chúng ta cn tìm mt th hin mà t đó gii thut cho mt câu tr li sai, hoc không tìm đc câu tr li. Tuy nhiên, đ chng minh mt gii thut không đúng là rt khó khn.  ch ra rng gii thut có th áp dng cho tt c các th hin, chúng ta đã xác đnh mt min xác đnh, đó là mt tp th hin mà chúng ta xem xét. Gii thut nhân 2 s trong Chng 1 không làm vic vi s âm và hu t, tuy nhiên không th nói gii thut là không có giá tr. Các th hin ca phép nhân s âm hoc hu t không nm trong min xác đnh chúng ta đã la chn ban đu. Các thit b tính toán còn có gii hn kích thc ca các th hin. Tuy nhiên, gii hn này không làm hn ch gii thut. Máy tính khác nhau có gii hn khác nhau và thm chí nhng chng trình khác nhau trên cùng mt gii thut trên thit b nh nhau cng cho kt qu khác nhau. Chng 2. Các khái nim c bn Nguyn V Quc Hng-Nguyn Qunh Dip 8 2.2. Hiu qu ca các gii thut Khi chúng ta có mt bài toán có mt vài gii thut có kh nng thích hp, chúng ta cn phi la chn mt gii thut tt nht. iu này đt ra mt câu hi là làm th nào đ chn trong mt vài gii thut đó gii thut thích đáng hn c. Nu chúng ta ch có mt hoc hai th hin nh ca bài toán quá đn gin thì không cn phi chn la k càng quá trong trng hp này đn gin là chúng ta chn gii thut đ d lp trình, hoc chn chng trình đã có mà không cn lo lng v các thuc tính lý thuyt ca nó. Tuy nhiên, nu chúng ta không có đy đ các th hin ca bài toán hoc là mt bài toán khó thì chúng ta phi la chn k càng hn. Nhng ngi theo ch ngha kinh nghim thng chn mt gii thut phù hp vi k thut lp trình và th nghim chúng trên các th hin khác nhau vi s tr giúp ca máy tính. Nhng ngi theo lý thuyt chn gii thut phù hp vi xác đnh khi lng có tính toán hc ca các ngi hc cn thit cho mi bài toán nh là mt hàm trên kích thc ca th hin cn thit. Ngun hc mà ta quan tâm nht là thi gian tính toán và không gian lu tr. Trong khuôn kh giáo trình này, chúng ta thng xuyên so sánh các gii thut trên c s thi gian thc hin nó, khi đó đn gin là ta s nói nó chy nhanh nh th nào. Kích thc ca mt th hin thng không là s bit cn thit đ biu din nó trong máy tính. Tuy nhiên,  đây t " kích thc" đ ch s lng các thành phn ca mt th hin. Ví d, nói v sp xp thì kích thc ca th hin là s lng phn t đc sp xp. Tng t nh vy, khi nói v đ th thì kích thc là s lng các nút hoc các cung (có th là c hai). Trong các bài toán liên quan đn s nguyên, đôi khi chúng ta coi hiu nng ca gii thut nh là giá tr ca th hin cn thit hin ti, (s lng bit cn thit đ biu din giá tr này dng nh phân). Thun li ca phng pháp lý thuyt là nó không đc vào máy tính hin ti đang s dng, không chn vào ngôn ng lp trình, thm trí không chn vào k nng ca ngi lp trình. Da vào đó ta tit kim đc c thi gian s mt đi do lp trình vô ích mt gii thut không hiu Chng 2. Các khái nim c bn Nguyn V Quc Hng-Nguyn Qunh Dip 9 qu và c thi gian mt đi do máy tính s kim tra nó. Cao hn na (quan trng hn) là s nghiên cu hiu qu ca gii thut trên các th hin ca kích thc. ây là cái không có trong phng pháp kinh nghim (thc nghim), ni mà s thc hành luôn là kim tra các gii thut ch da trên mt s nh các la chn th hin tu ý có kích thc va phi. Cng t đó thng khám phá đc gii thut mi tt hn khi c hai đc s dng trên các th hin ln, đúng là mt quan đim đc bit quan trng. Cng có nhng kh nng phân tích gii thut bng phng pháp lai, hiu qu ca gii thut, mô t dng khuôn mu cho các chc nng đc xác đnh theo lý thuyt và các tham s s hc cho chng trình và máy riêng bit đc xác đnh bi kinh nghim, thng nh là phng pháp hi quy. S dng phng pháp này có th d đoán đc thi gian thc hin đy đ thc t trên mt th hin quá ln mà ta dùng đ kim tra. Cn tránh s suy din (ngoi suy) duy nht trên c s mt s lng nh ca các th hin theo kinh nghim b qua các nguyên lý cn thit. D đoán mà không có c s lý thuyt là mt kiu làm vic m h, vin vông. Nu chúng ta mun đo tng không gian lu tr ca mt gii thut đc s dng nh là hàm ca kích thc, thì ta s dng bít. Bt k loi máy tính nào đc s dng, khía nim bit lu tr là không đi, đã xác đnh. Mt khác, trong phn ln các trng hp, chúng ta mun đo hiu qa ca gii thut theo thi gian thì không th biu din theo giây (second) đc vì chúng ta chn mt yu t bt bin, sao cho hai ln thc hin mt th hin ca cùng gii thut s ch chênh lnh hiu qu bi mt hng s nhân. Ví d, nu hng s này là 5, ln thc hin đu tiên có thi gian là 1 giây đ gii quyt mt th hin có kích thc riêng bit thì ln thc hin th hai (trên máy khác, trên ngôn ng lp trình khác) có thi gian không lâu hn 5 giây đ gii quyt cùng mt th hin. Chính xác hn, nu 2 ln thc hin cùng mt gii thut cn thi gian t1(n) và t2(n) giây đ gii quyt th hin có kích thc n thì luôn tn ti hng s dng c và d sao cho t1(n) c.t2(n) và t2(n)  d.t1(n) khi n đ ln. Yu t bt bin có th đc chn làm đn v đo hiu qu ca mt gii thut bng mt hng s phc hp. Chúng ta nói rng, mt gii thut Chng 2. Các khái nim c bn Nguyn V Quc Hng-Nguyn Qunh Dip 10 cho mt bài toán nào đó có thi gian thc hin bc t(n), t là mt hàm, nu nh tn ti mt hng s dng c và s thc hin gii thut có kh nng gii tt c các th hin kích thc n là có thi gian không ln hn c.t(n) giây. S dng giây trong đnh ngha này là không b bó buc, chúng ta ch cn chuyn hng s thích hp nào đó thì ta gi là mt gii thut có thi gian bc n, hoc đn gin hn là mt gii thut có thi gian tuyn tính (linear algorithm). Mt gii thut có thi gian thc hin th hin kích thc n không nhiu hn c.n 2 giây gi là bc n 2 hoc thi gian bc hai, gii thut bc 2 (quadratus algorithm). Tng t, mt gii thut bc 3, đa thc, lu tha (cubie, polynomial, exponential có thi gian bc n 3 , n k , c n , tng ng). Lu ý là bc rt quan trng trong đánh giá hiu qu, bc n 2 , n 3 là rt khác nhau nu kích thc ln. 2.3. Phơn tích trung bình vƠ phơn tích ti nht Thi gian thc hin hoc không gian lu tr có th bin đng đáng k gia hai th hin khác nhau có cùng kích thc.  làm nhng điu này, hãy xem xét hai gii thut sp xp c bn, gii thut chèn trc tip (insertion) và gii thut chn trc tip (selection). Procedure insert (T [1 n]) for i  2 to n do x T[i] ; j  i-1 while (j>o) and (x< T [j]) do T [j+1]T[j] j j-1 T[j+1]  x Procedure select (T[1 n]) for i  1 to n-1 do min j  i ; minx  T[i] for j  i +1 to n do Chng 2. Các khái nim c bn Nguyn V Quc Hng-Nguyn Qunh Dip 11 if T [j] <minx then minj  j minx  T[j] T[minj]  T[i] T[i]  minx Hãy bt chc thao tác ca gii thut trên mt vài mng nh đ chc chn rng chúng ta đã bit gii thut làm vic nh th nào. Vòng lp chính ca Insertion đã xem xét mi phn t ca mng t phân t th hai đn phn t th n và chèn nó vào v trí thích hp gia các phn t đng trc nó trong mng. Gii thut Selection chn phn t nh nht ca bng, đt nó vào làm phn t đu tiên, ri li chn phn t nh nht, tip theo, đt nó làm phn t th hai ca mng, và c nh vy cho đn ht. Ly U và V là 2 mng có N phn t, mng U đã đc sp xp tng dn và mng V đã đc sp xp gim dn. C hai gii thut có thi gian thc hin V nhiu hn thi gian thc hin U. Thc t là mng V biu din trng hp vi kh nng xu nht cho c hai gii thut, không có mng nào vi n phn t li cn nhiu thi gian x lý nh vy. Gii tht chn trc tip không nhn bit đc th t gc ca mt mng dã đc sp: Thao tác kim tra “ if T[j] < min x “ đc thc hin vi s ln nh nhau cho tt c các trng hp. S thay đi trong thi gian thc hin ch do thi gian thc hin các phép gán trong phn “then” ca thao tác kim tra này có phi thc hin hay không. Khi chúng ta lp trình gii thut này và kim tra nó trên máy thì s thy rng thi gian cn thit đ sp xp s phn t là không nhiu hn 15% cho dù th t khi đng là đã đc sp xp. Ri chúng ta s bit, gii thut Selection (T) có thi gian thc hin bc 2, không đm xa gì đn th t khi đu ca các phn t. Nu chúng ta so sánh thi gian thc hin bi gii thut Insert(T) trên cùng hai mng này thì s có nhng nhn xét khác hn. Bi vì điu kin điu khin ca vòng lp (while) là luôn sai t lúc bt đu, Insert(U) thc hin rt nhanh ta nói rng nó có thi gian tuyn tính. Vi V, gii thut Insert(T) có thi gian bâc hai bi vòng lp (while) đã thc hin (i- Chng 2. Các khái nim c bn Nguyn V Quc Hng-Nguyn Qunh Dip 12 1) ln vi mi giá tr ca i. S bin đng v thi gian thc hin gia hai th hin là rt đáng k. Hn na, s bin đng còn tng lên theo s lng phn t đã đc sp xp. Khi chúng ta thc hin gii thut Insert(T) đ sp xp mt mng 5000 phn t đã sp tng dn thì mt thi gian khôn ít hn 1/5 giây, trong khi đó mt 210 giây đ sp xp mng đó đã xp gim dn (tc là 1000 ln lâu hn). Nu có s bin đi ln xy ra thì làm th nào đ phát hin v thi gian thc hin gii thut theo kích thc ca các th hin đc gii? Chúng ta luôn coi trng hp tt nht ca mt gii thut cho mi kích thc khi mà gii thut đòi hi nhiu thi gian nht. iu này đã gii thích vì sao trong phn trên ta nói gii thut phi có kh nng gii tt c các th hin có kích thc n trong thi gian không quá Ct(n) giây vi C là hng s thích hp. Nu nó chy vi thi gian bc t(n) ta đã có n trong đó mt trng hp ti nht. Phân tích trng hp ti nht là thích hp cho các gii thut đáp ng mt thi gian có hn. Ví d, gii thut điu khin nng lng ht nhân, điu ct yu là bit đc gii hn trên vì thi gian ca h thng, bt k các th hin đc bit đc gii quyt. Mt khác, nu mt gii thut đc s dng nhiu ln trên nhiu th hin khác nhau thì điu quan trng là ta đánh giá đc thi gian thc hin trung bình trên các th hin có kích thc n. Chúng ta đã bit rng thi gian thc hin gii thut insert(T) bin đng gia bc n và bc n 2 nu chúng ta có th tính toán thi gian trung bình ca gii thut khi gii n! các sp xp khác nhau ca mng khi bt đu (vi các phn t ca mng là riêng bit) thì chúng ta có th nói v thi gian sp xp ca mt mng vi v trí phn t là ngu nhiên. Trong phn sau ta thy rng trc tiên n! ca các hoán v phn t ca mng s cho thi gian trung bình vn là bc n 2 . Sp xp chèn có thi gian bc 2  trng hp trung bình và ti nht, mc dù vài trng hp có th nhanh hn. Ta bit rng, mt vài gii thut sp xp khác có thi gian bc hai trong trng hp ti nht nhng có thi gian bc nlog(n) trong trng hp trung bình. Thm chí gii thut này là kém nht trong trng hp ti nht nhng li có kh nng là gii thut nhanh nht trong trng hp trung bình vi phng pháp sp xp mng ti ch. Chng 2. Các khái nim c bn Nguyn V Quc Hng-Nguyn Qunh Dip 13 Phân tích trung bình ca gii thut luôn nh hn phân tích ti nht. Hn na, phân tích trung bình có th sai nu nh trong thc t các th hin nghim không đc chn ngu nhiên. Ví d, Insert(T) có thi gian trung bình bc 2 khi tt c n! kh nng sp xp ca mng đã đc th nghim. Tuy nhiên, trong nhiu ng dng điu kin này có th không thc t. Mt chng trình sp xp đc s dng đ cp nht mt tp tin (file) thng ch yu sp xp mt mng mà các phn t ca nó đã tht s nm gn đúng v trí, ch còn vài phn t ca nm ngoài v trí. Trng hp này phng pháp trung bình trên các th hin đc chn ngu nhiên là mt ví d ti cho hiu qu thc t.  phân tích đy đ trng hp trung bình đòi hi mt vài tri thc kinh đin v s phân tán các th hin đc gii. iu này thông thng là mt đòi hi không thc t. c bit, khi mà mt gii thut li đc s dng bên trong mt gii thut phc tp hn, s không c tính đc các th hin s phi xy ra mt cách tht thng. 2.4. Th nƠo lƠ mt thao tác c bn (elementary operation) Mt thao tác c bn là mt thao tác mà thi gian thc hin nó có th gii hn trên bi mt hng s ch ph thuc vào mt s thc hin riêng bit đã đc s dng trên máy tính, trên ngôn ng lp trình, . . . Nh vy, hng s này không ph thuc kích thc hoc các thông s khác ca th hin đang đc xem xét. Bi vì chúng ta quan tâm đn thi gian thc hin giait thut xác đnh trong phm vi mt hng s nhân, nó ch là, mt s lng các thao tác c bn đc thc hin trong gii thut mà không quan tâm đn thi gian chính xác ca mi thao tác đó. Chng hn, khi phân tích mt gii thut đ gii quyt mt th hin vi mt kích thc nào đó ta thy nó cn a phép cng, m phép nhân và s phép gán giá tr. Gi s, chúng ta bit dãy phép cng không bao gi thc hin quá t a micro giây, phép nhân thc hin không quá t m micro giây, phép gán thc hin không quá t s micro giây ( các hng s này đu ph thuc máy đc s dng đ thc hin gii thut). Phép cng, nhân và gán coi nh là các thao tác c bn. Tng thi gian t cn có đ gii thut chy xong có th đc đánh giá nh sau: Chng 2. Các khái nim c bn Nguyn V Quc Hng-Nguyn Qunh Dip 14 t ≤ a.t a + m.t m + s.t s ≤ max(t a , t m , t s ).( a + m + s) Nh vy, t đc gii hn bi mt hng s phc hp đc cu to t s lng ca các thao tác c bn đã đc thc hin. Thi gian chính xác cho mi thao tác c bn không quan trng, đn gin ta nói rng mi thao tác đc thc hin trên mt đn v chi phí thi gian. Trong mô t gii thut trên đây, mt dòng đn ca chng trình phù hp vi s lng bin đng ca thao tác c bn, thi gian cn thit đ tính (T là mng N phân t) x  min { T[i], 1≤ I ≤n} Tng lên theo n, đó chính là mô t rút gn ca xT[1] For I  2 to n do Y T[i] < x then x  T[i] Tng t, mt vài thao tác toán hc quá phc tp đc coi nh là thao tác c bn. Nu chúng ta coi phép tính giá tr ca mt giai tha và kim tra cha ht là đn v chi phí, bt chp kích thc ca các toán hc nguyên lý Wilson (s nguyên n cha ht (n-1)! + 1 nu và ch nu n là s nguyên t vi mi n>1) s kim tra mt s nguyên vi hiu qu đáng kinh ngc: Function Wilson (n) {return true if and only if n là nguyên t} if n chia ht (n-1)! + 1 then return true else return false Trong ví d  đu ca phn này, chúng ta đã coi phép cng và phép nhân là các thao tác đn v chi phí, thi gian cn thit cho các thao tác này gii hn bi mt hng s. Theo lý thuyt, các thao tác này không phi là c bn vì thi gian cn thit đ thc hin nó tng lên theo đ dài ca các toán hng. Chng 2. Các khái nim c bn Nguyn V Quc Hng-Nguyn Qunh Dip 15 Thc t, chúng có th đc coi là thao tác c bn min là các toán hng có liên quan có kích thc hp lý trong các th hin mà hy vng s gp. Hai ví d di đây s minh ha cho điu chúng ta nói. Function Sum(n) {Tính tng các s nguyên t 1 đn n} sum  0 For I  1 to n do sum  sum +i Return Sum Function Fibonacci (n) {Tính s hng th n ca dây Fibonacci} I  1; j 0 For k 1 to n do j i+j I  j -1 Return j Trong gii thut Sum, giá tr sum phù hp vi tt c các th hin mà trong thc t gii thut khi thc hin có th bt gp. Nu chúng ta s dng máy vi 32 bit biu din s, tt c các phép cng có th thc hin trc tip vi n không ln hn 65535. Theo lý thuyt, gii thut phi làm vic vi tt c các giá tr có kh nng ca n. Trong thc t, không mt máy tính nào có th thc hin phép cng nh là mt đn v chi phí nu n đc chn đ ln. S phân tích gii thut phi tu theo mc đích ca ng dng. Trong trng hp Fibonacci ta có mt trng thái khác, ta tính đc s cui cùng là n +47, lúc này phép cng j i +j s b tràn ô s hn trên máy 32 bit.  có kt qu vi n + 65535 ta cn 45496 bit hoc nhiu hn 1420 t máy Vn đ cng tng t nh vy, khi ta phân tích các gii thut bao hàm s thc. Chng hn, tính dãy Fibonacci bng công thc Moivre Chng 2. Các khái nim c bn Nguyn V Quc Hng-Nguyn Qunh Dip 16     N N N F   5 1 VI 2 51  ( t l này) Tóm li, đ quyt đnh mt câu lnh b ngoài nhiu đn gin nh jj+i có là mt thao tác c bn hoc không ta đ cho cách s dng phán x. Sau đây chúng ta coi phép cng, tr, nhân, chia, ly modulo, toán t logic, so sánh và phép gán là các thao tác c bn có th thc hin mt đn v chi phí tr khi có mt gii thích khác. 2.5. Vì sao li phi xem xét hiu qu ca gii thut. Các thit b tính toán ngày càng chy nhanh hn, mt câu hi là ta có b cùng trên phí thi gian đ xây dng mt gii thut có hiu qu hay d dàng hn là ch th h máy tính mi? Các t tng ch yu đã đc trình bày trong phn này ch rõ điu đó là không đúng. Gi s, có mt bài toán riêng bit có thi gian hàm m và mt máy tính có kh nng gii mt th hin có kích thc n trong 10 -4 x 2 10 giây, tc là khong 1/10 giây, gii kích thc 20 là 10 -4 x 2 20 gn 1000 ln dài hn, khong hai phút. Gii vi kích thc 30 thì li là 1000 ln dài hn na, gn 1 ngày na. Gi s, máy tính không b ngt, không có li thì chy c mt nm cng ch gii đc th hin có kích thc 38. Gi thit là chúng ta có kh nng tài chính đ mua mt vài cái máy tính chy nhanh hn gp 100 ln máy nói  trên. Vi cùng gii thut đó, gii quyt th hin vi kích thc n ch có 10 -6 x 2 n giây. Vy thì chy c nm chúng ta cùng ch gii đc mt th hin có 45. Nói chung, máy tính có kh nng gii th hin kích thc n trong mt khong thi gian nào đó thì máy tính mi nói s gii đc mt th hin có kích thc ít nht là n+lg100, khong n+7, trong cùng mt thi gian. Gi thit chúng ta đu t cùng chi phí đó vào thit k gii thut đt kt qu là tìm thy mt gii thut bc ba cho bài toán ca chúng ta. Chng hn, cùng vi máy tính ban đu và gii thut mi vi chi phí thi gian cho th hin kích thc n là 10 -2 x n 3 giây. Vy thì gii thut th [...]... 10-2xn3 102 10-4xn3 10 1 5 chính xác là 3 10 15 20 25 30 35 100 ùng 17 Ch - 2.6 2.6 -J uss- 3 - Jordan trong 1/20 giây , khô , lg7 = n2,81 Jordan không 2.6 18 Ch - , g 2 phân nsert sort trung bình còn Quicksort nsertsort trên so sánh các ph nhiên, , T[1 n]) array U[1 10.000] For k 1 to 10000 do U[k] For i 1 to n do k U [k] 0 T[i] U[k] +1 19 Ch - i 0 For k 1 to 10000 do While U[k] 0 do i i+1 T[i] U[k]... -1 ây 2.6 Trong c K , , ta c 20 Ch - log(3/2) 0.59 1.59 2 và n1.59 n2 (nhanh h 2.6 n Khi , Function ucln (m,n) i min (m,n) +1 repeat i i-1 return i G 21 Ch - chính là ucln (m,n) : ucln (120,700), phân tích ta có 120 = 23 x 3 x5 và 700 = 22 x 52 2 x 51 Euclid Function Euclid (m,n) While m > 0 do t m m n modm n t return n 2.6.5 Tính dãy Fibonacci f0 = 0; f1 = 1 fn = fn-1 + fn-2 22 Ch - fn 1 n n 5 1 . ti ch. Chng 2. Các khái nim c bn Nguyn V Quc Hng-Nguyn Qunh Dip 13 Phân tích trung bình ca gii thut luôn nh hn phân tích ti nht. Hn na, phân tích trung bình có th. kinh đin tính ucln (m,n), đu tiên phân tích m,n ra thành tích ca các thc s nguyên t, sau đó ly tích ca các thc s chung vi s m nh nht trong c 2 tích ca m và n, kt qu đt đc. Chng 2. Các khái nim c bn Nguyn V Quc Hng-Nguyn Qunh Dip 7 CHNG 2 CÁC KHÁI NIM C BN V PHÂN TÍCH GII THUT 2.1. BƠi toán vƠ th hin (Problems

Ngày đăng: 02/02/2015, 17:34

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan