Tải bản đầy đủ (.pdf) (18 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (588.38 KB, 18 trang )

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

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

17
hin kích thc 10 mt 10 giây, th hin kích thc 20 mt thi gian gia
1 và 2 phút, nhng th hin kích thc 30 mt 4, 5 phút và mt ngày đ
gii đc th hin kích thc 200, vi mt nm gii đc th hin kích
thc 1500. Ta có đ th sau minh ho cho s so sánh đó:











Gii thut mi mang li mt hiu qu ln hn hiu qu ca vic
mua máy tính mi, gi s chúng ta thc hin c 2 phng án thì hiu qu
đt đc còn ln hn nhiu na.Gii thut mi và máy tính nhanh hn
100 ln máy c s gii đc th hin có kích thc ln hn 4 hoc 5 ln

trong cùng mt khong thi gian (so vi gii thut c và máy c), h s
chính xác là
3
100
. Vi gii thut c, máy mi ta cng 7 vào kích thc
còn gii thut mi, máy mi ta nhan kích thc lên 4 hoc 5 ln (cùng
thi gian). Tuy nhiên, gii thut mi không s dng thích hp vi tt c
các th hn ca bài toán, đc bit là th hin vi kích thc nh. Ta có
th nhn thy rng máy tính c, gii thut mi gii thut mi gii th hin
Thi gian tính bng giây
10
10
3

10
2

10
5

10
4

1
5
10
20
15
25
30

35
Kích thc ca th hin
10
-4
x2
n

10
-6
x2
n

10
-2
xn
3

10
-4
xn
3

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

18
kích thc 10 mt 10 giây, chm hn 100 ln so vi gii thut c. Gii
thut mi ch tt đi vi th hin có kích thc ln hn 20.
2.6. Mt vƠi ví d
2.6.1 Tính đnh thc
nh thc có vai trò rt quan trng trong đi s tuyn tính và

chúng ta cn tính đc hiu qu ca nó. Có hai gii thut tính đnh thc
ni ting. Mt có c s trên đnh ngha hàm quy hi ca đnh thc, gii
thut kia là kh Gaus- Jordan. Gii thut hi quy cho thi gian t l là n!
đ tính đnh thc ca ma trn n x n, điu này còn xu hn c hàm m.
Ngc li, kh Gauss-Jordan cho thi gian t l n
3
vi cùng tác v.
Chúng ta đã lp trình c hai gii thut trên cùng mt máy tính.
Gii thut Gauss-Jordan tìm ra đnh thc ca ma trn 10 x10 trong 1/100
giây, khong 5 giây mi vi ma trn 100 x 100. Gii thut hi quy mt
20 giây cho mt ma trn 5 x 5 và 10 phút cho ma trn 10 x10. Chúng ta
gi thit rng gii thut hi quy cn 10 triu nm đ tính đnh thc ca
ma trn 20 x20, công vic đc thc hin hn hn bi gii thut Gauss-
Jordan trong 1/20 giây.
Qua ví d này, không có ngha là gii thut đ quy là không tt,
ngc li nó có vai trò c bn đ thit k thut toán có hiu qu cao. c
bit, có gii thut đ quy tính đnh thc ca ma trn n x n trong thi gian
t l vi n
lg7
= n
2,81
ngi ta đã chng t rng kh Gauss – Jordan không
phi là ti u.
2.6.2 Sp xp
Bài toán sp xp là mt bài toán rt quan trng ca khoa hc máy
tính, đc bit là trong thit k và phân tích gii thut. Bài toán đòi hi
chúng ta sp xp li n đi tng trong mt tp hp đi tng vi th t
đã quy đnh. Các đi tng khi so sánh có th t trong min giá tr ca
nó, ví d min s nguyên, s, ngày tháng, lu ý là tp hp đi tng phi
đng nht và ta coi là sp xp tng dn.

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

19
Bài toán sp xp cha đng nhiu gii thut lý thú và đôi khi
phc tp.  phn trên ta đã làm quên vi hai gii thut. Chèn và chn
trc tip, c hai gii thut này đu có thi gian bc 2 trong c trng hp
trung bình và ti nht.
Mc dù, 2 gii thut này là tuyt vi vi n nh nhng vn còn
nhng gii thut khác nhau có hiu qu cao hn nhiu vi n ln, chng
hn gii thut xp đng (heapsort), trn (mergesort) hay gii thut nhanh
ca Hoare (quick sort). Tt c nhng gii thut này có thi gian bc
n.logn trong trng hp trung bình, heapsort và mergesort cùng có thi
gian n.logn trong trng hp ti nht.
 làm sáng t s khác nhau thc t gia thi gian bc n
2
và bc
n logn, chúng ta đã lp trình Insert sort và Quicksort trên cùng mt máy.
S khác nhau v hiu qu gia hai gii thut này khá sit sao khi s lng
phân t đc sp xp là nh. Quicksort thc s nhanh hn 2 ln khi sp
50 phn t Insertsort mt nhiu hn 3 giây còn qucicsort cn ít hn 1/5
giây. Khi có 5000 phn t đc sp xp thì hiu qu kém ca Insert sort
bt đu b l ra, nó mt mt phút na cho trng hp trung bình còn
Quicksort ít hn 1 giây. Trong 30 giây, Quicksort có th sp đc
100.000 phn t, chúng ta phi mt 9 giây ri cho công vic nh vy
vi Insertsort.
 phn sau ta s bit rng không có gii thut sp xp nào da
trên so sánh các phn t đc sp có thi gian nhanh hn bc nlogn. Tuy
nhiên, gii thut nhanh nht đc tìm ra trong trng hp đc bit. Gi
s, phn t đc sp xp là các s nguyên có giá tr nm gia 1 và
10.000, gii thut sau đây đã đc s dng:

Procedure ngn kéo (T[1 n])
array U[1 10.000]
For k1 to 10000 do U[k] 0
For i  1 to n do
k  T[i]
U [k]  U[k] +1
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

20
i  0
For k 1 to 10000 do
While U[k] 0 do
i  i+1
T[i]  k
U[k]  U [k] -1
 đây U là mng “ngn kéo” cho các phn t đc sp .
Ti đó, phi phân tích các ngn kéo cho các phn t có kh nng
tìm thy trong T. Vòng lp đu tiên xáo ngn kéo, vòng lp th hai đt
mi phn t ca T vào mt v trí thích hp và vòng lp th ba ly chúng
ra theo th t tng dn.  thy gii thut này có thi gian bc n ( đây
n đi mt hng s bi ph thuc vào gii hn giá tr ca các phn t, 
đây là 10000)
2.6.3 Phép nhân s nguyên ln
Khi chúng ta tính toán vi s nguyên quá ln, các toán hng ca
nó là quá dài đ cha trong mt t máy ca máy tính đang s dng.
Trong các ngôn ng lp trình hin nay đu có các phng thc tính s
ln chng hn đ chính xác kép, s nguyên dài nhng chúng ta phi
xác đnh thi gian cn thit đ cng, tr, nhân, chia các s nguyên ln
theo kích thc các toán hng. Kích thc này có th đo bi s t máy
cn đ biu din toán hng hoc đ dài biu din nó dng thp phân (s

ch ca nó vit dng thp phân) hoc nh phân.
Trong phn này, chúng ta ch xem xét phép nhân. Phân tích phép
cng, tr, khá đn gin ta coi nh bài tp. Gi s, ta có phép nhân 2 s
nguyên ln có kích thc tng ng là m và n (không ln ln nó vi giá
tr ca s nguyên) gii thut phân lp đc tính trong phn trc d dàng
phù hp vi ng cnh ca chúng ta. Chúng ta thc hin nhân mi s ca
toán hng này vi mi s ca toán hng khác và thc hin mt phép cng
cho mi phép nhân đó. Trên máy tính chúng ta nhân mi t ca mt toán
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

21
hng vi mi t ca toán hng khác và làm phép cng đ dài gp đôi cho
mi phép nhân đó. Thi gian cn thit đ nhân bc m.n.
Phép nhân kiu Nga cng có bc m.n.
Gii thut có hiu qu cao đ nhân hai s nguyên ln là gii thut
chia đ tr có thi gian bc n.m
log(3/2)
hoc gn đúng là n.m
0.59
,  đó n>m.
Nu c hai toán hng cùng có đ dài n thì bc thi gian là n
1.59
. Gii thut
này có thi gian nh hn bc hai so vi c hai gii thut phân lp và gii
thut Nga.
S khác nhau gia bc n
2
và n
1.59
nh hn s khác nhau gia bc

n
2
và nlogn (không đp bng). Chúng ta đã kim tra điu này bng mt
chng trình chy trên gii thut chia đ tr và mt chng trình trên gii
thut phân lp và kim tra nó bng các s hng có kích thc khác nhau.
Chng trình chia đ tr tính trên s có 600 ch s ht 300 mi li giây.
Tng đ dài toán hng lên gp 10 ln thì mt là 15 giây, cái kia là 40 giây
(nhanh hn gp 3 ln). Hiu qu chia đ tr tip tc tng lên khi đ dài
toán hng tng lên.
2.6.4 Tìm c s chung ln nht
Cho m và n là hai s nguyên dng, vi c s chung ln nht
ca m và n kí hiu ucln(m,n) là hai s nguyên ln nht chia ht c m và
n. Khi ucln (m,n) = 1 ta gi đó là 2 s nguyên t cùng nhau. Chng hn,
ucln (10,u) =1 và ucln (6,15)= 3 thì 10 và 21 là nguyên t cùng nhau còn
6 và 15 thì không. Ta có gii thut sau xut phát t đnh ngha.
Function ucln (m,n)
i min (m,n) +1
repeat i  i-1 until i chia ht c m và n
return i
Gii thut này có thi gian là s chênh lch gia s nh nht
(trong hai s) và c chung ln nht. Khi m và n tng đng kích th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

22
và nguyên t cùng nhau thì thi gian ca gii thut bc n (chú ý là n là
giá tr toán hng ch không phi là kích thc).
Gii thut 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ính là ucln (m,n).

Ví d: ucln (120,700), phân tích ta có 120 = 2
3
x 3 x5 và 700 = 2
2

x 5
2
x 7. Tha s chung cho c hai là 2 và 5, s m nh nht ca chúng
trong c hai tính tng ng là 2 và 1, t đó ta có ucln (120,700) = 2
2
x 5
1

= 20. Gi thut này đòi hi chúng ta phân tích m và n ra các tha s
nguyên t, mt thao tác mà không ai đánh giá đc hiu qu khi m và n
là các s ln.
Mt gii thut có hiu qu hn mà ta đã bit chính là gii thut
Euclid
Function Euclid (m,n)
While m > 0 do
t m
m  n modm
n  t
return n
Nu chúng ta coi thao tác s hc có mt hng s thi gian nào đó
thì gii thut này có thi gian bc logarit.
2.6.5 Tính dãy Fibonacci
Dãy Fibonacci chúng ta đã bit là nó đc đnh ngha nh sau:
f
0

= 0; f
1
= 1
f
n
= f
n-1
+ f
n-2
n≥2
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

23
c th là dãy bt đu nh sau: 0,1,1,2,3,5,8,13,21,37. . . và chúng ta cng
đã bit công thc Moivre
 
 
nn
n
f


5
1

 đó
2
51

là t l bng, và s hng

 
n

có th b qua
khi n khác ln, vì vy giá tr ca f
n
tu thuc vào
n

và kích thc ca f
n

tu thuc vào n. Tuy nhiên, công thc này cn đn s tr giúp cu
phng thc tính chính xác s thc.
Gii thut đ quy đc xây dng t đnh ngha ca dãy Fibonacci
nh sau:
Function Fibrec(n)
if n>2 then return n
else return Fibrec (n-1) +Fibrec(n-2)
Gii thut này rt không hiu qu vì tính toán li cùng mt giá tr
nhiu ln. Chng hn, đ tính Fibrec (5) chúng ta cn giá tr ca Fibrec(4)
và Fibrec(3) đc tính hai ln, Fibrec (2) là 3 ln, Fibrec(1) là 5 ln và
Fibrec(0) là ba ln.
Gii thut th hai tính dãy Fibonacci nh sau:
Function Fibiter (n)
i1 ; j 0
For k1 to n do j  i+j
i  j-i
Return j
Gii thut th hai này có thi gian bc n nu chúng ta coi mi

phép cng nh là mt thao tác c s. Ngi ta đã làm chng trình so
sánh hai 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

24
N
10
20
30
50
100
Fibrec
8 msec
20
2 min
21 days
10 year
Fibiter
1/6 msec
1/3 msec
msec
3/4 msec
2
1
1
msec
Nu chúng ta không coi phép cng là phép tính c s thì Fibiter
có thi gian bc n
2
, vn còn nhanh hn rt nhiu so vi thi gian hàm m

ca Fibrec.

×