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

Giáo trình 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 (3.39 MB, 83 trang )

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
ng toán hc. Tt nhiên 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 ó cng 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 gian
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
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
 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
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 cng có th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
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
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à
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 cng 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
 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
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ó  sut tng (growth rate) f(n) nu tn ti các hng s c
và n
0
sao cho T(n)  f(n) vi mi n  n
0
.
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 n

0
= 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
 4n
2
vi mi n  1, tc là t sut tng ca T(n)
là n
2
.
Ví d 1-4: T sut tng ca hàm T(n) = 3n
3
+ 2n
2
là n
3
. Thc vy, cho n
0
= 0 và c = 5 ta d
dàng chng minh rng vi mi n  0 thì 3n
3
+ 2n
2
 5n
3
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) = 100n
2
(vi t
sut tng là n

2
) và T2(n) = 5n
3
(vi t sut tng là n
3
). Gii thut nào s thc hin nhanh hn? Câu tr
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 5n
3
nh hn h s ca 100n
2
(5<100). Nhng khi n > 20 thì ngc li do s m ca 100n
2
nh hn s m
a 5n
3
(2<3). ây chúng ta ch nên quan tâm n trng hp n>20 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, N
0
sao cho T(n) 
cf(n) vi mi n  N
0
(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à n
2
nên T(n)= (n+1)

2
là O(n
2
)
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ì
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
p có các dng thng gp sau: log
2
n, n, nlog
2
n, n
2
, n
3
, 2
2
, n!, n
n
. Ba hàm cui cùng ta gi là dng
hàm m, 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 m 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
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 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 n hai chng trình ó 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 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 n hai n chng trình ó 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 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 u kin. Thng thi gian kim tra 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
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
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 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;
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
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
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;
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
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
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
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ó
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ó
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
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
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).
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 c
2
c chn và c
2
n 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
 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 = 2

k
, quá trình suy rng s kt thúc khi i =k, khi ó ta có:
T(n) = 2
k
T(1) + kC
2
n
Vì 2
k
= n nên k = logn và vi T(1) =C
1
nên ta có
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) = C
1
n + C
2
nlogn
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, n
2
, n
3
, 2
n
, n!, n
n

.
ô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) = an
2
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
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) = C
1
và f(1) = b, mun T(1)  f(1) thì b  C
1
(*)
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) + C
2
n
Áp dng (I.2) vi k = n/2 < n ta có:
T(n) = 2T(n/2) + C
2
n  2[an/2log(n/2) + b] + C
2
n
T(n)  anlogn - an + 2b + C
2
n
T(n)  (anlogn + b) + [b + (C
2
- a)n] . Nu ly a  C

2
+ b (**) ta c
T(n)  (anlogn + b) + [b +(C
2
- C
2
- 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 = C
1
và a= C
1
+C
2
ta c T(n)  (C
1
+ C
2
)nlogn + C
1
vi mi 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 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.
i các bài toán con chúng ta cng 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) = C
2
n/C
1
. Xem C
1
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 = b
k
ta c: T(n/b
k
) = 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), a
k
= n
log
b
a
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.

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
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 cng 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
 nguyên dng m và n.
Ví d 1-12: Hàm f(n) = n
k
là mt hàm nhân, vì f(m.n) = (m.n)
k
= m
k
.n
k
= f(m) f(n)
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(b
k-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(a

k
) = O(n
log
b
a
). Nh vy nghim riêng và nghim thun
nht bng nhau do ó T(n) là O(n
log
b
a
).
Ta cng 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(n
log
b
d(b)
). Trong trng hp này nghim riêng
n hn nghim thun nht nên T(n) = O(n
log
b
d(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à log
b
(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:
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à n
log
b
a
log
b
n và nghim này ln gp log
b
n ln nghim thun nht.
Do ó T(n) = O(n
log
b
a
log
b
n).
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.
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
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) + n
2
3/- T(n) = 4T(n/2) + n
3
Trong mi trng hp, a=4, b=2 và nghim thun nht là n
2
. Vi d(n) = n ta có d(b) = 2 vì a =
4 > d(b) nên nghim riêng cng là n
2
và T(n) = O(n
2
) trong phng trình (1).
Trong phng trình (3), d(n) = n
3
, d(b) = 8 và a < d(b). Vì vy nghim riêng là O(n
log
b
d(b)
) =
O(n

3
) và T(n) ca (3) là O(n
3
).
Trong phng trình (2) chúng ta có d(b) = 4 = a nên T(n) = O(n
2
logn).
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
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) + 2n
1.5
ây, 2n
1.5
không phi là hàm nhân nhng n
1.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) + n
1.5
Nghim thun nht khi U(1) = 1 là n
log3
= n
1.59
; vì U(1) = 1/2 nên nghim thun nht là n
1.59/2


O(n
1.59
). Vì a = 3 và b = 2 và b
1.5
= 2.82 < a, nghim riêng cng là O(n
1.59
) và do ó U(n) = O(n
1.59
) . Vì
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(n
1.59
) hay T(n) = O(n
log3
).
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(nlog
2
n), nghim này ln hn nghim thun nht và
T(n) = O(nlog
2
n).
Bài 1: Tính thi gian thc hin ca các 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) + n
2
c) T(n) = 8T(n/2) + n
3
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) + n
2
c) T(n) = 9T(n/3) + n
2
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) + n
2

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
ng ó, nu tìm thy thì tr v TRUE, ngc li tr v FALSE.
 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.
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
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 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
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.
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
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(n
2
) 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á.
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ó
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
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 ly O(n
2
) 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à
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
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 ly O(n
2
) 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
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
 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
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 ly O(n
2
) 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.
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” cng 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
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
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.
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à 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.
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
 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”.
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
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
ng  lu gi giá tr cht và bin k  lu gi giá tr ca 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 l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(n
2
).
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.
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
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 cng 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
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 tr 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
 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) 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á
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.

×