Ch
ng 5
Các k thu tthi
t k gi ithu t
1
N i dung
ng
1. Quiho ch 2. Gi ithu ttham lam 3. Gi ithu tquay lui
2
1.Quiho ch
ng
ng(dynamic programming) gi i các bàito án Quy ho ch b ng cách k t h p các l i gi i c a các bàito án con c a bài toán ang xét.
c
ng pháp này kh d ngkhi c ác bàito án con không i v inhau, t c là khi các bàito án con có dùngchung
Ph l p nh ng bàito án “cháu” (subsubproblem).
ng gi i các bàito án “cháu” dùng chung này
i c a chúngtrong m t b ng và sau ó
Quiho ch m t l n và l u l igi kh i ph i tính l ikhi g p l i bàito án cháu ó.
c áp d ng cho nh ng bàito án t i u
3
ng Quiho ch hóa(optimization problem).
B n b
c c aquiho ch
ng
S xây d ng m t gi ithu t quiho ch ng có th c chia
làm b n b c:
ctr ng hóa c utr úc c a l igi i t i u. 1.
2. nh ngh agi á tr c a l igi i t i u m t cách quy.
3. Tínhtr c a l igi i t i utheoki u t d i lên.
4. C u t o l igi i t i u t nh ngth ôngtin ã c tính
4
toán.
Thí d 1:Nh ân xâu matr n
Cho m t chu i g m n matr n, và tamu n tính tích cácmatr n.
(5.1) A1 A2 … An
c g i là m - óng-ngo c- y-
n ho c là tích
.
y- c m - óng-ngo c- y- theo
Tích c a xâumatr n này (fullyparenthesized ) n u nó là m tmatr n c a hai xâumatr n m - óng-ngo c- Thí d : A1 A2 A3 A4 có th 5 cách:
5
(A1(A2(A3A4))) (A1((A2A3)A4) ((A1A2)(A3A4)) (A1(A2A3))A4) (((A1A2)A3)A4)
ng
Cách mà ta m óngngo c m t xâumatr n có nh h r t l n n chi phí tính tích xâumatr n.
Thí d :
10 100 5 100 5 50 A1 A2 A3
(A1(A2A3))th chi n 10.000.5 +10.5.50=5000+ 2500
= 7500 phép nhân vô h ng.
ép nhân vô
(A1(A2A3))th chi n 100.5.50 +10.100.50 = 25000+ 50000= 75000ph h ng.
6
Hai chi phí trên r tkh ác bi t nhau.
Phátbi u bàito ánnh ân xâu matr n
Bàito án tính tích xâumatr n: '‘Cho m tchu i g m n matr n, v i m i
ng”. c pi-1 pi,ta m - óng- i= 1, 2, …, n, matr n Ai có kíchth ngo c tích nàysaocho t ithi u hóa t ng s phép nhân vô h
7
ây là m t bài toán t i u hóathu c lo ikh ó.
C utr úc c a m t cách m óngngo c t i u
ctr ng hóa c utr úc c a m t l i gi i t i u.
ký hi umatr n k t qu c a vi c tính
i v trí n mgi a Ak và Ak+1 v i m ttr
cti ênta t ính các chu ima
B c 1: Dùng Ai..j Ai Ai+1…Aj. M t s m óng ngo c t i u c a tích xâumatr n A1.A2… An Tách xâungay t nguyên k, 1 k < n. Ngh a là,tr tr n A1..k and Ak+1..n và r i nhânch úng v inhau cho ra A1.n.
8
Chi phí c a s m óng ngo c t i u này= chi ph í tính Al..k + chí phí tính Ak+1..n, + chi phí nhân chúng l i v i nhau.
Di n t
l
igi
i m t cách
quy
ây, nh ng bàito án con c ata l à bàito án xác nhchi ph í
t i u ng v i s m óng ngo c cho chu i Ai.Ai+1… Aj v i 1 j n. i
tm[i,j] l à t ng s t ithi u các phép nhân vô h ng
c tính
tínhmatr n Ai..j. Chi phí c a cách r nh t c ghi m[1, n]. òi h i A1..n s
Gi s r ng s m óng ngo c t i u tách ôi tíchchu i Ai k < j.Th ì m[i,j] b ng Ai+l… Aj t i gi a Ak and Ak+l, v i i tính Ai..k và Ak+1..j, c ng v ichiph í v i chí phí t ithi u nhân haimatr n này l i v i nhau.
m[i,j]=m[i,k] + m[k+1,j] + p
i-1pkpj.
9
M t côngth c
quy
quychochi ph í t i thi u c a m t
Nh v y, nhngh a s m óngngo ccho A i Ai+l… Aj là nh sau:
n ui =j,
m[i, j]= 0
=min{m[i,k]+m[k+1, j]+ p
i-1pkpj.}
(5.2)
n ui
giúptheo d õi cách t o m t l igi
i t i u, hãy nh
ngh a:
tr c a k t i ó chúngta t ách tích xâuma tr n
t
n m t s m óng ngo c t i u.
s[i, j]:
AiAi+1…Aj
10
M tnh n xétquantr ng
M t nh n xét quan tr ng là
''S m óng ngo c c a xâu con A1A2....Ak bên trong s m
óng ngo c t i u c a xâu A1A2…An c ng ph i là m t s m
óng ngo c t i u''.
ngtrong n ó nh ng l igi i t i u c a nh ng bàito án
Nh v y, m t l i gi i t i u cho bài tóan tích xâumatr n
ch a
con.
ng phápqui ho ch
B cth hai c a ph
tr c a l igi i t i u m t cách quytheonh ng l igi ng là nh ngh a
i t i
11
u c a nh ng bàito án con.
Tínhnh ngchiph í t i u
i d a vào côngth ccho (5.2) b ng m t
Thay vì tính l igi
gi ithu t quy, chúngta ith c hi n B c 3 c aqui ho ch
ng: tínhchi ph í t i u b ng cáchti p c n t d i lên.
c pi-1 pi v i
Gi s matr n Ai có kíchth
i = 1, 2 ,..,n.
u vào là chu itr s .
l u các chi phí m[i,j]
l ugi á tr nào c a v trí k mà th c
Th t c dùng m t b ngm[1..n,1..n]
và b ngs[1..n, 1..n]
hi n cchi ph í t i ukhi t ínhm[i,j].
12
Th t cMATRIX-CHAIN-ORDERtr v hai m ng m và s.
Th t c tínhhai b ng m và s
procedure MATRIX-CHAIN-ORDER(p,m,s);
begin
n:= length[p]-1;
for i:= 1 to n do m[i, i]:= 0;
for l:= 2 to n do /* l: length of the chain */
for i:= 1 to n – l + 1 do
begin
/* initialization */
j:= i + l – 1;
m[i, j]:= ;
for k:= i to j-1 do
begin
i-1pkpj;
then
q:=m[i, k]+m[k+ 1, j]+ p
if q
end
end
end
13
M tth í d : Tính tích xâu matr n
Vì ta nhngh am[i,j] ch cho i
c nh sau:
30
35
15
5
10
20 Cho cácmatr n v i kíchth
35
A1
15
A2
5
A3
10
A4
A5
20
25
A6
c tính b ith t c
14
Hình5.1tr ình bày b ng m và s
MATRIX-CHAIN-ORDER v i n = 6.
M tth í d v tính tích xâu matr ân(tt.)
M ng m
i
1
2
3
5
4
6
0
2500 1000
0
750
0
6 15125 10500 51375 3500 5000
5 11875 7125
0
9357 4375
7875 2625
0
15750
0
j 4
3
2
1
M ng s
Hình 5.1
5
5
4
5
4
i
3
3
3
3
2
3
3
3
2
1
3
3
3
1
1
6
5
j 4
3
2
15
M tth í d v tính tích xâu matr ân(tt.)
0 2500 35.15.20 13000
2625 100 35.5.30 7125
4375 0 35.10.20 11375
m[2,2] m[3,5] p.p p
2 5
m[2,3] m[4,5] p p p
1 2 5
m[2,4] m[5m5] p p p
1 4 5
m[2,5]=min
= 7125
k = 3for A 2..5
ngph áp qui ho ch ng là t o m t l igi i
16
B c 4 c a ph
t i u t nh ngth ôngtin ã tínhto án.
B c4: T o m t l
igi
i t i u
xác nh cách t t nh t
s[i,j] ghitr tính
i
Ta dùng m ngs[1..n, 1..n]
tích xâumatr n. M i ph n t
of k saocho t
ó s m óng ngo c t i u tách ôi xâu AiAi+1… Aj thành
hai o n t i Ak và Ak+1.
cchu imatr n A = , b ng s và các
Chotr
quy MATRIX-CHAIN-MULTIPLY sau
ch s i và j,th t c
ây tính tích xâumatr n Ai..j,.Th t ctr v k t qu qua
tham s AIJ.
V i l nh g i ban u là
17
MATRIX-CHAIN-MULTIPLY(A,s, 1, n, A1N)
Th t c s tr v k tqu matr n tíchsau c ùng v i m ng
A1N.
Tính l
igi
i
procedure MATRIX-CHAIN-MULTIPLY(A,s, i,j, AIJ);
begin
if j> i then
begin
MATRIX-CHAIN-MULTIPLY(A,s, i,s[i,j], X);
MATRIX-CHAIN-MULTIPLY(A,s,s[i, j]+1,j, Y);
MATRIX-MULTIPLY(X,Y, AIJ);
end
else
assignAi to AIJ;
18
end;
Cácth ànhph n c aquyho ch
ng
có th áp d ngqui ho ch ng: Có haith ành ph nthen ch t mà m t bàito án t i u hóa ph i
có
(1) ti u c utr úc t i u (optimalsubstructure) v à
(2) các bàito áncon tr ùng l p (overlappingsubproblems) .
Ti u c utr úc t i u
M t bàito án có tínhch tti u c utr úc t i u n u l igi
i t i
i t i u c anh ng bàito án uch atrong n ó nh ng l igi
19
con.
Nh ng bàito áncontr ùng l p
ithu t quy g p l i cùng m t bàito án con
Khi m tgi
nhi u l n,ta b o r ng bàito án t i u hóa có nh ng bàito án
contr ùng l p.
Gi ithu t quy ho ch
trùng l p b ng cáchgi
gi i vàotrong m t b ng mà b ng này s ng l i d ng nh ng bài toáncon
i m i bàito án con m t l n, c t l i
cthamkh o
nkhi c n.
ithu t
quy làmvi c t
ch ng làmvi c t trênxu ng trongkhi c ác
i lên, Cáchsau d
20
Cácgi
gi ithu tquyho
h u hi u h n .
Thí d 2: Bàito ánchu iconchung d àinh t
M t chu i con (subsequence) c a m t chu i(sequence) l à
i m t vài ph n t .
chu i ysaukhi b
Thí d :Z = l à m tchu icon c a
X = v i chu i ch s <2, 3, 5, 7>.
Cho hai chu i X và Y,ta b oZ l à chu icon chung (common
subsequence) c a X và Y n uZ l à m t chu i con c a c hai
chu i X và Y.
cchohai
21
Trong bàito ánchu iconchung d àinh t,ta
chu i X = và Y= và mu n tìm
chu iconchung d ài nh t (LCS) c a X và Y.
Ti u c utr úc t i u c a bàito ánchu icon
chung dàinh t
Thí d : X= v à Y=
l à LCS c a X and Y.
nhngh a ti n t th i c a
Chochu iX=,ta
X, v i i =0, 1, …,m, l à Xi =.
nh lý 6.1
22
Cho X = và Y= là nh ng
chu i, và Z = là LCS c a X và Y.
1. N u xm = yn thì zk = xm = yn và Zk-1 là LCS c a Xm-1 và
Yn-1.
2. N u xm yn,th ì zk
3. N u xm yn,th ì zk xm hàm ý Z l à LCS c a Xm-1 và Y.
yn hàm ý Z là LCS c a X và Yn-1.
L igi
i
quy
tìm m tLCS c a X và Y,ta c ó th c n tìmLCS c a X và
Yn-1 và LCS c a Xm-1 và Y. Nh ng m itrong hai b àito án
con này có nh ng bàito án “cháu” tìm Xm-1 và Yn-1.
G i c[i,j] l à chi u dài c aLCS c a hai chu i Xi và Yj. N u
i = 0 hay j = 0,th ì LCS có chi u dài 0. Tính ch tti u c u
quysau:
trúc t i u c a bàito ánLCS cho ra c ôngth c
0 n u i=0 hayj= 0
c[i,j]=c[i-1,j-1]+1 n u i, j>0 v à xi = yj
23
(5.3) max(c[i,j-1],c[i-1,j]) n u i,j>0 v à xi yj
Tínhchi u dài c a m tLCS
ng trình (5.3),ta c ó th vi t m tgi
D a vàoph
quy
i thu t
tìmchi u dài c a m tLCS c a haichu i.Tuy
ch
ng
tính l
igi
i
nhiên,ch úng ta dùngquiho
d
theo cách t
i lên.
u vào.
ngi n hóavi c t o
i t i u.
igi
Th t cLCS-LENGTH c ó haichu i X=
và Y= là
Th t c l u các tr c[i, j] trong b ngc[0..m,0..n]. N ó
c ng duytr ì b ng b[1..m,1..n]
l
24
procedure LCS-LENGTH(X, Y)
begin
for j:= 1 to n do c[0,j]:=0;
“” end
then
m:=length[X];n:=length[Y];
for i:= 1 to m do c[i, 0]:=0;
for i:= 1 to m do
for j:= 1 to n do
if xi = yj then
begin c[i,j]:= c[i-1,j-1]+1; b[i,j]:=
else if c[i – 1,j]>= c[i,j-1]
begin c[i,j]:=c[i – 1,j]; b[i, j]:= “” end
else
begin c[i,j]:=c[i, j-1];b[i,j]:= “” end
end;
25
âytr ình bày matr n c c ath í d . Hình5.2sau
0
0
0
0
0
0
0
B D C A B A yj
xi
1
1
0
0
0
0
1
A
2
0
1
1
1
1
2
B
Hình 5.2
2
0
1
1
2
2
2
C
1
3
0
1
2
2
3
B
2
0
1
2
2
3
3
D
3
4
0
1
2
3
2
A
1
4
0
2
2
3
4
B
26
T ochu iconchung d àinh t
B ng b có th
c dùng
t o m tLCS c a
X= andY=
quysau
âyinra m tLCS c aX v à Y. L nh g i
uti ên là
Th tuc
PRINT-LCS(b,X, n, m).
procedure PRINT-LCS(b,X,i,j)
begin
Th i gian tínhto án
c ath t cPRINT-
LCS là O(m+n), vì ít
nh t i hay j gi m m t
n v trong m i
ch ng c a quy.
if i<> 0 and j<> 0 then
if b[i,j]='' '' then
begin PRINT-LCS(b,X,i-1,j-l ) ;
print xi
end
elseif b[i,j]='' '' then
PRINT-LCS (b,X,i-1,j)
else PRINT-LCS(b,X,i,j-1)
end;
27
Thí d 3. Bàito án cái túi(Knapsack)
ng và giá tr khác nhau, nh ng y ch
ng t i a là
t m t giá tr cao nh t v i
'‘M t k tr m t nh p vào m t c a hi u tìmth y có n m t
hàng có tr ng l
mangtheo m t cái túi có s cch a v tr ng l
M. Bàito án cái túi là tìm m t t h p các m t hàng mà k
tr m nên b vào cái túi
nh ng món hàng mà y mang i.”
ng b ng cách
Bàito án này có th gi i b ng qui ho ch
dùng hai b ng cost và best sau ây:
c v i m t
cost[i] ch a giá tr t i a mà có th th chi n
cái túi có s c ch a i
cost[i]= cost[i – size[j]]+ val[j]
c
28
best[i] ch a m t hàngcu i cùng b vào túinh m t
giá tr t i a.
M tth í d c a bàito án cái túi
value 4
5
10
11
13
name A
B
C
D
E
29
Hình5.3 M tth í d c a bàito án cái túi
Gi ithu tquyho ch
ngcho b àito án cái túi
for i:= 0 to M do cost[i]:= 0;
for j:= 1 to N do /* each ofitem type*/
begin
for i:= 1 to M do /*imeans capacity*/
if i – size[j]>= 0 then
if cost[i]<(cost[i – size[j]]+ val[j])then
begin
cost[i]:= cost[i – size[j]]+ val[j]; best[i]:= j
end;
30
end;
M tth hi n c a cái túi
6 7 8 9
10 111213 1415 16 17
8 8 8 12
12 12 1616 1620 20 20
A A A A A A A A A A A A A A A
8 9 10 12 13 14
A B B A B B A B B A
16 17 18 2021 22
B B A B B
8 1010 12 14 15
16 18 18
2022 24
A B B A C B A C C A C C A C C
8 1011 12 14 15
16 18 20
2122 24
A B B A C D A C C A C C D C C
8 1011 13 14 15
17 18 20
K 1 2 3 4 5
j=1
cost[k] 0 0 4 4 4
best[k]
j=2
cost[k] 0 0 4 5 5
best[k]
j=3
cost[k] 0 0 4 5 5
best[k]
j=4
cost[k] 0 0 4 5 5
best[k]
j=5
cost[k] 0 0 4 5 5
best[k]
2123 24
A B B A C D E C C E C C D E C
Hình 5.4 Các m ng cost và best c a m tth í d bàito án cái túi
31
Ghi Chú:
i
c. c n u M không l n,
Bàito án cái túi có th d dànggi
nh ngkhiM l nth ì th igian ch ytr nên khôngth ch p
nh n
ng pháp này khôngth làmvi c c khi M và tr ng
Ph
l ng/kíchth c là nh ng s th cthay v ì s nguyên.
ng gi i bàito án cái
32
Tính ch t5.1.1 Gi ithu t qui ho ch
túi có th igian ch y t l v iNM .
Gi ithu tthamlam
ng i qua m t s b
c v i m t
c. M t gi ithu ttham
ng ch n m tkh n ng mà xem nh t tnh t t i lúc
Các gi ithu t t i u hóath
t p cáckh n ng l ach n t i m i b
lamth
ó.
T c là,gi
v ng s d n ithu t ch n m tkh n ng t i u c c b v i hy
i t i uto àn c c. n m t l igi
Vàith í d c a gi ithu ttham lam:
-Gi ithu tPrim tính câybaotr ùm t ithi u
-Gi ithu t Dijkstra gi i bài tóan nh ng l i ing n
33
nh t t m t nhngu n(single-sourceshortest paths
problem).
ng(Activity-
Bàito án x p l chcho c ácho t
Selection Problem)
c dùng b i m tho t òng, mà ch có th
Gi s
ng mà
ta có m t t pS = {1, 2, …, n} g m n ho t
cùngmu n s d ng cùng m t tài nguyên,th í d nh m t
ng
gi ng
t i m t lúc.
i m b t i m k t u si và m t th i
c l ach n, ho t ng i di n ra ng i có th i
fi. N u
ng i và j là t
M i ho t
thúc fi, mà si
trongth i kho ng[s i, fi). Ho t
ng thích n u
th ikho ng[s i, fi) và [sj, fj)kh ông ph l p lên nhau (t c là, i
và j là t ngth ích n u si >= fj hay sj >= fi).
ng t ngth ích v i nhau và có s ho t ng là ch n ra m tchu i các
ng nhi u
34
Bàito án x p l ch cácho t
ho t
nh t.
Gi ithu tthamlamcho b àito án x p l ch các
ho t
ng
gi i bàito án
s r ng cácho t ngnh p vào
ng,tagi
t t ng c ath i i m k tth úc:
Trongth t c áp d ng gi ithu tthamlam
x p l ch các ho t
c s ptheoth
f2 … fn.
/*sis
f1
procedure GREED-ACTIVITY-SELECTOR(S,f) ;
thearraykeepingthesetofactivitiesandfisthearraykeeping
thefinishing times*/
begin
= 1;
n:=length[s]; A :={1};j:
for i:= 2 to n do
if si >= fj then /* i is compatible with allactivitiesinA */
begin A:= A {i};j:= i end
35
end
Th t cGreedy-activity-selector
ng
ng là ho t i m k t thúc s m
c ch n b ith t c GREEDY-ACTIVITY-
ng v i th i
c x p l ch m t cách h p l . Ho t c
ng
l i c h i
Ho t
SELECTERth
nh t mà có th
ch ntheo c ách “thamlam ” theongh a nó s
c nhi u ho t
x p l ch cho ngkhác.
t em l i l igi i t i u.
c m t l igi ng tìm i t i u cho m tth hi n c a bài
36
Gi ithu tthamlam kh ông nh tthi
Tuy nhiênth t cGREEDY-ACTIVITY-SELECTOR
th
toán x p l ch các ho t ng.
i
si
fi
Hình 5.5 M tth í d
c a bài toán x p l ch
1
1
4
2
3
5
3
0
6
4
5
7
5
3
8
6
5
9
7
6
10
8
8
11
9
8
12
10 2
13
1112
14
37
Haith ànhph nch ính c agi
ithu tthamlam
có th áp d ng
Có hai tính ch t mà các bàito án ph i có
gi ithu tthamlam l à:(1) t ínhch t l a ch nthamlam v à
(2)ti u c utr úc t i u.
ithu tthamlam t ùythu c cth chi n b igi
i
trênxu ng,th chi n
L a ch n
vào nh ng l a ch n ã làm cho n bây gi , nh ng nó
nglaihay
không tùythu c vào b t k l a ch ntrong t
i c a nh ng bàito án con. Nh v y, m tgi
nh ng l igi
thu ttham lamti n hànhtheoki u t
m i lúc m t l a ch nthamlam.
Tính ch tti u c utr úc t i u(OptimalSubstructure)
i t i uchonh
38
M t bài tóan có tínhch tti u c utr úc t i u n u m t l i
gi i t i uch atrong n ó nh ng l igi
ng
bàito án con.
Gi ithu tthamlamso s ánh v iquyho ch
ng
ng và gi ithu ttham lam
S khác bi tgi a quiho ch
khi dùng gi i bàito án t i u là r t t nh .
Bàito án cái túi d ng 0-1
c nhnghi ã nh sau:
'‘M t k tr m tnh p vào m t c ahi u tìm th y n lo i món
ng và giá tr khácnhau (m ón hàng th i có giá
hàng có tr ng l
tr vi ô la và tr ng l
ng wi),nh ngch có m t cái túi v i s c
ng là M mang các món hàng. Bài toán cái túi
ch a v tr ng l
là tìm m t t h p các món hàng mà k tr m nênch n b vào cái
c m tgi á tr t i a v inh ng món hàng mà y l y
túi
t
i.”.
39
Bàito án này
c g i là bàito án cái túi d ng0-1 vì m i
món hàngth ì ho c là l y i ho c là b l i, k tr mkh ông
th l y ich m t ph n c a món hàng.
Bàito án cái túi d ngph ân s (Fractional
knapsackproblem)
t c ng nh v y,
Trong bàito án cái túi d ng phân s , tìnhti
nh k tr m có th l y i m tph n c a m t món hàng.
C hai bàito án u có tínhch t ti u c utr úc t i u.
i v i bàito án cái túi d ng0-1, x ét m t t h p n ng M ký
mà em l i giá tr c c
i. N uta l y món hàngth j rakh i
túi, nh ng món hàng còn l i c ng là t h p em l igi á tr l n
ng t i aM- w j mà k tr m có th l y
nh t ng v itr ng l
i t n-1 lo i m t hàngtr m t hàng th j.
ng h pkhita
i v i bàito án cái túi d ngph ân s , xéttr
i túi wj -w ký c a m t hàngth
40
j,nh ng món hàng
l yrakh
còn l i c ng là t h p em l igi á tr l nnh t ng v itr ng
ng M – (wj –w) mà k tr m có th l y i t n-1 lo i m t
l
hàngtr m t hàngth j.
Bàito án cái túi d ngph ân s (tt.)
Ta dùng gi i thu tthamlam cho bàito án cái túi d ngph ân
s và quiho ch ng cho bàito án cái túi d ng 1-0.
gi i bàito án cái túi d ng phân s ,tr
n v tr ng l cti ênta t ính h s
ng (vi/wi ) c a t ng m t
giá tr ti ntr ên m t
hàng.
u b ng cách l y càng nhi u càng t t m t
41
K tr m b t
hàng có h s vi/wi l n nh t.Khi lo i m t hàng này ã c n
c n ath ì y s càng
mà k tr m còn có th mangth êm
nhi u càng t t m t hàng có h s vi/wi l n nhì và c nh th
cho nkhi y kh ông còn có th mangth êm n a.
Hình 5.6
42
procedure GREEDY_KNAPSACK(V,W,M,X,n);
/*V,Warethearrayscontainthevaluesandweightsofnobjects
orderedsothat V i/Wi Vi+1/Wi+1.Mistheknapsackcapacityand Xis
solutionvector*/
var rc:real; i:integer;
begin
for i:= 1 to n do X[i]:=0;
rc :=M; //rc=remaining knapsack
capacity//
for i:= 1 to n do
begin i
thenexit;
if W[i]>rc
X[i]:= 1;rc:=rc – W[i] B quath i gian
s pth t các
món hàng,gi
thu t này có
ph c t p O(n).
end;
if i n then X[i]:=rc/W[i]
43
end
Mã Huffman
n v n
nàyli ênquan
nén file (file
c dùng
c nén d li u, ti tki m
Ch
compression). Các mã Huffman là k thu t
ph bi n và r t h uhi uchovi
t 20% n90% l à i n hình.
uti ên c avi c xây d ng mã Huffman là m
B c
t n s xu t hi n (frequency) c a m i ký t
trong t p tin
c mã hóa.
Gi s chúng ta có m t t p tin100000 k ý t mà chúng
tamu n l u tr
d ng nén.
44
a b
c
d e
f
5
45
13
12
16 9
T n s
Mã có chi u dài c
nh 000
001
010
011 100
101
i 0 101
100
111 1101
1100
Mã có chi u dàithay
t k m t mã nh phâncho k ý t
ó m i ký t d
c di n t
Chúng ta xét bài toánthi
(binarycharactercode)theo
b ng m ttr àng bit nh phân.
nh (3 bit)
N uch úng ta dùng m t mã có chi u dài c
di n t 6 ký t :
a =000,b=001, . .. , f=101
Thì c n t t c 300000bit
mã hóa toàn t p tin.
45
Mã có chi u dàithay
i
i (variable-length code) có th làm
M t mã có chi u dài thay
vi c t t h n m t mã có chi u dài c
nh, nó cho nh ng ký t
hayxu t hi n nh ng mã ng n và nh ng ký t hayxu t hi n
nh ng mã dài h n.
a= 0, b= 101, . . .f = 1100
Mã này òi h i:
(45. 1 + 13.3 + 12.3 +16.3+ 9.4+ 5.4).1000 = 224000bits
bi udi n t ptin,ti tki m c 25%.
46
Và y c ng chính là mã t i ucho t ptin n ày.
Mã phi-ti n t
(Prefix-code)
âytach xét nh ng cách mã hóa mà không có mã c a ký t
(prefix) c a mã c a m t ký t khác. Nh ng cách
c g i là mã phiti n t (prefix-free-code)
nào là ti n t
mã hóa nh v y
hay mã ti n t (prefix-code).
c r ng s néntin t i u cth chi n
Có th ch ngminh
b i m t cách mã hóa ký t và ó là mã phiti n t .
c a chu ng vì nó làm n gi n s mã hóa
Mã phiti n t
và gi i mã.
- S mã hóa là
t l i v inhauth ì s bi udi n ngi n;ta ch c n ghép k các mã c a các ký
c m i ký t trong t ptin.
47
- S gi i mã c n m t s bi udi nthu nti n cho mã phiti n t
sao cho ph n cnh t ra m t cách d dàng. u c a mã
Mã phiti n t và câynh phân
là m t câynh phân v i m i
Bi u di ncho m t mã phiti n t
nút lá t ng ng v i các ký t c cho.
i t nút r
Chúngtaph ân gi i m t mã nh phân cho m t ký t nh là
y, mà 0 ng v i “r
n nút lá c a ký t
m t l i
sang con bêntr ái” và 1 ngh a là “r sang con bên ph i”.
ng
y (fullbinarytree ). M t cây nh phân Mã t i u c a m t t ptinth
cây nh phân
cbi u di n b ng m t
y
hai là m t cây nh phân mà m i nútkh ôngph i lá có
con.
ó các ký t l yra,th ì câynh phân
t i u có úng|C| n út lá, m i nút lá cho
48
N u C là t p ký t mà t
cho mã phiti n t
m t ký t , và úng|C|-1 n út n i.
100
100
0
1
0
86
14
1
55
a:45
1
0
0
0
1
30
58
28
14
25
1
0
1
0
1
0
0
1
0
1
f:5
a:45 b:13
c:12
d:16
e:9
c:12
b:13
d:16
14
1
0
e:9
f:5
(a)
(b)
Hình5.7So s ánhhai c ách mã hóa
49
Mã phiti n t và câynh phân(tt.)
ng ng v i m t mã phiti n t , chúngta c ó
Cho m t câyT t
th tính t ng s bit c n mã hóa m t t ptin.
V i m i ký t c trong t p ký t C, dùng f(c)
ký hi u t n s
xu t hi n c a c trong t ptin v à dT(c) là chi u dài c a mã cho
ký t c.Th ì s bit òi h i mã hóa t ptin l à
B(T) = f(c)dT(c)
c C
50
Mà chúngta coi l à chi phí c a cây nh phânT.
C u t o mã Huffman
xu t m tgi ithu ttham lam c u t o m t
t i u c g i là mã Huffman (Huffman
Huffman ã
mã phiti n t
code).
ng ng v i mã t i u
u v i m t t p g m|C|
t o ra
Gi ithu t t o m t cây nh phân T t
i lên. Gi ithu t b t
theoki u t d
nút lá và th c hi n m t chu i g m|C| t ác v tr n
cây cu i cùng.
u tiên Q, l ytr khóatheo t n s f, c
i có
nh n di nhai i t ng có t n s nh nh t tr n
M t hàng
dùng
l i v i nhau.
i t ng là m t i t
51
K t qu c a vi ctr nhai
t n s là t ng t n s c a hai i t ng mà ã ng m i mà
ctr n.
(a)
(b)
f:5
e:9
c:12
b:13
d:16
a:45
c:12
b:13
d:16
a:45
14
0
f:5
1
e:9
(c)
(d)
d:16
a:45
a:45
14
25
25
30
0
0
f:5
1
e:9
0
c:12
1
b:13
0
c:12
1
b:13
1
d:16
14
0
f:5
1
e:9
(e)
(f)
a:45
55
100
0
1
0
1
30
25
a:45
55
0
0
1
0
c:12
1
b:13
1
d:16
14
30
25
0
0
f:5
1
e:9
0
c:12
1
b:13
1
d:16
14
Hình 5.8 Các b c c agi
ithu t t o mã Huffman
52
0
f:5
1
e:9
Gi ithu tHuffman
procedure HUFFMAN(C) ;
begin
n:=|C|;Q := C ;
for i:= 1 to n-1 do
begin
z: = ALLOCATE-NODE();
left[z]: =EXTRACT-MIN(Q);
right[z]: =EXTRACT-MIN(Q);
f[z]:=f[left[z]] +f[right[z]];
INSERT(Q,z);
end
53
end
ph c t p c agi
ithu tHuffman
Gi s Q
c hi n th c hóa b i m t heap nh phân.
c
Cho m t t pC g m n ký t ,vi c kh i t o c a Q
th c thi v i th igianO(n).
c th c thich ính xác g m|n|-1 l n, và vì
Vòng l p for
m i tác v làmvi c trên heap òi h iO(lgn), v òng l p
này óng gópchi ph í O(nlgn) vào th igian t ính toán.
i thu tHUFFMAN
Nh v y,th igian t ính toán c agi
trên t p n ký t
s là O(nlgn).
54
Gi ithu tquay lui
ng pháp t ng quát gi i quy t v n :thi
(trialand error ). t k
M t ph
gi ithu t tìm l i gi icho b ài tóankh ông ph i là bámtheo
c xác nh mà là b ng cách
m t t p qui lu t tính tóan
th và s asai
ng là phân rã quá trìnhth và s a
ngth ì nh ng công
quy m t cách c di n t
Khuôn m uth ôngth
saith ànhnh ng công tác b ph n.Th
theo l i
tác b ph n này
thu nti n và bao g m vi c th m dò m t s h u h nnh ng
công tác con.
55
Ta có th coito àn b quá trình này nh là m t quá trình tìm
ki m (search process) mà d n d n c u t o và duy t qua m t
cây các công táccon.
ng i c aconhi p s (TheKnight ’s
Bàito án
Tour Problem)
c di
c ttr ên bàn c t i
Cho m t bàn c n n v i n2 ô. M tcon hi p s –
chuy ntu ântheolu tch i c vua –
ô uti ên có t a x0, y0.
là tìm m t l csao cho ph toàn
trình g m n2 –1 b
c vi ng úng m t l n). V n
b bàn c (m i ô
thugi m bàito án ph n2 ô là xét bài toán,
Cách rõ ràng
ho c là
-th chi n b c i k ti p, hay
56
-ph át hi n r ngkh ôngki m c b c i h p l nào.
procedure trynextmove;
begin initializeselection ofmoves;
repeat
selectnextcandidatefrom list of nextmoves;
if acceptable then
begin
recordmove;
if board notfull then
begin
try nextmove;
(5.3.1)
if notsuccessful then erase previousrecording
end
end
until (move wassuccessful) (nomore candidates)
57
end
Cáchbi udi n d li u
Chúngtadi n t bàn c b ng m tmatr n h.
type index= 1..n ;
var h: array[index,index] of integer;
h[x, y] = 0:
h[x, y] = i: ô ch a h
ô ã c vi ng
cvi ng t i b cchuy nth i
(1 i n2)
i uki n “board notfull ” có th c di n t b ng “i <
n2”.
c a ô n. u, v: t a
i uki n “acceptable” có th c di n t b ng
58
(1 v n) (h[u,v]=0) (1 u n)
procedure try(i:integer; x,y :index; var q:boolean);
var u,v:integer; q1:boolean;
begin initializeselectionformoves;
repeat let u, v bethe coordinates ofthe nextmove ;
then (5.3.2)
if (1un) (1vn) (h[u,v]=0) then
begin h[u,v]:=i;
if i
try(i+1, u, v, q1); i f q1 then h[u,v]:=0
end
else q1:=true
end
until q1 (nomorecandidates);
q:=q1
59
end
c a ô hi n hành, c ó 8 kh n ng
3
2
4
1
5
8
6
7
60
Cho t a
ti p ch n ô k
c ánh s t 1 n 8 nh sau: i t i.Ch úng
S tinhch sau cùng
ngi n nh t t c t a u, v t x, y là b ng
saibi tto t ihai m ng a và b. Cách
cách c ng
Và k c dùng ánh s ngvi ên(candidate) k ti p.
61
program knightstour(output);
const n= 5; nsq= 25;
type index= 1..n
var i,j: index;q: boolean;
s: setof index;
a,b: array [1..8] of integer;
h: array [index,index] of integer;
procedure try(i:integer; x,y: index; var q:boolean);
var k,u,v : integer; q1: boolean;
begin k:=0;
repeat
k:=k+1;q1:=false; u:=x+a[k]; v:=y+b[k];
if (u in s) (v in s) then
if h[u,v]=0 then
begin
h[u,v]:=i;
if i< nsq then
begin
try(i+1, u,v,q1);
if q1 then h[u,v]:=0
end
else q1:=true
end
until q1 (k=8);
q:=q1
end {try};
62
begin
h[1,1]:=1;try(2,1,1,q);
if q then
for i:=1 to n do
begin
for j:=1 to n do
write(h[i,j]:5);
writeln
s:=[1,2,3,4,5];
a[1]:=2; b[1]:=1;
a[2]:=1; b[2]:= 2;
a[3]:= –1; b[3]:=2;
a[4]:= –2; b[4]:=1;
a[5]:= –2; b[5]:= –1;
a[6]:= –1; b[6]:= –2;
a[7]:=1; b[7]:= –2;
a[8]:=2; b[8]:= –1;
end
for i:=1 to n do
else writeln (‘NO
for j:=1 to n do h[i,j]:=0;
63
SOLUTION’)
end.
quy
ckh i
ng b ng l nh g i v i t a
kh i
u x0,
u.
Th t c
y0 , t
ó chuy n i b t
H[x0,y0]:=1; try(2, x 0, y0,q)
Hình5.3.1tr ình bày m t l igi
i
t
c v i v trí <1,1> v in=5.
1
6
15
10
21
14
9
20
5
16
19
2
7
22
11
8
13
24
17
4
25
18
3
12
23
64
T thí d trênta
i
n v i m tki u “gi iquy t v n
” m i:
c i m chính là
ng v l igi
i
c h
và ghi l ith ôngtin
y
c này mà sau ó nó có th b tháo g và xóa i
c này ã không d n
, t c là m t b
y
c i d n
n l i
n “tìnhth b
c g i là quay lui -
“b
v b
khiph áthi n r ng b
gi i
t c”(dead-end).(H ànhvi n ày
bactracking.)
65
ithu tquay lui
Khuôn m u t ngqu át c agi
procedure try;
begin intializeselection ofcandidates;
repeat
select next;
if acceptable then
begin
recordit;
if solutionincomplete then
begin
(5.3.3)
trynextstep;
if notsuccessful then cancelrecording
end
end
66
until successful nomore candidates
end
procedure try(i: integer);
var k : integer;
begin k:=0;
repeat
k:=k+1;select k-thcandidate;
if acceptable then
begin
N u t i m i
b
ng
c, s
viên ph ith là
nhth ì ki u
c
m utr ên có th
i nh :
bi n
record it;
if i
(5.3.4)
c g i
try(i+1);
if not successful then
cancelrecording
Th t c
b ng l nh g i
end
try(1).
end
until successful (k=m)
end
67
Bàito án8con h u
cC.F.Gausskh
o sát n m1850,
Bàito án này ã
nh ng ôngtakh ôngho ànto àngi
iquy t
c.
t vào bàn c saochokh ông có
c
“Támcon h u
con h u nào có th t n côngcon h u nào”.
có
c m tth
Dùngkhu ôn m u hình5.3.1,ta s
t csaucho b àito án8con h u:
68
procedure try (i:integer);
begin
initializeselectionofpositionsfori-thqueen;
repeat
makenextselection;
if safe then
begin
setqueen;
if i< 8 then
begin
try (i+1);
if notsuccessful then removequeen
end
end
until successful nomorepositions
end
69
Lu t c : M tcon h u có th t n công cáccon h ukh ác n mtr ên
ngch éotr ên bàn c .
cùng m t hàng, cùng m t c thay l à cùng
Cách bi udi n d li u
Làm cách nào di n t 8con h utr ên bàn c ?
var x: array[1..8] of integer;
a: array[1..8] ofBoolean;
b: array[b1..b2] ofBoolean;
c: array[c1..c2] ofBoolean;
v i
x[i]ch v trí c acon h utr ên c tth i;
a[j] chobi tkh ông có con h utr ên hàngth j;
b[k] cho bi tkh ông có con h utr ên ng chéo th k;
70
ng chéo c[k] cho bi tkh ông có con h utr ên th k.
c xác nh
c tính.
t t
ng chéo chi u
i +j, và
ng chépchi u
Vi cch ntr cho các m c b1, b2, c1, c2
b i cách mà các ch s c a các m ng b và c
Hãych ú ý r ngtr ên cùng m t
c các ô s có cùnggi á tr c a t nghai t a
trên cùng m t
các ô s có cùnggi á tr c ahi uhai t a
diagonal, t t c
(i – j ).
ctinh ch nh sau:
Nh v y,ph átbi u setqueen
x[i]:=j; a[j]:=false; b[i+j]:=false;c[i-j]:=false;
Phátbi u removequeen
c chiti
a[j]= true; b[i+j]=true ; c[i-j] := true
t hóa nh sau:
i uki n safe
cdi n t nh sau:
a[j] b[i+j] c[i-j]
71
begin
i : integer; q:boolean;
x[i]:=j;
a[j]:=false; b[i+j]:=false;
c[i-j]:=false;
if i<8 then
begin
try(i+1,q);
if q then
begin
a[j]:=true; b[i+j]:=true;
c[i-j]:=true
program eightqueeen1(output);
{findonesolution to eight queens
problem}
var
a : array [1..8] of boolean;
b : array [2..16] of boolean;
c : array [–7..7] of boolean;
x : array [1..8] of integer;
procedure try(i: integer; var q:
boolean);
var j: integer;
begin
end
j:=0;
repeat
end
else q:=true
end
j:=j+1; q:=false;
if a[j] b[i+j] c[i-j] then
until q (j=8)
end {try};
72
begin
for i:= 1 to 8 do a[i]:=true;
for i:= 2 to 16 do b[i]:=true;
for i:= –7 to 7 do c[i]:=true;
try(1,q);
if q then
for i:=1 to 8 do
write(x[i]:4);
writeln
end
73
c cho hình v sau: M t l i gi i c a bàito án 8 con h u
H
1
H
2
H
3
H
4
H
5
H
6
H
7
H
8
74
S m r ng: Tìm t t c các l
igi
i
i mà t t c
S m r ng là tìmkh ông ch m t l igi
nh ng l
i c a bàito án ã cho.
igi
ngph áp: M tkhi m t l igi
c tìmth y và
i
Ph
ghi l i,tati p t c xét ng viên k trongqu á trình ch n
ngvi ên m t cách có h th ng.
c d nxu t t
(5.3.4) và
Khuôn m u t ngqu át
ctr ình bàynh sau:
75
procedure try(i:integer);
var k: integer;
begin
for k:=1 to m do
begin
selectk-thcandidate;
if acceptable then
begin
recordit;
if i
end
end
76
end
n gi n hóa i uki n d ng
cthayth b ng phát
Trong gi ithu t m r ng,
c a quá trình ch n,ph át bi u repeat
bi u for
procedure try(i:integer);
var j: integer;
begin
for j:=1 to 8 do
if a[j] b[i+j] c[i-j] then
begin
program eightqueens(output);
var i: integer;
of boolean;
a: array [1..8]
b: array [2..16] of boolean;
c: array [–7..7] of boolean;
x: array [1..8]
of integer;
procedure print;
var k : integer;
begin
for k : 1 to 8 do write(x[k]:4);
writeln
end {print};
x[i]:=j;
a[j]:=false; b[i+j]:=false;
c[i-j]:=false;
if i< 8 then try(i+1) else print;
a[j]:=true; b[i+j]:= true;
c[i-j]:= true;
end
end {try};
77
begin
for i:= 1 to 8 do a[i]:=true;
for i:= 2 to 16 do b[i]:=true;
for i:= –7 to 7 do c[i]:=true;
try(1);
end.
t c 92 l igi
i
Gi ithu t m r ng có th s nsinh t
cho bàito án8 con h u.
ith t s khácbi
t
Nh ngth t rach có 12 l igi
nhau.
78
cli igi i ó
N
x4
x6
x2
x3
x7
x8
t kê trong b ngsau:
x5
M ihai l
x1
=========================================================
1
1
1
1
2
2
2
2
2
2
2
2
876
264
200
136
504
400
72
280
240
264
160
336
8
8
4
5
6
7
7
1
8
3
5
6
3
7
8
2
3
3
1
4
1
8
1
3
5
6
7
7
4
5
5
6
6
7
7
8
7
4
2
4
1
8
8
8
4
5
4
5
6
3
6
8
8
1
4
7
3
6
8
1
4
5
3
3
5
4
3
5
5
4
3
4
2
2
5
6
7
6
6
3
7
1
6
7
79
c tNch s l nth
Nh nggi á tr
bình c n 161 phép th trong 92 l igi tìm m t ô anto àn.Trung
i này.
Câykh ônggiantr ngth ái
ti n di n t gi ithu t quay lui,ta x ây d ng c utr úc cây
ghi nh ng l a ch n ã cth c hi n. C utr úc cây này
c g i là cây khônggiantr ng thái (statespacetree) hay
cây tìmki m (searchtree).
tr ngth ái uti ên tr ckhi qu á
Nút r c a cây di n t
trình tìmki m l igi
Các nút m c
i b t u.
uti êntrong c ây di n t nh ng l ach n
c làm ng v ith ành ph n uti ên c a l i gi i.
Các nút m cth haì trong cây di n t nh ng l ach n
i và các
c làm ng v ith ành ph nth hai c a l igi
80
m c k ti p t ng t nh th .
M t núttr ên cây KGTT
ng v i l i gi i b ph n mà s có th d n c g i là tri n v ng n u nó t
i n l igi ng
y
;tr ái l i, nó
Các nút lá di n t nh ngtr c g i là m t l i gi i không tri n v ng.
ng h p b t c (deadend) hay
nh ng l igi i y .
Thí d : Cho m t bàito án nh sau:
T p bi n:X, Y,Z.
Gántr t t p{1,2} v ào các bi nsao choth a mãn các ràng
bu c: X=Y, X Z,Y >Z.
i bàito án b ng m t gi ithu t quaylui.
Hãygi
Câykh ông giantr ngth ái c a bàito án này c cho hình
81
v sau:
X=1
X=2
Y=2
Y= 1
Y= 1
Y=2
Z=1
Z=2
Z=2
Z=1
l
igi
i
Hình5.9Th í d v câyKh ông GianTr ngTh ái
82
ph c t p c a gi
ithu tquay lui
ithu tquayluith
ng
Th igian t ínhto án c a cácgi
là hàm m (exponential).
nút con, và chi u dài c a l i
i l igi
i là N,th ì
N u m i núttr ên câykh ônggiantr ngth ái có trung
bình
s núttr ên cây s t l v i N.
ithu t
quy t
ng ng
Th igian t ínhto án c agi
v i s núttr ên câykh ônggiantr ngth ái nên có
ph c t p hàm m .
83
giúptheo d õi cách t o m t l igi
i t i u, hãy nh
ngh a:
tr c a k t i ó chúngta t ách tích xâuma tr n
t
n m t s m óng ngo c t i u.
s[i, j]: AiAi+1…Aj
10
M tnh n xétquantr ng
M t nh n xét quan tr ng là ''S m óng ngo c c a xâu con A1A2....Ak bên trong s m óng ngo c t i u c a xâu A1A2…An c ng ph i là m t s m óng ngo c t i u''.
ngtrong n ó nh ng l igi i t i u c a nh ng bàito án
Nh v y, m t l i gi i t i u cho bài tóan tích xâumatr n ch a con.
ng phápqui ho ch
B cth hai c a ph tr c a l igi i t i u m t cách quytheonh ng l igi ng là nh ngh a i t i
11
u c a nh ng bàito án con.
Tínhnh ngchiph í t i u
i d a vào côngth ccho (5.2) b ng m t
Thay vì tính l igi gi ithu t quy, chúngta ith c hi n B c 3 c aqui ho ch
ng: tínhchi ph í t i u b ng cáchti p c n t d i lên.
c pi-1 pi v i
Gi s matr n Ai có kíchth i = 1, 2 ,..,n.
u vào là chu itr s
l u các chi phí m[i,j]
l ugi á tr nào c a v trí k mà th c
Th t c dùng m t b ngm[1..n,1..n] và b ngs[1..n, 1..n] hi n cchi ph í t i ukhi t ínhm[i,j].
12
Th t cMATRIX-CHAIN-ORDERtr v hai m ng m và s.
Th t c tínhhai b ng m và s
procedure MATRIX-CHAIN-ORDER(p,m,s); begin
n:= length[p]-1; for i:= 1 to n do m[i, i]:= 0; for l:= 2 to n do /* l: length of the chain */
for i:= 1 to n – l + 1 do begin
/* initialization */
j:= i + l – 1; m[i, j]:= ; for k:= i to j-1 do begin
i-1pkpj;
then
q:=m[i, k]+m[k+ 1, j]+ p
if q
end
end
end
13
M tth í d : Tính tích xâu matr n
Vì ta nhngh am[i,j] ch cho i
c nh sau:
30
35
15
5
10
20 Cho cácmatr n v i kíchth
35
A1
15
A2
5
A3
10
A4
A5
20
25
A6
c tính b ith t c
14
Hình5.1tr ình bày b ng m và s
MATRIX-CHAIN-ORDER v i n = 6.
M tth í d v tính tích xâu matr ân(tt.)
M ng m
i
1
2
3
5
4
6
0
2500 1000
0
750
0
6 15125 10500 51375 3500 5000
5 11875 7125
0
9357 4375
7875 2625
0
15750
0
j 4
3
2
1
M ng s
Hình 5.1
5
5
4
5
4
i
3
3
3
3
2
3
3
3
2
1
3
3
3
1
1
6
5
j 4
3
2
15
M tth í d v tính tích xâu matr ân(tt.)
0 2500 35.15.20 13000
2625 100 35.5.30 7125
4375 0 35.10.20 11375
m[2,2] m[3,5] p.p p
2 5
m[2,3] m[4,5] p p p
1 2 5
m[2,4] m[5m5] p p p
1 4 5
m[2,5]=min
= 7125
k = 3for A 2..5
ngph áp qui ho ch ng là t o m t l igi i
16
B c 4 c a ph
t i u t nh ngth ôngtin ã tínhto án.
B c4: T o m t l
igi
i t i u
xác nh cách t t nh t
s[i,j] ghitr tính
i
Ta dùng m ngs[1..n, 1..n]
tích xâumatr n. M i ph n t
of k saocho t
ó s m óng ngo c t i u tách ôi xâu AiAi+1… Aj thành
hai o n t i Ak và Ak+1.
cchu imatr n A = , b ng s và các
Chotr
quy MATRIX-CHAIN-MULTIPLY sau
ch s i và j,th t c
ây tính tích xâumatr n Ai..j,.Th t ctr v k t qu qua
tham s AIJ.
V i l nh g i ban u là
17
MATRIX-CHAIN-MULTIPLY(A,s, 1, n, A1N)
Th t c s tr v k tqu matr n tíchsau c ùng v i m ng
A1N.
Tính l
igi
i
procedure MATRIX-CHAIN-MULTIPLY(A,s, i,j, AIJ);
begin
if j> i then
begin
MATRIX-CHAIN-MULTIPLY(A,s, i,s[i,j], X);
MATRIX-CHAIN-MULTIPLY(A,s,s[i, j]+1,j, Y);
MATRIX-MULTIPLY(X,Y, AIJ);
end
else
assignAi to AIJ;
18
end;
Cácth ànhph n c aquyho ch
ng
có th áp d ngqui ho ch ng: Có haith ành ph nthen ch t mà m t bàito án t i u hóa ph i
có
(1) ti u c utr úc t i u (optimalsubstructure) v à
(2) các bàito áncon tr ùng l p (overlappingsubproblems) .
Ti u c utr úc t i u
M t bàito án có tínhch tti u c utr úc t i u n u l igi
i t i
i t i u c anh ng bàito án uch atrong n ó nh ng l igi
19
con.
Nh ng bàito áncontr ùng l p
ithu t quy g p l i cùng m t bàito án con
Khi m tgi
nhi u l n,ta b o r ng bàito án t i u hóa có nh ng bàito án
contr ùng l p.
Gi ithu t quy ho ch
trùng l p b ng cáchgi
gi i vàotrong m t b ng mà b ng này s ng l i d ng nh ng bài toáncon
i m i bàito án con m t l n, c t l i
cthamkh o
nkhi c n.
ithu t
quy làmvi c t
ch ng làmvi c t trênxu ng trongkhi c ác
i lên, Cáchsau d
20
Cácgi
gi ithu tquyho
h u hi u h n .
Thí d 2: Bàito ánchu iconchung d àinh t
M t chu i con (subsequence) c a m t chu i(sequence) l à
i m t vài ph n t .
chu i ysaukhi b
Thí d :Z = l à m tchu icon c a
X = v i chu i ch s <2, 3, 5, 7>.
Cho hai chu i X và Y,ta b oZ l à chu icon chung (common
subsequence) c a X và Y n uZ l à m t chu i con c a c hai
chu i X và Y.
cchohai
21
Trong bàito ánchu iconchung d àinh t,ta
chu i X = và Y= và mu n tìm
chu iconchung d ài nh t (LCS) c a X và Y.
Ti u c utr úc t i u c a bàito ánchu icon
chung dàinh t
Thí d : X= v à Y=
l à LCS c a X and Y.
nhngh a ti n t th i c a
Chochu iX=,ta
X, v i i =0, 1, …,m, l à Xi =.
nh lý 6.1
22
Cho X = và Y= là nh ng
chu i, và Z = là LCS c a X và Y.
1. N u xm = yn thì zk = xm = yn và Zk-1 là LCS c a Xm-1 và
Yn-1.
2. N u xm yn,th ì zk
3. N u xm yn,th ì zk xm hàm ý Z l à LCS c a Xm-1 và Y.
yn hàm ý Z là LCS c a X và Yn-1.
L igi
i
quy
tìm m tLCS c a X và Y,ta c ó th c n tìmLCS c a X và
Yn-1 và LCS c a Xm-1 và Y. Nh ng m itrong hai b àito án
con này có nh ng bàito án “cháu” tìm Xm-1 và Yn-1.
G i c[i,j] l à chi u dài c aLCS c a hai chu i Xi và Yj. N u
i = 0 hay j = 0,th ì LCS có chi u dài 0. Tính ch tti u c u
quysau:
trúc t i u c a bàito ánLCS cho ra c ôngth c
0 n u i=0 hayj= 0
c[i,j]=c[i-1,j-1]+1 n u i, j>0 v à xi = yj
23
(5.3) max(c[i,j-1],c[i-1,j]) n u i,j>0 v à xi yj
Tínhchi u dài c a m tLCS
ng trình (5.3),ta c ó th vi t m tgi
D a vàoph
quy
i thu t
tìmchi u dài c a m tLCS c a haichu i.Tuy
ch
ng
tính l
igi
i
nhiên,ch úng ta dùngquiho
d
theo cách t
i lên.
u vào.
ngi n hóavi c t o
i t i u.
igi
Th t cLCS-LENGTH c ó haichu i X=
và Y= là
Th t c l u các tr c[i, j] trong b ngc[0..m,0..n]. N ó
c ng duytr ì b ng b[1..m,1..n]
l
24
procedure LCS-LENGTH(X, Y)
begin
for j:= 1 to n do c[0,j]:=0;
“” end
then
m:=length[X];n:=length[Y];
for i:= 1 to m do c[i, 0]:=0;
for i:= 1 to m do
for j:= 1 to n do
if xi = yj then
begin c[i,j]:= c[i-1,j-1]+1; b[i,j]:=
else if c[i – 1,j]>= c[i,j-1]
begin c[i,j]:=c[i – 1,j]; b[i, j]:= “” end
else
begin c[i,j]:=c[i, j-1];b[i,j]:= “” end
end;
25
âytr ình bày matr n c c ath í d . Hình5.2sau
0
0
0
0
0
0
0
B D C A B A yj
xi
1
1
0
0
0
0
1
A
2
0
1
1
1
1
2
B
Hình 5.2
2
0
1
1
2
2
2
C
1
3
0
1
2
2
3
B
2
0
1
2
2
3
3
D
3
4
0
1
2
3
2
A
1
4
0
2
2
3
4
B
26
T ochu iconchung d àinh t
B ng b có th
c dùng
t o m tLCS c a
X= andY=
quysau
âyinra m tLCS c aX v à Y. L nh g i
uti ên là
Th tuc
PRINT-LCS(b,X, n, m).
procedure PRINT-LCS(b,X,i,j)
begin
Th i gian tínhto án
c ath t cPRINT-
LCS là O(m+n), vì ít
nh t i hay j gi m m t
n v trong m i
ch ng c a quy.
if i<> 0 and j<> 0 then
if b[i,j]='' '' then
begin PRINT-LCS(b,X,i-1,j-l ) ;
print xi
end
elseif b[i,j]='' '' then
PRINT-LCS (b,X,i-1,j)
else PRINT-LCS(b,X,i,j-1)
end;
27
Thí d 3. Bàito án cái túi(Knapsack)
ng và giá tr khác nhau, nh ng y ch
ng t i a là
t m t giá tr cao nh t v i
'‘M t k tr m t nh p vào m t c a hi u tìmth y có n m t
hàng có tr ng l
mangtheo m t cái túi có s cch a v tr ng l
M. Bàito án cái túi là tìm m t t h p các m t hàng mà k
tr m nên b vào cái túi
nh ng món hàng mà y mang i.”
ng b ng cách
Bàito án này có th gi i b ng qui ho ch
dùng hai b ng cost và best sau ây:
c v i m t
cost[i] ch a giá tr t i a mà có th th chi n
cái túi có s c ch a i
cost[i]= cost[i – size[j]]+ val[j]
c
28
best[i] ch a m t hàngcu i cùng b vào túinh m t
giá tr t i a.
M tth í d c a bàito án cái túi
value 4
5
10
11
13
name A
B
C
D
E
29
Hình5.3 M tth í d c a bàito án cái túi
Gi ithu tquyho ch
ngcho b àito án cái túi
for i:= 0 to M do cost[i]:= 0;
for j:= 1 to N do /* each ofitem type*/
begin
for i:= 1 to M do /*imeans capacity*/
if i – size[j]>= 0 then
if cost[i]<(cost[i – size[j]]+ val[j])then
begin
cost[i]:= cost[i – size[j]]+ val[j]; best[i]:= j
end;
30
end;
M tth hi n c a cái túi
6 7 8 9
10 111213 1415 16 17
8 8 8 12
12 12 1616 1620 20 20
A A A A A A A A A A A A A A A
8 9 10 12 13 14
A B B A B B A B B A
16 17 18 2021 22
B B A B B
8 1010 12 14 15
16 18 18
2022 24
A B B A C B A C C A C C A C C
8 1011 12 14 15
16 18 20
2122 24
A B B A C D A C C A C C D C C
8 1011 13 14 15
17 18 20
K 1 2 3 4 5
j=1
cost[k] 0 0 4 4 4
best[k]
j=2
cost[k] 0 0 4 5 5
best[k]
j=3
cost[k] 0 0 4 5 5
best[k]
j=4
cost[k] 0 0 4 5 5
best[k]
j=5
cost[k] 0 0 4 5 5
best[k]
2123 24
A B B A C D E C C E C C D E C
Hình 5.4 Các m ng cost và best c a m tth í d bàito án cái túi
31
Ghi Chú:
i
c. c n u M không l n,
Bàito án cái túi có th d dànggi
nh ngkhiM l nth ì th igian ch ytr nên khôngth ch p
nh n
ng pháp này khôngth làmvi c c khi M và tr ng
Ph
l ng/kíchth c là nh ng s th cthay v ì s nguyên.
ng gi i bàito án cái
32
Tính ch t5.1.1 Gi ithu t qui ho ch
túi có th igian ch y t l v iNM .
Gi ithu tthamlam
ng i qua m t s b
c v i m t
c. M t gi ithu ttham
ng ch n m tkh n ng mà xem nh t tnh t t i lúc
Các gi ithu t t i u hóath
t p cáckh n ng l ach n t i m i b
lamth
ó.
T c là,gi
v ng s d n ithu t ch n m tkh n ng t i u c c b v i hy
i t i uto àn c c. n m t l igi
Vàith í d c a gi ithu ttham lam:
-Gi ithu tPrim tính câybaotr ùm t ithi u
-Gi ithu t Dijkstra gi i bài tóan nh ng l i ing n
33
nh t t m t nhngu n(single-sourceshortest paths
problem).
ng(Activity-
Bàito án x p l chcho c ácho t
Selection Problem)
c dùng b i m tho t òng, mà ch có th
Gi s
ng mà
ta có m t t pS = {1, 2, …, n} g m n ho t
cùngmu n s d ng cùng m t tài nguyên,th í d nh m t
ng
gi ng
t i m t lúc.
i m b t i m k t u si và m t th i
c l ach n, ho t ng i di n ra ng i có th i
fi. N u
ng i và j là t
M i ho t
thúc fi, mà si
trongth i kho ng[s i, fi). Ho t
ng thích n u
th ikho ng[s i, fi) và [sj, fj)kh ông ph l p lên nhau (t c là, i
và j là t ngth ích n u si >= fj hay sj >= fi).
ng t ngth ích v i nhau và có s ho t ng là ch n ra m tchu i các
ng nhi u
34
Bàito án x p l ch cácho t
ho t
nh t.
Gi ithu tthamlamcho b àito án x p l ch các
ho t
ng
gi i bàito án
s r ng cácho t ngnh p vào
ng,tagi
t t ng c ath i i m k tth úc:
Trongth t c áp d ng gi ithu tthamlam
x p l ch các ho t
c s ptheoth
f2 … fn.
/*sis
f1
procedure GREED-ACTIVITY-SELECTOR(S,f) ;
thearraykeepingthesetofactivitiesandfisthearraykeeping
thefinishing times*/
begin
= 1;
n:=length[s]; A :={1};j:
for i:= 2 to n do
if si >= fj then /* i is compatible with allactivitiesinA */
begin A:= A {i};j:= i end
35
end
Th t cGreedy-activity-selector
ng
ng là ho t i m k t thúc s m
c ch n b ith t c GREEDY-ACTIVITY-
ng v i th i
c x p l ch m t cách h p l . Ho t c
ng
l i c h i
Ho t
SELECTERth
nh t mà có th
ch ntheo c ách “thamlam ” theongh a nó s
c nhi u ho t
x p l ch cho ngkhác.
t em l i l igi i t i u.
c m t l igi ng tìm i t i u cho m tth hi n c a bài
36
Gi ithu tthamlam kh ông nh tthi
Tuy nhiênth t cGREEDY-ACTIVITY-SELECTOR
th
toán x p l ch các ho t ng.
i
si
fi
Hình 5.5 M tth í d
c a bài toán x p l ch
1
1
4
2
3
5
3
0
6
4
5
7
5
3
8
6
5
9
7
6
10
8
8
11
9
8
12
10 2
13
1112
14
37
Haith ànhph nch ính c agi
ithu tthamlam
có th áp d ng
Có hai tính ch t mà các bàito án ph i có
gi ithu tthamlam l à:(1) t ínhch t l a ch nthamlam v à
(2)ti u c utr úc t i u.
ithu tthamlam t ùythu c cth chi n b igi
i
trênxu ng,th chi n
L a ch n
vào nh ng l a ch n ã làm cho n bây gi , nh ng nó
nglaihay
không tùythu c vào b t k l a ch ntrong t
i c a nh ng bàito án con. Nh v y, m tgi
nh ng l igi
thu ttham lamti n hànhtheoki u t
m i lúc m t l a ch nthamlam.
Tính ch tti u c utr úc t i u(OptimalSubstructure)
i t i uchonh
38
M t bài tóan có tínhch tti u c utr úc t i u n u m t l i
gi i t i uch atrong n ó nh ng l igi
ng
bàito án con.
Gi ithu tthamlamso s ánh v iquyho ch
ng
ng và gi ithu ttham lam
S khác bi tgi a quiho ch
khi dùng gi i bàito án t i u là r t t nh .
Bàito án cái túi d ng 0-1
c nhnghi ã nh sau:
'‘M t k tr m tnh p vào m t c ahi u tìm th y n lo i món
ng và giá tr khácnhau (m ón hàng th i có giá
hàng có tr ng l
tr vi ô la và tr ng l
ng wi),nh ngch có m t cái túi v i s c
ng là M mang các món hàng. Bài toán cái túi
ch a v tr ng l
là tìm m t t h p các món hàng mà k tr m nênch n b vào cái
c m tgi á tr t i a v inh ng món hàng mà y l y
túi
t
i.”.
39
Bàito án này
c g i là bàito án cái túi d ng0-1 vì m i
món hàngth ì ho c là l y i ho c là b l i, k tr mkh ông
th l y ich m t ph n c a món hàng.
Bàito án cái túi d ngph ân s (Fractional
knapsackproblem)
t c ng nh v y,
Trong bàito án cái túi d ng phân s , tìnhti
nh k tr m có th l y i m tph n c a m t món hàng.
C hai bàito án u có tínhch t ti u c utr úc t i u.
i v i bàito án cái túi d ng0-1, x ét m t t h p n ng M ký
mà em l i giá tr c c
i. N uta l y món hàngth j rakh i
túi, nh ng món hàng còn l i c ng là t h p em l igi á tr l n
ng t i aM- w j mà k tr m có th l y
nh t ng v itr ng l
i t n-1 lo i m t hàngtr m t hàng th j.
ng h pkhita
i v i bàito án cái túi d ngph ân s , xéttr
i túi wj -w ký c a m t hàngth
40
j,nh ng món hàng
l yrakh
còn l i c ng là t h p em l igi á tr l nnh t ng v itr ng
ng M – (wj –w) mà k tr m có th l y i t n-1 lo i m t
l
hàngtr m t hàngth j.
Bàito án cái túi d ngph ân s (tt.)
Ta dùng gi i thu tthamlam cho bàito án cái túi d ngph ân
s và quiho ch ng cho bàito án cái túi d ng 1-0.
gi i bàito án cái túi d ng phân s ,tr
n v tr ng l cti ênta t ính h s
ng (vi/wi ) c a t ng m t
giá tr ti ntr ên m t
hàng.
u b ng cách l y càng nhi u càng t t m t
41
K tr m b t
hàng có h s vi/wi l n nh t.Khi lo i m t hàng này ã c n
c n ath ì y s càng
mà k tr m còn có th mangth êm
nhi u càng t t m t hàng có h s vi/wi l n nhì và c nh th
cho nkhi y kh ông còn có th mangth êm n a.
Hình 5.6
42
procedure GREEDY_KNAPSACK(V,W,M,X,n);
/*V,Warethearrayscontainthevaluesandweightsofnobjects
orderedsothat V i/Wi Vi+1/Wi+1.Mistheknapsackcapacityand Xis
solutionvector*/
var rc:real; i:integer;
begin
for i:= 1 to n do X[i]:=0;
rc :=M; //rc=remaining knapsack
capacity//
for i:= 1 to n do
begin i
thenexit;
if W[i]>rc
X[i]:= 1;rc:=rc – W[i] B quath i gian
s pth t các
món hàng,gi
thu t này có
ph c t p O(n).
end;
if i n then X[i]:=rc/W[i]
43
end
Mã Huffman
n v n
nàyli ênquan
nén file (file
c dùng
c nén d li u, ti tki m
Ch
compression). Các mã Huffman là k thu t
ph bi n và r t h uhi uchovi
t 20% n90% l à i n hình.
uti ên c avi c xây d ng mã Huffman là m
B c
t n s xu t hi n (frequency) c a m i ký t
trong t p tin
c mã hóa.
Gi s chúng ta có m t t p tin100000 k ý t mà chúng
tamu n l u tr
d ng nén.
44
a b
c
d e
f
5
45
13
12
16 9
T n s
Mã có chi u dài c
nh 000
001
010
011 100
101
i 0 101
100
111 1101
1100
Mã có chi u dàithay
t k m t mã nh phâncho k ý t
ó m i ký t d
c di n t
Chúng ta xét bài toánthi
(binarycharactercode)theo
b ng m ttr àng bit nh phân.
nh (3 bit)
N uch úng ta dùng m t mã có chi u dài c
di n t 6 ký t :
a =000,b=001, . .. , f=101
Thì c n t t c 300000bit
mã hóa toàn t p tin.
45
Mã có chi u dàithay
i
i (variable-length code) có th làm
M t mã có chi u dài thay
vi c t t h n m t mã có chi u dài c
nh, nó cho nh ng ký t
hayxu t hi n nh ng mã ng n và nh ng ký t hayxu t hi n
nh ng mã dài h n.
a= 0, b= 101, . . .f = 1100
Mã này òi h i:
(45. 1 + 13.3 + 12.3 +16.3+ 9.4+ 5.4).1000 = 224000bits
bi udi n t ptin,ti tki m c 25%.
46
Và y c ng chính là mã t i ucho t ptin n ày.
Mã phi-ti n t
(Prefix-code)
âytach xét nh ng cách mã hóa mà không có mã c a ký t
(prefix) c a mã c a m t ký t khác. Nh ng cách
c g i là mã phiti n t (prefix-free-code)
nào là ti n t
mã hóa nh v y
hay mã ti n t (prefix-code).
c r ng s néntin t i u cth chi n
Có th ch ngminh
b i m t cách mã hóa ký t và ó là mã phiti n t .
c a chu ng vì nó làm n gi n s mã hóa
Mã phiti n t
và gi i mã.
- S mã hóa là
t l i v inhauth ì s bi udi n ngi n;ta ch c n ghép k các mã c a các ký
c m i ký t trong t ptin.
47
- S gi i mã c n m t s bi udi nthu nti n cho mã phiti n t
sao cho ph n cnh t ra m t cách d dàng. u c a mã
Mã phiti n t và câynh phân
là m t câynh phân v i m i
Bi u di ncho m t mã phiti n t
nút lá t ng ng v i các ký t c cho.
i t nút r
Chúngtaph ân gi i m t mã nh phân cho m t ký t nh là
y, mà 0 ng v i “r
n nút lá c a ký t
m t l i
sang con bêntr ái” và 1 ngh a là “r sang con bên ph i”.
ng
y (fullbinarytree ). M t cây nh phân Mã t i u c a m t t ptinth
cây nh phân
cbi u di n b ng m t
y
hai là m t cây nh phân mà m i nútkh ôngph i lá có
con.
ó các ký t l yra,th ì câynh phân
t i u có úng|C| n út lá, m i nút lá cho
48
N u C là t p ký t mà t
cho mã phiti n t
m t ký t , và úng|C|-1 n út n i.
100
100
0
1
0
86
14
1
55
a:45
1
0
0
0
1
30
58
28
14
25
1
0
1
0
1
0
0
1
0
1
f:5
a:45 b:13
c:12
d:16
e:9
c:12
b:13
d:16
14
1
0
e:9
f:5
(a)
(b)
Hình5.7So s ánhhai c ách mã hóa
49
Mã phiti n t và câynh phân(tt.)
ng ng v i m t mã phiti n t , chúngta c ó
Cho m t câyT t
th tính t ng s bit c n mã hóa m t t ptin.
V i m i ký t c trong t p ký t C, dùng f(c)
ký hi u t n s
xu t hi n c a c trong t ptin v à dT(c) là chi u dài c a mã cho
ký t c.Th ì s bit òi h i mã hóa t ptin l à
B(T) = f(c)dT(c)
c C
50
Mà chúngta coi l à chi phí c a cây nh phânT.
C u t o mã Huffman
xu t m tgi ithu ttham lam c u t o m t
t i u c g i là mã Huffman (Huffman
Huffman ã
mã phiti n t
code).
ng ng v i mã t i u
u v i m t t p g m|C|
t o ra
Gi ithu t t o m t cây nh phân T t
i lên. Gi ithu t b t
theoki u t d
nút lá và th c hi n m t chu i g m|C| t ác v tr n
cây cu i cùng.
u tiên Q, l ytr khóatheo t n s f, c
i có
nh n di nhai i t ng có t n s nh nh t tr n
M t hàng
dùng
l i v i nhau.
i t ng là m t i t
51
K t qu c a vi ctr nhai
t n s là t ng t n s c a hai i t ng mà ã ng m i mà
ctr n.
(a)
(b)
f:5
e:9
c:12
b:13
d:16
a:45
c:12
b:13
d:16
a:45
14
0
f:5
1
e:9
(c)
(d)
d:16
a:45
a:45
14
25
25
30
0
0
f:5
1
e:9
0
c:12
1
b:13
0
c:12
1
b:13
1
d:16
14
0
f:5
1
e:9
(e)
(f)
a:45
55
100
0
1
0
1
30
25
a:45
55
0
0
1
0
c:12
1
b:13
1
d:16
14
30
25
0
0
f:5
1
e:9
0
c:12
1
b:13
1
d:16
14
Hình 5.8 Các b c c agi
ithu t t o mã Huffman
52
0
f:5
1
e:9
Gi ithu tHuffman
procedure HUFFMAN(C) ;
begin
n:=|C|;Q := C ;
for i:= 1 to n-1 do
begin
z: = ALLOCATE-NODE();
left[z]: =EXTRACT-MIN(Q);
right[z]: =EXTRACT-MIN(Q);
f[z]:=f[left[z]] +f[right[z]];
INSERT(Q,z);
end
53
end
ph c t p c agi
ithu tHuffman
Gi s Q
c hi n th c hóa b i m t heap nh phân.
c
Cho m t t pC g m n ký t ,vi c kh i t o c a Q
th c thi v i th igianO(n).
c th c thich ính xác g m|n|-1 l n, và vì
Vòng l p for
m i tác v làmvi c trên heap òi h iO(lgn), v òng l p
này óng gópchi ph í O(nlgn) vào th igian t ính toán.
i thu tHUFFMAN
Nh v y,th igian t ính toán c agi
trên t p n ký t
s là O(nlgn).
54
Gi ithu tquay lui
ng pháp t ng quát gi i quy t v n :thi
(trialand error ). t k
M t ph
gi ithu t tìm l i gi icho b ài tóankh ông ph i là bámtheo
c xác nh mà là b ng cách
m t t p qui lu t tính tóan
th và s asai
ng là phân rã quá trìnhth và s a
ngth ì nh ng công
quy m t cách c di n t
Khuôn m uth ôngth
saith ànhnh ng công tác b ph n.Th
theo l i
tác b ph n này
thu nti n và bao g m vi c th m dò m t s h u h nnh ng
công tác con.
55
Ta có th coito àn b quá trình này nh là m t quá trình tìm
ki m (search process) mà d n d n c u t o và duy t qua m t
cây các công táccon.
ng i c aconhi p s (TheKnight ’s
Bàito án
Tour Problem)
c di
c ttr ên bàn c t i
Cho m t bàn c n n v i n2 ô. M tcon hi p s –
chuy ntu ântheolu tch i c vua –
ô uti ên có t a x0, y0.
là tìm m t l csao cho ph toàn
trình g m n2 –1 b
c vi ng úng m t l n). V n
b bàn c (m i ô
thugi m bàito án ph n2 ô là xét bài toán,
Cách rõ ràng
ho c là
-th chi n b c i k ti p, hay
56
-ph át hi n r ngkh ôngki m c b c i h p l nào.
procedure trynextmove;
begin initializeselection ofmoves;
repeat
selectnextcandidatefrom list of nextmoves;
if acceptable then
begin
recordmove;
if board notfull then
begin
try nextmove;
(5.3.1)
if notsuccessful then erase previousrecording
end
end
until (move wassuccessful) (nomore candidates)
57
end
Cáchbi udi n d li u
Chúngtadi n t bàn c b ng m tmatr n h.
type index= 1..n ;
var h: array[index,index] of integer;
h[x, y] = 0:
h[x, y] = i: ô ch a h
ô ã c vi ng
cvi ng t i b cchuy nth i
(1 i n2)
i uki n “board notfull ” có th c di n t b ng “i <
n2”.
c a ô n. u, v: t a
i uki n “acceptable” có th c di n t b ng
58
(1 v n) (h[u,v]=0) (1 u n)
procedure try(i:integer; x,y :index; var q:boolean);
var u,v:integer; q1:boolean;
begin initializeselectionformoves;
repeat let u, v bethe coordinates ofthe nextmove ;
then (5.3.2)
if (1un) (1vn) (h[u,v]=0) then
begin h[u,v]:=i;
if i
try(i+1, u, v, q1); i f q1 then h[u,v]:=0
end
else q1:=true
end
until q1 (nomorecandidates);
q:=q1
59
end
c a ô hi n hành, c ó 8 kh n ng
3
2
4
1
5
8
6
7
60
Cho t a
ti p ch n ô k
c ánh s t 1 n 8 nh sau: i t i.Ch úng
S tinhch sau cùng
ngi n nh t t c t a u, v t x, y là b ng
saibi tto t ihai m ng a và b. Cách
cách c ng
Và k c dùng ánh s ngvi ên(candidate) k ti p.
61
program knightstour(output);
const n= 5; nsq= 25;
type index= 1..n
var i,j: index;q: boolean;
s: setof index;
a,b: array [1..8] of integer;
h: array [index,index] of integer;
procedure try(i:integer; x,y: index; var q:boolean);
var k,u,v : integer; q1: boolean;
begin k:=0;
repeat
k:=k+1;q1:=false; u:=x+a[k]; v:=y+b[k];
if (u in s) (v in s) then
if h[u,v]=0 then
begin
h[u,v]:=i;
if i< nsq then
begin
try(i+1, u,v,q1);
if q1 then h[u,v]:=0
end
else q1:=true
end
until q1 (k=8);
q:=q1
end {try};
62
begin
h[1,1]:=1;try(2,1,1,q);
if q then
for i:=1 to n do
begin
for j:=1 to n do
write(h[i,j]:5);
writeln
s:=[1,2,3,4,5];
a[1]:=2; b[1]:=1;
a[2]:=1; b[2]:= 2;
a[3]:= –1; b[3]:=2;
a[4]:= –2; b[4]:=1;
a[5]:= –2; b[5]:= –1;
a[6]:= –1; b[6]:= –2;
a[7]:=1; b[7]:= –2;
a[8]:=2; b[8]:= –1;
end
for i:=1 to n do
else writeln (‘NO
for j:=1 to n do h[i,j]:=0;
63
SOLUTION’)
end.
quy
ckh i
ng b ng l nh g i v i t a
kh i
u x0,
u.
Th t c
y0 , t
ó chuy n i b t
H[x0,y0]:=1; try(2, x 0, y0,q)
Hình5.3.1tr ình bày m t l igi
i
t
c v i v trí <1,1> v in=5.
1
6
15
10
21
14
9
20
5
16
19
2
7
22
11
8
13
24
17
4
25
18
3
12
23
64
T thí d trênta
i
n v i m tki u “gi iquy t v n
” m i:
c i m chính là
ng v l igi
i
c h
và ghi l ith ôngtin
y
c này mà sau ó nó có th b tháo g và xóa i
c này ã không d n
, t c là m t b
y
c i d n
n l i
n “tìnhth b
c g i là quay lui -
“b
v b
khiph áthi n r ng b
gi i
t c”(dead-end).(H ànhvi n ày
bactracking.)
65
ithu tquay lui
Khuôn m u t ngqu át c agi
procedure try;
begin intializeselection ofcandidates;
repeat
select next;
if acceptable then
begin
recordit;
if solutionincomplete then
begin
(5.3.3)
trynextstep;
if notsuccessful then cancelrecording
end
end
66
until successful nomore candidates
end
procedure try(i: integer);
var k : integer;
begin k:=0;
repeat
k:=k+1;select k-thcandidate;
if acceptable then
begin
N u t i m i
b
ng
c, s
viên ph ith là
nhth ì ki u
c
m utr ên có th
i nh :
bi n
record it;
if i
(5.3.4)
c g i
try(i+1);
if not successful then
cancelrecording
Th t c
b ng l nh g i
end
try(1).
end
until successful (k=m)
end
67
Bàito án8con h u
cC.F.Gausskh
o sát n m1850,
Bàito án này ã
nh ng ôngtakh ôngho ànto àngi
iquy t
c.
t vào bàn c saochokh ông có
c
“Támcon h u
con h u nào có th t n côngcon h u nào”.
có
c m tth
Dùngkhu ôn m u hình5.3.1,ta s
t csaucho b àito án8con h u:
68
procedure try (i:integer);
begin
initializeselectionofpositionsfori-thqueen;
repeat
makenextselection;
if safe then
begin
setqueen;
if i< 8 then
begin
try (i+1);
if notsuccessful then removequeen
end
end
until successful nomorepositions
end
69
Lu t c : M tcon h u có th t n công cáccon h ukh ác n mtr ên
ngch éotr ên bàn c .
cùng m t hàng, cùng m t c thay l à cùng
Cách bi udi n d li u
Làm cách nào di n t 8con h utr ên bàn c ?
var x: array[1..8] of integer;
a: array[1..8] ofBoolean;
b: array[b1..b2] ofBoolean;
c: array[c1..c2] ofBoolean;
v i
x[i]ch v trí c acon h utr ên c tth i;
a[j] chobi tkh ông có con h utr ên hàngth j;
b[k] cho bi tkh ông có con h utr ên ng chéo th k;
70
ng chéo c[k] cho bi tkh ông có con h utr ên th k.
c xác nh
c tính.
t t
ng chéo chi u
i +j, và
ng chépchi u
Vi cch ntr cho các m c b1, b2, c1, c2
b i cách mà các ch s c a các m ng b và c
Hãych ú ý r ngtr ên cùng m t
c các ô s có cùnggi á tr c a t nghai t a
trên cùng m t
các ô s có cùnggi á tr c ahi uhai t a
diagonal, t t c
(i – j ).
ctinh ch nh sau:
Nh v y,ph átbi u setqueen
x[i]:=j; a[j]:=false; b[i+j]:=false;c[i-j]:=false;
Phátbi u removequeen
c chiti
a[j]= true; b[i+j]=true ; c[i-j] := true
t hóa nh sau:
i uki n safe
cdi n t nh sau:
a[j] b[i+j] c[i-j]
71
begin
i : integer; q:boolean;
x[i]:=j;
a[j]:=false; b[i+j]:=false;
c[i-j]:=false;
if i<8 then
begin
try(i+1,q);
if q then
begin
a[j]:=true; b[i+j]:=true;
c[i-j]:=true
program eightqueeen1(output);
{findonesolution to eight queens
problem}
var
a : array [1..8] of boolean;
b : array [2..16] of boolean;
c : array [–7..7] of boolean;
x : array [1..8] of integer;
procedure try(i: integer; var q:
boolean);
var j: integer;
begin
end
j:=0;
repeat
end
else q:=true
end
j:=j+1; q:=false;
if a[j] b[i+j] c[i-j] then
until q (j=8)
end {try};
72
begin
for i:= 1 to 8 do a[i]:=true;
for i:= 2 to 16 do b[i]:=true;
for i:= –7 to 7 do c[i]:=true;
try(1,q);
if q then
for i:=1 to 8 do
write(x[i]:4);
writeln
end
73
c cho hình v sau: M t l i gi i c a bàito án 8 con h u
H
1
H
2
H
3
H
4
H
5
H
6
H
7
H
8
74
S m r ng: Tìm t t c các l
igi
i
i mà t t c
S m r ng là tìmkh ông ch m t l igi
nh ng l
i c a bàito án ã cho.
igi
ngph áp: M tkhi m t l igi
c tìmth y và
i
Ph
ghi l i,tati p t c xét ng viên k trongqu á trình ch n
ngvi ên m t cách có h th ng.
c d nxu t t
(5.3.4) và
Khuôn m u t ngqu át
ctr ình bàynh sau:
75
procedure try(i:integer);
var k: integer;
begin
for k:=1 to m do
begin
selectk-thcandidate;
if acceptable then
begin
recordit;
if i
end
end
76
end
n gi n hóa i uki n d ng
cthayth b ng phát
Trong gi ithu t m r ng,
c a quá trình ch n,ph át bi u repeat
bi u for
procedure try(i:integer);
var j: integer;
begin
for j:=1 to 8 do
if a[j] b[i+j] c[i-j] then
begin
program eightqueens(output);
var i: integer;
of boolean;
a: array [1..8]
b: array [2..16] of boolean;
c: array [–7..7] of boolean;
x: array [1..8]
of integer;
procedure print;
var k : integer;
begin
for k : 1 to 8 do write(x[k]:4);
writeln
end {print};
x[i]:=j;
a[j]:=false; b[i+j]:=false;
c[i-j]:=false;
if i< 8 then try(i+1) else print;
a[j]:=true; b[i+j]:= true;
c[i-j]:= true;
end
end {try};
77
begin
for i:= 1 to 8 do a[i]:=true;
for i:= 2 to 16 do b[i]:=true;
for i:= –7 to 7 do c[i]:=true;
try(1);
end.
t c 92 l igi
i
Gi ithu t m r ng có th s nsinh t
cho bàito án8 con h u.
ith t s khácbi
t
Nh ngth t rach có 12 l igi
nhau.
78
cli igi i ó
N
x4
x6
x2
x3
x7
x8
t kê trong b ngsau:
x5
M ihai l
x1
=========================================================
1
1
1
1
2
2
2
2
2
2
2
2
876
264
200
136
504
400
72
280
240
264
160
336
8
8
4
5
6
7
7
1
8
3
5
6
3
7
8
2
3
3
1
4
1
8
1
3
5
6
7
7
4
5
5
6
6
7
7
8
7
4
2
4
1
8
8
8
4
5
4
5
6
3
6
8
8
1
4
7
3
6
8
1
4
5
3
3
5
4
3
5
5
4
3
4
2
2
5
6
7
6
6
3
7
1
6
7
79
c tNch s l nth
Nh nggi á tr
bình c n 161 phép th trong 92 l igi tìm m t ô anto àn.Trung
i này.
Câykh ônggiantr ngth ái
ti n di n t gi ithu t quay lui,ta x ây d ng c utr úc cây
ghi nh ng l a ch n ã cth c hi n. C utr úc cây này
c g i là cây khônggiantr ng thái (statespacetree) hay
cây tìmki m (searchtree).
tr ngth ái uti ên tr ckhi qu á
Nút r c a cây di n t
trình tìmki m l igi
Các nút m c
i b t u.
uti êntrong c ây di n t nh ng l ach n
c làm ng v ith ành ph n uti ên c a l i gi i.
Các nút m cth haì trong cây di n t nh ng l ach n
i và các
c làm ng v ith ành ph nth hai c a l igi
80
m c k ti p t ng t nh th .
M t núttr ên cây KGTT
ng v i l i gi i b ph n mà s có th d n c g i là tri n v ng n u nó t
i n l igi ng
y
;tr ái l i, nó
Các nút lá di n t nh ngtr c g i là m t l i gi i không tri n v ng.
ng h p b t c (deadend) hay
nh ng l igi i y .
Thí d : Cho m t bàito án nh sau:
T p bi n:X, Y,Z.
Gántr t t p{1,2} v ào các bi nsao choth a mãn các ràng
bu c: X=Y, X Z,Y >Z.
i bàito án b ng m t gi ithu t quaylui.
Hãygi
Câykh ông giantr ngth ái c a bàito án này c cho hình
81
v sau:
X=1
X=2
Y=2
Y= 1
Y= 1
Y=2
Z=1
Z=2
Z=2
Z=1
l
igi
i
Hình5.9Th í d v câyKh ông GianTr ngTh ái
82
ph c t p c a gi
ithu tquay lui
ithu tquayluith
ng
Th igian t ínhto án c a cácgi
là hàm m (exponential).
nút con, và chi u dài c a l i
i l igi
i là N,th ì
N u m i núttr ên câykh ônggiantr ngth ái có trung
bình
s núttr ên cây s t l v i N.
ithu t
quy t
ng ng
Th igian t ínhto án c agi
v i s núttr ên câykh ônggiantr ngth ái nên có
ph c t p hàm m .
83
end
end
end
13
M tth í d : Tính tích xâu matr n
Vì ta nhngh am[i,j] ch cho i c nh sau: 30
35
15
5
10
20 Cho cácmatr n v i kíchth
35
A1
15
A2
5
A3
10
A4
A5
20
25
A6 c tính b ith t c 14 Hình5.1tr ình bày b ng m và s
MATRIX-CHAIN-ORDER v i n = 6. 15 0 2500 35.15.20 13000 2625 100 35.5.30 7125 4375 0 35.10.20 11375 m[2,2] m[3,5] p.p p
2 5
m[2,3] m[4,5] p p p
1 2 5
m[2,4] m[5m5] p p p
1 4 5 m[2,5]=min = 7125
k = 3for A 2..5 ngph áp qui ho ch ng là t o m t l igi i 16 B c 4 c a ph
t i u t nh ngth ôngtin ã tínhto án. xác nh cách t t nh t s[i,j] ghitr tính
i Ta dùng m ngs[1..n, 1..n]
tích xâumatr n. M i ph n t
of k saocho t
ó s m óng ngo c t i u tách ôi xâu AiAi+1… Aj thành
hai o n t i Ak và Ak+1. cchu imatr n A = Chotr
quy MATRIX-CHAIN-MULTIPLY sau
ch s i và j,th t c
ây tính tích xâumatr n Ai..j,.Th t ctr v k t qu qua
tham s AIJ. V i l nh g i ban u là 17 MATRIX-CHAIN-MULTIPLY(A,s, 1, n, A1N)
Th t c s tr v k tqu matr n tíchsau c ùng v i m ng
A1N. procedure MATRIX-CHAIN-MULTIPLY(A,s, i,j, AIJ);
begin if j> i then
begin MATRIX-CHAIN-MULTIPLY(A,s, i,s[i,j], X);
MATRIX-CHAIN-MULTIPLY(A,s,s[i, j]+1,j, Y);
MATRIX-MULTIPLY(X,Y, AIJ); end
else assignAi to AIJ; 18 end; có th áp d ngqui ho ch ng: Có haith ành ph nthen ch t mà m t bàito án t i u hóa ph i
có (1) ti u c utr úc t i u (optimalsubstructure) v à (2) các bàito áncon tr ùng l p (overlappingsubproblems) . Ti u c utr úc t i u M t bàito án có tínhch tti u c utr úc t i u n u l igi i t i
i t i u c anh ng bàito án uch atrong n ó nh ng l igi 19 con. ithu t quy g p l i cùng m t bàito án con Khi m tgi
nhi u l n,ta b o r ng bàito án t i u hóa có nh ng bàito án
contr ùng l p. Gi ithu t quy ho ch
trùng l p b ng cáchgi
gi i vàotrong m t b ng mà b ng này s ng l i d ng nh ng bài toáncon
i m i bàito án con m t l n, c t l i
cthamkh o nkhi c n. ithu t quy làmvi c t
ch ng làmvi c t trênxu ng trongkhi c ác
i lên, Cáchsau d 20 Cácgi
gi ithu tquyho
h u hi u h n . M t chu i con (subsequence) c a m t chu i(sequence) l à
i m t vài ph n t .
chu i ysaukhi b Thí d :Z = l à m tchu icon c a X = v i chu i ch s <2, 3, 5, 7>. Cho hai chu i X và Y,ta b oZ l à chu icon chung (common
subsequence) c a X và Y n uZ l à m t chu i con c a c hai
chu i X và Y. cchohai 21 Trong bàito ánchu iconchung d àinh t,ta
chu i X = Thí d : X= v à Y= l à LCS c a X and Y. nhngh a ti n t th i c a Chochu iX= nh lý 6.1 22 Cho X = tìm m tLCS c a X và Y,ta c ó th c n tìmLCS c a X và Yn-1 và LCS c a Xm-1 và Y. Nh ng m itrong hai b àito án
con này có nh ng bàito án “cháu” tìm Xm-1 và Yn-1. G i c[i,j] l à chi u dài c aLCS c a hai chu i Xi và Yj. N u
i = 0 hay j = 0,th ì LCS có chi u dài 0. Tính ch tti u c u
quysau:
trúc t i u c a bàito ánLCS cho ra c ôngth c 0 n u i=0 hayj= 0 c[i,j]=c[i-1,j-1]+1 n u i, j>0 v à xi = yj 23 (5.3) max(c[i,j-1],c[i-1,j]) n u i,j>0 v à xi yj 24 procedure LCS-LENGTH(X, Y)
begin for j:= 1 to n do c[0,j]:=0; “” end then m:=length[X];n:=length[Y];
for i:= 1 to m do c[i, 0]:=0;
for i:= 1 to m do
for j:= 1 to n do
if xi = yj then
begin c[i,j]:= c[i-1,j-1]+1; b[i,j]:=
else if c[i – 1,j]>= c[i,j-1]
begin c[i,j]:=c[i – 1,j]; b[i, j]:= “” end
else
begin c[i,j]:=c[i, j-1];b[i,j]:= “” end end; 25 âytr ình bày matr n c c ath í d . Hình5.2sau 0 0 0 0 0 0 0 B D C A B A yj 1 1 0 0 0 0 1 2 0 1 1 1 1 2 2 0 1 1 2 2 2 1 3 0 1 2 2 3 2 0 1 2 2 3 3 3 4 0 1 2 3 2 1 4 0 2 2 3 4 26 Th i gian tínhto án
c ath t cPRINT-
LCS là O(m+n), vì ít
nh t i hay j gi m m t
n v trong m i ch ng c a quy. 27 ng và giá tr khác nhau, nh ng y ch ng t i a là t m t giá tr cao nh t v i ng b ng cách Bàito án này có th gi i b ng qui ho ch
dùng hai b ng cost và best sau ây: c v i m t cost[i] ch a giá tr t i a mà có th th chi n
cái túi có s c ch a i cost[i]= cost[i – size[j]]+ val[j] c 28 best[i] ch a m t hàngcu i cùng b vào túinh m t
giá tr t i a. 29 Hình5.3 M tth í d c a bàito án cái túi for i:= 0 to M do cost[i]:= 0;
for j:= 1 to N do /* each ofitem type*/
begin for i:= 1 to M do /*imeans capacity*/ if i – size[j]>= 0 then if cost[i]<(cost[i – size[j]]+ val[j])then
begin cost[i]:= cost[i – size[j]]+ val[j]; best[i]:= j end; 30 end; 31 Ghi Chú: i c. c n u M không l n,
Bàito án cái túi có th d dànggi
nh ngkhiM l nth ì th igian ch ytr nên khôngth ch p
nh n ng pháp này khôngth làmvi c c khi M và tr ng Ph
l ng/kíchth c là nh ng s th cthay v ì s nguyên. ng gi i bàito án cái 32 Tính ch t5.1.1 Gi ithu t qui ho ch
túi có th igian ch y t l v iNM . ng i qua m t s b c v i m t
c. M t gi ithu ttham
ng ch n m tkh n ng mà xem nh t tnh t t i lúc Các gi ithu t t i u hóath
t p cáckh n ng l ach n t i m i b
lamth
ó. T c là,gi
v ng s d n ithu t ch n m tkh n ng t i u c c b v i hy
i t i uto àn c c. n m t l igi Vàith í d c a gi ithu ttham lam: -Gi ithu tPrim tính câybaotr ùm t ithi u -Gi ithu t Dijkstra gi i bài tóan nh ng l i ing n 33 nh t t m t nhngu n(single-sourceshortest paths
problem). c dùng b i m tho t òng, mà ch có th Gi s
ng mà
ta có m t t pS = {1, 2, …, n} g m n ho t
cùngmu n s d ng cùng m t tài nguyên,th í d nh m t
ng
gi ng
t i m t lúc. i m b t i m k t u si và m t th i c l ach n, ho t ng i di n ra ng i có th i
fi. N u ng i và j là t M i ho t
thúc fi, mà si
trongth i kho ng[s i, fi). Ho t
ng thích n u
th ikho ng[s i, fi) và [sj, fj)kh ông ph l p lên nhau (t c là, i
và j là t ngth ích n u si >= fj hay sj >= fi). ng t ngth ích v i nhau và có s ho t ng là ch n ra m tchu i các
ng nhi u 34 Bàito án x p l ch cácho t
ho t
nh t. gi i bàito án s r ng cácho t ngnh p vào ng,tagi
t t ng c ath i i m k tth úc: Trongth t c áp d ng gi ithu tthamlam
x p l ch các ho t
c s ptheoth
f2 … fn. /*sis f1
procedure GREED-ACTIVITY-SELECTOR(S,f) ;
thearraykeepingthesetofactivitiesandfisthearraykeeping
thefinishing times*/
begin = 1; n:=length[s]; A :={1};j:
for i:= 2 to n do if si >= fj then /* i is compatible with allactivitiesinA */
begin A:= A {i};j:= i end 35 end ng ng là ho t i m k t thúc s m c ch n b ith t c GREEDY-ACTIVITY-
ng v i th i
c x p l ch m t cách h p l . Ho t c ng
l i c h i Ho t
SELECTERth
nh t mà có th
ch ntheo c ách “thamlam ” theongh a nó s
c nhi u ho t
x p l ch cho ngkhác. t em l i l igi i t i u. c m t l igi ng tìm i t i u cho m tth hi n c a bài 36 Gi ithu tthamlam kh ông nh tthi
Tuy nhiênth t cGREEDY-ACTIVITY-SELECTOR
th
toán x p l ch các ho t ng. 37 có th áp d ng
Có hai tính ch t mà các bàito án ph i có
gi ithu tthamlam l à:(1) t ínhch t l a ch nthamlam v à
(2)ti u c utr úc t i u. ithu tthamlam t ùythu c cth chi n b igi i trênxu ng,th chi n L a ch n
vào nh ng l a ch n ã làm cho n bây gi , nh ng nó
nglaihay
không tùythu c vào b t k l a ch ntrong t
i c a nh ng bàito án con. Nh v y, m tgi
nh ng l igi
thu ttham lamti n hànhtheoki u t
m i lúc m t l a ch nthamlam. Tính ch tti u c utr úc t i u(OptimalSubstructure) i t i uchonh 38 M t bài tóan có tínhch tti u c utr úc t i u n u m t l i
gi i t i uch atrong n ó nh ng l igi
ng
bàito án con. ng và gi ithu ttham lam S khác bi tgi a quiho ch
khi dùng gi i bàito án t i u là r t t nh . 39 Bàito án này
c g i là bàito án cái túi d ng0-1 vì m i
món hàngth ì ho c là l y i ho c là b l i, k tr mkh ông
th l y ich m t ph n c a món hàng. t c ng nh v y, Trong bàito án cái túi d ng phân s , tìnhti
nh k tr m có th l y i m tph n c a m t món hàng. C hai bàito án u có tínhch t ti u c utr úc t i u. i v i bàito án cái túi d ng0-1, x ét m t t h p n ng M ký
mà em l i giá tr c c
i. N uta l y món hàngth j rakh i
túi, nh ng món hàng còn l i c ng là t h p em l igi á tr l n
ng t i aM- w j mà k tr m có th l y
nh t ng v itr ng l i t n-1 lo i m t hàngtr m t hàng th j. ng h pkhita i v i bàito án cái túi d ngph ân s , xéttr
i túi wj -w ký c a m t hàngth 40 j,nh ng món hàng
l yrakh
còn l i c ng là t h p em l igi á tr l nnh t ng v itr ng
ng M – (wj –w) mà k tr m có th l y i t n-1 lo i m t
l
hàngtr m t hàngth j. Ta dùng gi i thu tthamlam cho bàito án cái túi d ngph ân
s và quiho ch ng cho bàito án cái túi d ng 1-0. gi i bàito án cái túi d ng phân s ,tr n v tr ng l cti ênta t ính h s
ng (vi/wi ) c a t ng m t giá tr ti ntr ên m t
hàng. u b ng cách l y càng nhi u càng t t m t 41 K tr m b t
hàng có h s vi/wi l n nh t.Khi lo i m t hàng này ã c n
c n ath ì y s càng
mà k tr m còn có th mangth êm
nhi u càng t t m t hàng có h s vi/wi l n nhì và c nh th
cho nkhi y kh ông còn có th mangth êm n a. 42 /*V,Warethearrayscontainthevaluesandweightsofnobjects
orderedsothat V i/Wi Vi+1/Wi+1.Mistheknapsackcapacityand Xis
solutionvector*/ var rc:real; i:integer;
begin for i:= 1 to n do X[i]:=0;
rc :=M; //rc=remaining knapsack capacity// for i:= 1 to n do
begin i thenexit; if W[i]>rc
X[i]:= 1;rc:=rc – W[i] B quath i gian
s pth t các
món hàng,gi
thu t này có
ph c t p O(n). end;
if i n then X[i]:=rc/W[i] 43 end 44 45 i (variable-length code) có th làm M t mã có chi u dài thay
vi c t t h n m t mã có chi u dài c
nh, nó cho nh ng ký t
hayxu t hi n nh ng mã ng n và nh ng ký t hayxu t hi n
nh ng mã dài h n. a= 0, b= 101, . . .f = 1100 Mã này òi h i: (45. 1 + 13.3 + 12.3 +16.3+ 9.4+ 5.4).1000 = 224000bits bi udi n t ptin,ti tki m c 25%. 46 Và y c ng chính là mã t i ucho t ptin n ày. âytach xét nh ng cách mã hóa mà không có mã c a ký t
(prefix) c a mã c a m t ký t khác. Nh ng cách c g i là mã phiti n t (prefix-free-code) nào là ti n t
mã hóa nh v y
hay mã ti n t (prefix-code). c r ng s néntin t i u cth chi n Có th ch ngminh
b i m t cách mã hóa ký t và ó là mã phiti n t . c a chu ng vì nó làm n gi n s mã hóa Mã phiti n t
và gi i mã. - S mã hóa là
t l i v inhauth ì s bi udi n ngi n;ta ch c n ghép k các mã c a các ký
c m i ký t trong t ptin. 47 - S gi i mã c n m t s bi udi nthu nti n cho mã phiti n t
sao cho ph n cnh t ra m t cách d dàng. u c a mã là m t câynh phân v i m i Bi u di ncho m t mã phiti n t
nút lá t ng ng v i các ký t c cho. i t nút r Chúngtaph ân gi i m t mã nh phân cho m t ký t nh là
y, mà 0 ng v i “r
n nút lá c a ký t
m t l i
sang con bêntr ái” và 1 ngh a là “r sang con bên ph i”. ng y (fullbinarytree ). M t cây nh phân Mã t i u c a m t t ptinth
cây nh phân cbi u di n b ng m t
y
hai là m t cây nh phân mà m i nútkh ôngph i lá có con. ó các ký t l yra,th ì câynh phân t i u có úng|C| n út lá, m i nút lá cho 48 N u C là t p ký t mà t
cho mã phiti n t
m t ký t , và úng|C|-1 n út n i. 100 100 0 1 0 86 14 1
55 a:45 1 0 0 0 1 30 58 28 14 25 1 0 1 0 1 0 0 1 0 1 f:5 a:45 b:13 c:12 d:16 e:9 c:12 b:13 d:16 14 1 0 e:9 f:5 (a) (b) 49 ng ng v i m t mã phiti n t , chúngta c ó Cho m t câyT t
th tính t ng s bit c n mã hóa m t t ptin. V i m i ký t c trong t p ký t C, dùng f(c)
ký hi u t n s
xu t hi n c a c trong t ptin v à dT(c) là chi u dài c a mã cho
ký t c.Th ì s bit òi h i mã hóa t ptin l à B(T) = f(c)dT(c) 50 Mà chúngta coi l à chi phí c a cây nh phânT. xu t m tgi ithu ttham lam c u t o m t t i u c g i là mã Huffman (Huffman Huffman ã
mã phiti n t
code). ng ng v i mã t i u
u v i m t t p g m|C| t o ra Gi ithu t t o m t cây nh phân T t
i lên. Gi ithu t b t
theoki u t d
nút lá và th c hi n m t chu i g m|C| t ác v tr n
cây cu i cùng. u tiên Q, l ytr khóatheo t n s f, c i có
nh n di nhai i t ng có t n s nh nh t tr n M t hàng
dùng
l i v i nhau. i t ng là m t i t 51 K t qu c a vi ctr nhai
t n s là t ng t n s c a hai i t ng mà ã ng m i mà
ctr n. (a) (b) f:5 e:9 c:12 b:13 d:16 a:45 c:12 b:13 d:16 a:45 14 0
f:5 1
e:9 (c) (d) d:16 a:45 a:45 14 25 25 30 0 0
f:5 1
e:9 0
c:12 1
b:13 0
c:12 1
b:13 1
d:16 14 0
f:5 1
e:9 (e) (f) a:45 55 100 0 1 0 1 30 25 a:45 55 0 0 1 0
c:12 1
b:13 1
d:16 14 30 25 0 0
f:5 1
e:9 0
c:12 1
b:13 1
d:16 14 52 0
f:5 1
e:9 procedure HUFFMAN(C) ;
begin n:=|C|;Q := C ;
for i:= 1 to n-1 do
begin z: = ALLOCATE-NODE();
left[z]: =EXTRACT-MIN(Q);
right[z]: =EXTRACT-MIN(Q);
f[z]:=f[left[z]] +f[right[z]];
INSERT(Q,z); end 53 end 54 ng pháp t ng quát gi i quy t v n :thi (trialand error ). t k
M t ph
gi ithu t tìm l i gi icho b ài tóankh ông ph i là bámtheo
c xác nh mà là b ng cách
m t t p qui lu t tính tóan
th và s asai ng là phân rã quá trìnhth và s a
ngth ì nh ng công
quy m t cách c di n t Khuôn m uth ôngth
saith ànhnh ng công tác b ph n.Th
theo l i
tác b ph n này
thu nti n và bao g m vi c th m dò m t s h u h nnh ng
công tác con. 55 Ta có th coito àn b quá trình này nh là m t quá trình tìm
ki m (search process) mà d n d n c u t o và duy t qua m t
cây các công táccon. c di c ttr ên bàn c t i Cho m t bàn c n n v i n2 ô. M tcon hi p s –
chuy ntu ântheolu tch i c vua –
ô uti ên có t a x0, y0. là tìm m t l csao cho ph toàn trình g m n2 –1 b
c vi ng úng m t l n). V n
b bàn c (m i ô thugi m bàito án ph n2 ô là xét bài toán, Cách rõ ràng
ho c là -th chi n b c i k ti p, hay 56 -ph át hi n r ngkh ôngki m c b c i h p l nào. procedure trynextmove;
begin initializeselection ofmoves; repeat selectnextcandidatefrom list of nextmoves;
if acceptable then begin recordmove;
if board notfull then begin try nextmove; (5.3.1)
if notsuccessful then erase previousrecording
end end until (move wassuccessful) (nomore candidates) 57 end Chúngtadi n t bàn c b ng m tmatr n h. type index= 1..n ;
var h: array[index,index] of integer;
h[x, y] = 0:
h[x, y] = i: ô (1 i n2) i uki n “board notfull ” có th c di n t b ng “i < n2”. c a ô n. u, v: t a i uki n “acceptable” có th c di n t b ng 58 (1 v n) (h[u,v]=0) (1 u n) procedure try(i:integer; x,y :index; var q:boolean);
var u,v:integer; q1:boolean;
begin initializeselectionformoves; repeat let u, v bethe coordinates ofthe nextmove ; then (5.3.2) if (1un) (1vn) (h[u,v]=0) then
begin h[u,v]:=i;
if i try(i+1, u, v, q1); i f q1 then h[u,v]:=0 end
else q1:=true end until q1 (nomorecandidates);
q:=q1 59 end c a ô hi n hành 3 2 4 1 5 8 6 7 60 Cho t a
ti p ch n ô k
c ánh s t 1 n 8 nh sau: i t i.Ch úng ngi n nh t t c t a u, v t x, y là b ng saibi tto t ihai m ng a và b. Cách
cách c ng Và k c dùng ánh s ngvi ên(candidate) k ti p. 61 program knightstour(output);
const n= 5; nsq= 25;
type index= 1..n
var i,j: index;q: boolean;
s: setof index;
a,b: array [1..8] of integer;
h: array [index,index] of integer; 62 begin h[1,1]:=1;try(2,1,1,q);
if q then for i:=1 to n do
begin for j:=1 to n do write(h[i,j]:5); writeln s:=[1,2,3,4,5];
a[1]:=2; b[1]:=1;
a[2]:=1; b[2]:= 2;
a[3]:= –1; b[3]:=2;
a[4]:= –2; b[4]:=1;
a[5]:= –2; b[5]:= –1;
a[6]:= –1; b[6]:= –2;
a[7]:=1; b[7]:= –2;
a[8]:=2; b[8]:= –1; end for i:=1 to n do else writeln (‘NO for j:=1 to n do h[i,j]:=0; 63 SOLUTION’)
end. 1 6 15 10 21 14 9 20 5 16 19 2 7 22 11 8 13 24 17 4 25 18 3 12 23 64 65 procedure try;
begin intializeselection ofcandidates;
repeat select next; if acceptable then
begin recordit;
if solutionincomplete then
begin (5.3.3) trynextstep;
if notsuccessful then cancelrecording end end 66 until successful nomore candidates
end N u t i m i
b
ng
c, s
viên ph ith là
nhth ì ki u
c
m utr ên có th
i nh :
bi n (5.3.4) c g i cancelrecording Th t c
b ng l nh g i try(1). 67 68 69 Cách bi udi n d li u Làm cách nào di n t 8con h utr ên bàn c ? v i x[i]ch v trí c acon h utr ên c tth i; a[j] chobi tkh ông có con h utr ên hàngth j; b[k] cho bi tkh ông có con h utr ên ng chéo th k; 70 ng chéo c[k] cho bi tkh ông có con h utr ên th k. x[i]:=j; a[j]:=false; b[i+j]:=false;c[i-j]:=false; a[j]= true; b[i+j]=true ; c[i-j] := true t hóa nh sau: i uki n safe a[j] b[i+j] c[i-j] 71 i : integer; q:boolean; a[j]:=true; b[i+j]:=true;
c[i-j]:=true 72 begin for i:= 1 to 8 do a[i]:=true;
for i:= 2 to 16 do b[i]:=true;
for i:= –7 to 7 do c[i]:=true;
try(1,q);
if q then
for i:=1 to 8 do write(x[i]:4); writeln end 73 c cho hình v sau: M t l i gi i c a bàito án 8 con h u H H H H H H H H 74 (5.3.4) và 75 procedure try(i:integer);
var k: integer;
begin for k:=1 to m do
begin selectk-thcandidate;
if acceptable then
begin recordit;
if i end end 76 end n gi n hóa i uki n d ng
cthayth b ng phát Trong gi ithu t m r ng,
c a quá trình ch n,ph át bi u repeat
bi u for 77 begin for i:= 1 to 8 do a[i]:=true;
for i:= 2 to 16 do b[i]:=true;
for i:= –7 to 7 do c[i]:=true;
try(1); end. 78 cli igi i ó t kê trong b ngsau:
x5 M ihai l
x1
=========================================================
1
1
1
1
2
2
2
2
2
2
2
2 79 c tNch s l nth
Nh nggi á tr
bình c n 161 phép th trong 92 l igi tìm m t ô anto àn.Trung
i này. ti n di n t gi ithu t quay lui,ta x ây d ng c utr úc cây ghi nh ng l a ch n ã cth c hi n. C utr úc cây này c g i là cây khônggiantr ng thái (statespacetree) hay cây tìmki m (searchtree). tr ngth ái uti ên tr ckhi qu á Các nút m c i b t u. uti êntrong c ây di n t nh ng l ach n c làm ng v ith ành ph n uti ên c a l i gi i. c làm ng v ith ành ph nth hai c a l igi 80 m c k ti p t ng t nh th . M t núttr ên cây KGTT ng v i l i gi i b ph n mà s có th d n c g i là tri n v ng n u nó t
i n l igi ng
y ;tr ái l i, nó Các nút lá di n t nh ngtr c g i là m t l i gi i không tri n v ng.
ng h p b t c (deadend) hay nh ng l igi i y . Thí d : Cho m t bàito án nh sau:
T p bi n:X, Y,Z.
Gántr t t p{1,2} v ào các bi nsao choth a mãn các ràng bu c: X=Y, X Z,Y >Z. i bàito án b ng m t gi ithu t quaylui. Hãygi
Câykh ông giantr ngth ái c a bàito án này c cho hình 81 v sau: 82 83M tth í d v tính tích xâu matr ân(tt.)
M ng m
i
1
2
3
5
4
6
0
2500 1000
0
750
0
6 15125 10500 51375 3500 5000
5 11875 7125
0
9357 4375
7875 2625
0
15750
0
j 4
3
2
1
M ng s
Hình 5.1
5
5
4
5
4
i
3
3
3
3
2
3
3
3
2
1
3
3
3
1
1
6
5
j 4
3
2
M tth í d v tính tích xâu matr ân(tt.)
B c4: T o m t l
igi
i t i u
Tính l
igi
i
Cácth ànhph n c aquyho ch
ng
Nh ng bàito áncontr ùng l p
Thí d 2: Bàito ánchu iconchung d àinh t
Ti u c utr úc t i u c a bàito ánchu icon
chung dàinh t
L igi
i
quy
Tínhchi u dài c a m tLCS
ng trình (5.3),ta c ó th vi t m tgi
D a vàoph
quy
i thu t
tìmchi u dài c a m tLCS c a haichu i.Tuy
ch
ng
tính l
igi
i
nhiên,ch úng ta dùngquiho
d
theo cách t
i lên.
u vào.
ngi n hóavi c t o
i t i u.
igi
Th t cLCS-LENGTH c ó haichu i X=
xi
A
B
Hình 5.2
C
B
D
A
B
T ochu iconchung d àinh t
B ng b có th
c dùng
t o m tLCS c a
X=
quysau
âyinra m tLCS c aX v à Y. L nh g i
uti ên là
Th tuc
PRINT-LCS(b,X, n, m).
procedure PRINT-LCS(b,X,i,j)
begin
if i<> 0 and j<> 0 then
if b[i,j]='' '' then
begin PRINT-LCS(b,X,i-1,j-l ) ;
print xi
end
elseif b[i,j]='' '' then
PRINT-LCS (b,X,i-1,j)
else PRINT-LCS(b,X,i,j-1)
end;
Thí d 3. Bàito án cái túi(Knapsack)
'‘M t k tr m t nh p vào m t c a hi u tìmth y có n m t
hàng có tr ng l
mangtheo m t cái túi có s cch a v tr ng l
M. Bàito án cái túi là tìm m t t h p các m t hàng mà k
tr m nên b vào cái túi
nh ng món hàng mà y mang i.”
M tth í d c a bàito án cái túi
value 4
5
10
11
13
name A
B
C
D
E
Gi ithu tquyho ch
ngcho b àito án cái túi
M tth hi n c a cái túi
6 7 8 9
10 111213 1415 16 17
8 8 8 12
12 12 1616 1620 20 20
A A A A A A A A A A A A A A A
8 9 10 12 13 14
A B B A B B A B B A
16 17 18 2021 22
B B A B B
8 1010 12 14 15
16 18 18
2022 24
A B B A C B A C C A C C A C C
8 1011 12 14 15
16 18 20
2122 24
A B B A C D A C C A C C D C C
8 1011 13 14 15
17 18 20
K 1 2 3 4 5
j=1
cost[k] 0 0 4 4 4
best[k]
j=2
cost[k] 0 0 4 5 5
best[k]
j=3
cost[k] 0 0 4 5 5
best[k]
j=4
cost[k] 0 0 4 5 5
best[k]
j=5
cost[k] 0 0 4 5 5
best[k]
2123 24
A B B A C D E C C E C C D E C
Hình 5.4 Các m ng cost và best c a m tth í d bàito án cái túi
Gi ithu tthamlam
ng(Activity-
Bàito án x p l chcho c ácho t
Selection Problem)
Gi ithu tthamlamcho b àito án x p l ch các
ho t
ng
Th t cGreedy-activity-selector
i
si
fi
Hình 5.5 M tth í d
c a bài toán x p l ch
1
1
4
2
3
5
3
0
6
4
5
7
5
3
8
6
5
9
7
6
10
8
8
11
9
8
12
10 2
13
1112
14
Haith ànhph nch ính c agi
ithu tthamlam
Gi ithu tthamlamso s ánh v iquyho ch
ng
Bàito án cái túi d ng 0-1
c nhnghi ã nh sau:
'‘M t k tr m tnh p vào m t c ahi u tìm th y n lo i món
ng và giá tr khácnhau (m ón hàng th i có giá
hàng có tr ng l
tr vi ô la và tr ng l
ng wi),nh ngch có m t cái túi v i s c
ng là M mang các món hàng. Bài toán cái túi
ch a v tr ng l
là tìm m t t h p các món hàng mà k tr m nênch n b vào cái
c m tgi á tr t i a v inh ng món hàng mà y l y
túi
t
i.”.
Bàito án cái túi d ngph ân s (Fractional
knapsackproblem)
Bàito án cái túi d ngph ân s (tt.)
Hình 5.6
procedure GREEDY_KNAPSACK(V,W,M,X,n);
Mã Huffman
n v n
nàyli ênquan
nén file (file
c dùng
c nén d li u, ti tki m
Ch
compression). Các mã Huffman là k thu t
ph bi n và r t h uhi uchovi
t 20% n90% l à i n hình.
uti ên c avi c xây d ng mã Huffman là m
B c
t n s xu t hi n (frequency) c a m i ký t
trong t p tin
c mã hóa.
Gi s chúng ta có m t t p tin100000 k ý t mà chúng
tamu n l u tr
d ng nén.
a b
c
d e
f
5
45
13
12
16 9
T n s
Mã có chi u dài c
nh 000
001
010
011 100
101
i 0 101
100
111 1101
1100
Mã có chi u dàithay
t k m t mã nh phâncho k ý t
ó m i ký t d
c di n t
Chúng ta xét bài toánthi
(binarycharactercode)theo
b ng m ttr àng bit nh phân.
nh (3 bit)
N uch úng ta dùng m t mã có chi u dài c
di n t 6 ký t :
a =000,b=001, . .. , f=101
Thì c n t t c 300000bit
mã hóa toàn t p tin.
Mã có chi u dàithay
i
Mã phi-ti n t
(Prefix-code)
Mã phiti n t và câynh phân
Hình5.7So s ánhhai c ách mã hóa
Mã phiti n t và câynh phân(tt.)
c C
C u t o mã Huffman
Hình 5.8 Các b c c agi
ithu t t o mã Huffman
Gi ithu tHuffman
ph c t p c agi
ithu tHuffman
Gi s Q
c hi n th c hóa b i m t heap nh phân.
c
Cho m t t pC g m n ký t ,vi c kh i t o c a Q
th c thi v i th igianO(n).
c th c thich ính xác g m|n|-1 l n, và vì
Vòng l p for
m i tác v làmvi c trên heap òi h iO(lgn), v òng l p
này óng gópchi ph í O(nlgn) vào th igian t ính toán.
i thu tHUFFMAN
Nh v y,th igian t ính toán c agi
trên t p n ký t
s là O(nlgn).
Gi ithu tquay lui
ng i c aconhi p s (TheKnight ’s
Bàito án
Tour Problem)
Cáchbi udi n d li u
S tinhch sau cùng
procedure try(i:integer; x,y: index; var q:boolean);
var k,u,v : integer; q1: boolean;
begin k:=0;
repeat
k:=k+1;q1:=false; u:=x+a[k]; v:=y+b[k];
if (u in s) (v in s) then
if h[u,v]=0 then
begin
h[u,v]:=i;
if i< nsq then
begin
try(i+1, u,v,q1);
if q1 then h[u,v]:=0
end
else q1:=true
end
until q1 (k=8);
q:=q1
end {try};
quy
ckh i
ng b ng l nh g i v i t a
kh i
u x0,
u.
Th t c
y0 , t
ó chuy n i b t
H[x0,y0]:=1; try(2, x 0, y0,q)
Hình5.3.1tr ình bày m t l igi
i
t
c v i v trí <1,1> v in=5.
T thí d trênta
i
n v i m tki u “gi iquy t v n
” m i:
c i m chính là
ng v l igi
i
c h
và ghi l ith ôngtin
y
c này mà sau ó nó có th b tháo g và xóa i
c này ã không d n
, t c là m t b
y
c i d n
n l i
n “tìnhth b
c g i là quay lui -
“b
v b
khiph áthi n r ng b
gi i
t c”(dead-end).(H ànhvi n ày
bactracking.)
ithu tquay lui
Khuôn m u t ngqu át c agi
procedure try(i: integer);
var k : integer;
begin k:=0;
repeat
k:=k+1;select k-thcandidate;
if acceptable then
begin
record it;
if i
try(i+1);
if not successful then
end
end
until successful (k=m)
end
Bàito án8con h u
cC.F.Gausskh
o sát n m1850,
Bàito án này ã
nh ng ôngtakh ôngho ànto àngi
iquy t
c.
t vào bàn c saochokh ông có
c
“Támcon h u
con h u nào có th t n côngcon h u nào”.
có
c m tth
Dùngkhu ôn m u hình5.3.1,ta s
t csaucho b àito án8con h u:
procedure try (i:integer);
begin
initializeselectionofpositionsfori-thqueen;
repeat
makenextselection;
if safe then
begin
setqueen;
if i< 8 then
begin
try (i+1);
if notsuccessful then removequeen
end
end
until successful nomorepositions
end
Lu t c : M tcon h u có th t n công cáccon h ukh ác n mtr ên
ngch éotr ên bàn c .
cùng m t hàng, cùng m t c thay l à cùng
var x: array[1..8] of integer;
a: array[1..8] ofBoolean;
b: array[b1..b2] ofBoolean;
c: array[c1..c2] ofBoolean;
c xác nh
c tính.
t t
ng chéo chi u
i +j, và
ng chépchi u
Vi cch ntr cho các m c b1, b2, c1, c2
b i cách mà các ch s c a các m ng b và c
Hãych ú ý r ngtr ên cùng m t
c các ô s có cùnggi á tr c a t nghai t a
trên cùng m t
các ô s có cùnggi á tr c ahi uhai t a
diagonal, t t c
(i – j ).
ctinh ch nh sau:
Nh v y,ph átbi u setqueen
Phátbi u removequeen
c chiti
cdi n t nh sau:
begin
x[i]:=j;
a[j]:=false; b[i+j]:=false;
c[i-j]:=false;
if i<8 then
begin
try(i+1,q);
if q then
begin
program eightqueeen1(output);
{findonesolution to eight queens
problem}
var
a : array [1..8] of boolean;
b : array [2..16] of boolean;
c : array [–7..7] of boolean;
x : array [1..8] of integer;
procedure try(i: integer; var q:
boolean);
var j: integer;
begin
end
j:=0;
repeat
end
else q:=true
end
j:=j+1; q:=false;
if a[j] b[i+j] c[i-j] then
until q (j=8)
end {try};
1
2
3
4
5
6
7
8
S m r ng: Tìm t t c các l
igi
i
i mà t t c
S m r ng là tìmkh ông ch m t l igi
nh ng l
i c a bàito án ã cho.
igi
ngph áp: M tkhi m t l igi
c tìmth y và
i
Ph
ghi l i,tati p t c xét ng viên k trongqu á trình ch n
ngvi ên m t cách có h th ng.
c d nxu t t
Khuôn m u t ngqu át
ctr ình bàynh sau:
procedure try(i:integer);
var j: integer;
begin
for j:=1 to 8 do
if a[j] b[i+j] c[i-j] then
begin
program eightqueens(output);
var i: integer;
of boolean;
a: array [1..8]
b: array [2..16] of boolean;
c: array [–7..7] of boolean;
x: array [1..8]
of integer;
procedure print;
var k : integer;
begin
for k : 1 to 8 do write(x[k]:4);
writeln
end {print};
x[i]:=j;
a[j]:=false; b[i+j]:=false;
c[i-j]:=false;
if i< 8 then try(i+1) else print;
a[j]:=true; b[i+j]:= true;
c[i-j]:= true;
end
end {try};
t c 92 l igi
i
Gi ithu t m r ng có th s nsinh t
cho bàito án8 con h u.
ith t s khácbi
t
Nh ngth t rach có 12 l igi
nhau.
N
x4
x6
x2
x3
x7
x8
876
264
200
136
504
400
72
280
240
264
160
336
8
8
4
5
6
7
7
1
8
3
5
6
3
7
8
2
3
3
1
4
1
8
1
3
5
6
7
7
4
5
5
6
6
7
7
8
7
4
2
4
1
8
8
8
4
5
4
5
6
3
6
8
8
1
4
7
3
6
8
1
4
5
3
3
5
4
3
5
5
4
3
4
2
2
5
6
7
6
6
3
7
1
6
7
Câykh ônggiantr ngth ái
Nút r c a cây di n t
trình tìmki m l igi
Các nút m cth haì trong cây di n t nh ng l ach n
i và các
X=1
X=2
Y=2
Y= 1
Y= 1
Y=2
Z=1
Z=2
Z=2
Z=1
l
igi
i
Hình5.9Th í d v câyKh ông GianTr ngTh ái
ph c t p c a gi
ithu tquay lui
ithu tquayluith
ng
Th igian t ínhto án c a cácgi
là hàm m (exponential).
nút con, và chi u dài c a l i
i l igi
i là N,th ì
N u m i núttr ên câykh ônggiantr ngth ái có trung
bình
s núttr ên cây s t l v i N.
ithu t
quy t
ng ng
Th igian t ínhto án c agi
v i s núttr ên câykh ônggiantr ngth ái nên có
ph c t p hàm m .