Professional Documents
Culture Documents
Giai Thuat Va Lap Trinh PDF
Giai Thuat Va Lap Trinh PDF
Bi ging chuyn
Albert Einstein
i
MC LC
6. CY (TREE).................................................................................................................................. 70
6.1. NH NGHA............................................................................................................................................70
6.2. CY NH PHN (BINARY TREE) .........................................................................................................71
6.3. BIU DIN CY NH PHN ..................................................................................................................73
6.4. PHP DUYT CY NH PHN ..............................................................................................................74
6.5. CY K_PHN ..........................................................................................................................................76
6.6. CY TNG QUT...................................................................................................................................77
8. SP XP (SORTING) .................................................................................................................. 87
8.1. BI TON SP XP................................................................................................................................87
8.2. THUT TON SP XP KIU CHN (SELECTIONSORT) ...............................................................89
8.3. THUT TON SP XP NI BT (BUBBLESORT)...........................................................................90
8.4. THUT TON SP XP KIU CHN...................................................................................................90
8.5. SHELLSORT.............................................................................................................................................92
8.6. THUT TON SP XP KIU PHN ON (QUICKSORT) ............................................................93
8.7. THUT TON SP XP KIU VUN NG (HEAPSORT) ................................................................99
8.8. SP XP BNG PHP M PHN PHI (DISTRIBUTION COUNTING)......................................102
8.9. TNH N NH CA THUT TON SP XP (STABILITY) .........................................................103
8.10. THUT TON SP XP BNG C S (RADIX SORT) .................................................................104
8.11. THUT TON SP XP TRN (MERGESORT)..............................................................................109
8.12. CI T ...............................................................................................................................................112
8.13. NH GI, NHN XT......................................................................................................................119
HNH V
Hnh 77: Mng vi cc kh nng thng qua (1 pht, 6 thu) v mt lung ca n vi gi tr 7............................257
Hnh 78: Mng G v mng thng d Gf tng ng (k hiu f[u,v]:c[u,v] ch lung f[u, v] v kh nng thng qua
c[u, v] trn cung (u, v)) ..............................................................................................................................261
Hnh 79: Mng thng d v ng tng lung ....................................................................................................262
Hnh 80: Lung trn mng G trc v sau khi tng.............................................................................................262
Hnh 81: Mng gi ca mng c nhiu im pht v nhiu im thu..................................................................273
Hnh 82: Thay mt nh u bng hai nh uin, uout .................................................................................................274
Hnh 83: Mng gi ca mng c kh nng thng qua ca cc cung b chn hai pha ..........................................274
Hnh 84: th hai pha ......................................................................................................................................280
Hnh 85: th hai pha v b ghp M ...............................................................................................................281
Hnh 86: M hnh lung ca bi ton tm b ghp cc i trn th hai pha...................................................285
Hnh 87: Php xoay trng s cnh .......................................................................................................................289
Hnh 88: Thut ton Hungari ...............................................................................................................................292
Hnh 89: Cy pha "mc" ln hn sau mi ln xoay trng s cnh v tm ng ................................................299
Hnh 90: th G v mt b ghp M ..................................................................................................................304
Hnh 91: Php chp Blossom...............................................................................................................................306
Hnh 92: N Blossom d ng xuyn qua Blossom .....................................................................................306
ix
CHNG TRNH
Pk n!
n
S chnh hp khng lp chp k ca n phn t (= )
(n k)!
O ( .) K php ch O ln
( .) K php ln
( .) K php ln
o ( .) K php ch o nh
( .) k php nh
ab ab
a b ...a
a
a{
b copies of a
lg x Logarithm nh phn (c s 2) ca x
ln x Logarithm t nhin (c s e) ca x
lg* x log*2 x
ln* x log*e x
PHN 1. BI TON LIT K
1.1. CHNH HP LP
Mi nh x f: X S. Cho tng ng vi mi i X, mt v ch mt phn t f(i) S.
c gi l mt chnh hp lp chp k ca S.
Nhng do X l tp hu hn (k phn t) nn nh x f c th xc nh qua bng cc gi tr f(1),
f(2), , f(k).
V d: S = {A, B, C, D, E, F}; k = 3. Mt nh x f c th cho nh sau:
i 1 2 3
f(i) E C E
f(i) C A E
S chnh hp khng lp chp k ca tp gm n phn t l:
n!
n Pk = n(n 1)(n 2)...(n k + 1) =
(n k)!
1.3. HON V
Khi k = n. Mt chnh hp khng lp chp n ca S c gi l mt hon v cc phn t ca S.
V d: mt hon v: A, D, C, E, B, F ca S = {A, B, C, D, E, F}
i 1 2 3 4 5 6
f(i) A D C E B F
HSPHN 1999-2004
Bi ton lit k 3
1.4. T HP
Mt tp con gm k phn t ca S c gi l mt t hp chp k ca S.
Ly mt tp con k phn t ca S, xt tt c k! hon v ca tp con ny. D thy rng cc hon
v l cc chnh hp khng lp chp k ca S. V d ly tp {A, B, C} l tp con ca tp S
trong v d trn th: A, B, C, C, A, B, B, C, A, l cc chnh hp khng lp chp 3 ca
S. iu tc l khi lit k tt c cc chnh hp khng lp chp k th mi t hp chp k s
n! n
c tnh k! ln. Vy s t hp chp k ca tp gm n phn t l =
k!(n k)! k
L Minh Hong
4 Chuyn
HSPHN 1999-2004
Bi ton lit k 5
a[k-1] = b[k-1]
a[k] = b[k]
a[k+1] < b[k+1]
Trong trng hp ny, ta c th vit a < b.
Th t gi l th t t in trn cc dy di n.
Khi di hai dy a v b khng bng nhau, ngi ta cng xc nh c th t t in. Bng
cch thm vo cui dy a hoc dy b nhng phn t c bit gi l phn t di ca a
v b bng nhau, v coi nhng phn t ny nh hn tt c cc phn t khc, ta li a v xc
nh th t t in ca hai dy cng di. V d:
1, 2, 3, 4 < 5, 6
a, b, c < a, b, c, d
'calculator' < 'computer'
L Minh Hong
6 Chuyn
HSPHN 1999-2004
Bi ton lit k 7
L Minh Hong
8 Chuyn
HSPHN 1999-2004
Bi ton lit k 9
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n);
Close(f);
L Minh Hong
10 Chuyn
HSPHN 1999-2004
Bi ton lit k 11
Bi 7
Nhp vo danh sch n bn nam v n bn n, in ra tt c cc cch xp 2n ngi vo mt bn
trn, mi bn nam tip n mt bn n.
Bi 8
Ngi ta c th dng phng php sinh lit k cc chnh hp khng lp chp k. Tuy nhin
c mt cch khc l lit k tt c cc tp con k phn t ca tp hp, sau in ra k! hon v
ca n. Hy vit chng trnh lit k cc chnh hp khng lp chp k ca {1, 2, , n} theo c
hai cch.
Bi 9
Lit k tt c cc hon v ch ci trong t MISSISSIPPI theo th t t in.
Bi 10
Lit k tt c cc cch phn tch s nguyn dng n thnh tng cc s nguyn dng, hai cch
phn tch l hon v ca nhau ch tnh l mt cch.
Cui cng, ta c nhn xt, mi phng php lit k u c u, nhc im ring v phng
php sinh cng khng nm ngoi nhn xt . Phng php sinh khng th sinh ra c cu
hnh th p nu nh cha c cu hnh th p - 1, chng t rng phng php sinh t ra u im
trong trng hp lit k ton b mt s lng nh cu hnh trong mt b d liu ln th li c
nhc im v t tnh ph dng trong nhng thut ton duyt hn ch. Hn th na, khng
phi cu hnh ban u lc no cng d tm c, khng phi k thut sinh cu hnh k tip
cho mi bi ton u n gin nh trn (Sinh cc chnh hp khng lp chp k theo th t t
in chng hn). Ta sang mt chuyn mc sau ni n mt phng php lit k c tnh ph
dng cao hn, gii cc bi ton lit k phc tp hn l: Thut ton quay lui (Back
tracking).
L Minh Hong
12 Chuyn
Thut ton quay lui dng gii bi ton lit k cc cu hnh. Mi cu hnh c xy dng
bng cch xy dng tng phn t, mi phn t c chn bng cch th tt c cc kh nng.
Gi s cu hnh cn lit k c dng x[1..n], khi thut ton quay lui thc hin qua cc bc:
1) Xt tt c cc gi tr x[1] c th nhn, th cho x[1] nhn ln lt cc gi tr . Vi mi gi
tr th gn cho x[1] ta s:
2) Xt tt c cc gi tr x[2] c th nhn, li th cho x[2] nhn ln lt cc gi tr . Vi mi
gi tr th gn cho x[2] li xt tip cc kh nng chn x[3] c tip tc nh vy n bc:
HSPHN 1999-2004
Bi ton lit k 13
max = 30;
var
x: array[1..max] of Integer;
n: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n); {Nhp d liu}
Close(f);
Assign(f, OutputFile); Rewrite(f);
Try(1); {Th cc cch chn gi tr x[1]}
Close(f);
end.
V d: Khi n = 3, cy tm kim quay lui nh sau:
Try(1)
X1=0 X1=1
Try(2)
Try(2)
X2=0 X2=1 X2=0 X2=1
L Minh Hong
14 Chuyn
x[k] n
x[k-1] x[k] - 1 n - 1
x[i] n - k + i
x[1] n - k + 1.
T suy ra x[i-1] + 1 x[i] n - k + i (1 i k) y ta gi thit c thm mt s x[0] = 0
khi xt i = 1.
Nh vy ta s xt tt c cc cch chn x[1] t 1 (=x[0] + 1) n n - k + 1, vi mi gi tr ,
xt tip tt c cc cch chn x[2] t x[1] +1 n n - k + 2, c nh vy khi chn c n
x[k] th ta c mt cu hnh cn lit k. Chng trnh lit k bng thut ton quay lui nh sau:
P_1_03_2.PAS * Thut ton quay lui lit k cc tp con k phn t
program Combination;
const
InputFile = 'SUBSET.INP';
OutputFile = 'SUBSET.OUT';
max = 30;
var
x: array[0..max] of Integer;
n, k: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(F);
ReadLn(f, n, k);
Close(f);
Assign(f, OutputFile); Rewrite(f);
x[0] := 0;
Try(1);
Close(f);
end.
HSPHN 1999-2004
Bi ton lit k 15
L Minh Hong
16 Chuyn
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n, k);
Assign(f, OutputFile); Rewrite(f);
FillChar(c, SizeOf(c), True); {Tt c cc s u cha b chn}
Try(1); {Th cc cch chn gi tr ca x[1]}
Close(f);
end.
HSPHN 1999-2004
Bi ton lit k 17
L Minh Hong
18 Chuyn
t: array[0..max] of Integer;
f: Text;
begin
Init;
Assign(f, OutputFile); Rewrite(f);
Try(1);
Close(f);
end.
3.5. BI TON XP HU
3.5.1. Bi ton
Xt bn c tng qut kch thc nxn. Mt qun hu trn bn c c th n c cc qun khc
nm ti cc cng hng, cng ct hoc cng ng cho. Hy tm cc xp n qun hu trn
bn c sao cho khng qun no n qun no.
V d mt cch xp vi n = 8:
HSPHN 1999-2004
Bi ton lit k 19
1 2 3 4 5 6 7 8
N 2
4
W E
5
S 7
L Minh Hong
20 Chuyn
Ci t:
Ta c 3 mng logic nh du:
Mng a[1..n]. a[i] = TRUE nu nh ct i cn t do, a[i] = FALSE nu nh ct i b mt
qun hu khng ch
Mng b[2..2n]. b[i] = TRUE nu nh ng cho B-TN th i cn t do, b[i] = FALSE
nu nh ng cho b mt qun hu khng ch.
Mng c[1-n..n-1]. c[i] = TRUE nu nh ng cho N-TB th i cn t do, c[i] = FALSE
nu nh ng cho b mt qun hu khng ch.
Ban u c 3 mng nh du u mang gi tr TRUE. (Cc ct v ng cho u t do)
Thut ton quay lui:
Xt tt c cc ct, th t qun hu 1 vo mt ct, vi mi cch t nh vy, xt tt c cc
cch t qun hu 2 khng b qun hu 1 n, li th 1 cch t v xt tip cc cch t
qun hu 3Mi cch t c n qun hu n cho ta 1 nghim
Khi chn v tr ct j cho qun hu th i, th ta phi chn (i, j) khng b cc qun hu t
trc n, tc l phi chn ct j cn t do, ng cho B-TN (i+j) cn t do, ng
cho N-TB(i-j) cn t do. iu ny c th kim tra (a[j] = b[i+j] = c[i-j] = TRUE)
Khi th t c qun hu th i vo ct j, nu l qun hu cui cng (i = n) th ta c
mt nghim. Nu khng:
Trc khi gi quy tm cch t qun hu th i + 1, ta nh du ct v 2 ng cho
b qun hu va t khng ch (a[j] = b[i+j] = c[i-j] := FALSE) cc ln gi quy
tip sau chn cch t cc qun hu k tip s khng chn vo nhng nm trn ct j
v nhng ng cho ny na.
Sau khi gi quy tm cch t qun hu th i + 1, c ngha l sp ti ta li th mt
cch t khc cho qun hu th i, ta b nh du ct v 2 ng cho b qun hu va
th t khng ch (a[j] = b[i+j] = c[i-j] := TRUE) tc l ct v 2 ng cho li
thnh t do, bi khi t qun hu i sang v tr khc ri th ct v 2 ng cho
hon ton c th gn cho mt qun hu khc
Hy xem li trong cc chng trnh lit k chnh hp khng lp v hon v v k thut nh
du. y ch khc vi lit k hon v l: lit k hon v ch cn mt mng nh du xem gi
tr c t do khng, cn bi ton xp hu th cn phi nh du c 3 thnh phn: Ct, ng
cho B-TN, ng cho N- TB. Trng hp n gin hn: Yu cu lit k cc cch t n
qun xe ln bn c nxn sao cho khng qun no n qun no chnh l bi ton lit k hon v
Input: file vn bn QUEENS.INP cha s nguyn dng n 12
Output: file vn bn QUEENS.OUT, mi dng ghi mt cch t n qun hu
HSPHN 1999-2004
Bi ton lit k 21
QUEENS.INP QUEENS.OUT
5 (1, 1); (2, 3); (3, 5); (4, 2); (5, 4);
(1, 1); (2, 4); (3, 2); (4, 5); (5, 3);
(1, 2); (2, 4); (3, 1); (4, 3); (5, 5);
(1, 2); (2, 5); (3, 3); (4, 1); (5, 4);
(1, 3); (2, 1); (3, 4); (4, 2); (5, 5);
(1, 3); (2, 5); (3, 2); (4, 4); (5, 1);
(1, 4); (2, 1); (3, 3); (4, 5); (5, 2);
(1, 4); (2, 2); (3, 5); (4, 3); (5, 1);
(1, 5); (2, 2); (3, 4); (4, 1); (5, 3);
(1, 5); (2, 3); (3, 1); (4, 4); (5, 2);
P_1_03_5.PAS * Thut ton quay lui gii bi ton xp hu
program n_Queens;
const
InputFile = 'QUEENS.INP';
OutputFile = 'QUEENS.OUT';
max = 12;
var
n: Integer;
x: array[1..max] of Integer;
a: array[1..max] of Boolean;
b: array[2..2 * max] of Boolean;
c: array[1 - max..max - 1] of Boolean;
f: Text;
procedure Init;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n);
Close(f);
FillChar(a, SizeOf(a), True); {Mi ct u t do}
FillChar(b, SizeOf(b), True); {Mi ng cho ng Bc - Ty Nam u t do}
FillChar(c, SizeOf(c), True); {Mi ng cho ng Nam - Ty Bc u t do}
end;
procedure PrintResult;
var
i: Integer;
begin
for i := 1 to n do Write(f, '(', i, ', ', x[i], '); ');
WriteLn(f);
end;
begin
L Minh Hong
22 Chuyn
Init;
Assign(f, OutputFile); Rewrite(f);
Try(1);
Close(f);
end.
Bi tp:
Bi 1
Mt s chng trnh trn x l khng tt trong trng hp tm thng (n = 0 hoc k = 0), hy
khc phc cc li
Bi 2
Vit chng trnh lit k cc chnh hp lp chp k ca n phn t
Bi 3
Cho hai s nguyn dng l, n. Hy lit k cc xu nh phn di n c tnh cht, bt k hai
xu con no di l lin nhau u khc nhau.
Bi 4
Vi n = 5, k = 3, v cy tm kim quay lui ca chng trnh lit k t hp chp k ca tp {1,
2, , n}
Bi 5
Lit k tt c cc tp con ca tp S gm n s nguyn {S[1], S[2], , S[n]} nhp vo t bn
phm
Bi 6
Tng t nh bi 5 nhng ch lit k cc tp con c max - min T (T cho trc).
Bi 7
Mt dy x[1..n] gi l mt hon v hon ton ca tp {1, 2, , n} nu n l mt hon v v
tho mn x[i] i vi i: 1 i n. Hy vit chng trnh lit k tt c cc hon v hon ton
ca tp trn (n vo t bn phm).
Bi 8
Sa li th tc in kt qu (PrintResult) trong bi xp hu c th v hnh bn c v cc cch
t hu ra mn hnh.
HSPHN 1999-2004
Bi ton lit k 23
Bi 9
M i tun: Cho bn c tng qut kch thc nxn v mt qun M, hy ch ra mt hnh trnh
ca qun M xut pht t ang ng i qua tt c cc cn li ca bn c, mi ng 1 ln.
Bi 10
Chuyn tt c cc bi tp trong bi trc ang vit bng sinh tun t sang quay lui.
Bi 11
Xt s giao thng gm n nt giao thng nh s t 1 ti n v m on ng ni chng,
mi on ng ni 2 nt giao thng. Hy nhp d liu v mng li giao thng , nhp s
hiu hai nt giao thng s v d. Hy in ra tt c cc cch i t s ti d m mi cch i khng
c qua nt giao thng no qu mt ln.
L Minh Hong
24 Chuyn
4. K THUT NHNH CN
4.1. BI TON TI U
Mt trong nhng bi ton t ra trong thc t l vic tm ra mt nghim tho mn mt s iu
kin no , v nghim l tt nht theo mt ch tiu c th, nghin cu li gii cc lp bi
ton ti u thuc v lnh vc quy hoch ton hc. Tuy nhin cng cn phi ni rng trong
nhiu trng hp chng ta cha th xy dng mt thut ton no thc s hu hiu gii bi
ton, m cho ti nay vic tm nghim ca chng vn phi da trn m hnh lit k ton b cc
cu hnh c th v nh gi, tm ra cu hnh tt nht. Vic lit k cu hnh c th ci t bng
cc phng php lit k: Sinh tun t v tm kim quay lui. Di y ta s tm hiu phng
php lit k bng thut ton quay lui tm nghim ca bi ton ti u.
4.2. S BNG N T HP
M hnh thut ton quay lui l tm kim trn 1 cy phn cp. Nu gi thit rng ng vi mi
nt tng ng vi mt gi tr c chn cho x[i] s ng vi ch 2 nt tng ng vi 2 gi tr
m x[i+1] c th nhn th cy n cp s c ti 2n nt l, con s ny ln hn rt nhiu ln so vi
d liu u vo n. Chnh v vy m nu nh ta c thao tc tha trong vic chn x[i] th s phi
tr gi rt ln v chi ph thc thi thut ton bi qu trnh tm kim lng vng v ngha trong
cc bc chn k tip x[i+1], x[i+2], Khi , mt vn t ra l trong qu trnh lit k li
gii ta cn tn dng nhng thng tin tm c loi b sm nhng phng n chc chn
khng phi ti u. K thut gi l k thut nh gi nhnh cn trong tin trnh quay lui.
HSPHN 1999-2004
Bi ton lit k 25
begin
Init;
Try(1);
Thng bo cu hnh ti u BESTCONFIG;
end.
K thut nhnh cn thm vo cho thut ton quay lui kh nng nh gi theo tng bc, nu
ti bc th i, gi tr th gn cho x[i] khng c hi vng tm thy cu hnh tt hn cu hnh
BESTCONFIG th th gi tr khc ngay m khng cn phi gi quy tm tip hay ghi nhn
kt qu lm g. Nghim ca bi ton s c lm tt dn, bi khi tm ra mt cu hnh mi (tt
hn BESTCONFIG - tt nhin), ta khng in kt qu ngay m s cp nht BESTCONFIG bng
cu hnh mi va tm c
L Minh Hong
26 Chuyn
procedure Enter;
var
i, j, k: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n, m);
for i := 1 to n do {Khi to bng chi ph ban u}
for j := 1 to n do
if i = j then C[i, j] := 0 else C[i, j] := maxC;
for k := 1 to m do
begin
ReadLn(f, i, j, C[i, j]);
C[j, i] := C[i, j]; {Chi ph nh nhau trn 2 chiu}
end;
Close(f);
end;
HSPHN 1999-2004
Bi ton lit k 27
MinSpending := maxC;
end;
procedure PrintResult;
var
i: Integer;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
if MinSpending = maxC then WriteLn(f, 'NO SOLUTION')
else
for i := 1 to n do Write(f, BestWay[i], '->');
WriteLn(f, 1);
WriteLn(f, 'Cost: ', MinSpending);
Close(f);
end;
begin
Enter;
Init;
Try(2);
PrintResult;
end.
Trn y l mt gii php nhnh cn cn rt th s gii bi ton ngi du lch, trn thc t
ngi ta cn c nhiu cch nh gi nhnh cn cht hn na. Hy tham kho cc ti liu khc
tm hiu v nhng phng php .
4.5. DY ABC
Cho trc mt s nguyn dng N (N 100), hy tm mt xu ch gm cc k t A, B, C
tho mn 3 iu kin:
C di N
Hai on con bt k lin nhau u khc nhau (on con l mt dy k t lin tip ca xu)
L Minh Hong
28 Chuyn
C t k t C nht.
Cch gii:
Khng trnh by, ngh t xem chng trnh hiu, ch ch thch k thut nhnh cn nh
sau:
Nu dy X[1..n] tho mn 2 on con bt k lin nhau u khc nhau, th trong 4 k t lin
tip bt k bao gi cng phi c 1 k t "C". Nh vy vi mt dy con gm k k t lin tip
ca dy X th s k t C trong dy con bt buc phi k div 4.
Ti bc th chn X[i], nu ta c T[i] k t "C" trong on chn t X[1] n X[i], th
cho d cc bc quy tip sau lm tt nh th no chng na, s k t "C" s phi chn
thm bao gi cng (n - i) div 4. Tc l nu theo phng n chn X[i] nh th ny th s k
t "C" trong dy kt qu (khi chn n X[n]) cho d c lm tt n u cng T[i] + (n - i)
div 4. Ta dng con s ny nh gi nhnh cn, nu n nhiu hn s k t "C" trong
BestConfig th chc chn c lm tip cng ch c mt cu hnh ti t hn, ta b qua ngay
cch chn ny v th phng n khc.
Input: file vn bn ABC.INP cha s nguyn dng n 100
Output: file vn bn ABC.OUT ghi xu tm c
ABC.INP ABC.OUT
10 ABACABCBAB
"C" Letter Count : 2
P_1_04_2.PAS * Dy ABC
program ABC_STRING;
const
InputFile = 'ABC.INP';
OutputFile = 'ABC.OUT';
max = 100;
var
N, MinC: Integer;
X, Best: array[1..max] of 'A'..'C';
T: array[0..max] of Integer; {T[i] cho bit s k t "C" trong on t X[1] n X[i]}
f: Text;
{Hm Same(i, l) cho bit xu gm l k t kt thc ti X[i] c trng vi xu l k t lin trc n khng ?}
function Same(i, l: Integer): Boolean;
var
j, k: Integer;
begin
j := i - l; {j l v tr cui on lin trc on }
for k := 0 to l - 1 do
if X[i - k] <> X[j - k] then
begin
Same := False; Exit;
end;
Same := True;
end;
{Hm Check(i) cho bit X[i] c lm hng tnh khng lp ca dy X[1..i] hay khng}
function Check(i: Integer): Boolean;
var
l: Integer;
begin
HSPHN 1999-2004
Bi ton lit k 29
procedure PrintResult;
var
i: Integer;
begin
for i := 1 to N do Write(f, Best[i]);
WriteLn(f);
WriteLn(f, '"C" Letter Count : ', MinC);
end;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, N);
Close(f);
Assign(f, OutputFile); Rewrite(f);
T[0] := 0;
MinC := N; {Khi to cu hnh BestConfig ban u rt ti}
Try(1);
PrintResult;
Close(f);
end.
Nu ta thay bi ton l tm xu t k t 'B' nht m vn vit chng trnh tng t nh trn th
chng trnh s chy chm hn cht t. L do: th tc Try trn s th ln lt cc gi tr 'A',
'B', ri mi n 'C'. C ngha ngay trong cch tm, n tit kim s dng k t 'C' nht nn
trong phn ln cc b d liu n nhanh chng tm ra li gii hn so vi bi ton tng ng
tm xu t k t 'B' nht. Chnh v vy m nu nh bi yu cu t k t 'B' nht ta c lp
chng trnh lm yu cu t k t 'C' nht, ch c iu khi in kt qu, ta i vai tr 'B', 'C' cho
L Minh Hong
30 Chuyn
nhau. y l mt v d cho thy sc mnh ca thut ton quay lui khi kt hp vi k thut
nhnh cn, nu vit quay lui thun tu hoc nh gi nhnh cn khng tt th vi N = 100, ti
cng khng kin nhn i chng trnh cho kt qu (ch bit rng > 3 gi). Trong khi
khi N = 100, vi chng trnh trn ch chy ht hn 3 giy cho kt qu l xu 27 k t 'C'.
Ni chung, t khi ta gp bi ton m ch cn s dng mt thut ton, mt m hnh k thut ci
t l c th gii c. Thng thng cc bi ton thc t i hi phi c s tng hp, pha
trn nhiu thut ton, nhiu k thut mi c c mt li gii tt. Khng c lm dng mt
k thut no v cng khng xem thng mt phng php no khi bt tay vo gii mt bi
ton tin hc. Thut ton quay lui cng khng phi l ngoi l, ta phi bit phi hp mt cch
uyn chuyn vi cc thut ton khc th khi n mi thc s l mt cng c mnh.
Bi tp:
Bi 1
Mt dy du ngoc hp l l mt dy cc k t "(" v ")" c nh ngha nh sau:
i. Dy rng l mt dy du ngoc hp l su 0
ii. Nu A l dy du ngoc hp l su k th (A) l dy du ngoc hp l su k + 1
iii. Nu A v B l hay dy du ngoc hp l vi su ln lt l p v q th AB l dy du
ngoc hp l su l max(p, q)
di ca mt dy ngoc l tng s k t "(" v ")"
V d: C 5 dy du ngoc hp l di 8 v su 3:
1. ((()()))
2. ((())())
3. ((()))()
4. (()(()))
5. ()((()))
Bi ton t ra l khi cho bit trc hai s nguyn dng n v k. Hy lit k ht cc dy
ngoc hp l c di l n v su l k (lm c vi n cng ln cng tt).
Bi 2
Cho mt bi mn kch thc mxn vung, trn mt c th c cha mt qu mn hoc khng,
biu din bn mn , ngi ta c hai cch:
Cch 1: dng bn nh du: s dng mt li vung kch thc mxn, trn ti (i, j)
ghi s 1 nu c mn, ghi s 0 nu khng c mn
Cch 2: dng bn mt : s dng mt li vung kch thc mxn, trn ti (i, j) ghi
mt s trong khong t 0 n 8 cho bit tng s mn trong cc ln cn vi (i, j) ( ln cn
vi (i, j) l c chung vi (i, j) t nht 1 nh).
Gi thit rng hai bn c ghi chnh xc theo tnh trng mn trn hin trng.
V nguyn tc, lc ci bi mn phi v c bn nh du v bn mt , tuy nhin sau
mt thi gian di, khi ngi ta mun g mn ra khi bi th vn ht sc kh khn bi bn
nh du b tht lc !!. Cng vic ca cc lp trnh vin l: T bn mt , hy ti
to li bn nh du ca bi mn.
HSPHN 1999-2004
Bi ton lit k 31
L Minh Hong
PHN 2. CU TRC D LIU V
GII THUT
1.1. XC NH BI TON
Input Process Output
(D liu vo X l Kt qu ra)
Vic xc nh bi ton tc l phi xc nh xem ta phi gii quyt vn g?, vi gi thit no
cho v li gii cn phi t nhng yu cu g. Khc vi bi ton thun tu ton hc ch cn
xc nh r gi thit v kt lun ch khng cn xc nh yu cu v li gii, i khi nhng bi
ton tin hc ng dng trong thc t ch cn tm li gii tt ti mc no , thm ch l ti
mc chp nhn c. Bi li gii tt nht i hi qu nhiu thi gian v chi ph.
V d:
Khi ci t cc hm s phc tp trn my tnh. Nu tnh bng cch khai trin chui v hn th
chnh xc cao hn nhng thi gian chm hn hng t ln so vi phng php xp x. Trn
thc t vic tnh ton lun lun cho php chp nhn mt sai s no nn cc hm s trong
my tnh u c tnh bng phng php xp x ca gii tch s
Xc nh ng yu cu bi ton l rt quan trng bi n nh hng ti cch thc gii quyt v
cht lng ca li gii. Mt bi ton thc t thng cho bi nhng thng tin kh m h v
hnh thc, ta phi pht biu li mt cch chnh xc v cht ch hiu ng bi ton.
V d:
Bi ton: Mt d n c n ngi tham gia tho lun, h mun chia thnh cc nhm v mi
nhm tho lun ring v mt phn ca d n. Nhm c bao nhiu ngi th c trnh ln by
nhiu kin. Nu ly mi nhm mt kin em ghp li th c mt b kin trin khai
d n. Hy tm cch chia s b kin cui cng thu c l ln nht.
Pht biu li: Cho mt s nguyn dng n, tm cc phn tch n thnh tng cc s nguyn
dng sao cho tch ca cc s l ln nht.
Trn thc t, ta nn xt mt vi trng hp c th thng qua hiu c bi ton r hn
v thy c cc thao tc cn phi tin hnh. i vi nhng bi ton n gin, i khi ch cn
qua v d l ta c th a v mt bi ton quen thuc gii.
HSPHN 1999-2004
Cu trc d liu v gii thut 35
L Minh Hong
36 Chuyn
Begin
Input: a, b
No
b>0? Output a;
Yes
r := a mod b;
a := b;
b := r
End
Khi m t thut ton bng ngn ng t nhin, ta khng cn phi qu chi tit cc bc v tin
trnh thc hin m ch cn m t mt cch hnh thc chuyn thnh ngn ng lp trnh.
Vit s cc thut ton quy l mt v d.
i vi nhng thut ton phc tp v nng v tnh ton, cc bc v cc cng thc nn m t
mt cch tng minh v ch thch r rng khi lp trnh ta c th nhanh chng tra cu.
i vi nhng thut ton kinh in th phi thuc. Khi gii mt bi ton ln trong mt thi
gian gii hn, ta ch phi thit k tng th cn nhng ch thuc th c vic lp rp vo.
HSPHN 1999-2004
Cu trc d liu v gii thut 37
1.4. LP TRNH
Sau khi c thut ton, ta phi tin hnh lp trnh th hin thut ton . Mun lp trnh t
hiu qu cao, cn phi c k thut lp trnh tt. K thut lp trnh tt th hin k nng vit
chng trnh, kh nng g ri v thao tc nhanh. Lp trnh tt khng phi ch cn nm vng
ngn ng lp trnh l , phi bit cch vit chng trnh uyn chuyn, khn kho v pht
trin dn dn chuyn cc tng ra thnh chng trnh hon chnh. Kinh nghim cho thy
mt thut ton hay nhng do ci t vng v nn khi chy li cho kt qu sai hoc tc
chm.
Thng thng, ta khng nn c th ho ngay ton b chng trnh m nn tin hnh theo
phng php tinh ch tng bc (Stepwise refinement):
Ban u, chng trnh c th hin bng ngn ng t nhin, th hin thut ton vi cc
bc tng th, mi bc nu ln mt cng vic phi thc hin.
Mt cng vic n gin hoc l mt on chng trnh c hc thuc th ta tin hnh
vit m lnh ngay bng ngn ng lp trnh.
Mt cng vic phc tp th ta li chia ra thnh nhng cng vic nh hn li tip tc vi
nhng cng vic nh hn .
Trong qu trnh tinh ch tng bc, ta phi a ra nhng biu din d liu. Nh vy cng vi
s tinh ch cc cng vic, d liu cng c tinh ch dn, c cu trc hn, th hin r hn
mi lin h gia cc d liu.
Phng php tinh ch tng bc l mt th hin ca t duy gii quyt vn t trn xung,
gip cho ngi lp trnh c c mt nh hng th hin trong phong cch vit chng trnh.
Trnh vic m mm, xo i vit li nhiu ln, bin chng trnh thnh t giy nhp.
1.5. KIM TH
1.5.1. Chy th v tm li
Chng trnh l do con ngi vit ra, m l con ngi th ai cng c th nhm ln. Mt
chng trnh vit xong cha chc chy c ngay trn my tnh cho ra kt qu mong
mun. K nng tm li, sa li, iu chnh li chng trnh cng l mt k nng quan trng
ca ngi lp trnh. K nng ny ch c c bng kinh nghim tm v sa cha li ca chnh
mnh.
C ba loi li:
Li c php: Li ny hay gp nht nhng li d sa nht, ch cn nm vng ngn ng lp
trnh l . Mt ngi c coi l khng bit lp trnh nu khng bit sa li c php.
Li ci t: Vic ci t th hin khng ng thut ton nh, i vi li ny th phi
xem li tng th chng trnh, kt hp vi cc chc nng g ri sa li cho ng.
L Minh Hong
38 Chuyn
HSPHN 1999-2004
Cu trc d liu v gii thut 39
T nhng phn tch trn, chng ta nhn thy rng vic lm ra mt chng trnh i hi rt
nhiu cng on v tiu tn kh nhiu cng sc. Ch mt cng on khng hp l s lm tng
chi ph vit chng trnh. Ngh ra cch gii quyt vn kh, bin tng thnh hin
thc cng khng d cht no.
Nhng cu trc d liu v gii thut cp ti trong chuyn ny l nhng kin thc rt ph
thng, mt ngi hc lp trnh khng sm th mun cng phi bit ti. Ch hy vng rng khi
hc xong chuyn ny, qua nhng cu trc d liu v gii thut ht sc mu mc, chng ta
rt ra c bi hc kinh nghim: ng bao gi vit chng trnh khi m cha suy xt k
v gii thut v nhng d liu cn thao tc, bi nh vy ta d mc phi hai sai lm trm
trng: hoc l sai v gii thut, hoc l gii thut khng th trin khai ni trn mt cu trc d
liu khng ph hp. Ch cn mc mt trong hai li thi th nguy c sp ton b chng
trnh l hon ton c th, cng c cha cng b ri, kh nng hu nh chc chn l phi lm li
t u(*).
(*)
Tt nhin, cn thn n u th cng c xc sut ri ro nht nh, ta hiu c mc tai hi ca hai li ny hn
ch n cng nhiu cng tt
L Minh Hong
40 Chuyn
HSPHN 1999-2004
Cu trc d liu v gii thut 41
Hnh 5 l biu din th ca k php ln, ln v ln. D thy rng T(n) = (g(n))
nu v ch nu T(n) = O(g(n)) v T(n) = (g(n)).
c2.g(n)
c.g(n)
T(n) T(n) T(n)
c1.g(n) c.g(n)
n n n0 n
n0 n0
L Minh Hong
42 Chuyn
HSPHN 1999-2004
Cu trc d liu v gii thut 43
( ) (
Nu f (n) = O n logb a vi hng s >0, th T(n) = n log b a )
( ) ( )
Nu f (n) = n logb a th T(n) = n logb a lg n
th T(n) = ( f (n) )
nh l Master l mt nh l quan trng trong vic phn tch phc tp tnh ton ca cc
gii thut lp hay quy. Tuy nhin vic chng minh nh l kh di dng, ta c th tham
kho trong cc ti liu khc.
2.3.6. Mt s tnh cht
Ta quan tm ch yu ti cc k php "ln". R rng k php l "cht" hn k php O v
theo ngha: Nu phc tp tnh ton ca gii thut c th vit l (f(n)) th cng c th vit
l O(f(n)) cng nh (f(n)). Di y l mt s cch biu din phc tp tnh ton qua k
php .
Nu mt thut ton c thi gian thc hin l P(n), trong P(n) l mt a thc bc k th
phc tp tnh ton ca thut ton c th vit l (nk).
L Minh Hong
44 Chuyn
Nu mt thut ton c thi gian thc hin l logaf(n). Vi b l mt s dng, ta nhn thy
logaf(n) = logab.logbf(n). Tc l: (logaf(n)) = (logbf(n)). Vy ta c th ni rng phc
tp tnh ton ca thut ton l (log f(n)) m khng cn ghi c s ca logarit.
Nu mt thut ton c phc tp l hng s, tc l thi gian thc hin khng ph thuc
vo kch thc d liu vo th ta k hiu phc tp tnh ton ca thut ton l (1).
Di y l mt s hm s hay dng k hiu phc tp tnh ton v bng gi tr ca
chng tin theo di s tng ca hm theo i s n.
lgn n nlgn n2 n3 2n
0 1 0 1 1 2
1 2 2 4 8 4
2 4 8 16 64 16
3 8 24 64 512 256
V d:
Thut ton tnh tng cc s t 1 ti n:
Nu vit theo s nh sau:
Input n;
S := 0;
for i := 1 to n do S := S + i;
Output S;
Cc on chng trnh cc dng 1, 2 v 4 c phc tp tnh ton l (1). Vng lp dng
3 lp n ln php gn S := S + i, nn thi gian tnh ton t l thun vi n. Tc l phc tp
tnh ton l (n). Dng quy tc cng v quy tc ly max, ta suy ra phc tp tnh ton ca
gii thut trn l (n).
Cn nu vit theo s nh sau:
Input n;
S := n * (n - 1) div 2;
Output S;
Th phc tp tnh ton ca thut ton trn l (1), thi gian tnh ton khng ph thuc vo
n.
2.3.7. Php ton tch cc
Da vo nhng nhn xt nu trn v cc quy tc khi nh gi thi gian thc hin gii
thut, ta ch c bit n mt php ton m ta gi l php ton tch cc trong mt on
chng trnh. l mt php ton trong mt on chng trnh m s ln thc hin
khng t hn cc php ton khc.
Xt hai on chng trnh tnh ex bng cng thc gn ng:
HSPHN 1999-2004
Cu trc d liu v gii thut 45
x x2 xn n
xi
ex 1 + + + ... + = vi x v n cho trc.
1! 2! n! i =0 i!
{Chng trnh 1: Tnh ring tng hng t ri cng li} {Tnh hng t sau qua hng t trc}
program Exp1; program Exp2;
var var
i, j, n: Integer; i, n: Integer;
x, p, S: Real; x, p, S: Real;
begin begin
Write('x, n = '); ReadLn(x, n); Write('x, n = '); ReadLn(x, n);
S := 0; S := 1; p := 1;
for i := 0 to n do for i := 1 to n do
begin begin
p := 1; p := p * x / i;
for j := 1 to i do p := p * x / j; S := S + p;
S := S + p; end;
end; WriteLn('exp(', x:1:4, ') = ', S:1:4);
WriteLn('exp(', x:1:4, ') = ', S:1:4); end.
end.
L Minh Hong
46 Chuyn
Khng nn ln ln cc cch phn tch trong trng hp xu nht, trung bnh, v tt nht vi
cc k php biu din phc tp tnh ton, y l hai khi nim hon ton phn bit.
Trn phng din l thuyt, nh gi bng k php (.) l tt nht, tuy vy vic nh gi
bng k php (.) i hi phi nh gi bng c k php O(.) ln (.). Dn ti vic phn tch
kh phc tp, gn nh phi biu din chnh xc thi gian thc hin gii thut qua cc hm gii
tch. V vy trong nhng thut ton v sau, phn ln ti s dng k php T(n) = O(f(n)) vi
f(n) l hm tng chm nht c th (nm trong tm hiu bit ca mnh).
k ,
100
2100 , ( 2)lg n , n 2 , n! , 3n , lg* n , lg(n!) , 1 , lg* (lg n) , ln n , n lg(lg n) , (lg n)lg n , 2n ,
k =1
n
1
n lg n , k
k =1
HSPHN 1999-2004
Cu trc d liu v gii thut 47
100
1 , 2100
lg* n , lg* (lg n)
n
1
ln n , k
k =1
( 2)lg n
n lg n , lg(n!)
n
n2 , k
k =1
2n
3n
n!
Bi 2
Xc nh phc tp tnh ton ca nhng gii thut sau bng k php :
a) on chng trnh tnh tng hai a thc:
P(x) = amxm + am-1xm-1 + + a1x + a0 v Q(x) = bnxn + an-1xn-1 + + b1x + b0
c a thc
R(x) = cpxp + cp-1xp-1 + + c1x + c0
if m < n then p := m else p := n; {p = min(m, n)}
for i := 0 to p do c[i] := a[i] + b[i];
if p < m then
for i := p + 1 to m do c[i] := a[i]
else
for i := p + 1 to n do c[i] := b[i];
while (p > 0) and (c[p] = 0) do p := p - 1;
b) on chng trnh tnh tch hai a thc:
P(x) = amxm + am-1xm-1 + + a1x + a0 v Q(x) = bnxn + an-1xn-1 + + b1x + b0
c a thc
R(x) = cpxp + cp-1xp-1 + + c1x + c0
p := m + n;
for i := 0 to p do c[i] := 0;
for i := 0 to m do
for j := 0 to n do
L Minh Hong
48 Chuyn
2.c. n/2.lg(n/2) + n
2.c.(n/2).lg(n/2) + n
= c.n.lg(n/2) + n
= c.n.lgn - c.n.lg2 + n
= c.n.lgn + (1-c).n
HSPHN 1999-2004
Cu trc d liu v gii thut 49
2.c. n/2 + n
= O(n)
Ta c mt kt qu "th v": T nlgn = O(T(n)) v T(n) = O(n), theo lut bc cu ta suy ra:
nlgn = O(n) !!!wow!!!
L Minh Hong
50 Chuyn
HSPHN 1999-2004
Cu trc d liu v gii thut 51
L Minh Hong
52 Chuyn
2. X = 5 (l) X := 5 * 3 + 1; (16)
HSPHN 1999-2004
Cu trc d liu v gii thut 53
end;
Trn y l cch vit quy trc tip, cn c mt cch vit quy tng h nh sau:
procedure Solve(X: Integer); forward; {Th tc tm cch biu din s X: Khai bo trc, c t sau}
procedure SolveOdd(X: Integer); {Th tc tm cch biu din s X > 1 trong trng hp X l}
begin
Solve(X * 3 + 1);
Write(' div 3');
end;
procedure SolveEven(X: Integer); {Th tc tm cch biu din s X trong trng hp X chn}
begin
Solve(X div 2);
Write(' * 2');
end;
L Minh Hong
54 Chuyn
1 2 3
Hnh 6: Thp H Ni
HSPHN 1999-2004
Cu trc d liu v gii thut 55
Tht ng tic nu nh chng ta phi lp trnh vi mt cng c khng cho php quy,
nhng nh vy khng c ngha l ta b tay trc mt bi ton mang tnh quy. Mi gii
thut quy u c cch thay th bng mt gii thut khng quy (kh quy), c th ni
c nh vy bi tt c cc chng trnh con quy s u c trnh dch chuyn thnh
nhng m lnh khng quy trc khi giao cho my tnh thc hin.
Vic tm hiu cch kh quy mt cch "my mc" nh cc chng trnh dch th ch cn
hiu r c ch xp chng ca cc th tc trong mt dy chuyn gi quy l c th lm c.
Nhng mun kh quy mt cch tinh t th phi tu thuc vo tng bi ton m kh quy
cho kho. Khng phi tm u xa, nhng k thut gii cng thc truy hi bng quy hoch
ng l v d cho thy tnh ngh thut trong nhng cch tip cn bi ton mang bn cht
quy tm ra mt gii thut khng quy y hiu qu.
Bi tp
L Minh Hong
56 Chuyn
Bi 1
Vit mt hm quy tnh c s chung ln nht ca hai s t nhin a, b khng ng thi
bng 0, ch r u l phn neo, u l phn quy.
Bi 2
n
Vit mt hm quy tnh theo cng thc truy hi sau:
k
n n
= = 1
0 n
n = n 1 + n 1 ; k:0<k<n
k k 1 k
n
( y ti dng k hiu thay cho Ckn thuc h thng k hiu ca Nga)
k
Bi 3
Nu r cc bc thc hin ca gii thut cho bi Thp H Ni trong trng hp n = 3.
Vit chng trnh gii bi ton Thp H Ni khng quy
Li gii:
C nhiu cch gii, y ti vit mt cch "l" nht vi mc ch gii tr, cc bn t tm hiu
ti sao n hot ng ng:
program HanoiTower;
const
max = 30;
var
Stack: array[1..3, 0..max] of Integer;
nd: array[1..3] of Integer;
RotatedList: array[0..2, 1..2] of Integer;
n: Integer;
i: LongInt;
procedure Init;
var
i: Integer;
begin
Stack[1, 0] := n + 1; Stack[2, 0] := n + 1; Stack[3, 0] := n + 1;
for i := 1 to n do Stack[1, i] := n + 1 - i;
nd[1] := n; nd[2] := 0; nd[3] := 0;
if Odd(n) then
begin
RotatedList[0][1] := 1; RotatedList[0][2] := 2;
RotatedList[1][1] := 1; RotatedList[1][2] := 3;
RotatedList[2][1] := 2; RotatedList[2][2] := 3;
end
else
begin
RotatedList[0][1] := 1; RotatedList[0][2] := 3;
RotatedList[1][1] := 1; RotatedList[1][2] := 2;
RotatedList[2][1] := 2; RotatedList[2][2] := 3;
end;
end;
HSPHN 1999-2004
Cu trc d liu v gii thut 57
procedure DisplayStatus;
var
i: Integer;
begin
for i := 1 to 3 do
Writeln('Peg ', i, ': ', nd[i], ' disks');
end;
begin
Write('n = '); Readln(n);
Init;
DisplayStatus;
for i := 1 to 1 shl n - 1 do
MoveDisk(RotatedList[(i - 1) mod 3][1], RotatedList[(i - 1) mod 3][2]);
DisplayStatus;
end.
L Minh Hong
58 Chuyn
A B C D E F G H I J K L
A B C D E F G H I J K L
t gi tr V vo v tr p:
p
A B C D E F V G H I J K L
Tng n ln 1
Xo phn t khi mng
Mng ban u:
p
A B C D E F G H I J K L
HSPHN 1999-2004
Cu trc d liu v gii thut 59
A B C D E F H I J K L
Gim n i 1
p
A B C D E F H I J K L
Data Gi tr
Lin kt
Hnh 7: Cu trc nt ca danh sch ni n
Nt u tin trong danh sch c gi l cht ca danh sch ni n (Head). duyt danh
sch ni n, ta bt u t cht, da vo trng lin kt i sang nt k tip, n khi gp gi
tr c bit (duyt qua nt cui) th dng li
Head
A B C D E
A B C D E
q p
L Minh Hong
60 Chuyn
To ra mt nt mi NewNode cha gi tr V:
A B C D E
q p
V
A B C D E
q p
A B C D E
q p
HSPHN 1999-2004
Cu trc d liu v gii thut 61
Lin kt sau
Data Gi tr
Lin kt trc
Hnh 9: Cu trc nt ca danh sch ni kp
Khc vi danh sch ni n, danh sch ni kp c hai cht: Nt u tin trong danh sch
c gi l First, nt cui cng trong danh sch c gi l Last. duyt danh sch ni kp,
ta c hai cch: Hoc bt u t First, da vo lin kt Next i sang nt k tip, n khi gp
gi tr c bit (duyt qua nt cui) th dng li. Hoc bt u t Last, da vo lin kt Prev
i sang nt lin trc, n khi gp gi tr c bit (duyt qua nt u) th dng li
First
A B C D E
Last
Hnh 10: Danh sch ni kp
A B C D E
L Minh Hong
62 Chuyn
A B C D E
Bi tp
Bi 1
Lp chng trnh qun l danh sch hc sinh, tu chn loi danh sch cho ph hp, chng
trnh c nhng chc nng sau: (H s mt hc sinh gi s c: Tn, lp, s in thoi, im
TB )
Cho php nhp danh sch hc sinh t bn phm hay t file.
Cho php in ra danh sch hc sinh gm c tn v xp loi
Cho php in ra danh sch hc sinh gm cc thng tin y
Cho php nhp vo t bn phm mt tn hc sinh v mt tn lp, tm xem c hc sinh c tn
nhp vo trong lp khng ?. Nu c th in ra s in thoi ca hc sinh
Cho php vo mt h s hc sinh mi t bn phm, b sung hc sinh vo danh sch hc
sinh, in ra danh sch mi.
Cho php nhp vo t bn phm tn mt lp, loi b tt c cc hc sinh ca lp khi danh
sch, in ra danh sch mi.
C chc nng sp xp danh sch hc sinh theo th t gim dn ca im trung bnh
Cho php nhp vo h s mt hc sinh mi t bn phm, chn hc sinh vo danh sch m
khng lm thay i th t sp xp, in ra danh sch mi.
Cho php lu tr li trn a danh sch hc sinh khi thay i.
Bi 2
HSPHN 1999-2004
Cu trc d liu v gii thut 63
L Minh Hong
64 Chuyn
5. NGN XP V HNG I
begin
StackInit;
HSPHN 1999-2004
Cu trc d liu v gii thut 65
begin
StackInit;
Test; {a mt vi lnh kim tra hot ng ca Stack}
end.
L Minh Hong
66 Chuyn
begin
QueueInit;
Test; {a mt vi lnh kim tra hot ng ca Queue}
end.
HSPHN 1999-2004
Cu trc d liu v gii thut 67
Last
First
Lu l trong thao tc Push v Pop phi kim tra Queue trn hay Queue cn nn phi cp
nht li bin n. ( y dng thm bin n cho d hiu cn trn thc t ch cn hai bin Front v
Rear l ta c th kim tra c Queue trn hay cn ri)
program QueueByCList;
const
max = 10000;
var
Queue: array[0..max - 1] of Integer;
i, n, Front, Rear: Integer;
L Minh Hong
68 Chuyn
Inc(n);
end;
end;
begin
QueueInit;
Test; {a mt vi lnh kim tra hot ng ca Queue}
end.
5.2.3. M t Queue bng danh sch ni n kiu FIFO
Tng t nh ci t Stack bng danh sch ni n kiu LIFO, ta cng khng kim tra Queue
trn trong trng hp m t Queue bng danh sch ni n kiu FIFO.
program QueueByLinkedList;
type
PNode = ^TNode; {Kiu con tr ti mt nt ca danh sch}
TNode = record {Cu trc mt nt ca danh sch}
Value: Integer;
Link: PNode;
end;
var
Front, Rear: PNode; {Hai con tr ti nt u v nt cui ca danh sch}
HSPHN 1999-2004
Cu trc d liu v gii thut 69
begin
QueueInit;
Test; {a mt vi lnh kim tra hot ng ca Queue}
end.
Bi tp
Bi 1
Tm hiu c ch xp chng ca th tc quy, phng php dng ngn xp kh quy.
Vit chng trnh m t cch i c s t h thp phn sang h c s R dng ngn xp
Bi 2
Hnh 14 l c cu ng tu ti mt ga xe la
1 2 n
C A
1 2 n
A
C
L Minh Hong
70 Chuyn
6. CY (TREE)
6.1. NH NGHA
Cu trc d liu tru tng ta quan tm ti trong mc ny l cu trc cy. Cy l mt cu trc
d liu gm mt tp hu hn cc nt, gia cc nt c mt quan h phn cp gi l quan h
"cha - con". C mt nt c bit gi l gc (root).
C th nh ngha cy bng cc quy nh sau:
Mi nt l mt cy, nt cng l gc ca cy y
Nu n l mt nt v n1, n2, , nk ln lt l gc ca cc cy T1, T2, , Tk; cc cy ny i
mt khng c nt chung. Th nu cho nt n tr thnh cha ca cc nt n1, n2, , nk ta s
c mt cy mi T. Cy ny c nt n l gc cn cc cy T1, T2, , Tk tr thnh cc cy
con (subtree) ca gc.
tin, ngi ta cn cho php tn ti mt cy khng c nt no m ta gi l cy rng (null
tree).
Xt cy trong Hnh 16:
B C D
E F G H I
J K
Hnh 16: Cy
A l cha ca B, C, D, cn G, H, I l con ca D
S cc con ca mt nt c gi l cp ca nt , v d cp ca A l 3, cp ca B l 2, cp
ca C l 0.
Nt c cp bng 0 c gi l nt l (leaf) hay nt tn cng. V d nh trn, cc nt E, F, C,
G, J, K v I l cc nt l. Nhng nt khng phi l l c gi l nt nhnh (branch)
Cp cao nht ca mt nt trn cy gi l cp ca cy , cy hnh trn l cy cp 3.
Gc ca cy ngi ta gn cho s mc l 1, nu nt cha c mc l i th nt con s c mc l i +
1. Mc ca cy trong Hnh 16 c ch ra trong Hnh 17:
HSPHN 1999-2004
Cu trc d liu v gii thut 71
A 1
B C D 2
E F G H I 3
J K 4
+ -
/ C D E
(A / B + C) * (D - E)
A B
L Minh Hong
72 Chuyn
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
5 5 5 5
a) b) c) d)
1 1
2 3 2 3
4 5 6 7 4 5 6 7
4 5 5
e) f)
Ta c th thy ngay nhng tnh cht sau bng php chng minh quy np:
Trong cc cy nh phn c cng s lng nt nh nhau th cy nh phn suy bin c chiu
cao ln nht, cn cy nh phn hon chnh th c chiu cao nh nht.
S lng ti a cc nt trn mc i ca cy nh phn l 2i-1, ti thiu l 1 (i 1).
S lng ti a cc nt trn mt cy nh phn c chiu cao h l 2h-1, ti thiu l h (h 1).
Cy nh phn hon chnh c n nt th chiu cao ca n l h = lg(n) + 1.
HSPHN 1999-2004
Cu trc d liu v gii thut 73
A
1
B E
2 3
C D F G
4 5 6 7
Hnh 21: nh s cc nt ca cy nh phn y biu din bng mng
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
A B C D E ...
L Minh Hong
74 Chuyn
INFO
B C
D E F G
H I J K L
HSPHN 1999-2004
Cu trc d liu v gii thut 75
L Minh Hong
76 Chuyn
6.5. CY K_PHN
Cy K_phn l mt dng cu trc cy m mi nt trn cy c ti a K nt con (c tnh n
th t ca cc nt con).
6.5.1. Biu din cy K_phn bng mng
Cng tng t nh vic biu din cy nh phn, ngi ta c th thm vo cy K_phn mt s
nt gi cho mi nt nhnh ca cy K_phn u c ng K nt con, cc nt con c xp
th t t nt con th nht ti nt con th K, sau nh s cc nt trn cy K_phn bt u
t 0 tr i, bt u t mc 1, ht mc ny n mc khc v t "tri qua phi" mi mc.
Theo cch nh s ny, nt con th j ca nt i l: i * K + j. Nt cha ca nt x l nt (x - 1) div
K. Ta c th dng mt mng T nh s t 0 lu cc gi tr trn cc nt: Gi tr ti nt th i
c lu tr phn t T[i].
0
A
3
1 J
B
2
F
M
12
G H I
C L
D 7 8 9 K 11
4 E
5 10
6
0 1 2 3 4 5 6 7 8 9 10 11 12
A B F J C D E G H I K L M
HSPHN 1999-2004
Cu trc d liu v gii thut 77
9
A
4
1
I
B
2
F
L
12
C
K
D G H
3 E J 11
5 7 8
6 10
1 2 3 4 5 6 7 8 9 10 11 12
Info: B F C I D E G H A J K L
1 2 3 4 5 6 7 8 9 10 11
Children: 3 5 6 7 8 10 11 12 1 2 4
Head: 0 3 5 5 8 8 8 8 8 11 11 11 11
1 2 3 4 5 6 7 8 9 10 11 12 13
L Minh Hong
78 Chuyn
INFO Sibling
FirstChild
HSPHN 1999-2004
Cu trc d liu v gii thut 79
+ -
/ 3 7 4
6 2
L Minh Hong
80 Chuyn
hng. Nu biu thc phc tp th my phi chia nh v tnh ring tng biu thc trung gian,
sau mi ly gi tr tm c tnh tip. V d nh biu thc 1 + 2 + 4 my s phi tnh 1
+ 2 trc c kt qu l 3 sau mi em 3 cng vi 4 ch khng th thc hin php cng
mt lc ba s c.
Khi lu tr biu thc di dng cy nh phn th ta c th coi mi nhnh con ca cy m
t mt biu thc trung gian m my cn tnh khi x l biu thc ln. Nh v d trn, my s
phi tnh hai biu thc 6 / 2 + 3 v 7 - 4 trc khi lm php tnh nhn cui cng. tnh biu
thc 6 / 2 + 3 th my li phi tnh biu thc 6 / 2 trc khi em cng vi 3.
Vy tnh mt biu thc lu tr trong mt nhnh cy nh phn gc nt n, my s tnh gn
ging nh hm quy sau:
function Calculate(n): Value; {Tnh biu thc con trong nhnh cy gc n}
begin
if <Nt n cha khng phi l mt ton t> then
Calculate := <Gi tr cha trong nt n>
else {Nt n cha mt ton t R}
begin
x := Calculate(nt con tri ca n);
y := Calculate(nt con phi ca n);
Calculate := x R y;
end;
end.
(Trong trng hp lp trnh trn cc h thng song song, vic tnh gi tr biu thc cy con
tri v cy con phi c th tin hnh ng thi lm gim ng k thi gian tnh ton biu
thc).
rng khi tnh ton biu thc, my s phi quan tm ti vic tnh biu thc hai nhnh
con trc, ri mi xt n ton t nt gc. iu lm ta ngh ti php cy theo th t sau
v k php hu t. Trong nhng nm u 1950, nh l-gic hc ngi Balan Jan Lukasiewicz
chng minh rng biu thc hu t khng cn phi c du ngoc vn c th tnh c mt
cch ng n bng cch c ln lt biu thc t tri qua phi v dng mt Stack lu
cc kt qu trung gian:
Bc 1: Khi to mt Stack rng
Bc 2: c ln lt cc phn t ca biu thc RPN t tri qua phi (phn t ny c th l
hng, bin hay ton t) vi mi phn t , ta kim tra:
Nu phn t ny l mt ton hng th y gi tr ca n vo Stack.
Nu phn t ny l mt ton t , ta ly t Stack ra hai gi tr (y v x) sau p dng ton
t vo hai gi tr va ly ra, y kt qu tm c (x y) vo Stack (ra hai vo mt).
Bc 3: Sau khi kt thc bc 2 th ton b biu thc c c xong, trong Stack ch cn
duy nht mt phn t, phn t chnh l gi tr ca biu thc.
V d: Tnh biu thc 10 2 / 3 + 7 4 - * (tng ng vi biu thc (10 / 2 + 3) * (7 - 4)
c X l Stack
10 y vo Stack 10
HSPHN 1999-2004
Cu trc d liu v gii thut 81
c X l Stack
2 y vo Stack 10, 2
3 y vo Stack 5, 3
7 y vo Stack 8, 7
4 y vo Stack 8, 7, 4
Ta c kt qu l 24
Di y ta s vit mt chng trnh n gin tnh gi tr biu thc RPN. Chng trnh s
nhn Input l biu thc RPN gm cc s thc v cc ton t + - * / v cho Output l kt qu
biu thc .
Quy nh khun dng bt buc l hai s lin nhau trong biu thc RPN phi vit cch nhau t
nht mt du cch. qu trnh c mt phn t trong biu thc RPN c d dng hn, sau
bc nhp liu, ta c th hiu chnh i cht biu thc RPN v khun dng d c nht.
Chng hn nh thm v bt mt s du cch trong Input mi phn t (ton hng, ton t)
u cch nhau ng mt du cch, thm mt du cch vo cui biu thc RPN. Khi qu
trnh c ln lt cc phn t trong biu thc RPN c th lm nh sau:
T := '';
for p := 1 to Length(RPN) do {Xt cc k t trong biu thc RPN t tri qua phi}
if RPN[p] ' ' then T := T + RPN[p] {Nu RPN[p] khng phi du cch th ni k t vo T}
else {Nu RPN[p] l du cch th phn t ang c c xong, tip theo s l phn t khc}
begin
<X l phn t T>
T := ''; {Chun b c phn t mi}
end;
n gin, chng trnh khng kim tra li vit sai biu thc RPN, vic ch l thao tc t
m ch khng phc tp lm, ch cn xem li thut ton v ci thm cc m-un bt li ti mi
bc.
Input Output
Enter RPN Expression: 10 2/3 + 4 7 -* 10 2 / 3 + 4 7 - * = 24.0000
P_2_07_1.PAS * Tnh gi tr biu thc RPN
{$N+, E+}
program CalculateRPNExpression;
const
Opt = ['+', '-', '*', '/'];
var
T, RPN: String;
Stack: array[1..255] of Extended;
p, Top: Integer;
{Cc thao tc i vi Stack}
procedure StackInit;
begin
Top := 0;
L Minh Hong
82 Chuyn
end;
procedure Refine(var S: String); {Hiu chnh biu thc RPN v khun dng d c nht}
var
i: Integer;
begin
S := S + ' ';
for i := Length(S) - 1 downto 1 do {Thm nhng du cch gia ton hng v ton t}
if (S[i] in Opt) or (S[i + 1] in Opt) then
Insert(' ', S, i + 1);
for i := Length(S) - 1 downto 1 do {Xo nhng du cch tha}
if (S[i] = ' ') and (S[i + 1] = ' ') then Delete(S, i + 1, 1);
end;
begin
Write('Enter RPN Expression: '); ReadLn(RPN);
Refine(RPN);
StackInit;
T := '';
for p := 1 to Length(RPN) do {Xt cc k t ca biu thc RPN t tri qua phi}
if RPN[p] <> ' ' then T := T + RPN[p] {nu khng phi du cch th ni n vo sau xu T}
else {Nu gp du cch}
begin
Process(T); {X l phn t va c xong}
T := ''; {t li T chun b c phn t mi}
end;
WriteLn(RPN, ' = ', Pop:0:4); {In gi tr biu thc RPN c lu trong Stack}
end.
HSPHN 1999-2004
Cu trc d liu v gii thut 83
( y vo Stack (
2 Hin th ( 2
3 Hin th (* 23
7 Hin th (+ 23*7
L Minh Hong
84 Chuyn
c X l Stack Output
( y vo Stack *(
5 Hin th *( 23*78/+5
Di y l chng trnh chuyn biu thc vit dng trung t sang dng RPN. Biu thc
trung t u vo s c hiu chnh sao cho mi thnh phn ca n c cch nhau ng mt
du cch, v thm mt du cch vo cui cho d tch cc phn t ra x l. V Stack ch
dng cha cc ton t v du ngoc m nn c th m t Stack di dng xu k t cho
n gin.
V d v Input / Output ca chng trnh:
Input Output
Infix: (10*3 + 7 /8) * (5-1) Refined: ( 10 * 3 + 7 / 8 ) * ( 5 - 1 )
RPN: 10 3 * 7 8 / + 5 1 - *
P_2_07_2.PAS * Chuyn biu thc trung t sang dng RPN
program ConvertInfixToRPN;
const
Opt = ['(', ')', '+', '-', '*', '/'];
var
T, Infix, Stack: String; {Stack dng cha ton t v du ngoc m nn dng String cho tin}
p: Integer;
HSPHN 1999-2004
Cu trc d liu v gii thut 85
end;
procedure Refine(var S: String); {Hiu chnh biu thc trung t v khun dng d c nht}
var
i: Integer;
begin
S := S + ' ';
for i := Length(S) - 1 downto 1 do {Thm nhng du cch trc v sau mi ton t v du ngoc}
if (S[i] in Opt) or (S[i + 1] in Opt) then
Insert(' ', S, i + 1);
for i := Length(S) - 1 downto 1 do {Xo nhng du cch tha}
if (S[i] = ' ') and (S[i + 1] = ' ') then Delete(S, i + 1, 1);
end;
begin
Write('Infix = '); ReadLn(Infix);
Refine(Infix);
WriteLn('Refined: ', Infix);
Write('RPN: ');
T := '';
for p := 1 to Length(Infix) do
if Infix[p] <> ' ' then T := T + Infix[p]
else
begin
Process(T);
T := '';
end;
while Stack <> '' do Write(Pop, ' ');
WriteLn;
end.
L Minh Hong
86 Chuyn
HSPHN 1999-2004
Cu trc d liu v gii thut 87
8. SP XP (SORTING)
8.1. BI TON SP XP
Sp xp l qu trnh b tr li cc phn t ca mt tp i tng no theo mt th t nht
nh. Chng hn nh th t tng dn (hay gim dn) i vi mt dy s, th t t in i vi
cc t v.v Yu cu v sp xp thng xuyn xut hin trong cc ng dng Tin hc vi cc
mc ch khc nhau: sp xp d liu trong my tnh tm kim cho thun li, sp xp cc
kt qu x l in ra trn bng biu v.v
Ni chung, d liu c th xut hin di nhiu dng khc nhau, nhng y ta quy c: Mt
tp cc i tng cn sp xp l tp cc bn ghi (records), mi bn ghi bao gm mt s
trng (fields) khc nhau. Nhng khng phi ton b cc trng d liu trong bn ghi u
c xem xt n trong qu trnh sp xp m ch l mt trng no (hay mt vi trng
no ) c ch ti thi. Trng nh vy ta gi l kho (key). Sp xp s c tin hnh
da vo gi tr ca kho ny.
V d: H s tuyn sinh ca mt trng i hc l mt danh sch th sinh, mi th sinh c tn,
s bo danh, im thi. Khi mun lit k danh sch nhng th sinh trng tuyn tc l phi sp
xp cc th sinh theo th t t im cao nht ti im thp nht. y kho sp xp chnh l
im thi.
1 A100 Nguyn Vn A 20
2 B200 Trn Th B 25
3 X150 Phm Vn C 18
4 G180 Th D 21
L Minh Hong
88 Chuyn
c th thc hin c bng cch da vo trng lin kt ca bn ghi tng ng thuc bng
kho.
Nh v d trn, ta c th xy dng bng kho gm 2 trng, trng kho cha im v
trng lin kt cha s th t ca ngi c im tng ng trong bng ban u:
im thi STT
20 1
25 2
18 3
21 4
Sau khi sp xp theo trt t im cao nht ti im thp nht, bng kho s tr thnh:
im thi STT
25 2
21 4
20 1
18 3
HSPHN 1999-2004
Cu trc d liu v gii thut 89
Do kho c vai tr c bit nh vy nn sau ny, khi trnh by cc gii thut, ta s coi kho
nh i din cho cc bn ghi v cho n gin, ta ch ni ti gi tr ca kho m thi. Cc
thao tc trong k thut sp xp l ra l tc ng ln ton bn ghi gi y ch lm trn kho.
Cn vic ci t cc phng php sp xp trn danh sch cc bn ghi v k thut sp xp
bng ch s, ta coi nh bi tp.
Bi ton sp xp gi y c th pht biu nh sau:
Xt quan h th t ton phn "nh hn hoc bng" k hiu "" trn mt tp hp S, l quan h
hai ngi tho mn bn tnh cht:
Vi a, b, c S
Tnh ph bin: Hoc l a b, hoc b a;
Tnh phn x: a a
Tnh phn i xng: Nu a b v b a th bt buc a = b.
Tnh bc cu: Nu c a b v b c th a c.
Trong trng hp a b v a b, ta dng k hiu "<" cho gn
Cho mt dy k[1..n] gm n kho. Gia hai kho bt k c quan h th t ton phn "". Xp
li dy cc kho c dy kho tho mn k[1] k[2] k[n].
Gi s cu trc d liu cho dy kho c m t nh sau:
const
n = ; {S kho trong dy kho, c th khai bo di dng bin s nguyn tu bin hn}
type
TKey = ; {Kiu d liu mt kho}
TArray = array[1..n] of TKey;
var
k: TArray; {Dy kho}
Th nhng thut ton sp xp di y c vit di dng th tc sp xp dy kho k, kiu
ch s nh cho tng kho trong dy c th coi l s nguyn Integer.
L Minh Hong
90 Chuyn
procedure SelectionSort;
var
i, j, jmin: Integer;
begin
for i := 1 to n - 1 do {Lm n - 1 lt}
begin
{Chn trong s cc kho trong on k[i..n] ra kho k[jmin] nh nht}
jmin := i;
for j := i + 1 to n do
if k[j] < k[jmin] then jmin := j;
if jmin i then
<o gi tr ca k[jmin] cho k[i]>
end;
end;
i vi phng php kiu la chn, c th coi php so snh (k[j] < k[jmin]) l php ton tch
cc nh gi hiu sut thut ton v mt thi gian. lt th i, chn ra kho nh nht
bao gi cng cn n - i php so snh, s lng php so snh ny khng h ph thuc g vo
tnh trng ban u ca dy kho c. T suy ra tng s php so snh s phi thc hin l:
(n - 1) + (n - 2) + + 1 = n * (n - 1) / 2
Vy thut ton sp xp kiu chn c phc tp tnh ton l O(n2)
HSPHN 1999-2004
Cu trc d liu v gii thut 91
procedure InsertionSort;
var
i, j: Integer;
tmp: TKey; {Bin gi li gi tr kho chn}
begin
for i := 2 to n do {Chn gi tr k[i] vo dy k[1..i-1] ton on k[1..i] tr thnh sp xp}
begin
tmp := k[i]; {Gi li gi tr k[i]}
j := i - 1;
while (j > 0) and (tmp < k[j]) do {So snh gi tr cn chn vi ln lt cc kho k[j] (i-1j0)}
begin
k[j+1] := k[j]; {y li gi tr k[j] v pha sau mt v tr, to ra "khong trng" ti v tr j}
j := j - 1;
end;
k[j+1] := tmp; {a gi tr chn vo "khong trng" mi to ra}
end;
end;
i vi thut ton sp xp kiu chn, th chi ph thi gian thc hin thut ton ph thuc vo
tnh trng dy kho ban u. Nu coi php ton tch cc y l php so snh tmp < k[j] th:
Trng hp tt nht ng vi dy kho sp xp ri, mi lt ch cn 1 php so snh, v nh
vy tng s php so snh c thc hin l n - 1. Phn tch trong trng hp tt nht, phc
tp tnh ton ca InsertionSort l (n)
Trng hp ti t nht ng vi dy kho c th t ngc vi th t cn sp th lt th i,
cn c i - 1 php so snh v tng s php so snh l:
(n - 1) + (n - 2) + + 1 = n * (n - 1) / 2.
Vy phn tch trong trng hp tt nht, phc tp tnh ton ca InsertionSort l (n2)
Trng hp cc gi tr kho xut hin mt cch ngu nhin, ta c th coi xc sut xut hin
mi kho l ng kh nng, th c th coi lt th i, thut ton cn trung bnh i / 2 php so
snh v tng s php so snh l:
(1 / 2) + (2 / 2) + + (n / 2) = (n + 1) * n / 4.
Vy phn tch trong trng hp trung bnh, phc tp tnh ton ca InsertionSort l (n2).
Nhn v kt qu nh gi, ta c th thy rng thut ton sp xp kiu chn t ra tt hn so vi
thut ton sp xp chn v sp xp ni bt. Tuy nhin, chi ph thi gian thc hin ca thut
ton sp xp kiu chn vn cn kh ln.
C th ci tin thut ton sp xp chn nh nhn xt: Khi dy kho k[1..i-1] c sp xp
th vic tm v tr chn c th lm bng thut ton tm kim nh phn v k thut chn c th
lm bng cc lnh dch chuyn vng nh cho nhanh. Tuy nhin iu cng khng lm gim
i phc tp ca thut ton bi trong trng hp xu nht, ta phi mt n - 1 ln chn v ln
chn th i ta phi dch li i kho to ra khong trng trc khi y gi tr kho chn vo
ch trng .
L Minh Hong
92 Chuyn
procedure InsertionSortwithBinarySearching;
var
i, inf, sup, median: Integer;
tmp: TKey;
begin
for i := 2 to n do
begin
tmp := k[i]; {Gi li gi tr k[i]}
inf := 1; sup := i - 1; {Tm ch chn gi tr tmp vo on t k[inf] ti k[sup+1]}
repeat {Sau mi vng lp ny th on tm b co li mt na}
median := (inf + sup) div 2; {Xt ch s nm gia ch s inf v ch s sup}
if tmp < k[median] then sup := median - 1
else inf := median + 1;
until inf > sup; { Kt thc vng lp th inf = sup + 1 chnh l v tr chn}
<Dch cc kho t k[inf] ti k[i-1] li sau mt v tr>
k[inf] := tmp; {a gi tr tmp vo "khong trng" mi to ra}
end;
end;
8.5. SHELLSORT
Nhc im ca thut ton sp xp kiu chn th hin khi m ta lun phi chn mt kha vo
v tr gn u dy. Trong trng hp , ngi ta s dng phng php ShellSort.
Xt dy kho: k[1..n]. Vi mt s nguyn dng h: 1 h n, ta c th chia dy thnh h
dy con:
Dy con 1: k[1], k[1+h], k[1 + 2h],
Dy con 2: k[2], k[2+h], k[2 + 2h],
Dy con 1: 4 2 1
Dy con 2: 6 3 9
Dy con 3: 7 5 8
Nhng dy con nh vy c gi l dy con xp theo di bc h. T tng ca thut ton
ShellSort l: Vi mt bc h, p dng thut ton sp xp kiu chn tng dy con c lp
lm mn dn dy kho chnh. Ri li lm tng t i vi bc h div 2 cho ti khi h = 1 th
ta c dy kho sp xp.
Nh v d trn, nu dng thut ton sp xp kiu chn th khi gp kho k[7] = 1, l kho nh
nht trong dy kho, n phi chn vo v tr 1, tc l phi thao tc trn 6 kho ng trc n.
Nhng nu coi 1 l kho ca dy con 1 th n ch cn chn vo trc 2 kho trong dy con
m thi. y chnh l nguyn nhn ShellSort hiu qu hn sp xp chn: Kho nh c
nhanh chng a v gn v tr ng ca n.
HSPHN 1999-2004
Cu trc d liu v gii thut 93
procedure ShellSort;
var
i, j, h: Integer;
tmp: TKey;
begin
h := n div 2;
while h <> 0 do {Lm mn dy vi di bc h}
begin
for i := h + 1 to n do
begin {Sp xp chn trn dy con a[i-h], a[i], a[i+h], a[i+2h], }
tmp := k[i]; j := i - h;
while (j > 0) and (k[j] > tmp) do
begin
k[j+h] := k[j];
j := j - h;
end;
k[j+h] := tmp;
end;
h := h div 2;
end;
end;
Trn y l phin bn nguyn thu ca ShellSort do D.L.Shell a ra nm 1959. di bc
c em div 2 sau mi ln lp. D thy rng ShellSort hot ng ng th ch cn dy
bc h gim dn v 1 sau mi bc lp l c, c mt s nghin cu v vic chn dy
bc h cho ShellSort nhm tng hiu qu ca thut ton.
ShellSort hot ng nhanh v d ci t, tuy vy vic nh gi phc tp tnh ton ca
ShellSort l tng i kh, ta ch tha nhn cc kt qu sau y:
Nu cc bc h c chn theo th t ngc t dy 1, 3, 7, 15, , 2i-1, th phc tp
tnh ton ca ShellSort l O(n3/2).
Nu cc bc h c chn theo th t ngc t dy 1, 8, 23, 77, , 4i+1 + 3.2i + 1, th
phc tp tnh ton ca ShellSort l O(n4/3).
Nu cc bc h c chn theo th t ngc t dy 1, 2, 3, 4, 6, 8, 9, 12, 16, , 2i3j, (dy
tng dn ca cc phn t dng 2i3j) th phc tp tnh ton ca ShellSort l O(n(logn)2).
L Minh Hong
94 Chuyn
begin
Partition(1, n);
end;
Ta th phn tch xem ti sao on chng trnh trn hot ng ng: Xt vng lp
repeatuntil trong ln lp u tin, vng lp while th nht chc chn s tm c kho k[i]
kho cht bi chc chn tn ti trong on mt kho bng kha cht. Tng t nh vy,
vng lp while th hai chc chn tm c kho k[j] kho cht. Nu nh kho k[i] ng
trc kho k[j] th ta o gi tr hai kho, cho i tin v j li. Khi ta c nhn xt rng mi
kho ng trc v tr i s phi kho cht v mi kho ng sau v tr j s phi kho cht.
kL ki kj kH
HSPHN 1999-2004
Cu trc d liu v gii thut 95
Sau mi php hon chuyn, mi kho ng trc v tr i lun kho cht v mi kho
ng sau v tr j lun kho cht.
Vng lp repeat until s kt thc khi m ch s i ng pha sau ch s j (Hnh 30).
kL kj ki kH
Kho cht
Kho cht
Theo nhng nhn xt trn, nu c mt kho nm gia k[j] v k[i] th kho phi ng bng
kho cht v n c t v tr ng ca n, nn c th b qua kho ny m ch xt hai
on hai u. Cng vic cn li l gi quy lm tip vi on t k[L] ti k[j] v on
t k[i] ti k[H]. Hai on ny ngn hn on ang xt bi v L j < i H. Vy thut ton
khng bao gi b ri vo qu trnh v hn m s dng v cho kt qu ng n.
Xt v phc tp tnh ton, trng hp tt nht l ti mi bc chn cht phn on, ta
chn ng trung v ca dy kho (gi tr s ng gia dy khi sp th t), khi phc tp
tnh ton ca QuickSort l (nlgn). Trng hp ti t nht l ti mi bc chn cht phn
on, ta chn ng vo kho ln nht hoc nh nht ca dy kho, to ra mt on gm 1
kho v on cn li gm n - 1 kho, khi phc tp tnh ton ca QuickSort l (n2).
Thi gian thc hin gii thut QuickSort trung bnh l (nlgn). Vic chng minh cc kt qu
ny phi s dng nhng cng c ton hc phc tp, ta tha nhn nhng iu ni trn.
8.6.2. Trung v v th t thng k (median and order statistics)
Vic chn cht cho php phn on quyt nh hiu qu ca QuickSort, nu chn cht khng
tt, rt c th vic phn on b suy bin thnh trng hp xu khin QuickSort hot ng
chm v trn ngn xp chng trnh con khi gp phi dy chuyn qui qu di. Nhng v d
sau y cho thy vi mt chin lc chn cht ti c th d dng tm ra nhng b d liu
khin QuickSort hot ng chm.
Vi m kh ln:
Nu nh chn cht l kho u on (Pivot := k[L]) hay chn cht l kho cui on
(Pivot := k[H]) th QuickSort s tr thnh "Slow"Sort vi dy (1, 2, , m).
Nu nh chn cht l kho gia on (Pivot := k[(L+H) div 2]) th QuickSort cng tr
thnh "Slow"Sort vi dy (1, 2, , m-1, m, m, m-1, , 2, 1).
Trong trng hp chn cht l kho nm v tr ngu nhin trong on, tht kh c th
tm ra mt b d liu khin cho QuickSort hot ng chm. Nhng ta cng cn hiu rng
vi mi thut ton to s ngu nhin, trong m! dy hon v ca dy (1, 2, m) th no
cng c mt dy lm QuickSort b suy bin, tuy nhin xc sut xy ra dy ny qu nh v
cng rt kh ch ra nn vic s dng cch chn cht l kho nm v tr ngu nhin c
th coi l an ton vi cc trng hp suy bin ca QuickSort.
L Minh Hong
96 Chuyn
Phn "trung v v th t thng k" ny c trnh by trong ni dung tho lun v QuickSort
bi n cung cp mt chin lc chn cht "p" trn l thuyt, ngha l trong trng hp xu
nht, phc tp tnh ton ca QuickSort cng ch l O(nlgn) m thi. gii quyt vn
suy bin ca QuickSort, ta xt bi ton tm trung v ca dy kho v bi ton tng qut hn:
Bi ton th t thng k (Order statistics).
Bi ton: Cho dy kho k1, k2, , kn, hy ch ra kho s ng th p trong dy khi sp th t.
Khi p = n div 2 th bi ton th t thng k tr thnh bi ton tm trung v ca dy kho. Sau
y ta s ni v mt s cch gii quyt bi ton th t thng k vi mc tiu cui cng l tm
ra mt thut ton gii bi ton ny vi phc tp trong trng hp xu nht l O(n)
Cch t nht m ai cng c th ngh ti l sp xp li ton b dy k v a ra kho ng th p
ca dy sp. Trong cc thut ton sp xp tng qut m ta tho lun trong bi, khng thut
ton no cho php thc hin vic ny vi phc tp xu nht v trung bnh l (n) c.
Cch th hai l sa i mt cht th tc Partition ca QuickSort: th tc Partition chn kho
cht v chia on ang xt lm hai on con (thc ra l ba): Cc kho ca on u cht,
cc kho ca on gia = cht, cc kho ca on sau cht. Khi ta hon ton c th xc
nh c kho cn tm nm on no. Nu kho nm on gia th ta ch vic tr v
gi tr kho cht. Nu kho nm on u hay on sau th ch cn gi quy lm tng
t vi mt trong hai on ch khng cn gi quy sp xp c hai on nh QuickSort.
{
Input: Dy kho k[1..n], s p (1 p n)
Output: Gi tr kho ng th p trong dy sau khi sp th t c tr v trong li gi hm Select(1, n)
}
function Select(L, H: Integer): TKey; {Tm trong on k[L..H]}
var
Pivot: TKey;
i, j: Integer;
begin
Pivot := k[Random(H - L + 1) + L];
i := L; j := H;
repeat
while k[i] < Pivot do i := i + 1;
while k[j] > Pivot do j := j - 1;
if i j then
begin
if i < j then o gi tr k[i] v k[j];
i := i + 1; j := j - 1;
end;
until i > j;
{Xc nh kho cn tm nm on no}
if p j then Select := Select(L, j) {Kho cn tm nm trong on u}
else
if p i then Select := Select(i, H) {Kho cn tm nm trong on sau}
else Select := Pivot; {Kho cn tm nm on gia, ch cn tr v Pivot}
end;
Cch th hai tt hn cch th nht khi phn tch phc tp trung bnh v thi gian thc
hin gii thut (C th chng minh c l O(n)). Tuy nhin trong trng hp xu nht, gii
thut ny vn c phc tp O(n2) khi cn ch ra kho ln nht ca dy kho v cht Pivot
HSPHN 1999-2004
Cu trc d liu v gii thut 97
Nu cui cng qu trnh chia nhm cn li t hn 5 kho (do di on k[L..H] khng chia
ht cho 5), ta b qua khng xt nhng kho d tha ny.
Vi mi nhm 5 kho k trn, ta tm trung v ca nhm (gi tt l trung v nhm - kho ng
th 3 khi sp th t 5 kho) v y trung v nhm ra u on k[L..H] theo th t:
Trung v ca k[L + 0..L + 4] s c o gi tr cho k[L]
Trung v ca k[L + 5..L + 9] s c o gi tr cho k[L + 1]
L Minh Hong
98 Chuyn
HSPHN 1999-2004
Cu trc d liu v gii thut 99
Ta s ch ra rng phc tp tnh ton ca thut ton trn l O(n) trong trng hp xu nht.
Nu gi T(n) l thi gian thc hin hm Select trong trng hp xu nht vi di dy kho
k[L..H] bng n. Ta c:
c1 , if n 50
T(n) n 3n
c 2 .n + T 5 + T 4
Bi khi n 50 th thut ton sp xp chn s c thc hin, c th coi on chng trnh ny
kt thc trong thi gian c1 vi c1 l mt hng s ln. Khi n > 50, nhn vo cc on m
trong hm Select, lnh Pivot := Select(L, j, (j - L + 1) div 2) c thi gian thc hin T(n div 5).
Lnh Select := Select(L, j, ) c thi gian thc hin khng qu T(3n/4) do tnh cht ca Pivot.
Thi gian thc hin cc lnh khc trong hm Select tng li c th coi l khng qu c2.n vi c2
l mt hng s ln. t c = max(c1, 20c2), ta c:
Vi 1 n 50, r rng T(n) c1 c.n. Gi thit quy np rng T(m) c.m vi m < n, ta s
chng minh T(n) c.n, tht vy:
n 3n 1 1 3
T(n) c 2 .n + c. + c. c. .n + c. .n + c. .n = c.n
5 4 20 5 4
Ta c iu phi chng minh: T(n) = O(n). S b n ca vic chn s 5 cho kch thc nhm
c gii thch (1/5 + 3/4 < 1)
8.6.3. Kt lun:
C th gii bi ton th t thng k bng thut ton c phc tp O(n) trong trng hp
xu nht.
C th ci t thut ton QuickSort vi phc tp O(nlgn) trong trng hp xu nht bi
ti mi ln phn on ca QuickSort ta c th tm c trung v ca dy trong thi gian
O(n) bng vic gii quyt bi ton th t thng k
Cho ti thi im ny, khi gii mi bi ton c cha th tc sp xp, c th coi l c cch
ci t thi gian thc hin th tc sp xp l O(nlgn) vi mi tnh trng d liu.
L Minh Hong
100 Chuyn
10
9 6
7 8 4 1
3 2 5
8.7.2. Vun ng
Trong bi 6, ta bit mt dy kho k[1..n] l biu din ca mt cy nh phn hon chnh m
k[i] l gi tr lu trong nt th i, nt con ca nt th i l nt 2i v nt 2i + 1, nt cha ca nt
th j l nt j div 2. Vn t ra l sp li dy kho cho n biu din mt ng.
V cy nh phn ch gm c mt nt hin nhin l ng, nn vun mt nhnh cy gc r
thnh ng, ta c th coi hai nhnh con ca n (nhnh gc 2r v 2r + 1) l ng ri v
thc hin thut ton vun ng t di ln (bottom-up) i vi cy: Gi h l chiu cao ca cy,
nt mc h (nt l) l gc mt ng, ta vun ln nhng nt mc h - 1 cng l gc ca
ng, c nh vy cho ti nt mc 1 (nt gc) cng l gc ca ng.
Thut ton vun thnh ng i vi cy gc r, hai nhnh con ca r l ng ri:
Gi s nt r cha gi tr V. T r, ta c i ti nt con cha gi tr ln nht trong 2 nt con,
cho ti khi gp phi mt nt c m mi nt con ca c u cha gi tr V (nt l cng l
trng hp ring ca iu kin ny). Dc trn ng i t r ti c, ta y gi tr cha nt con
ln nt cha v t gi tr V vo nt c.
4
10
10 9
8 9
7 8 6 1
7 4 6 1
3 5 2
3 5 2
HSPHN 1999-2004
Cu trc d liu v gii thut 101
tnh ti k[n] na (Hnh 33). Cn li dy kho k[1..n-1] tuy khng cn l biu din ca mt
ng na nhng n li biu din cy nh phn hon chnh m hai nhnh cy nt th 2 v nt
th 3 (hai nt con ca nt 1) l ng ri. Vy ch cn vun mt ln, ta li c mt ng,
o gi tr k[1] cho k[n-1] v tip tc cho ti khi ng ch cn li 1 nt (Hnh 34).
V d:
10 2
8 9 8 9
7 4 6 1 7 4 6 1
3 5 2 3 5 10
9 5
8 6 8 6
7 4 2 1 7 4 2 1
3 5 3 9
L Minh Hong
102 Chuyn
procedure HeapSort;
var
r, i: Integer;
HSPHN 1999-2004
Cu trc d liu v gii thut 103
L Minh Hong
104 Chuyn
bit 3 2 1 0
11 = 1 0 1 1 (z = 4)
HSPHN 1999-2004
Cu trc d liu v gii thut 105
001 011 111 110 101 010 011 100 100 101 110 111
001 011 011 010 101 110 111 100 100 101 110 111
001 011 011 010 101 101 100 100 111 110 110 111
001 010 011 011 100 100 101 101 110 110 111 111
L Minh Hong
106 Chuyn
procedure RadixExchangeSort;
var
z: Integer; { di dy bit biu din mi kho}
begin
Da vo gi tr ln nht ca dy kho, xc nh z l di dy bit biu din mi kho;
Partition(1, n, z - 1);
end;
Vi Radix Exchange Sort, ta hon ton c th lm trn h c s R khc ch khng nht thit
phi lm trn h nh phn ( tng cng tng t nh trn), tuy nhin qu trnh phn on s
khng phi chia lm 2 m chia thnh R on. V phc tp ca thut ton, ta thy phn
on bng mt bit th thi gian s l C.n chia tt c cc on cn chia bng bit (C l
hng s). Vy tng thi gian phn on bng z bit s l C.n.z. Trong trng hp xu nht,
phc tp ca Radix Exchange Sort l O(n.z). V phc tp trung bnh ca Radix Exchange
Sort l O(n.min(z, lgn)).
Ni chung, Radix Exchange Sort ci t nh trn ch th hin tc ti a trn cc h thng
cho php x l trc tip trn cc bit: H thng phi cho php ly mt bit ra d dng v thao
tc vi thi gian nhanh hn hn so vi thao tc trn Byte v Word. Khi Radix Exchange
Sort s tt hn nhiu QuickSort. (Ta th lp trnh sp xp cc dy nh phn di z theo th
t t in kho st). Trn cc my tnh hin nay ch cho php x l trc tip trn Byte (hay
Word, DWord v.v), vic tch mt bit ra khi Byte x l li rt chm v lm nh
hng khng nh ti tc ca Radix Exchange Sort. Chnh v vy, tuy y l mt phng
php hay, nhng khi ci t c th th tc cng ch ngang nga ch khng th qua mt
QuickSort c.
8.10.2. Sp xp c s trc tip (Straight Radix Sort)
Ta s trnh by phng php sp xp c s trc tip bng mt v d: Sp xp dy kho:
925 817 821 638 639 744 742 563 570 166
HSPHN 1999-2004
Cu trc d liu v gii thut 107
570 821 742 563 744 925 166 817 638 639
817 821 925 638 639 742 744 563 166 570
V thut ton sp xp ta s dng l n nh, nn nu hai kho c ch s hng chc ging nhau
th kho no c ch s hng n v nh hn s ng trc. Ni nh vy c ngha l dy kho
thu c s c th t tng dn v gi tr to thnh t hai ch s cui.
Cui cng, ta sp xp li dy kho theo th t tng dn ca ch s hng trm cng bng mt
thut ton sp xp n nh, thu c dy kho:
166 563 570 638 639 742 744 817 821 925
L Minh Hong
108 Chuyn
procedure StraightRadixSort;
const
radix = ; {Tu chn h c s radix cho hp l}
var
t: TArray; {Dy kho ph}
p: Integer;
nDigit: Integer; {S ch s cho mt kho, nh s t ch s th 0 l hng n v n ch s th nDigit - 1}
Flag: Boolean; {Flag = True th sp dy k, ghi kt qu vo dy t; Flag = False th sp dy t, ghi kq vo k}
HSPHN 1999-2004
Cu trc d liu v gii thut 109
3 6 5 4 9 8 1 0 2 7
3 6 4 5 8 9 0 1 2 7
3 4 5 6 0 1 8 9 2 7
0 1 3 4 5 6 8 9 2 7
0 1 2 3 4 5 6 7 8 9
tin hnh thut ton sp xp trn hai ng trc tip, ta vit cc th tc:
L Minh Hong
110 Chuyn
HSPHN 1999-2004
Cu trc d liu v gii thut 111
procedure MergeSort;
var
t: TArray; {Dy kho ph}
len: Integer;
Flag: Boolean; {Flag = True: trn cc mch trong k vo t; Flag = False: trn cc mch trong t vo k}
L Minh Hong
112 Chuyn
Cng l nhng thut ton sp xp tng qut vi phc tp trung bnh nh nhau, nhng
khng ging nh QuickSort hay HeapSort, MergeSort c tnh n nh. Nhc im ca
MergeSort l n phi dng thm mt vng nh cha dy kho ph c kch thc bng dy
kho ban u.
Ngi ta cn c th li dng c trng thi d liu vo khin MergeSort chy nhanh hn:
ngay t u, ta khng coi mi kho ca dy kho l mt mch m coi nhng on c
sp trong dy kho l mt mch. Bi mt dy kho bt k c th coi l gm cc mch sp
xp nm lin tip nhau. Khi ngi ta gi phng php ny l phng php trn hai
ng t nhin.
Tng qut hn na, thay v php trn hai mch, ngi ta c th s dng php trn k mch, khi
ta c thut ton sp xp trn k ng.
8.12. CI T
Ta s ci t tt c cc thut ton sp xp nu trn, vi d liu vo c t trong file vn bn
SORT.INP cha khng nhiu hn 15000 kho v gi tr mi kho l s t nhin khng qu
15000. Kt qu c ghi ra file vn bn SORT.OUT cha dy kho c sp, mi kho trn
mt dng.
SORT.INP SORT.OUT
14325 1
798 2
10 6 3
4
5
6
7
8
9
10
Chng trnh c giao din di dng menu, mi chc nng tng ng vi mt thut ton sp
xp. Ti mi thut ton sp xp, ta thm mt vi lnh o thi gian thc t ca n (ch o thi
gian thc hin gii thut, khng tnh thi gian nhp liu v in kt qu).
thut ton Radix Exchange Sort, ta chn h nh phn. thut ton Straight Radix Sort, ta
s dng h c s 256, khi mt gi tr s t nhin x 15000 s c biu din bng hai ch
s trong h 256:
Ch s hng n v l x mod 256 = x mod 28 = x and 255 = x and $FF;
Ch s cn li (= ch s hng cao nht) l x div 256 = x div 28 = x shr 8;
P_2_08_1.PAS * Cc thut ton sp xp
{$M 65520 0 655360}
program SortingAlgorithmsDemo;
uses crt;
const
InputFile = 'SORT.INP';
OutputFile = 'SORT.OUT';
max = 15000;
maxV = 15000;
HSPHN 1999-2004
Cu trc d liu v gii thut 113
L Minh Hong
114 Chuyn
ch := ReadKey; Writeln(ch);
if Upcase(ch) = 'P' then
begin
for i := 1 to n do Write(k[i]:8);
Writeln;
Write('Press any key to return to menu...');
ReadKey;
end;
end;
{ BubbleSort}
procedure BubbleSort;
var
i, j: Integer;
begin
Enter;
for i := 2 to n do
for j := n downto i do
if k[j - 1] > k[j] then Swap(k[j - 1], k[j]);
PrintResult;
end;
{ InsertionSort}
procedure InsertionSort;
var
i, j, tmp: Integer;
begin
Enter;
for i := 2 to n do
begin
tmp := k[i]; j := i - 1;
while (j > 0) and (tmp < k[j]) do
begin
k[j + 1] := k[j];
Dec(j);
end;
k[j + 1] := tmp;
end;
PrintResult;
HSPHN 1999-2004
Cu trc d liu v gii thut 115
end;
{ ShellSort}
procedure ShellSort;
var
tmp: Integer;
i, j, h: Integer;
begin
Enter;
h := n shr 1;
while h <> 0 do
begin
for i := h + 1 to n do
begin
tmp := k[i]; j := i - h;
while (j > 0) and (k[j] > tmp) do
begin
k[j + h] := k[j];
j := j - h;
end;
k[j + h] := tmp;
end;
h := h shr 1;
end;
PrintResult;
end;
{ QuickSort}
procedure QuickSort;
L Minh Hong
116 Chuyn
begin
if i < j then Swap(k[i], k[j]);
Inc(i); Dec(j);
end;
until i > j;
Partition(L, j); Partition(i, H);
end;
begin
Enter;
Partition(1, n);
PrintResult;
end;
{ HeapSort}
procedure HeapSort;
var
r, i: Integer;
begin
Enter;
for r := n shr 1 downto 1 do Adjust(r, n);
for i := n downto 2 do
begin
Swap(k[1], k[i]);
Adjust(1, i - 1);
end;
PrintResult;
end;
{ Distribution Counting}
procedure DistributionCounting;
var
x: TArr;
c: TCount;
i, V: Integer;
begin
Enter;
FillChar(c, SizeOf(c), 0);
for i := 1 to n do Inc(c[k[i]]);
for V := 1 to MaxV do c[V] := c[V - 1] + c[V];
for i := n downto 1 do
begin
V := k[i];
x[c[V]] := k[i];
Dec(c[V]);
end;
k := x;
HSPHN 1999-2004
Cu trc d liu v gii thut 117
PrintResult;
end;
begin
Enter;
for i := 0 to MaxBit do MaskBit[i] := 1 shl i;
maxValue := k[1];
for i := 2 to n do
if k[i] > MaxValue then maxValue := k[i];
i := 0;
while (i < MaxBit) and (MaskBit[i + 1] <= MaxValue) do Inc(i);
Partition(1, n, i);
PrintResult;
end;
L Minh Hong
118 Chuyn
for i := 1 to n do
begin
d := GetDigit(x[i], p); Inc(c[d]);
end;
for d := 1 to Radix - 1 do c[d] := c[d - 1] + c[d];
for i := n downto 1 do
begin
d := GetDigit(x[i], p);
y[c[d]] := x[i];
Dec(c[d]);
end;
end;
begin
Enter;
Flag := True;
for p := 0 to nDigit - 1 do
begin
if Flag then DCount(k, t, p)
else DCount(t, k, p);
Flag := not Flag;
end;
if not Flag then k := t;
PrintResult;
end;
{ MergeSort}
procedure MergeSort;
var
t: TArr;
Flag: Boolean;
len: Integer;
HSPHN 1999-2004
Cu trc d liu v gii thut 119
begin
Enter;
len := 1; Flag := True;
FillChar(t, SizeOf(t), 0);
while len < n do
begin
if Flag then MergeByLength(k, t, len)
else MergeByLength(t, k, len);
len := len shl 1;
Flag := not Flag;
end;
if not Flag then k := t;
PrintResult;
end;
{---------------- End of Sorting Algorithms ----------------}
begin
repeat
selected := MenuSelect;
Writeln(SMenu[selected]);
case selected of
0: PrintInput;
1: SelectionSort;
2: BubbleSort;
3: InsertionSort;
4: AdvancedInsertionSort;
5: ShellSort;
6: QuickSort;
7: HeapSort;
8: DistributionCounting;
9: RadixExchangeSort;
10: StraightRadixSort;
11: MergeSort;
12: Halt;
end;
until False;
end.
L Minh Hong
120 Chuyn
tnh v cng c lp trnh khc, kt qu c th khc. Tuy vy, vic o thi gian thc thi ca
tng thut ton sp xp vn cn thit nu ta mun so snh tc ca cc thut ton cng cp
phc tp bi cc tnh ton trn l thuyt i khi b lch so vi thc t v nhiu l do khc nhau.
C mt vn t ra l ngoi nhng thut ton sp xp cp O(n2), rt kh c th o c tc
trung bnh ca nhng thut ton sp xp cn li khi m chng u chy khng ti mt nhp
ng h thi gian thc (u cho thi gian chy bng 0 do khng kp o thi gian). Mt cch
gii quyt l cho mi thut ton QuickSort, Radix Sort, thc hin c ln (c l mt s nguyn
ln) trn cc b d liu ngu nhin ri ly thi gian tng chia cho c, hay c th tng kch
thc d liu (iu ny c th dn n vic phi sa li mt vi ch trong chng trnh hoc
thm ch phi thay i mi trng lp trnh).
Ti vit li chng trnh ny trn Borland Delphi a vo mt s ci tin:
C th chy vi kch thc d liu ln hn rt nhiu (hng triu kha)
Thit k da trn kin trc a lung (MultiThreads) cho php chy ng thi ( ) hai hay
nhiu thut ton sp xp so snh tc , hin th qu trnh sp xp trc quan trn mn
hnh.
Cng cho php chy tun t ( ) cc thut ton sp xp o thi gian thc hin chnh
xc ca chng.
Ch : chng trnh khng b nh hng bi cc phn mm khc ang chy, khi bm
hoc khi ng cc threads, bn phm, chut v tt c cc phn mm khc s b treo tm
thi n khi cc threads thc hin xong. V vy khng nn chy cc thut ton sp xp chm
vi d liu ln, s khng th i n khi cc threads kt thc v s phi tt my khi ng li.
Hnh 37 l giao din ca chng trnh, bn c th tham kho m ngun chng trnh km
theo:
HSPHN 1999-2004
Cu trc d liu v gii thut 121
Cng mt mc ch sp xp nh nhau, nhng c nhiu phng php gii quyt khc nhau.
Nu ch da vo thi gian o c trong mt v d c th m nh gi thut ton ny tt hn
thut ton kia v mi mt l iu khng nn. Vic chn mt thut ton sp xp thch hp cho
ph hp vi tng yu cu, tng iu kin c th l k nng ca ngi lp trnh.
Nhng thut ton c phc tp O(n2) th ch nn p dng trong chng trnh c t ln sp
xp v vi kch thc n nh. V tc , BubbleSort lun lun ng bt, nhng m lnh ca
n li ht sc n gin m ngi mi hc lp trnh no cng c th ci t c, tnh n nh
ca BubbleSort cng rt ng ch . Trong nhng thut ton c phc tp O(n2),
InsertionSort t ra nhanh hn nhng phng php cn li v cng c tnh n nh, m lnh
cng tng i n gin, d nh. SelectionSort th khng n nh nhng vi n nh, vic chn
ra m kho nh nht c th thc hin d dng ch khng cn phi sp xp li ton b nh sp
xp chn.
Thut ton m phn phi v thut ton sp xp bng c s nn c tn dng trong trng
hp cc kho sp xp l s t nhin (hay l mt kiu d liu c th quy ra thnh cc s t
nhin) bi nhng thut ton ny c tc rt cao. Thut ton sp xp bng c s cng c th
sp xp dy kho c s thc hay s m nhng ta phi bit c cch thc lu tr cc kiu d
liu trn my tnh th mi c th lm c.
QuickSort, HeapSort, MergeSort v ShellSort l nhng thut ton sp xp tng qut, dy kho
thuc kiu d liu c th t no cng c th p dng c ch khng nht thit phi l cc s.
QuickSort gp nhc im trong trng hp suy bin nhng xc sut xy ra trng hp ny
L Minh Hong
122 Chuyn
HSPHN 1999-2004
Cu trc d liu v gii thut 123
L Minh Hong
124 Chuyn
9. TM KIM (SEARCHING)
HSPHN 1999-2004
Cu trc d liu v gii thut 125
L Minh Hong
126 Chuyn
2 6
1 3 5 7
HSPHN 1999-2004
Cu trc d liu v gii thut 127
4 4
2 6 2 6
1 3 5 7 1 3 7
9 9
L Minh Hong
128 Chuyn
4 4
2 5 2
7
1 3 7 1 3 6 9
6 9
4 3
2 5 2
5
1 3 7 1
7
6 9
6 9
Hnh 41: Xa nt c c hai nhnh con trn cy BST thay bng nt cc phi ca cy con tri
Hoc tm nt cha kho nh nht trong cy con phi, a gi tr cha trong sang nt
D, ri xo nt ny. Do tnh cht ca cy BST, nt cha kho nh nht trong cy con
phi chnh l nt cc tri ca cy con phi nn n khng th c hai con c, vic xo
a v hai trng hp trn.
4 5
2 5 2
7
1 3 7 1 3 6 9
6 9
Hnh 42: Xa nt c c hai nhnh con trn cy BST thay bng nt cc tri ca cy con phi
HSPHN 1999-2004
Cu trc d liu v gii thut 129
L Minh Hong
130 Chuyn
bit 3 2 1 0
11 = 1 0 1 1 (z = 4)
6
6 = 0110
0 1 5 = 0101
5 8
2 = 0010
7 = 0111
0 1 0 1 8 = 1000
10 = 1010
2 7 10 12
12 = 1100
11 = 1011
0 1 4 = 0100
4 11
L Minh Hong
132 Chuyn
Gi s cu trc mt nt ca cy c m t nh sau:
type
PNode = ^TNode; {Con tr cha lin kt ti mt nt}
TNode = record {Cu trc nt}
Info: TKey; {Trng cha kho}
Left, Right: PNode; {con tr ti nt con tri v phi, tr ti nil nu khng c nt con tri (phi)}
end;
Gc ca cy c lu trong con tr Root. Ban u nt Root = nil (cy rng)
Vi kho tm kim X, vic tm kim trn cy tm kim s hc c th m t nh sau: Ban u
ng nt gc, xt ln lt cc bit ca X t tri sang phi (t bit z - 1 ti bit 0), h gp bit
bng 0 th r sang nt con tri, nu gp bit bng 1 th r sang nt con phi. Qu trnh c tip
tc nh vy cho ti khi gp mt trong hai tnh hung sau:
i ti mt nt rng (do r theo mt lin kt nil), qu trnh tm kim tht bi do kho X
khng c trong cy.
i ti mt nt mang gi tr ng bng X, qu trnh tm kim thnh cng
{Hm tm kim trn cy tm kim s hc, n tr v nt cha kho tm kim X nu tm thy, tr v nil nu khng tm thy. z
l di dy bit biu din mt kho}
function DSTSearch(X: TKey): PNode;
var
b: Integer;
p: PNode;
begin
b := z; p := Root; {Bt u vi nt gc}
while (p nil) and (p^.Info X) do {Cha gp phi mt trong 2 tnh hung trn}
begin
b := b - 1; {Xt bit b ca X}
if <Bit b ca X l 0> then p := p^.Left {Gp 0 r tri}
else p := p^.Right; {Gp 1 r phi}
end;
DSTSearch := p;
end;
Thut ton dng cy tm kim s hc t dy kho k[1..n] cng c lm gn ging qu trnh
tm kim. Ta chn ln lt cc kho vo cy, trc khi chn, ta tm xem kho c trong
cy hay cha, nu c ri th b qua, nu n cha c th ta thm nt mi cha kho cn
chn v ni nt vo cy tm kim s hc ti mi ni rng va r sang khin qu trnh tm
kim tht bi
HSPHN 1999-2004
Cu trc d liu v gii thut 133
L Minh Hong
134 Chuyn
0 1
0 1 0 1
1 0 1 0 1 0
0 0 1 1 0 0 1 0
2 4 5 7 8 10 11 12
HSPHN 1999-2004
Cu trc d liu v gii thut 135
0 0 1
1
1 0 1 0 1
1
0 0 1 0 0 1
2 4 5 2 4 5 7
L Minh Hong
136 Chuyn
0 0 1
1
1 0 1 1 0
1 0 0 1
0 0 1
2 4 5 7 2 4 5
HSPHN 1999-2004
Cu trc d liu v gii thut 137
L Minh Hong
138 Chuyn
0
1
0 1 0 1
1 0 1 0 1 0
0 0 1 1 0 0 1 0
2 4 5 7 8 10 11 12
a)
0 1
0 1 0 1
2 12
0 1 0 1
7 8
0 1 0 1
4 5 10 11
b)
Tng t nh phng php sp xp bng c s, php tm kim bng c s khng nht thit
phi chn h c s 2. Ta c th chn h c s ln hn c tc nhanh hn (km theo s
tn km b nh), ch lu l cy tm kim s hc cng nh cy tm kim c s trong trng
hp ny khng cn l cy nh phn m l cy R_phn vi R l h c s c chn.
Trong cc phng php tm kim bng c s, thc ra cn mt phng php tinh tu v thng
minh nht, n c cu trc gn ging nh cy nhng khng c nt d tha, v qu trnh duyt
bit ca kho tm kim khng phi t tri qua phi m theo th t ca cc bit kim sot lu ti
mi nt i qua. Phng php c tn gi l Practical Algorithm To Retrieve Information
Coded In Alphanumeric (PATRICIA) do Morrison xut. Tuy nhin, vic ci t phng
php ny kh phc tp (c bit l thao tc xo gi tr kho), ta c th tham kho ni dung ca
n trong cc ti liu khc.
HSPHN 1999-2004
Cu trc d liu v gii thut 139
Tuy gi l chuyn v "Cu trc d liu v gii thut" nhng thc ra, ta mi ch tm hiu v
mt s cu trc d liu v gii thut hay gp. Khng mt ti liu no c th cp ti mi cu
trc d liu v gii thut bi chng qu phong ph v lin tc c b sung. Nhng cu trc
d liu v gii thut khng "ph thng" lm nh l thuyt th, hnh hc, v.v s c tch
ra v s c ni k hn trong mt chuyn khc.
Vic i su nghin cu nhng cu trc d liu v gii thut, d ch l mt phn nh hp cng
ny sinh rt nhiu vn hay v kh, nh cc vn l thuyt v phc tp tnh ton, vn
NP_y v.v l cng vic ca nhng nh khoa hc my tnh. Nhng trc khi tr
thnh mt nh khoa hc my tnh th iu kin cn l phi bit lp trnh. Vy nn khi tm hiu
bt c cu trc d liu hay gii thut no, nht thit ta phi c gng ci t bng c. Mi
tng hay s ch l b i nu nh khng bin thnh hiu qu, thc t l nh vy.
L Minh Hong
PHN 3. QUY HOCH NG
1.1. V D
Cho s t nhin n 100. Hy cho bit c bao nhiu cch phn tch s n thnh tng ca
dy cc s nguyn dng, cc cch phn tch l hon v ca nhau ch tnh l mt cch.
V d: n = 5 c 7 cch phn tch:
1. 5 = 1 + 1 + 1+1+1
2. 5 = 1 + 1 + 1+2
3. 5 = 1 + 1 + 3
4. 5 = 1 + 2 + 2
5. 5 = 1 + 4
6. 5 = 2 + 3
7. 5 = 5
(Lu : n = 0 vn coi l c 1 cch phn tch thnh tng cc s nguyn dng (0 l tng
ca dy rng))
gii bi ton ny, trong chuyn mc trc ta dng phng php lit k tt c cc cch
phn tch v m s cu hnh. By gi ta th ngh xem, c cch no tnh ngay ra s lng
cc cch phn tch m khng cn phi lit k hay khng ?. Bi v khi s cch phn tch
tng i ln, phng php lit k t ra kh chm. (n = 100 c 190569292 cch phn tch).
Nhn xt:
Nu gi F[m, v] l s cch phn tch s v thnh tng cc s nguyn dng m. Khi :
Cc cch phn tch s v thnh tng cc s nguyn dng m c th chia lm hai loi:
Loi 1: Khng cha s m trong php phn tch, khi s cch phn tch loi ny chnh l
s cch phn tch s v thnh tng cc s nguyn dng < m, tc l s cch phn tch s v
thnh tng cc s nguyn dng m - 1 v bng F[m - 1, v].
Loi 2: C cha t nht mt s m trong php phn tch. Khi nu trong cc cch phn tch
loi ny ta b i s m th ta s c cc cch phn tch s v - m thnh tng cc s
nguyn dng m (Lu : iu ny ch ng khi khng tnh lp li cc hon v ca mt
cch). C ngha l v mt s lng, s cc cch phn tch loi ny bng F[m, v - m]
Trong trng hp m > v th r rng ch c cc cch phn tch loi 1, cn trong trng hp m
v th s c c cc cch phn tch loi 1 v loi 2. V th:
F[m 1, v]; if m > v
F[m, v] =
F[m-1,v]+F[m,v-m]; if m v
Ta c cng thc xy dng F[m, v] t F[m - 1, v] v F[m, v - m]. Cng thc ny c tn gi l
cng thc truy hi a vic tnh F[m, v] v vic tnh cc F[m', v'] vi d liu nh hn. Tt
nhin cui cng ta s quan tm n F[n, n]: S cc cch phn tch n thnh tng cc s nguyn
dng n.
V d vi n = 5, bng F s l:
HSPHN 1999-2004
Quy hoch ng 143
F 0 1 2 3 4 5
v
0 1 0 0 0 0 0
1 1 1 1 1 1 1
2 1 1 2 2 3 3
3 1 1 2 3 4 5
4 1 1 2 3 5 6
5 1 1 2 3 5 7
m
L Minh Hong
144 Chuyn
trn dng 1. Ri li gn mng Current := Next v tip tc dng mng Current tnh mng Next,
mng Next s gm cc gi tr tng ng trn dng 2 v.v Vy ta c ci t ci tin sau:
P_3_01_2.PAS * m s cch phn tch s n
program Analyse2;
const
max = 100;
var
Current, Next: array[0..max] of LongInt;
n, m, v: Integer;
begin
Write('n = '); ReadLn(n);
FillChar(Current, SizeOf(Current), 0);
Current[0] := 1; {Khi to mng Current tng ng vi dng 0 ca bng F}
for m := 1 to n do
begin {Dng dng hin thi Current tnh dng k tip Next Dng dng m - 1 tnh dng m ca bng F}
for v := 0 to n do
if v < m then Next[v] := Current[v]
else Next[v] := Current[v] + Next[v - m];
Current := Next; {Gn Current := Next tc l Current by gi li lu cc phn t trn dng m ca bng F}
end;
WriteLn(Current[n], ' Analyses');
end.
Cch lm trn tit kim c kh nhiu khng gian lu tr, nhng n hi chm hn
phng php u tin v php gn mng (Current := Next). C th ci tin thm cch lm ny
nh sau:
P_3_01_3.PAS * m s cch phn tch s n
program Analyse3;
const
max = 100;
var
B: array[1..2, 0..max] of LongInt;{Bng B ch gm 2 dng thay cho 2 dng lin tip ca bng phng n}
n, m, v, x, y: Integer;
begin
Write('n = '); ReadLn(n);
{Trc ht, dng 1 ca bng B tng ng vi dng 0 ca bng phng n F, c in c s quy hoch ng}
FillChar(B[1], SizeOf(B[1]), 0);
B[1][0] := 1;
x := 1; {Dng B[x] ng vai tr l dng hin thi trong bng phng n}
y := 2; {Dng B[y] ng vai tr l dng k tip trong bng phng n}
for m := 1 to n do
begin
{Dng dng x tnh dng y Dng dng hin thi trong bng phng n tnh dng k tip}
for v := 0 to n do
if v < m then B[y][v] := B[x][v]
else B[y][v] := B[x][v] + B[y][v - m];
x := 3 - x; y := 3 - y; {o gi tr x v y, tnh xoay li}
end;
WriteLn(B[x][n], ' Analyses');
end.
HSPHN 1999-2004
Quy hoch ng 145
1.4. CI T QUY
Xem li cng thc truy hi tnh F[m, v] = F[m - 1, v] + F[m, v - m], ta nhn thy rng tnh
F[m, v] ta phi bit c chnh xc F[m - 1, v] v F[m, v - m]. Nh vy vic xc nh th t
tnh cc phn t trong bng F (phn t no tnh trc, phn t no tnh sau) l quan trng. Tuy
nhin ta c th tnh da trn mt hm quy m khng cn phi quan tm ti th t tnh ton.
Vic vit mt hm quy tnh cng thc truy hi kh n gin, nh v d ny ta c th vit:
P_3_01_5.PAS * m s cch phn tch s n dng quy
program Analyse5;
var
n: Integer;
begin
Write('n = '); ReadLn(n);
WriteLn(GetF(n, n), ' Analyses');
end.
Phng php ci t ny t ra kh chm v phi gi nhiu ln mi hm GetF(m, v) (bi sau s
gii thch r hn iu ny). Ta c th ci tin bng cch kt hp vi mt mng hai chiu F.
Ban u cc phn t ca F c coi l "cha bit" (bng cch gn mt gi tr c bit). Hm
GetF(m, v) khi c gi trc ht s tra cu ti F[m, v], nu F[m, v] cha bit th hm
GetF(m, v) s gi quy tnh gi tr ca F[m, v] ri dng gi tr ny gn cho kt qu hm,
cn nu F[m, v] bit th hm ny ch vic gn kt qu hm l F[m, v] m khng cn gi
quy tnh ton na.
P_3_01_6.PAS * m s cch phn tch s n dng quy
program Analyse6;
const
max = 100;
L Minh Hong
146 Chuyn
var
n: Integer;
F: array[0..max, 0..max] of LongInt;
begin
Write('n = '); ReadLn(n);
FillChar(f, SizeOf(f), $FF); {Khi to mng F bng gi tr -1}
WriteLn(GetF(n, n), ' Analyses');
end.
Vic s dng phng php quy gii cng thc truy hi l mt k thut ng lu , v
khi gp mt cng thc truy hi phc tp, kh xc nh th t tnh ton th phng php ny t
ra rt hiu qu, hn th na n lm r hn bn cht quy ca cng thc truy hi.
HSPHN 1999-2004
Quy hoch ng 147
1 1
x= y=
2
0 1 x
x+ y = 2
Cc dng bi ton quy hoch rt phong ph v a dng, ng dng nhiu trong thc t, nhng
cng cn bit rng, a s cc bi ton quy hoch l khng gii c, hoc cha gii c.
Cho n nay, ngi ta mi ch c thut ton n hnh gii bi ton quy hoch tuyn tnh li,
v mt vi thut ton khc p dng cho cc lp bi ton c th.
L Minh Hong
148 Chuyn
mt bi ton ln, ta chia n lm nhiu bi ton con cng dng vi n c th gii quyt c
lp. Trong phng php quy hoch ng, nguyn l ny cng c th hin r: Khi khng
bit cn phi gii quyt nhng bi ton con no, ta s i gii quyt tt c cc bi ton con v
lu tr nhng li gii hay p s ca chng vi mc ch s dng li theo mt s phi hp
no gii quyt nhng bi ton tng qut hn. chnh l im khc nhau gia Quy
hoch ng v php phn gii quy v cng l ni dung phng php quy hoch ng:
Php phn gii quy bt u t bi ton ln phn r thnh nhiu bi ton con v i gii
tng bi ton con . Vic gii tng bi ton con li a v php phn r tip thnh nhiu
bi ton nh hn v li i gii tip bi ton nh hn bt k n c gii hay cha.
Quy hoch ng bt u t vic gii tt c cc bi ton nh nht ( bi ton c s) t
tng bc gii quyt nhng bi ton ln hn, cho ti khi gii c bi ton ln nht (bi
ton ban u).
Ta xt mt v d n gin:
Dy Fibonacci l dy v hn cc s nguyn dng F[1], F[2], c nh ngha nh sau:
1, if i 2
F[i] =
F[i 1] + F[i 2], if i 3
Hy tnh F[6]
Xt hai cch ci t chng trnh:
Cch 1 Cch 2
program Fibo1; program Fibo2;
var
function F(i: Integer): Integer; F: array[1..6] of Integer;
begin i: Integer;
if i < 3 then F := 1
else F := F(i - 1) + F(i - 2); begin
end; F[1] := 1; F[2] := 1;
for i := 3 to 6 do
begin F[i] := F[i - 1] + F[i - 2];
WriteLn(F(6)); WriteLn(F[6]);
end. end.
HSPHN 1999-2004
Quy hoch ng 149
F(6)
F(5) F(4)
F(2) F(1)
Cch 2 th khng nh vy. Trc ht n tnh sn F[1] v F[2], t tnh tip F[3], li tnh tip
c F[4], F[5], F[6]. m bo rng mi gi tr Fibonacci ch phi tnh 1 ln.
(Cch 2 cn c th ci tin thm na, ch cn dng 3 gi tr tnh li ln nhau)
Trc khi p dng phng php quy hoch ng ta phi xt xem phng php c tho
mn nhng yu cu di y hay khng:
Bi ton ln phi phn r c thnh nhiu bi ton con, m s phi hp li gii ca cc bi
ton con cho ta li gii ca bi ton ln.
V quy hoch ng l i gii tt c cc bi ton con, nn nu khng khng gian vt l lu
tr li gii (b nh, a) phi hp chng th phng php quy hoch ng cng khng
th thc hin c.
Qu trnh t bi ton c s tm ra li gii bi ton ban u phi qua hu hn bc.
Cc khi nim:
Bi ton gii theo phng php quy hoch ng gi l bi ton quy hoch ng
Cng thc phi hp nghim ca cc bi ton con c nghim ca bi ton ln gi l
cng thc truy hi (hay phng trnh truy ton) ca quy hoch ng
Tp cc bi ton nh nht c ngay li gii t gii quyt cc bi ton ln hn gi l c
s quy hoch ng
Khng gian lu tr li gii cc bi ton con tm cch phi hp chng gi l bng
phng n ca quy hoch ng
Cc bc ci t mt chng trnh s dng quy hoch ng:
Gii tt c cc bi ton c s (thng thng rt d), lu cc li gii vo bng phng n.
Dng cng thc truy hi phi hp nhng li gii ca nhng bi ton nh lu trong bng
phng n tm li gii ca nhng bi ton ln hn v lu chng vo bng phng n.
Cho ti khi bi ton ban u tm c li gii.
Da vo bng phng n, truy vt tm ra nghim ti u.
L Minh Hong
150 Chuyn
HSPHN 1999-2004
Quy hoch ng 151
L Minh Hong
152 Chuyn
3.1.3. Truy vt
Ti bc xy dng dy L, mi khi gn L[i] := L[jmax] + 1, ta t T[i] = jmax. lu li rng:
Dy con di nht bt u ti a[i] s c phn t th hai k tip l a[jmax].
Sau khi tnh xong hay dy L v T, ta bt u t T[0].
T[0] chnh l phn t u tin c chn,
T[T[0]] l phn t th hai c chn,
T[T[T[0]]] l phn t th ba c chn
Qu trnh truy vt c th din t nh sau:
i := T[0];
while i <> n + 1 do {Chng no cha duyt n s a[n+1]=+ cui}
begin
<Thng bo chn a[i]>
i := T[i];
end;
V d: vi A = (5, 2, 3, 4, 9, 10, 5, 6, 7, 8). Hai dy L v T sau khi tnh s l:
Calculating
i 0 1 2 3 4 5 6 7 8 9 10 11
ai 5 2 3 4 9 10 5 6 7 8 +
L[i] 9 5 8 7 6 3 2 5 4 3 2 1
T[i] 2 8 3 4 7 6 11 8 9 10 11
Tracing
procedure Enter;
var
i: Word;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n);
for i := 1 to n do Read(f, a[i]);
Close(f);
HSPHN 1999-2004
Quy hoch ng 153
end;
procedure Result;
var
f: Text;
i: Integer;
begin
Assign(f, OutputFile); Rewrite(f);
WriteLn(f, L[0] - 2); {Chiu di dy con tng di nht}
i := T[0]; {Bt u truy vt tm nghim}
while i <> n + 1 do
begin
WriteLn(f, 'a[', i, '] = ', a[i]);
i := T[i];
end;
Close(f);
end;
begin
Enter;
Optimize;
Result;
end.
Nhn xt: Cng thc truy hi tnh cc L[.] c th tm tt l:
L[n + 1] = 0
L[i] = max L[ j] + 1; (i=0,n)
i < j n +1
ai <a j
L Minh Hong
154 Chuyn
begin
Tnh L[i]; t k := L[i];
if k > m then {Nu dy con tng di nht bt u ti a[i] c di > m}
begin
m := k; {Cp nht li m}
StartOf[k] := i; {Gn gi tr cho StartOf[m]}
end
else
if a[i] > a[StartOf[k]] then {Nu c nhiu dy n iu tng di nht di k th}
StartOf[k] := i; {ch ghi nhn li dy c phn t bt u ln nht}
end;
Khi bt u vo mt ln lp vi mt gi tr i, ta bit c:
m: di dy con n iu tng di nht ca dy a[i+1..n+1]
StartOf[k] (1 k m): Phn t a[StartOf[k]] l phn t ln nht trong s cc phn t trong
on a[i+1..n+1] tho mn: Dy con n iu tng di nht bt u t a[StartOf[k]] c di
k. Do th t tnh ton c p t nh trong s trn, ta d dng nhn thy rng:
a[StartOf[k]] < a[StartOf[k - 1]] <<a[StartOf[1]].
iu kin c dy con n iu tng di p+1 bt u ti a[i] chnh l a[StartOf[p]] > a[i]
(v theo th t tnh ton th khi bt u mt ln lp vi gi tr i, a[StartOf[p]] lun ng sau
a[i]). Mt khc nu em a[i] ghp vo u dy con n iu tng di nht bt u ti
a[StartOf[p]] m thu c dy tng th em a[i] ghp vo u dy con n iu tng di nht
bt u ti a[StartOf[p - 1]] ta cng thu c dy tng. Vy tnh L[i], ta c th tm s p ln
nht tho mn a[StartOf[p]] > a[i] bng thut ton tm kim nh phn ri t L[i] := p + 1
(v sau T[i] := StartOf[p], tt nhin)
P_3_03_2.PAS * Ci tin thut ton tm dy con n iu tng di nht
program LongestSubSequence;
const
InputFile = 'INCSEQ.INP';
OutputFile = 'INCSEQ.OUT';
const
max = 5000;
var
a, L, T, StartOf: array[0..max + 1] of Integer;
n, m: Integer;
procedure Enter;
var
i: Word;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n);
for i := 1 to n do Read(f, a[i]);
Close(f);
end;
procedure Init;
begin
a[0] := -32768;
a[n + 1] := 32767;
m := 1;
L[n + 1] := 1;
StartOf[1] := n + 1;
end;
HSPHN 1999-2004
Quy hoch ng 155
procedure Optimize;
var
i, j, k: Integer;
begin
for i := n downto 0 do
begin
j := Find(i);
k := L[j] + 1;
if k > m then
begin
m := k;
StartOf[k] := i;
end
else
if a[StartOf[k]] < a[i] then
StartOf[k] := i;
L[i] := k;
T[i] := j;
end;
end;
procedure Result;
var
f: Text;
i: Integer;
begin
Assign(f, OutputFile); Rewrite(f);
WriteLn(f, m - 2);
i := T[0];
while i <> n + 1 do
begin
WriteLn(f, 'a[', i, '] = ', a[i]);
i := T[i];
end;
Close(f);
end;
begin
Enter;
Init;
Optimize;
Result;
end.
D thy chi ph thi gian thc hin gii thut ny cp O(nlogn), y l mt v d in hnh
cho thy rng mt cng thc truy hi c th c nhiu phng php tnh.
L Minh Hong
156 Chuyn
3.2. BI TON CI TI
Trong siu th c n gi hng (n 100), gi hng th i c trng lng l W[i] 100 v tr gi
V[i] 100. Mt tn trm t nhp vo siu th, tn trm mang theo mt ci ti c th mang
c ti a trng lng M ( M 100). Hi tn trm s ly i nhng gi hng no c
tng gi tr ln nht.
Input: file vn bn BAG.INP
Dng 1: Cha hai s n, M cch nhau t nht mt du cch
n dng tip theo, dng th i cha hai s nguyn dng W[i], V[i] cch nhau t nht mt
du cch
Output: file vn bn BAG.OUT
Dng 1: Ghi gi tr ln nht tn trm c th ly
Dng 2: Ghi ch s nhng gi b ly
BAG.INP BAG.OUT
5 11 11
33 521
44
54
9 10
44
Cch gii:
Nu gi F[i, j] l gi tr ln nht c th c bng cch chn trong cc gi {1, 2, , i} vi gii
hn trng lng j. Th gi tr ln nht khi c chn trong s n gi vi gii hn trng lng
M chnh l F[n, M].
3.2.1. Cng thc truy hi tnh F[i, j].
Vi gii hn trng lng j, vic chn ti u trong s cc gi {1, 2, , i - 1, i} c gi tr ln
nht s c hai kh nng:
Nu khng chn gi th i th F[i, j] l gi tr ln nht c th bng cch chn trong s cc
gi {1, 2, , i - 1} vi gii hn trng lng l j. Tc l
F[i, j] = F[i - 1, j]
Nu c chn gi th i (tt nhin ch xt ti trng hp ny khi m W[i] j) th F[i, j] bng
gi tr gi th i l V[i] cng vi gi tr ln nht c th c c bng cch chn trong s cc
gi {1, 2, , i - 1} vi gii hn trng lng j - W[i]. Tc l v mt gi tr thu c:
F[i, j] = V[i] + F[i - 1, j - W[i]]
V theo cch xy dng F[i, j] l gi tr ln nht c th, nn F[i, j] s l max trong 2 gi tr thu
c trn.
3.2.2. C s quy hoch ng:
D thy F[0, j] = gi tr ln nht c th bng cch chn trong s 0 gi = 0.
HSPHN 1999-2004
Quy hoch ng 157
procedure Enter;
var
i: Integer;
fi: Text;
begin
Assign(fi, InputFile); Reset(fi);
ReadLn(fi, n, M);
for i := 1 to n do ReadLn(fi, W[i], V[i]);
Close(fi);
end;
procedure Optimize; {Tnh bng phng n bng cng thc truy hi}
var
i, j: Integer;
begin
FillChar(F[0], SizeOf(F[0]), 0); {in c s quy hoch ng}
for i := 1 to n do
for j := 0 to M do
begin {Tnh F[i, j]}
F[i, j] := F[i - 1, j]; {Gi s khng chn gi th i th F[i, j] = F[i - 1, j]}
{Sau nh gi: nu chn gi th i s c li hn th t li F[i, j]}
if (j >= W[i]) and (F[i, j] < F[i - 1, j - W[i]] + V[i]) then
F[i, j] := F[i - 1, j - W[i]] + V[i];
end;
L Minh Hong
158 Chuyn
end;
begin
Enter;
Optimize;
Trace;
end.
3.3. BIN I XU
Cho xu k t X, xt 3 php bin i:
a) Insert(i, C): i l s, C l k t: Php Insert chn k t C vo sau v tr i ca xu X.
b) Replace(i, C): i l s, C l k t: Php Replace thay k t ti v tr i ca xu X bi k t C.
c) Delete(i): i l s, Php Delete xo k t ti v tr i ca xu X.
Yu cu: Cho trc xu Y, hy tm mt s t nht cc php bin i trn bin xu X thnh
xu Y.
Input: file vn bn STR.INP
Dng 1: Cha xu X ( di 100)
Dng 2: Cha xu Y ( di 100)
Output: file vn bn STR.OUT ghi cc php bin i cn thc hin v xu X ti mi php
bin i.
STR.INP STR.OUT
PBBCEFATZQABCDABEFA 7
PBBCEFATZ -> Delete(9) -> PBBCEFAT
PBBCEFAT -> Delete(8) -> PBBCEFA
PBBCEFA -> Insert(4, B) -> PBBCBEFA
PBBCBEFA -> Insert(4, A) -> PBBCABEFA
PBBCABEFA -> Insert(4, D) -> PBBCDABEFA
PBBCDABEFA -> Replace(2, A) -> PABCDABEFA
PABCDABEFA -> Replace(1, Q) -> QABCDABEFA
Cch gii:
i vi xu k t th vic xo, chn s lm cho cc phn t pha sau v tr bin i b nh ch
s li, gy kh khn cho vic qun l v tr. khc phc iu ny, ta s tm mt th t bin
HSPHN 1999-2004
Quy hoch ng 159
i tho mn: Php bin i ti v tr i bt buc phi thc hin sau cc php bin i ti v tr i
+ 1, i + 2,
V d: X = 'ABCD';
Insert(0, E) sau Delete(4) cho ra X = 'EABD'. Cch ny khng tun th nguyn tc
Delete(3) sau Insert(0, E) cho ra X = 'EABD'. Cch ny tun th nguyn tc ra.
Ni tm li ta s tm mt dy bin i c v tr thc hin gim dn.
3.3.1. Cng thc truy hi
Gi s m l di xu X v n l di xu Y. Gi F[i, j] l s php bin i ti thiu bin
xu gm i k t u ca xu X: X[1..i] thnh xu gm j k t u ca xu Y: Y[1..j].
Quan st hai dy X v Y
X1 X2 Xm-1 Xm
Y1 Y2 Yn-1 Yn
Ta nhn thy:
Nu X[m] = Y[n] th ta ch cn bin on X[1..m-1] thnh Y[1..n-1]. Tc l trong trng
hp ny: F[m, n] = F[m - 1, n - 1]
X1 X2 Xm-1 Xm=Yn
Y1 Y2 Yn-1 Yn=Xm
X1 X2 Xm-1 Xm Yn
Y1 Y2 Yn-1 Yn
X1 X2 Xm-1 Xm:=Yn
Y1 Y2 Yn-1 Yn
L Minh Hong
160 Chuyn
X1 X2 Xm-1 Xm
Y1 Y2 Yn-1 Yn
F 0 1 2 3 4
0 0 1 2 3 4
1 1 1 1 2 3
2 2 2 2 1 2
3 3 3 3 2 2
4 4 4 4 3 2
Hnh 51: Truy vt
HSPHN 1999-2004
Quy hoch ng 161
Lu : khi truy vt, trnh truy nhp ra ngoi bng, nn to vin cho bng.
P_3_03_4.PAS * Bin i xu
program StrOpt;
const
InputFile = 'STR.INP';
OutputFile = 'STR.OUT';
max = 100;
var
X, Y: String[2 * max];
F: array[-1..max, -1..max] of Integer;
m, n: Integer;
procedure Enter;
var
fi: Text;
begin
Assign(fi, InputFile); Reset(fi);
ReadLn(fi, X); ReadLn(fi, Y);
Close(fi);
m := Length(X); n := Length(Y);
end;
procedure Optimize;
var
i, j: Integer;
begin
{Khi to vin cho bng phng n}
for i := 0 to m do F[i, -1] := max + 1;
for j := 0 to n do F[-1, j] := max + 1;
{Lu c s quy hoch ng}
for j := 0 to n do F[0, j] := j;
for i := 1 to m do F[i, 0] := i;
{Dng cng thc truy hi tnh ton bng phng n}
for i := 1 to m do
for j := 1 to n do
if X[i] = Y[j] then F[i, j] := F[i - 1, j - 1]
else F[i, j] := Min3(F[i, j - 1], F[i - 1, j - 1], F[i - 1, j]) + 1;
end;
L Minh Hong
162 Chuyn
begin
Enter;
Optimize;
Trace;
end.
Bi ny gii vi cc xu 100 k t, nu lu bng phng n di dng mng cp pht ng
th c th lm vi cc xu 255 k t. (Tt hn nn lu mi dng ca bng phng n l mt
mng cp pht ng 1 chiu). Hy t gii thch ti sao khi gii hn di d liu l 100, li
phi khai bo X v Y l String[200] ch khng phi l String[100] ?.
HSPHN 1999-2004
Quy hoch ng 163
SUBSEQ.INP SUBSEQ.OUT
10 5 8
1 6 11 5 10 15 20 2 4 9 a[10] = 9
a[9] = 4
a[7] = 20
a[6] = 15
a[5] = 10
a[4] = 5
a[3] = 11
a[2] = 6
Sum = 80
3.4.1. Cch gii 1
Khng nh hng n kt qu cui cng, ta c th t: a[i] := a[i] mod k vi i: 1 i n. Gi
S l tng cc phn t trong dy A, thay i cch tip cn bi ton: thay v tm xem phi chn
ra mt s ti a nhng phn t c tng chia ht cho k, ta s chn ra mt s ti thiu cc
phn t c tng ng d vi S theo modul k. Khi ch cn loi b nhng phn t ny th
nhng phn t cn li s l kt qu. Cch tip cn ny cho php tit kim c khng gian
lu tr bi s phn t ti thiu cn loi b bao gi cng nh hn k.
Cng thc truy hi: Nu ta gi f[i, t] l s phn t ti thiu phi chn trong dy a[1..i] c
tng chia k d t. Nu khng c phng n chn ta coi f[i, t] = +. Khi f[i, t] c tnh qua
cng thc truy hi sau:
Nu trong dy trn khng phi chn a[i] th f[i, t] = f[i - 1, t];
Nu trong dy trn phi chn a[i] th f[i, t] = 1 + f[i - 1, t A[i] ] ( t A[i] y hiu l
php tr trn cc lp ng d mod k. V d khi k = 7 th 1 3 =5)
procedure Enter;
var
fi: Text;
i: Integer;
begin
Assign(fi, InputFile); Reset(fi);
ReadLn(fi, n, k);
for i := 1 to n do Read(fi, a[i]);
Close(fi);
end;
L Minh Hong
164 Chuyn
var
tmp: Integer;
begin
tmp := (x - y) mod k;
if tmp >= 0 then Sub := tmp
else Sub := tmp + k;
end;
procedure Optimize;
var
i, t: Integer;
begin
FillChar(f, SizeOf(f), $FF); {Khi to cc phn t f[0,.] u bng 255 (+)}
f[0, 0] := 0; {Ngoi tr f[0, 0] := 0}
for i := 1 to n do
for t := 0 to k - 1 do {Tnh f[i, t] := min (f[i - 1, t], f[i - 1, Sub(t, a[i])] + 1}
if f[i - 1, t] < f[i - 1, Sub(t, a[i])] + 1 then
f[i, t] := f[i - 1, t]
else
f[i, t] := f[i - 1, Sub(t, a[i])] + 1;
end;
procedure Result;
var
fo: Text;
i, t: Integer;
SumAll, Sum: LongInt;
begin
SumAll := 0;
for i := 1 to n do SumAll := SumAll + a[i];
Assign(fo, OutputFile); Rewrite(fo);
WriteLn(fo, n - f[n, SumAll mod k]); {n - s phn t b i = s phn t gi li}
i := n; t := SumAll mod k;
Sum := 0;
for i := n downto 1 do
if f[i, t] = f[i - 1, t] then {Nu phng n ti u khng b ai, tc l c chn ai}
begin
WriteLn(fo, 'a[', i, '] = ', a[i]);
Sum := Sum + a[i];
end
else
t := Sub(t, a[i]);
WriteLn(fo, 'Sum = ', Sum);
Close(fo);
end;
begin
Enter;
Optimize;
Result;
end.
3.4.2. Cch gii 2
Phn cc phn t trong dy A theo cc lp ng d modul k. Lp i gm cc phn t chia k d
i. Gi Count[i] l s lng cc phn t thuc lp i.
Vi 0 i, t < k; Gi f[i, t] l s phn t nhiu nht c th chn c trong cc lp 0, 1, 2, , i
c tng chia k d t. Trong trng hp c cch chn, gi Trace[i, t] l s phn t c
chn trong lp i theo phng n ny, trong trng hp khng c cch chn, Trace[i, t] c
coi l -1.
HSPHN 1999-2004
Quy hoch ng 165
procedure Enter;
var
fi: Text;
i: Integer;
begin
Assign(fi, InputFile); Reset(fi);
ReadLn(fi, n, k);
FillChar(Count, SizeOf(Count), 0);
for i := 1 to n do
begin
Read(fi, a[i]);
Inc(Count[a[i] mod k]); {Nhp d liu ng thi vi vic tnh cc Count[.]}
end;
Close(fi);
end;
procedure Optimize;
var
i, j, t: Integer;
begin
FillChar(f, SizeOf(f), 0);
f[0, 0] := Count[0];
FillChar(Trace, SizeOf(Trace), $FF); {Khi to cc mng Trace=-1}
Trace[0, 0] := Count[0]; {Ngoi tr Trace[0, 0] = Count[0]}
for i := 1 to k - 1 do
L Minh Hong
166 Chuyn
for t := 0 to k - 1 do
for j := 0 to Count[i] do
if (Trace[i - 1, Sub(t, j * i)] <> -1) and
(f[i, t] < f[i - 1, Sub(t, j * i)] + j) then
begin
f[i, t] := f[i - 1, Sub(t, j * i)] + j;
Trace[i, t] := j;
end;
end;
procedure Result;
var
fo: Text;
i, t, j: Integer;
Sum: LongInt;
begin
t := 0;
{Tnh li cc Count[i] := S phn t phng n ti u s chn trong lp i}
for i := k - 1 downto 0 do
begin
j := Trace[i, t];
t := Sub(t, j * i);
Count[i] := j;
end;
Assign(fo, OutputFile); Rewrite(fo);
WriteLn(fo, f[k - 1, 0]);
Sum := 0;
for i := 1 to n do
begin
t := a[i] mod k;
if Count[t] > 0 then
begin
WriteLn(fo, 'a[', i, '] = ', a[i]);
Dec(Count[t]);
Sum := Sum + a[i];
end;
end;
WriteLn(fo, 'Sum = ', Sum);
Close(fo);
end;
begin
Enter;
Optimize;
Result;
end.
Cch gii th hai tt hn cch gii th nht v n c th thc hin vi n ln. V d ny cho
thy mt bi ton quy hoch ng c th c nhiu cch t cng thc truy hi gii.
V d:
A l ma trn kch thc 3x4, B l ma trn kch thc 4x5 th C s l ma trn kch thc 3x5
HSPHN 1999-2004
Quy hoch ng 167
1 0 2 4 0
1 2 3 4 14 6 9 36 9
0 1 0 5 1
5 6 7 8 x = 34 14 25 100 21
3 0 1 6 1
9
10 11 12 54 22 41 164 33
1 1 1 1 1
thc hin php nhn hai ma trn A(mxn) v B(nxp) ta c th lm nh on chng trnh
sau:
for i := 1 to p do
for j := 1 to r do
begin
c[i, j] := 0;
for k := 1 to q do c[i, j] := c[i, j] + a[i, k] * b[k, j];
end;
Ph tn thc hin php nhn ny c th nh gi qua s php nhn: nhn hai ma trn A
cp pxq v B cp qxr ta cn thc hin p.q.r php nhn s hc.
Php nhn ma trn khng c tnh cht giao hon nhng c tnh cht kt hp
(A.B).C = A.(B.C)
Vy nu A l ma trn cp 3x4, B l ma trn cp 4x10 v C l ma trn cp 10x15 th:
tnh (A.B).C, php tnh (A.B) cho ma trn kch thc 3x10 sau 3.4.10=120 php nhn
s, sau nhn tip vi C c ma trn kt qu kch thc 3x15 sau 3.10.15=450 php
nhn s. Vy tng s php nhn s hc phi thc hin s l 570.
tnh A.(B.C), php tnh (B.C) cho ma trn kch thc 4x15 sau 4.10.15=600 php nhn
s, ly A nhn vi ma trn ny c ma trn kt qu kch thc 3x15 sau 3.4.15=180 php
nhn s. Vy tng s php nhn s hc phi thc hin s l 780.
Vy th trnh t thc hin c nh hng ln ti chi ph. Vn t ra l tnh s ph tn t nht
n
khi thc hin php nhn mt dy cc ma trn: m[i]=m[1].m[2].....m[n]
i=1
Vi :
m[1] l ma trn kch thc a[1] x a[2]
m[2] l ma trn kch thc a[2] x a[3]
m[n] l ma trn kch thc a[n] x a[n+1]
Input: file vn bn MULTMAT.INP
Dng 1: Cha s nguyn dng n 100
Dng 2: Cha n + 1 s nguyn dng a[1], a[2], , a[n+1] (i: 1 a[i] 100) cch nhau
t nht mt du cch
Output: file vn bn MULTMAT.OUT
Dng 1: Ghi s php nhn s hc ti thiu cn thc hin
Dng 2: Ghi biu thc kt hp ti u ca php nhn dy ma trn
L Minh Hong
168 Chuyn
MULTMAT.INP MULTMAT.OUT
6 Number of numerical multiplications: 31
3231223 ((m[1].(m[2].m[3])).((m[4].m[5]).m[6]))
Trc ht, nu dy ch c mt ma trn th chi ph bng 0, tip theo ta nhn thy chi ph
nhn mt cp ma trn c th tnh c ngay. Vy c th ghi nhn c chi ph cho php nhn
hai ma trn lin tip bt k trong dy. S dng nhng thng tin ghi nhn ti u ho ph
tn nhn nhng b ba ma trn lin tip C tip tc nh vy cho ti khi ta tnh c ph tn
nhn n ma trn lin tip.
3.5.1. Cng thc truy hi:
Gi f[i, j] l s php nhn s hc ti thiu cn thc hin nhn on ma trn lin tip:
j
j
tnh m[p] , c th c nhiu cch kt hp:
p =i
j
k j
m[p] = m[q] . m[r] ; k: i k<j
p =i q =i r = k +1
Vi mt cch kt hp (ph thuc vo cch chn v tr k), chi ph ti thiu phi thc hin bng:
k j
f[i, k] (l chi ph ti thiu tnh m[q] ) cng vi f[k+1, j] (l chi ph ti thiu tnh
q =i
m[r] )
r = k +1
k
cng vi a[j].a[k+1].a[j+1] (l chi ph thc hin php nhn cui cng gia ma trn m[q]
q =i
j
v ma trn m[r] ). T suy ra: do c nhiu cch kt hp, m ta cn chn cch kt hp
r = k +1
HSPHN 1999-2004
Quy hoch ng 169
j
u nhn
r = t[i, j]+1
m[r] (c km theo du ng m ngoc) ng thi vit thm du "." vo
L Minh Hong
170 Chuyn
begin
Enter;
Optimize;
Assign(fo, OutputFile); Rewrite(fo);
WriteLn(fo, 'Number of numerical multiplications: ', f[1, n]);
Trace(1, n);
Close(fo);
end.
3.6. BI TP LUYN TP
3.6.1. Bi tp c hng dn li gii
Bi 1
Nhp vo hai s nguyn dng n v k (n, k 100). Hy cho bit
a) C bao nhiu s nguyn dng c n ch s m tng cc ch s ng bng k. Nu c hn
1 t s th ch cn thng bo c nhiu hn 1 t.
b) Nhp vo mt s p 1 t. Cho bit nu em cc s tm c xp theo th t tng dn th s
th p l s no ?
Hng dn:
Cu a: Ta s m s cc s c ng n ch s m tng cc ch s (TCCS) bng k, ch c iu
cc s ca ta cho php c th bt u bng 0. V d: ta coi 0045 l s c 4 ch s m TCCS l
9. Gi F[n, k] l s cc s c n ch s m TCCS bng k. Cc s c th biu din bng
mng x[1..n] gm cc ch s 09 v x[1] + x[2] + + x[n] = k. Nu c nh x[1] = t th ta
nhn thy x[2..n] lp thnh mt s c n - 1 ch s m TCCS bng k - t. Suy ra do x[1] c th
nhn cc gi tr t 0 ti 9 nn v mt s lng: F[n, k] = t =0 F[n 1, k t] . y l cng thc
9
HSPHN 1999-2004
Quy hoch ng 171
1, if 0 k 9
F[1, k] =
0, otherwise
Cu b: Da vo bng phng n F[0..n, 0..k] d ra s mang th t cho.
Bi 2
Cho n gi ko (n 200), mi gi cha khng qu 200 vin ko, v mt s M 40000. Hy
ch ra mt cch ly ra mt s cc gi ko c tng s ko l M, hoc thng bo rng
khng th thc hin c vic .
Hng dn:
Gi s s ko cha trong gi th i l A[i]
Gi b[V] l s nguyn dng b nht tho mn: C th chn trong s cc gi ko t gi 1 n
gi b[V] ra mt s gi c tng s ko l V. Nu khng c phng n chn, ta coi b[V] =
+. Trc tin, khi to b[0] := 0 v cc b[V] := + vi mi V > 0.
Vi mt gi tr V, gi k l gi tr cn tm gn cho b[V], v k cn b nht c th, nn nu c
cch chn trong s cc gi ko t gi 1 n gi k c s ko V th chc chn phi chn
gi k. Khi chn gi k ri th trong s cc gi ko t 1 n k - 1, phi chn ra c mt s
gi c s ko l V - A[k]. Tc l b[V - A[k]] k - 1 < k.
Suy ra b[V] s c tnh bng cch:
Xt tt c cc gi ko k c A[k] V v tho mn b[V - A[k]] < k, chn ra ch s k b nht gn
cho b[V]. y chnh l cng thc truy hi tnh bng phng n.
b[V] = min{k (A[k] V) & (b[V A[k]] < k)}
L Minh Hong
172 Chuyn
Cho mt bng A kch thc m x n, trn ghi cc s nguyn. Mt ngi xut pht ti no
ca ct 1, cn sang ct n (ti no cng c). Quy tc: T A[i, j] ch c quyn sang
mt trong 3 A[i, j + 1]; A[i - 1, j + 1]; A[i + 1, j + 1]. Hy tm v tr xut pht v hnh trnh
i t ct 1 sang ct n sao cho tng cc s ghi trn ng i l ln nht.
1 2 6 7 9
7 6 5 6 7
A =
1 2 3 4 2
4 7 8 7 6
Hng dn:
Gi B[i, j] l s im ln nht c th c c khi ti A[i, j]. R rng i vi nhng ct 1
th B[i, 1] = A[i, 1]:
1 2 6 7 9 1
7 6 5 6 7 7
A = B =
1 2 3 4 2 1
4 7 8 7 6 4
HSPHN 1999-2004
Quy hoch ng 173
MADAM MADAM
Edbabcd edcbabcde
00_11_22_33_222_1_000 000_11_222_33_222_11_000
abcdefg_hh_gfe_1_d_2_c_3_ba ab_3_c_2_d_1_efg_hh_gfe_1_d_2_c_3_ba
Bi 4
C n loi tin giy: T giy bc loi i c mnh gi l V[i] ( n 20, 1 V[i] 10000). Hi
mun mua mt mn hng gi l M th c bao nhiu cch tr s tin bng nhng loi giy
bc cho (Trng hp c > 1 t cch th ch cn thng bo c nhiu hn 1 t). Nu tn ti
cch tr, cho bit cch tr phi dng t t tin nht.
Bi 5
Cho n qun -mi-n xp dng ng theo hng ngang v c nh s t 1 n n. Qun -
mi-n th i c s ghi trn l a[i] v s ghi di l b[i]. Xem hnh v:
1 1 4 4 0 6
6 3 1 1 6 1
1 2 3 4 5 6
L Minh Hong
174 Chuyn
A B C D
A A A B B
B C D A B
C B C B A
D B D D D
Cho xu S gm n k t ch gm cc ch A, B, C, D.
Xt php co R(i): thay k t S[i] v S[i+1] bi k t nm trn hng S[i], ct S[i+1] ca bng
H.
V d: S = ABCD; p dng lin tip 3 ln R(1) s c
ABCD ACD BD B.
Yu cu: Cho trc mt k t X{A, B, C, D}, hy ch ra th t thc hin n - 1 php co
k t cn li cui cng trong S l X.
Bi 7
Cho N s t nhin a[1], a[2], , a[n]. Bit rng 1 n 200 v 0 a[i] 200. Ban u cc s
c t lin tip theo ng th t cch nhau bi du "?": a[1] ? a[2] ? ? a[n]. Yu cu:
Cho trc s nguyn K, hy tm cch thay cc du "?" bng du cng hay du tr c
mt biu thc s hc cho gi tr l K. Bit rng 1 n 200 v 0 a[i] 100.
V d: Ban u 1 ? 2 ? 3 ? 4 v K = 0 s cho kt qu 1 - 2 - 3 + 4.
Bi 8
Dy Catalan l mt dy s t nhin bt u l 0, kt thc l 0, hai phn t lin tip hn km
nhau 1 n v. Hy lp chng trnh nhp vo s nguyn dng n l v mt s nguyn dng
p. Cho bit rng nu nh ta em tt c cc dy Catalan di n xp theo th t t in th dy
th p l dy no.
Mt bi ton quy hoch ng c th c nhiu cch tip cn khc nhau, chn cch no l tu
theo yu cu bi ton sao cho d dng ci t nht. Phng php ny thng khng kh khn
trong vic tnh bng phng n, khng kh khn trong vic tm c s quy hoch ng, m
kh khn chnh l nhn nhn ra bi ton quy hoch ng v tm ra cng thc truy hi gii
n, cng vic ny i hi s nhanh nhy, khn kho, m ch t s rn luyn mi c th c
c. Hy c li 1 tm hiu k cc phng php thng dng khi ci t mt chng
trnh gii cng thc truy hi.
HSPHN 1999-2004
PHN 4. CC THUT TON TRN
TH
1. CC KHI NIM C BN
HSPHN 1999-2004
L thuyt th 177
n th a th
deg(v) = 2m
vV
L Minh Hong
178 Chuyn
deg
vV
+
(v) = deg (v) = m
vV
HSPHN 1999-2004
L thuyt th 179
L Minh Hong
180 Chuyn
1 2
4 3
Hnh 54
Ci t trn mng:
1 2 3 4 5 6
HSPHN 1999-2004
L thuyt th 181
1 2
4 3
Hnh 55
Cch 1: Dng mt mng cc nh, mng chia lm n on, on th i trong mng lu danh
sch cc nh k vi nh i: Vi th Hnh 55, danh sch k s l mt mng Adj gm 12
phn t:
1 2 3 4 5 6 7 8 9 10 11 12
2 3 5 1 3 1 2 4 3 5 1 4
I II III IV V
L Minh Hong
182 Chuyn
List 1: 2 3 5
List 2: 1 3
List 3: 1 2 4
List 4: 3 5
List 5: 1 4
u im ca danh sch k:
i vi danh sch k, vic duyt tt c cc nh k vi mt nh v cho trc l ht sc d
dng, ci tn "danh sch k" cho thy r iu ny. Vic duyt tt c cc cnh cng n
gin v mt cnh thc ra l ni mt nh vi mt nh khc k n.
Nhc im ca danh sch k
Danh sch k yu hn ma trn k vic kim tra (u, v) c phi l cnh hay khng, bi
trong cch biu din ny ta s phi vic phi duyt ton b danh sch k ca u hay danh
sch k ca v.
i vi nhng thut ton m ta s kho st, danh sch k tt hn hn so vi hai phng php
biu din trc. Ch c iu, trong trng hp c th m ma trn k hay danh sch cnh
khng th hin nhc im th ta nn dng ma trn k (hay danh sch cnh) bi ci t danh
sch k c phn di dng hn.
2.4. NHN XT
Trn y l nu cc cch biu din th trong b nh ca my tnh, cn nhp d liu cho
th th c nhiu cch khc nhau, dng cch no th tu. Chng hn nu biu din bng ma trn
k m cho nhp d liu c ma trn cp n x n (n l s nh) th khi nhp t bn phm s rt mt
thi gian, ta cho nhp kiu danh sch cnh cho nhanh. Chng hn mng A (nxn) l ma trn k
ca mt th v hng th ta c th khi to ban u mng A gm ton s 0, sau cho
ngi s dng nhp cc cnh bng cch nhp cc cp (i, j); chng trnh s tng A[i, j] v A[j,
i] ln 1. Vic nhp c th cho kt thc khi ngi s dng nhp gi tr i = 0. V d:
program Nhap_Do_Thi;
var
A: array[1..100, 1..100] of Integer; {Ma trn k ca th}
n, i, j: Integer;
begin
Write('Number of vertices'); ReadLn(n);
FillChar(A, SizeOf(A), 0);
repeat
Write('Enter edge (i, j) (i = 0 to exit) ');
ReadLn(i, j); {Nhp mt cp (i, j) tng nh l nhp danh sch cnh}
HSPHN 1999-2004
L thuyt th 183
if i <> 0 then
begin {nhng lu tr trong b nh li theo kiu ma trn k}
Inc(A[i, j]);
Inc(A[j, i]);
end;
until i = 0; {Nu ngi s dng nhp gi tr i = 0 th dng qu trnh nhp, nu khng th tip tc}
end.
Trong nhiu trng hp khng gian lu tr, vic chuyn i t cch biu din no sang
cch biu din khc khng c g kh khn. Nhng i vi thut ton ny th lm trn ma trn
k ngn gn hn, i vi thut ton kia c th lm trn danh sch cnh d dng hn v.v Do
, vi mc ch d hiu, cc chng trnh sau ny s la chn phng php biu din sao
cho vic ci t n gin nht nhm nu bt c bn cht thut ton. Cn trong trng hp
c th bt buc phi dng mt cch biu din no khc, th vic sa i chng trnh cng
khng tn qu nhiu thi gian.
L Minh Hong
184 Chuyn
3.1. BI TON
Cho th G = (V, E). u v v l hai nh ca G. Mt ng i (path) di p t nh s n
nh f l dy x[0..p] tho mn x[0] = s, x[p] = f v (x[i], x[i+1]) E vi i: 0 i < p.
ng i ni trn cn c th biu din bi dy cc cnh: (s = x[0], x[1]), (x[1], x[2]), ,
(x[p-1], x[p] = f)
nh u c gi l nh u, nh v c gi l nh cui ca ng i. ng i c nh u
trng vi nh cui gi l chu trnh (Circuit), ng i khng c cnh no i qua hn 1 ln
gi l ng i n, tng t ta c khi nim chu trnh n.
V d: Xt mt th v hng v mt th c hng trong Hnh 56:
2 3 2 3
1 4 1 4
6 5 6 5
Hnh 56: th v ng i
HSPHN 1999-2004
L thuyt th 185
ng i t s ti f
PATH.INP PATH.OUT
2 4
8715 From 1 you can visit:
12 1, 2, 3, 4, 5, 6,
6 13 The path from 1 to 5:
1 7 23 5<-3<-2<-1
8 24
35
3 5 46
78
L Minh Hong
186 Chuyn
InputFile = 'PATH.INP';
OutputFile = 'PATH.OUT';
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Trace: array[1..max] of Integer;
n, s, f: Integer;
begin
HSPHN 1999-2004
L thuyt th 187
Enter;
FillChar(Trace, SizeOf(Trace), 0); {Mi nh u cha thm}
Trace[s] := -1; {Ngoi tr s thm}
DFS(s);
Result;
end.
Nhn xt:
V c k thut nh du, nn th tc DFS s c gi n ln (n l s nh)
C th c nhiu ng i t s ti f, nhng thut ton DFS lun tr v mt ng i c th
t t in nh nht.
Qu trnh tm kim theo chiu su cho ta mt cy DFS gc s. Quan h cha-con trn cy
c nh ngha l: nu t nh u ti thm nh v (DFS(u) gi DFS(v)) th u l nt cha ca
nt v. Hnh 57 l th v cy DFS tng ng vi nh xut pht s = 1.
2nd 5th
2 4 2 4
6 6 6th
1 7 1 7
8 8
1 st
3 5 3 5
4th
3 rd
x1 x2 xp
L Minh Hong
188 Chuyn
danh sch. Chnh v nguyn tc nn danh sch cha nhng nh ang ch s c t chc
di dng hng i (Queue)
Nu ta c Queue l mt hng i vi th tc Push(v) y mt nh v vo hng i v hm
Pop tr v mt nh ly ra t hng i th m hnh ca gii thut c th vit nh sau:
for (v V) do Free[v] := True;
Free[s] := False; {Khi to ban u ch c nh S b nh du}
Queue := ; Push(s); {Khi to hng i ban u ch gm mt nh s}
repeat {Lp ti khi hng i rng}
u := Pop; {Ly t hng i ra mt nh u}
for (v V: Free[v] and ((u, v) E)) do {Xt nhng nh v k u cha b a vo hng i}
begin
Trace[v] := u; {Lu vt ng i}
Free[v] := False; {nh du v}
Push(v); {y v vo hng i}
end;
until Queue = ;
Thng bo t s c th thm c nhng nh v m Free[v] = False;
if Free[f] then {s i ti c f}
Truy theo vt t f tm ng i t s ti f;
Tng t nh thut ton tm kim theo chiu su, ta c th dng mng Trace[1..n] kim lun
chc nng nh du.
P_4_03_2.PAS * Thut ton tm kim theo chiu rng
program Breadth_First_Search;
const
InputFile = 'PATH.INP';
OutputFile = 'PATH.OUT';
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Trace: array[1..max] of Integer;
n, s, f: Integer;
HSPHN 1999-2004
L thuyt th 189
begin
Enter;
BFS;
Result;
end.
Nhn xt:
C th c nhiu ng i t s ti f nhng thut ton BFS lun tr v mt ng i ngn
nht (theo ngha i qua t cnh nht).
Qu trnh tm kim theo chiu rng cho ta mt cy BFS gc s. Quan h cha - con trn cy
c nh ngha l: nu t nh u ti thm nh v th u l nt cha ca nt v. Hnh 58 l v
d v cy BFS.
L Minh Hong
190 Chuyn
2nd 4th
2 4 2 4
6 6 6th
1 7 1 7
8 8
1 st
3 5 3 5
5th
3 rd
HSPHN 1999-2004
L thuyt th 191
4.1. NH NGHA
4.1.1. i vi th v hng G = (V, E)
G gi l lin thng (connected) nu lun tn ti ng i gia mi cp nh phn bit ca
th. Nu G khng lin thng th chc chn n s l hp ca hai hay nhiu th con* lin
thng, cc th con ny i mt khng c nh chung. Cc th con lin thng ri nhau
nh vy c gi l cc thnh phn lin thng ca th ang xt (Xem v d).
G1
G3
G2
Khp Cu
*
th G = (V, E) l con ca th G' = (V', E') nu G l th c VV' v E E'
L Minh Hong
192 Chuyn
begin
for v V do khi to v cha nh du;
Count := 0;
for u := 1 to n do
if <u cha nh du> then
begin
Count := Count + 1;
WriteLn('Thnh phn lin thng th ', Count, ' gm cc nh : ');
Scan(u);
end;
end.
Vi thut ton lit k cc thnh phn lin thng nh th ny, th phc tp tnh ton ca n
ng bng phc tp tnh ton ca thut ton tm kim trn th trong th tc Scan.
HSPHN 1999-2004
L thuyt th 193
K3 K4 K5
Hnh 62: th y
L Minh Hong
194 Chuyn
HSPHN 1999-2004
L thuyt th 195
begin
Enter;
{Thut ton Warshall}
for k := 1 to n do
for u := 1 to n do
for v := 1 to n do
a[u, v] := a[u, v] or a[u, k] and a[k, v];
Assign(fo, OutputFile); Rewrite(fo);
Count := 0;
FillChar(Free, n, True); {Mi nh u cha c lit k vo thnh phn lin thng no}
for u := 1 to n do
if Free[u] then {Vi mt nh u cha c lit k vo thnh phn lin thng no}
begin
Inc(Count);
WriteLn(fo, 'Connected Component ', Count, ': ');
for v := 1 to n do
if a[u, v] then {Xt nhng nh k u (trn bao ng)}
begin
Write(fo, v, ', '); {Lit k nh vo thnh phn lin thng cha u}
Free[v] := False; {Lit k nh no nh du nh }
end;
WriteLn(fo);
end;
Close(fo);
end.
L Minh Hong
196 Chuyn
bi ton ta c mt phng php kh hu hiu da trn thut ton tm kim theo chiu su
Depth First Search.
4.4.1. Phn tch
Thm vo th mt nh x v ni x vi tt c cc nh cn li ca th bng cc cung nh
hng. Khi qu trnh tm kim theo chiu su bt u t x c th coi nh mt qu trnh xy
dng cy tm kim theo chiu su (cy DFS) gc x.
procedure Visit(uV);
begin
Thm u vo cy tm kim DFS;
for (v: (v cy DFS) and ((u, v) E)) do Visit(v);
end;
begin
Thm vo th nh x v cc cung nh hng (x, v) vi mi v;
Khi to cy tm kim DFS := ;
Visit(x);
end.
th tc thm nh quy Visit(u). Th tc ny xt tt c nhng nh v ni t u, nu v
cha c thm th i theo cung thm v, tc l b sung cung (u, v) vo cy tm kim DFS.
Nu v thm th c ba kh nng xy ra i vi v tr ca u v v trong cy tm kim DFS:
v l tin bi (ancestor - t tin) ca u, tc l v c thm trc u v th tc Visit(u) do dy
chuyn quy t th tc Visit(v) gi ti. Cung (u, v) khi c gi l cung ngc (Back
edge)
v l hu du (descendant - con chu) ca u, tc l u c thm trc v, nhng th tc
Visit(u) sau khi tin quy theo mt hng khc gi Visit(v) ri. Nn khi dy chuyn
quy li li v th tc Visit(u) s thy v l thm nn khng thm li na. Cung (u, v)
khi gi l cung xui (Forward edge).
v thuc mt nhnh ca cy DFS duyt trc , tc l s c mt nh w c thm
trc c u v v. Th tc Visit(w) gi trc s r theo mt nhnh no thm v trc, ri
khi li li, r sang mt nhnh khc thm u. Cung (u, v) khi gi l cung cho (Cross
edge)
(Rt tic l t in thut ng tin hc Anh-Vit qu ngho nn nn khng th tm ra nhng t
tng ng vi cc thut ng trn. Ta c th hiu qua cc v d).
HSPHN 1999-2004
L thuyt th 197
Ta nhn thy mt c im ca thut ton tm kim theo chiu su, thut ton khng ch duyt
qua cc nh, n cn duyt qua tt c nhng cung na. Ngoi nhng cung nm trn cy tm
kim, nhng cung cn li c th chia lm ba loi: cung ngc, cung xui, cung cho.
4.4.2. Cy tm kim DFS v cc thnh phn lin thng mnh
nh l 1: Nu a, b l hai nh thuc thnh phn lin thng mnh C th vi mi ng i t a
ti b cng nh t b ti a. Tt c nh trung gian trn ng i u phi thuc C.
Chng minh
Nu a v b l hai nh thuc C th tc l c mt ng i t a ti b v mt ng i khc t b
ti a. Suy ra vi mt nh v nm trn ng i t a ti b th a ti c v, v ti c b, m b
c ng ti a nn v cng ti c a. Vy v nm trong thnh phn lin thng mnh cha a tc
l vC. Tng t vi mt nh nm trn ng i t b ti a.
nh l 2: Vi mt thnh phn lin thng mnh C bt k, s tn ti mt nh r C sao cho
mi nh ca C u thuc nhnh DFS gc r.
Chng minh: Trc ht, nhc li mt thnh phn lin thng mnh l mt th con lin
thng mnh ca th ban u tho mn tnh cht ti i tc l vic thm vo thnh phn
mt tp hp nh khc s lm mt i tnh lin thng mnh.
Trong s cc nh ca C, chn r l nh c thm u tin theo thut ton tm kim theo
chiu su. Ta s chng minh C nm trong nhnh DFS gc r. Tht vy: vi mt nh v bt k
ca C, do C lin thng mnh nn phi tn ti mt ng i t r ti v:
(r = x[0], x[1], , x[k] = v)
T nh l 1, tt c cc nh x[1], x[2], , x[k] u thuc C nn chng s phi thm sau nh
r. Khi th tc Visit(r) c gi th tt c cc nh x[1], x[2], x[k]=v u cha thm; v th
tc Visit(r) s lit k tt c nhng nh cha thm n c t r bng cch xy dng nhnh
gc r ca cy DFS, nn cc nh x[1], x[2], , x[k] = v s thuc nhnh gc r ca cy DFS.
Bi chn v l nh bt k trong C nn ta c iu phi chng minh.
nh r trong chng minh nh l - nh thm trc tt c cc nh khc trong C - gi l cht
ca thnh phn C. Mi thnh phn lin thng mnh c duy nht mt cht. Xt v v tr trong
cy tm kim DFS, cht ca mt thnh phn lin thng l nh nm cao nht so vi cc nh
L Minh Hong
198 Chuyn
khc thuc thnh phn , hay ni cch khc: l tin bi ca tt c cc nh thuc thnh phn
.
nh l 3: Lun tm c nh cht a tho mn: Qu trnh tm kim theo chiu su bt u t
a khng thm c bt k mt cht no khc. (Tc l nhnh DFS gc a khng cha mt cht
no ngoi a) chng hn ta chn a l cht c thm sau cng trong mt dy chuyn quy
hoc chn a l cht thm sau tt c cc cht khc. Vi cht a nh vy th cc nh thuc
nhnh DFS gc a chnh l thnh phn lin thng mnh cha a.
Chng minh: Vi mi nh v nm trong nhnh DFS gc a, xt b l cht ca thnh phn lin
thng mnh cha v. Ta s chng minh a b. Tht vy, theo nh l 2, v phi nm trong nhnh
DFS gc b. Vy v nm trong c nhnh DFS gc a v nhnh DFS gc b. Gi s phn chng
rng ab th s c hai kh nng xy ra:
Kh nng 1: Nhnh DFS gc a cha nhnh DFS gc b, c ngha l th tc Visit(b) s do
th tc Visit(a) gi ti, iu ny mu thun vi gi thit rng a l cht m qu trnh tm
kim theo chiu su bt u t a khng thm mt cht no khc.
Kh nng 2: Nhnh DFS gc a nm trong nhnh DFS gc b, c ngha l a nm trn mt
ng i t b ti v. Do b v v thuc cng mt thnh phn lin thng mnh nn theo nh l
1, a cng phi thuc thnh phn lin thng mnh . Vy th thnh phn lin thng mnh
ny c hai cht a v b. iu ny v l.
Theo nh l 2, ta c thnh phn lin thng mnh cha a nm trong nhnh DFS gc a, theo
chng minh trn ta li c: Mi nh trong nhnh DFS gc a nm trong thnh phn lin thng
mnh cha a. Kt hp li c: Nhnh DFS gc a chnh l thnh phn lin thng mnh cha a.
4.4.3. Thut ton Tarjan (R.E.Tarjan - 1972)
Chn u l cht m t qu trnh tm kim theo chiu su khng thm thm bt k mt cht
no khc, chn ly thnh phn lin thng mnh th nht l nhnh DFS gc u. Sau loi b
nhnh DFS gc u ra khi cy DFS, li tm thy mt nh cht v khc m nhnh DFS gc v
khng cha cht no khc, li chn ly thnh phn lin thng mnh th hai l nhnh DFS gc
v. Tng t nh vy cho thnh phn lin thng mnh th ba, th t, v.v C th hnh dung
thut ton Tarjan "b" cy DFS ti v tr cc cht c cc nhnh ri rc, mi nhnh l mt
thnh phn lin thng mnh.
HSPHN 1999-2004
L thuyt th 199
1
1
2
2
8
8
3
3
4
4
9 10
11 9 10
11
5
5
6
6
7
7
L Minh Hong
200 Chuyn
lin thng cha v'. Theo tnh cht trn, v' phi thm trc r, suy ra r' cng phi thm trc r.
C hai kh nng xy ra:
Nu r' thuc nhnh DFS duyt trc r th r' s c duyt xong trc khi thm r, tc l
khi thm r v c sau ny khi thm v th nhnh DFS gc r' b hu, cung cho (v, v') s
khng c tnh n na.
Nu r' l tin bi ca r th ta c r' n c r, v nm trong nhnh DFS gc r nn r n c
v, v n c v' v (v, v') l cung, v' li n c r' bi r' l cht ca thnh phn lin thng
mnh cha v'. Ta thit lp c chu trnh (r'rvv'r'), suy ra r' v r thuc cng mt
thnh phn lin thng mnh, r' l cht nn r khng th l cht na.
T ba nhn xt v cch ci t chng trnh nh trong nhn xt 3, Ta c: nh r l cht nu
v ch nu khng tn ti cung ngc hoc cung cho ni mt nh thuc nhnh DFS gc r vi
mt nh ngoi nhnh , hay ni cch khc: r l cht nu v ch nu khng tn ti cung
ni t mt nh thuc nhnh DFS gc r ti mt nh thm trc r.
Di y l mt ci t ht sc thng minh, ch cn sa i mt cht th tc Visit trn l ta
c ngay phng php ny. Ni dung ca n l nh s th t cc nh t nh c thm u
tin n nh thm sau cng. nh ngha Number[u] l s th t ca nh u theo cch nh s
. Ta tnh thm Low[u] l gi tr Number[.] nh nht trong cc nh c th n c t mt
nh v no ca nhnh DFS gc u bng mt cung (vi gi thit rng u c mt cung gi ni
vi chnh u).
C th cch cc tiu ho Low[u] nh sau:
Trong th tc Visit(u), trc ht ta nh s th t thm cho nh u v khi gn Low[u] :=
Number[u] (u c cung ti chnh u). Sau vi mi nh v ni t u, c hai kh nng:
Nu v thm th ta cc tiu ho Low[u] theo cng thc:
Low[u]mi := min(Low[u]c, Number[v]).
Nu v cha thm th ta gi quy i thm v, sau cc tiu ho Low[u] theo cng thc:
Low[u]mi := min(Low[u]c, Low[v])
D dng chng minh c tnh ng n ca cng thc tnh.
Khi duyt xong mt nh u (chun b thot khi th tc Visit(u)), ta so snh Low[u] v
Number[u]. Nu nh Low[u] = Number[u] th u l cht, bi khng c cung ni t mt nh
thuc nhnh DFS gc u ti mt nh thm trc u. Khi ch vic lit k cc nh thuc
thnh phn lin thng mnh cha u l nhnh DFS gc u.
cng vic d dng hn na, ta nh ngha mt danh sch Stack c t chc di dng
ngn xp v dng ngn xp ny ly ra cc nh thuc mt nhnh no . Khi thm ti mt
nh u, ta y ngay nh u vo ngn xp, th khi duyt xong nh u, mi nh thuc nhnh
DFS gc u s c y vo ngn xp Stack ngay sau u. Nu u l cht, ta ch vic ly cc nh
ra khi ngn xp Stack cho ti khi ly ti nh u l s c nhnh DFS gc u cng chnh l
thnh phn lin thng mnh cha u.
procedure Visit(uV);
HSPHN 1999-2004
L thuyt th 201
begin
Count := Count + 1; Number[u] := Count; {Trc ht nh s u}
Low[u] := Number[u];
Push(u); {y u vo ngn xp}
nh du u thm;
for (v: (u, v)E) do
if v thm then
Low[u] := min(Low[u], Number[v])
else
begin
Visit(v);
Low[u] := min(Low[u], Low[v]);
end;
if Number[u] = Low[u] then {Nu u l cht}
begin
Thng bo thnh phn lin thng mnh vi cht u gm c cc nh:;
repeat
v := Pop; {Ly t ngn xp ra mt nh v}
Output v;
Xo nh v khi th;
until v = u;
end;
end;
begin
Thm vo th mt nh x v cc cung (x, v) vi mi v;
Count := 0;
L := ; {Khi to mt ngn xp rng}
Visit(x)
end.
Bi thut ton Tarjan ch l sa i mt cht thut ton DFS, cc thao tc vo/ra ngn xp
c thc hin khng qu n ln. Vy nn nu th c n nh v m cung th phc tp tnh
ton ca thut ton Tarjan vn l O(n + m) trong trng hp biu din th bng danh sch
k, l O(n2) trong trng hp biu din bng ma trn k v l O(n.m) trong trng hp biu
din bng danh sch cnh.
Mi th sn sng, di y l ton b chng trnh. Trong chng trnh ny, ta s dng:
Ma trn k A biu din th.
Mng Free kiu Boolean, Free[u] = True nu u cha b lit k vo thnh phn lin thng
no, tc l u cha b loi khi th.
Mng Number v Low vi cng dng nh trn, quy c Number[u] = 0 nu nh u cha
c thm.
Mng Stack, th tc Push, hm Pop m t cu trc ngn xp.
Input: file vn bn SCONNECT.INP:
Dng u: Ghi s nh n ( 100) v s cung m ca th cch nhau mt du cch
m dng tip theo, mi dng ghi hai s nguyn u, v cch nhau mt du cch th hin c
cung (u, v) trong th
Output: file vn bn SCONNECT.OUT, lit k cc thnh phn lin thng mnh
L Minh Hong
202 Chuyn
1
SCONNECT.INP SCONNECT.OUT
11 15 Component 1:
12 7, 6, 5,
2
18 Component 2:
8
23 4, 3, 2,
34 Component 3:
3 42 11, 10, 9, 8,
45 Component 4:
4 56 1,
9 10 67
11 75
5 89
94
9 10
10 8
6
10 11
7 11 8
P_4_04_2.PAS * Thut ton Tarjan lit k cc thnh phn lin thng mnh
program Strong_connectivity;
const
InputFile = 'SCONNECT.INP';
OutputFile = 'SCONNECT.OUT';
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Free: array[1..max] of Boolean;
Number, Low, Stack: array[1..max] of Integer;
n, Count, ComponentCount, Top: Integer;
fo: Text;
procedure Enter;
var
i, u, v, m: Integer;
fi: Text;
begin
Assign(fi, InputFile); Reset(fi);
FillChar(a, SizeOf(a), False);
ReadLn(fi, n, m);
for i := 1 to m do
begin
ReadLn(fi, u, v);
a[u, v] := True;
end;
Close(fi);
end;
HSPHN 1999-2004
L thuyt th 203
procedure Solve;
var
u: Integer;
begin
{Thay v thm mt nh gi x v cc cung (x, v) vi mi nh v ri gi Visit(x), ta c th lm th ny cho nhanh}
for u := 1 to n do
if Number[u] = 0 then Visit(u);
end;
begin
Enter;
Assign(fo, OutputFile); Rewrite(fo);
Init;
Solve;
Close(fo);
end.
Bi tp
Bi 1
L Minh Hong
204 Chuyn
1 11
2 6
3 10
4 5
5 4
6 7 9 8
11 7
8 3
9 2
10 1
Hnh 66: nh s li, o chiu cc cung v duyt BFS vi cch chn cc nh xut pht ngc li vi th
t duyt xong (th t 11, 10 3, 2, 1)
Bi 2
HSPHN 1999-2004
L thuyt th 205
L Minh Hong
206 Chuyn
HSPHN 1999-2004
L thuyt th 207
L Minh Hong
208 Chuyn
G T1 T2 T3
1 1
2 3 2 3
4 5 6 7 4 5 6 7
8 9 10 11 8 9 10 11
a) b)
Hnh 68: Cy khung DFS (a) v cy khung BFS (b) (Mi tn ch chiu i thm cc nh)
HSPHN 1999-2004
L thuyt th 209
L Minh Hong
210 Chuyn
begin
nh du mi nh u cha thm;
for (v V) do
if v cha thm then Visit(v);
end;
Coi mt cnh ca th tng ng vi hai cung c hng ngc chiu nhau. Thut ton
tm kim theo chiu su theo m hnh trn s duyt qua ht cc nh ca th v tt c cc
cung na. Qu trnh duyt cho ta mt cy tm kim DFS. Ta c cc nhn xt sau:
Nhn xt 1:
Qu trnh duyt s khng c cung cho (cung i t mt nhnh DFS thm sau ti nhnh DFS
thm trc). Tht vy, nu qu trnh duyt xt ti mt cung (u, v):
Nu u thm trc v c ngha l khi Visit(u) c gi th v cha thm, v th tc Visit(u) s
xy dng nhnh DFS gc u gm nhng nh cha thm n c t u, suy ra v nm trong
nhnh DFS gc u v l hu du ca u, hay (u, v) l cung DFS hoc cung xui.
Nu u thm sau v (v thm trc u), tng t trn, ta suy ra u nm trong nhnh DFS gc v,
v l tin bi ca u (u, v) l cung ngc.
Nhn xt 2:
Trong qu trnh duyt th theo chiu su, nu c duyt qua cung (u, v) no th ta b i cung
(v, u). (Tc l h duyt qua cung (u, v) th ta nh chiu lun cnh (u, v) theo chiu t u ti v),
ta c mt php nh chiu th gi l php nh chiu DFS.
HSPHN 1999-2004
L thuyt th 211
1 1
2 3 2 3
4 5 6 4 5 6
7 7
8 9 8 9
10 10
Nhn xt 3:
Vi php nh chiu DFS, th s ch cn cc cung trn cy DFS v cung ngc, khng cn li
cung xui. Bi trn th v hng ban u, nu ta coi mt cnh l hai cung c hng ngc
chiu nhau th vi mt cung xui ta c cung ngc chiu vi n l cung ngc. Do tnh cht
DFS, cung ngc c duyt trc cung xui tng ng, nn khi nh chiu cnh theo cung
ngc th cung xui s b hu v khng b xt ti na.
Nhn xt 4:
Trong th v hng ban u, cnh b nh hng thnh cung ngc chnh l cnh ngoi
ca cy DFS. Chnh v vy, mi chu trnh c s ca cy DFS trong th v hng ban
u vn s l chu trnh trong th c hng to ra. (y l mt phng php hiu qu
lit k cc chu trnh c s ca cy khung DFS: Va duyt DFS va nh chiu, nu duyt phi
cung ngc (u, v) th truy vt ng i ca DFS tm ng t v n u, sau ni thm
cung ngc (u, v) c mt chu trnh c s).
nh l: iu kin cn v mt th v hng lin thng c th nh chiu c l mi
cnh ca th nm trn t nht mt chu trnh n (Hay ni cch khc mi cnh ca th
u khng phi l cu).
Chng minh: Gi G = (V, E) l mt th v hng lin thng.
""
Nu G l nh chiu c th sau khi nh hng s c th lin thng mnh G'. Vi mt
cnh (u, v) c nh chiu thnh cung (u, v) th s tn ti mt ng i n trong G' theo cc
cnh nh hng t v v u. ng i ni thm cung (u, v) s thnh mt chu trnh n c
hng trong G'. Tc l trn th ban u, cnh (u, v) nm trn mt chu trnh n.
""
Nu mi cnh ca G u nm trn mt chu trnh n, ta s chng minh rng: php nh chiu
DFS s to ra th G' lin thng mnh.
Trc ht ta chng minh rng nu (u, v) l cnh ca G th s c mt ng i t u ti v trong
G'. Tht vy, v (u, v) nm trong mt chu trnh n, m mi cnh ca mt chu trnh n u
L Minh Hong
212 Chuyn
HSPHN 1999-2004
L thuyt th 213
1 1
1
1
2 3 2 3
1
4
4 5 6 7 8 2 4
2
7 10 2
8 9 5 6 4
4
10 9 +
th v hng th nh chiu
Gi tr Numbering[.] ghi trong vng trn
Gi tr Low[.] ghi bn ngoi vng trn
L Minh Hong
214 Chuyn
CUT.INP CUT.OUT
1
12 14 Bridges:
12 (3, 6)
11
13 (5, 10)
2 3
23 (11, 12)
24 Cut vertices:
12 25 2
4 5 6 27 3
36 5
45 6
7 47
8 9
5 10
10 68
69
89
11 12
Ngoi cc mng c ni ti khi trnh by thut ton, c thm mt mng Parent[1..n],
trong Parent[v] ch ra nt cha ca nt v trn cy DFS, nu v l gc ca mt cy DFS th
Parent[v] c t bng -1. Cng dng ca mng Parent l cho php duyt tt c cc cnh
trn cy DFS v kim tra mt nh c phi l gc ca cy DFS hay khng.
P_4_05_1.PAS * Lit k cc khp v cu ca th
program Directivity_Bridges_CutVertices;
const
InputFile = 'CUT.INP';
OutputFile = 'CUT.OUT';
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Number, Low, Parent: array[1..max] of Integer;
n, Count: Integer;
HSPHN 1999-2004
L thuyt th 215
begin
Parent[v] := u;
Visit(v); {Thm v}
if Low[u] > Low[v] then Low[u] := Low[v]; {Cc tiu ho Low[u] theo Low[v]}
end
else {v thm, (u, v) l cung ngc}
if Low[u] > Number[v] then Low[u] := Number[v]; {Cc tiu ho Low[u] theo Number[v]}
end;
end;
procedure Solve;
var
u, v: Integer;
begin
Count := 0;
FillChar(Parent, SizeOf(Parent), 0); {nh du mi nh u cha thm}
for u := 1 to n do
if Parent[u] = 0 then {Gp mt nh cha thm}
begin
Parent[u] := -1; {Cho u l mt gc cy DFS}
Visit(u); {Xy dng cy DFS gc u}
end;
end;
begin
Enter;
Solve;
Result;
end.
L Minh Hong
216 Chuyn
6.1. BI TON 7 CI CU
Thnh ph Konigsberg thuc Ph (nay l Kaliningrad thuc Cng ho Nga), c chia lm 4
vng bng cc nhnh sng Pregel. Cc vng ny gm 2 vng bn b sng (B, C), o
Kneiphof (A) v mt min nm gia hai nhnh sng Pregel (D). Vo th k XVIII, ngi ta
xy 7 chic cu ni nhng vng ny vi nhau. Ngi dn y t hi: Liu c cch no
xut pht ti mt a im trong thnh ph, i qua 7 chic cu, mi chic ng 1 ln ri quay
tr v ni xut pht khng ?
Nh ton hc Thy s Leonhard Euler gii bi ton ny v c th coi y l ng dng u
tin ca L thuyt th, ng m hnh ho s 7 ci cu bng mt a th, bn vng
c biu din bng 4 nh, cc cu l cc cnh. Bi ton tm ng qua 7 cu, mi cu ng
mt ln c th tng qut ho bng bi ton: C tn ti chu trnh n trong a th cha
tt c cc cnh ?.
A D
6.2. NH NGHA
Chu trnh n cha tt c cc cnh ca th c gi l chu trnh Euler
ng i n cha tt c cc cnh ca th c gi l ng i Euler
Mt th c chu trnh Euler c gi l th Euler
Mt th c ng i Euler c gi l th na Euler.
6.3. NH L
Mt th v hng lin thng G = (V, E) c chu trnh Euler khi v ch khi mi nh ca
n u c bc chn: deg(v) 0 (mod 2) (vV)
Mt th v hng lin thng c ng i Euler nhng khng c chu trnh Euler khi v
ch khi n c ng 2 nh bc l
Mt thi c hng lin thng yu G = (V, E) c chu trnh Euler th mi nh ca n c
bn bc ra bng bn bc vo: deg+(v) = deg-(v) (vV); Ngc li, nu G lin thng yu
v mi nh ca n c bn bc ra bng bn bc vo th G c chu trnh Euler, hay G s l
lin thng mnh.
HSPHN 1999-2004
L thuyt th 217
2 5
7
1 4
8
3 6
Hnh 72
Nu xut pht t nh 1, c hai cch i tip: hoc sang 2 hoc sang 3, gi s ta s sang 2 v
xo cnh (1, 2) va i qua. T 2 ch c cch duy nht l sang 4, nn cho d (2, 4) l cu ta
cng phi i sau xo lun cnh (2, 4). n y, cc cnh cn li ca th c th v nh
Hnh 73 bng nt lin, cc cnh b xo c v bng nt t.
2 5
7
1 4
8
3 6
Hnh 73
L Minh Hong
218 Chuyn
6.5. CI T
Ta s ci t thut ton Fleury trn mt a th v hng. n gin, ta coi th ny
c chu trnh Euler, cng vic ca ta l tm ra chu trnh thi. Bi vic kim tra tnh lin
thng cng nh kim tra mi nh u c bc chn n gi c th coi l chuyn nh.
Input: file vn bn EULER.INP
Dng 1: Cha s nh n ca th (n 100)
Cc dng tip theo, mi dng cha 3 s nguyn dng cch nhau t nht 1 du cch c
dng: u v k cho bit gia nh u v nh v c k cnh ni
Output: file vn bn EULER.OUT, ghi chu trnh EULER
EULER.INP EULER.OUT
1 2 5 1231341
121
132
141
4 3 231
341
P_4_06_1.PAS * Thut ton Fleury tm chu trnh Euler
program Euler_Circuit;
const
InputFile = 'EULER.INP';
OutputFile = 'EULER.OUT';
max = 100;
var
a: array[1..max, 1..max] of Integer;
n: Integer;
procedure Enter;
var
u, v, k: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
FillChar(a, SizeOf(a), 0);
HSPHN 1999-2004
L thuyt th 219
ReadLn(f, n);
while not SeekEof(f) do
begin
ReadLn(f, u, v, k);
a[u, v] := k;
a[v, u] := k;
end;
Close(f);
end;
L Minh Hong
220 Chuyn
end;
until Next = 0; {Cho ti khi khng i tip c na}
Close(f);
end;
begin
Enter;
FindEulerCircuit;
end.
HSPHN 1999-2004
L thuyt th 221
procedure FindEulerCircuit;
var
u, v, count: Integer;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
Stack[1] := 1; {Khi to ngn xp ban u ch gm nh 1}
Top := 1;
count := 0;
while Top <> 0 do {Chng no ngn xp cha rng}
begin
u := Get; {Xc nh u l phn t nh ngn xp}
for v := 1 to n do
L Minh Hong
222 Chuyn
begin
Enter;
FindEulerCircuit;
end.
Bi tp
Trn mt phng cho n hnh ch nht c cc cnh song song vi cc trc to . Hy ch ra
mt chu trnh:
Ch i trn cnh ca cc hnh ch nht
Trn cnh ca mi hnh ch nht, ngoi tr nhng giao im vi cnh ca hnh ch nht khc
c th qua nhiu ln, nhng im cn li ch c qua ng mt ln.
B C
M
E F
J K
A D
H G
N
I L
M D A B C M F G N L I J K N H E M
HSPHN 1999-2004
L thuyt th 223
7.1. NH NGHA
Cho th G = (V, E) c n nh
Chu trnh (x[1], x[2], , x[n], x[1]) c gi l chu trnh Hamilton nu x[i] x[j] vi i, j:
1i<jn
ng i (x[1], x[2], , x[n]) c gi l ng i Hamilton nu x[i] x[j] vi i, j: 1
i<jn
th c chu trnh Hamilton c gi l th Hamilton
th c ng i Hamilton c gi l th na Hamilton
C th pht biu mt cch hnh thc: Chu trnh Hamilton l chu trnh xut pht t 1 nh, i
thm tt c nhng nh cn li mi nh ng 1 ln, cui cng quay tr li nh xut pht.
ng i Hamilton l ng i qua tt c cc nh ca th, mi nh ng 1 ln. Khc vi
khi nim chu trnh Euler v ng i Euler, mt chu trnh Hamilton khng phi l ng i
Hamilton bi c nh xut pht c thm ti 2 ln.
V d: Xt 3 n th G1, G2, G3 nh trong Hnh 74:
b c a b a b e
e d d c d c f g
G1 G2 G3
Hnh 74
th G1 c chu trnh Hamilton (a, b, c, d, e, a). G2 khng c chu trnh Hamilton v deg(a) =
1 nhng c ng i Hamilton (a, b, c, d). G3 khng c c chu trnh Hamilton ln ng i
Hamilton
7.2. NH L
th v hng G, trong tn ti k nh sao cho nu xo i k nh ny cng vi nhng
cnh lin thuc ca chng th th nhn c s c nhiu hn k thnh phn lin thng.
Th khng nh l G khng c chu trnh Hamilton. Mnh phn o ca nh l ny cho
ta iu kin cn mt th c chu trnh Hamilton
nh l Dirac (1952): th v hng G c n nh (n 3). Khi nu mi nh v ca G
u c deg(v) n/2 th G c chu trnh Hamilton. y l mt iu kin mt th c
chu trnh Hamilton.
L Minh Hong
224 Chuyn
7.3. CI T
Di y ta s ci t mt chng trnh lit k tt c cc chu trnh Hamilton xut pht t nh
1, cc chu trnh Hamilton khc c th c c bng cch hon v vng quanh. Lu rng cho
ti nay, ngi ta vn cha tm ra mt phng php no thc s hiu qu hn phng php
quay lui tm d ch mt chu trnh Hamilton cng nh ng i Hamilton trong trng hp
th tng qut.
Input: file vn bn HAMILTON.INP
Dng 1 ghi s nh n (2 n 100) v s cnh m ca th cch nhau 1 du cch
m dng tip theo, mi dng c dng hai s nguyn dng u, v cch nhau 1 du cch, th
hin u, v l hai nh k nhau trong th
Output: file vn bn HAMILTON.OUT lit k cc chu trnh Hamilton
1
HAMILTON.INP HAMILTON.OUT
56 135241
5 2 12 142531
13
24
35
41
4 3
52
P_4_07_1.PAS * Thut ton quay lui lit k chu trnh Hamilton
program All_of_Hamilton_Circuits;
const
InputFile = 'HAMILTON.INP';
OutputFile = 'HAMILTON.OUT';
max = 100;
var
fo: Text;
a: array[1..max, 1..max] of Boolean; {Ma trn k ca th: a[u, v] = True (u, v) l cnh}
Free: array[1..max] of Boolean; {Mng nh du Free[v] = True nu cha i qua nh v}
x: array[1..max] of Integer; {Chu trnh Hamilton s tm l; 1=x[1]x[2] x[n] x[1]=1}
n: Integer;
procedure Enter;
var
i, u, v, m: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
FillChar(a, SizeOf(a), False);
ReadLn(f, n, m);
for i := 1 to m do
begin
ReadLn(f, u, v);
a[u, v] := True;
a[v, u] := True;
end;
Close(f);
end;
HSPHN 1999-2004
L thuyt th 225
begin
Enter;
FillChar(Free, SizeOf(Free), True); {Khi to: Cc nh u cha i qua}
x[1] := 1; Free[1] := False; {Bt u t nh 1}
Assign(fo, OutputFile); Rewrite(fo);
Try(2); {Th cc cch chn nh k tip}
Close(fo);
end.
Bi tp
Bi 1
a) Lp chng trnh nhp vo mt th v ch ra ng mt chu trnh Hamilton nu c.
b) Lp chng trnh nhp vo mt th v ch ra ng mt ng i Hamilton nu c.
Bi 2
Trong m ci ca Perse v Andromde c 2n hip s. Mi hip s c khng qu n - 1 k
th. Hy gip Cassiop, m ca Andromde xp 2n hip s ngi quanh mt bn trn sao cho
khng c hip s no phi ngi cnh k th ca mnh. Mi hip s s cho bit nhng k th
ca mnh khi h n sn rng.
Bi 3
Gray code: Mt hnh trn c chia thnh 2n hnh qut ng tm. Hy xp tt c cc xu nh
phn di n vo cc hnh qut, mi xu vo mt hnh qut sao cho bt c hai xu no hai
hnh qut cnh nhau u ch khc nhau ng 1 bit. V d vi n = 3:
L Minh Hong
226 Chuyn
100 000
101 001
111 011
110 010
Bi 4
Thch : Bi ton m i tun: Trn bn c tng qut kch thc n x n vung (n chn v 6
n 20). Trn mt no c t mt qun m. Qun m ang (x[1], y[1]) c th di
chuyn sang (x[2], y[2]) nu x[1]-x[2].y[1]-y[2] = 2 (Xem hnh v).
45 42 3 18 35 20 5 8
2 17 44 41 4 7 34 21
43 46 1 36 19 50 9 6
16 31 48 59 40 33 22 51
47 60 37 32 49 58 39 10
30 15 64 57 38 25 52 23
61 56 13 28 63 54 11 26
14 29 62 55 12 27 24 53
HSPHN 1999-2004
L thuyt th 227
18 71 100 43 20 69 86 45 22 55
97 42 19 70 99 44 21 24 87 46
72 17 98 95 68 85 88 63 26 23
41 96 73 84 81 94 67 90 47 50
16 83 80 93 74 89 64 49 62 27
79 40 35 82 1 76 91 66 51 48
36 15 78 75 92 65 2 61 28 53
39 12 37 34 77 60 57 52 3 6
14 33 10 59 56 31 8 5 54 29
11 38 13 32 9 58 55 30 7 4
L Minh Hong
228 Chuyn
8.1. TH C TRNG S
th m mi cnh ca n c gn cho tng ng vi mt s (nguyn hoc thc) c gi
l th c trng s. S gn cho mi cnh ca th c gi l trng s ca cnh. Tng t
nh th khng trng s, c nhiu cch biu din th c trng s trong my tnh. i vi
n th th cch d dng nht l s dng ma trn trng s:
Gi s th G = (V, E) c n nh. Ta s dng ma trn vung C kch thc n x n. y:
Nu (u, v) E th C[u, v] = trng s ca cnh (u, v)
Nu (u, v) E th tu theo trng hp c th, C[u, v] c gn mt gi tr no c th
nhn bit c (u, v) khng phi l cnh (Chng hn c th gn bng +, hay bng 0, bng
-, v.v)
Quy c c[v, v] = 0 vi mi nh v.
ng i, chu trnh trong th c trng s cng c nh ngha ging nh trong trng
hp khng trng s, ch c khc l di ng i khng phi tnh bng s cnh i qua, m
c tnh bng tng trng s ca cc cnh i qua.
HSPHN 1999-2004
L thuyt th 229
s f2 f
L Minh Hong
230 Chuyn
MINPATH.INP MINPATH.OUT
2
2
3
6714 Distance from 1 to 4: 15
1
20 121 4<-5<-6<-3<-2<-1
1 6 20
1 3 4 232
363
20 5 3 4 20
6 5 545
4 654
HSPHN 1999-2004
L thuyt th 231
L Minh Hong
232 Chuyn
begin
LoadGraph;
Init;
Ford_Bellman;
PrintResult;
end.
li nhn d[v] dn ti vic d[v] c th phi chnh i chnh li rt nhiu ln. Vy nn chng, ti
mi bc khng phi ta xt mi cp nh (u, v) dng nh u sa nhn nh v m s chn
nh u l nh m khng th ti u nhn d[u] thm c na.
Thut ton Dijkstra (E.Dijkstra - 1959) c th m t nh sau:
Bc 1: Khi to
Vi nh v V, gi nhn d[v] l di ng i ngn nht t s ti v. Ban u d[v] c khi
gn nh trong thut ton Ford-Bellman (d[s] = 0 v d[v] = vi v s). Nhn ca mi nh
c hai trng thi t do hay c nh, nhn t do c ngha l c th cn ti u hn c na v
nhn c nh tc l d[v] bng di ng i ngn nht t s ti v nn khng th ti u
thm. lm iu ny ta c th s dng k thut nh du: Free[v] = TRUE hay FALSE tu
theo d[v] t do hay c nh. Ban u cc nhn u t do.
Bc 2: Lp
Bc lp gm c hai thao tc:
C nh nhn: Chn trong cc nh c nhn t do, ly ra nh u l nh c d[u] nh nht, v
c nh nhn nh u.
Sa nhn: Dng nh u, xt tt c nhng nh v v sa li cc d[v] theo cng
thc: d[v] := min(d[v], d[u]+c[u,v])
Bc lp s kt thc khi m nh ch f c c nh nhn (tm c ng i ngn nht t s
ti f); hoc ti thao tc c nh nhn, tt c cc nh t do u c nhn l + (khng tn ti
ng i). C th t cu hi, thao tc 1, ti sao nh u nh vy c c nh nhn, gi s
d[u] cn c th ti u thm c na th tt phi c mt nh t mang nhn t do sao cho d[u]
> d[t] + c[t, u]. Do trng s c[t, u] khng m nn d[u] > d[t], tri vi cch chn d[u] l nh
nht. Tt nhin trong ln lp u tin th s l nh c c nh nhn do d[s] = 0.
Bc 3: Kt hp vi vic lu vt ng i trn tng bc sa nhn, thng bo ng i ngn
nht tm c hoc cho bit khng tn ti ng i (d[f] = +).
for (v V) do d[v] := +;
d[s] := 0;
repeat
u := arg min(d[v]|v V); {Ly u l nh c nhn d[u] nh nht}
if (u = f) or (d[u] = +) then Break; {Hoc tm ra ng i ngn nht t s ti f, hoc kt lun khng c ng}
for (v V: (u, v) E) do {Dng u ti u nhn nhng nh v k vi u}
d[v] := min (d[v], d[u] + c[u, v]);
until False;
L Minh Hong
234 Chuyn
HSPHN 1999-2004
L thuyt th 235
begin
WriteLn(fo, 'Distance from ', s, ' to ', f, ': ', d[f]);
while f <> s do
begin
Write(fo, f, '<-');
f := Trace[f];
end;
WriteLn(fo, s);
end;
Close(fo);
end;
begin
LoadGraph;
Init;
Dijkstra;
PrintResult;
end.
L Minh Hong
236 Chuyn
procedure Init; {Khi to d[i] = di ng i ngn nht t s ti i qua 0 cnh, Heap rng}
var
i: Integer;
begin
for i := 1 to n do d[i] := maxC;
d[s] := 0;
FillChar(Free, SizeOf(Free), True);
FillChar(Pos, SizeOf(Pos), 0);
nHeap := 0;
end;
HSPHN 1999-2004
L thuyt th 237
begin
Inc(nHeap); child := nHeap;
end;
parent := child div 2; {parent l nt cha ca child}
while (parent > 0) and (d[heap[parent]] > d[v]) do
begin {Nu nh lu nt parent u tin km hn v th nh s b y xung nt con child}
heap[child] := heap[parent]; {y nh lu trong nt cha xung nt con}
Pos[heap[child]] := child; {Ghi nhn li v tr mi ca nh }
child := parent; {Tip tc xt ln pha nt gc}
parent := child div 2;
end;
{Thao tc "ko xung" trn to ra mt "khong trng" ti nt child ca Heap, nh v s c t vo y}
heap[child] := v;
Pos[v] := child;
end;
procedure Dijkstra;
var
i, u, iv, v, min: Integer;
begin
Update(s); {a nh xut pht v gc Heap}
repeat
u := Pop; {Chn nh t do c nhn nh nht}
if u = f then Break; {Nu nh l f th dng ngay}
Free[u] := False; {C nh nhn nh }
for iv := h^[u] + 1 to h^[u + 1] do {Xt danh sch k}
begin
v := adj^[iv];
if Free[v] and (d[v] > d[u] + adjCost^[iv]) then
begin
d[v] := d[u] + adjCost^[iv]; {Ti u ho nhn ca cc nh t do k vi u}
Trace[v] := u; {Lu vt ng i}
Update(v); {T chc li Heap}
end;
end;
until nHeap = 0; {Khng cn nh no mang nhn t do}
end;
procedure PrintResult;
var
L Minh Hong
238 Chuyn
fo: Text;
begin
Assign(fo, OutputFile); Rewrite(fo);
if d[f] = maxC then
WriteLn(fo, 'There is no path from ', s, ' to ', f)
else
begin
WriteLn(fo, 'Distance from ', s, ' to ', f, ': ', d[f]);
while f <> s do
begin
Write(fo, f, '<-');
f := Trace[f];
end;
WriteLn(fo, s);
end;
Close(fo);
end;
begin
LoadGraph;
Init;
Dijkstra;
PrintResult;
{Gii phng b nh cp cho cc bin ng}
Dispose(AdjCost);
Dispose(Adj);
Dispose(h);
end.
1 2 1 2
4 3 5 7
7 4
5 6
6 3
HSPHN 1999-2004
L thuyt th 239
count := count - 1;
end;
begin
nh du mi nh V u cha thm;
count := n; {Bin nh s c khi to bng n m li}
for u := 1 to n do
if u cha thm then Visit(u);
end;
Vic kim tra th khng c c chu trnh cng rt n gin bng cch thm vo on
chng trnh trn vi dng lnh, ti s khng vit di tp trung vo thut ton, cc bn c
th tham kho cc k thut trnh by trong thut ton Tarjan (4, 4.4.3).
Nu cc nh c nh s sao cho mi cung phi ni t mt nh ti mt nh khc mang
ch s ln hn th thut ton tm ng i ngn nht c th m t rt n gin:
Gi d[v] l di ng i ngn nht t s ti v. Khi to d[s] = 0 v d[v] = + vi v s. Ta
s tnh cc d[v] nh sau:
for u := 1 to n - 1 do
for v := u + 1 to n do
d[v] := min(d[v], d[u] + c[u, v]);
(Gi thit rng c[u, v] = + nu nh (u, v) khng l cung).
Tc l dng nh u, ti u nhn d[v] ca nhng nh v ni t u, vi u c xt ln lt t 1
ti n - 1. C th lm tt hn na bng cch ch cn cho u chy t nh xut pht ti nh kt
thc. Bi h u chy ti u th nhn d[u] l khng th cc tiu ho thm na.
P_4_08_4.PAS * ng i ngn nht trn th khng c chu trnh
program Critical_Path;
const
InputFile = 'MINPATH.INP';
OutputFile = 'MINPATH.OUT';
max = 100;
maxC = 10000;
var
c: array[1..max, 1..max] of Integer;
List, d, Trace: array[1..max] of Integer; {List cha danh sch cc nh theo th t nh s mi}
n, s, f: Integer;
L Minh Hong
240 Chuyn
begin
FillChar(Free, SizeOf(Free), True);
count := n;
for u := 1 to n do
if Free[u] then Visit(u);
end;
begin
HSPHN 1999-2004
L thuyt th 241
LoadGraph;
Numbering;
Init;
FindPath;
PrintResult;
end.
L Minh Hong
242 Chuyn
procedure Floyd;
var
k, u, v: Integer;
begin
for u := 1 to n do
for v := 1 to n do Trace[u, v] := v; {Gi s ng i ngn nht gia mi cp nh l ng trc tip}
{Thut ton Floyd}
for k := 1 to n do
for u := 1 to n do
for v := 1 to n do
if c[u, v] > c[u, k] + c[k, v] then {ng i t qua k tt hn}
begin
c[u, v] := c[u, k] + c[k, v]; {Ghi nhn ng i thay cho ng c}
Trace[u, v] := Trace[u, k]; {Lu vt ng i}
end;
end;
HSPHN 1999-2004
L thuyt th 243
Close(fo);
end;
begin
LoadGraph;
Floyd;
PrintResult;
end.
Khc bit r rng ca thut ton Floyd l khi cn tm ng i ngn nht gia mt cp nh
khc, chng trnh ch vic in kt qu ch khng phi thc hin li thut ton Floyd na.
8.8. NHN XT
Bi ton ng i di nht trn th trong mt s trng hp c th gii quyt bng cch i
du trng s tt c cc cung ri tm ng i ngn nht, nhng hy cn thn, c th xy ra
trng hp c chu trnh m.
Trong tt c cc ci t trn, v s dng ma trn trng s ch khng s dng danh sch cnh
hay danh sch k c trng s, nn ta u a v th y v em trng s + gn cho
nhng cnh khng c trong th ban u. Trn my tnh th khng c khi nim tru tng
+ nn ta s phi chn mt s dng ln thay. Nh th no l ln? s phi ln
hn tt c trng s ca cc ng i c bn cho d ng i tht c ti t n u vn tt
hn ng i trc tip theo cnh tng tng ra . Vy nn nu th cho s nh cng nh
trng s cc cnh vo c 300 chng hn th gi tr khng th chn trong phm vi Integer
hay Word. Ma trn c s phi khai bo l ma trn LongInt v gi tr hng s maxC trong cc
chng trnh trn phi i li l 300 * 299 + 1 - iu c th gy ra nhiu phin toi, chng
hn nh vn lng ph b nh. khc phc, ngi ta c th ci t bng danh sch k km
trng s hoc s dng nhng k thut nh du kho lo trong tng trng hp c th. Tuy
nhin c mt iu chc chn: khi th cho s nh cng nh trng s cc cnh vo khong
300 th cc trng s c[u, v] trong thut ton Floyd v cc nhn d[v] trong ba thut ton cn li
chc chn khng th khai bo l Integer c.
Xt v phc tp tnh ton, nu ci t nh trn, thut ton Ford-Bellman c phc tp l
O(n3), thut ton Dijkstra l O(n2), thut ton ti u nhn theo th t tp l O(n2) cn thut
ton Floyd l O(n3). Tuy nhin nu s dng danh sch k, thut ton ti u nhn theo th t
tp s c phc tp tnh ton l O(m). Thut ton Dijkstra kt hp vi cu trc d liu
Heap c phc tp O(max(n, m).logn).
Khc vi mt bi ton i s hay hnh hc c nhiu cch gii th ch cn nm vng mt cch
cng c th coi l t yu cu, nhng thut ton tm ng i ngn nht bc l rt r u,
nhc im trong tng trng hp c th (V d nh s nh ca th qu ln lm cho
khng th biu din bng ma trn trng s th thut ton Floyd s gp kh khn, hay thut
ton Ford-Bellman lm vic kh chm). V vy yu cu trc tin l phi hiu bn cht v
thnh tho trong vic ci t tt c cc thut ton trn c th s dng chng mt cch uyn
chuyn trong tng trng hp c th. Nhng bi tp sau y cho ta thy r iu .
Bi tp
L Minh Hong
244 Chuyn
Bi 1
Gii thch ti sao i vi th sau, cn tm ng i di nht t nh 1 ti nh 4 li khng
th dng thut ton Dijkstra c, c th p dng thut ton Dijkstra theo tng bc xem sao:
2
2 3
2 2
4
1 4
Bi 2
Trn mt phng cho n ng trn (n 2000), ng trn th i c cho bi b ba s thc
(x[i], y[i], R[i]), (x[i], y[i]) l to tm v R[i] l bn knh. Chi ph di chuyn trn mi
ng trn bng 0. Chi ph di chuyn gia hai ng trn bng khong cch gia chng. Hy
tm phng n di chuyn gia hai ng trn s, f cho trc vi chi ph t nht.
Bi 3
Cho mt dy n s nguyn a[1..n] (n 10000; 1 a[i] 10000). Hy tm mt dy con gm
nhiu nht cc phn t ca dy cho m tng ca hai phn t lin tip l s nguyn t.
Hng dn: Dng th G = (V, E), V = {1, , n}, (i, j) E nu i < j v a[i] + a[j] l s
nguyn t, tm ng i di nht trn th G khng c chu trnh
Bi 4
Mt cng trnh ln c chia lm n cng on nh s 1, 2, , n. Cng on i phi thc hin
mt thi gian t[i]. Quan h gia cc cng on c cho bi bng a[i, j]: a[i, j] = TRUE
cng on j ch c bt u khi m cng vic i xong. Hai cng on c lp nhau c th
tin hnh song song, hy b tr lch thc hin cc cng on sao cho thi gian hon thnh c
cng trnh l sm nht, cho bit thi gian sm nht .
Hng dn: Dng th G = (V, E), trong :
V = {0, 1, , n}
E = {(0, u)|1 u n} {(u, v)|a[u, v] = TRUE}. Trng s mi cung (i, j) t bng t[j]
Tm ng i di nht trn th khng c chu trnh, thi im thch hp thc hin cng
vic i chnh l d[i] - t[i].
Bi 5
Cho mt bng cc s t nhin kch thc mxn (1 m, n 100). T mt c th di chuyn
sang mt k cnh vi n. Hy tm mt cch i t (x, y) ra mt bin sao cho tng cc s
ghi trn cc i qua l cc tiu.
Hng dn: Dng thut ton Dijkstra vi cu trc Heap
Bi 6: Arbitrage
Arbitrage l mt cch s dng s bt hp l trong hi oi tin t kim li.
V d:
Gi s
HSPHN 1999-2004
L thuyt th 245
1$ mua c 0.7
1 mua c 190
1 mua c 0.009$
T 1$, ta c th i sang 0.7, sau sang 0.7x190=133, ri i li sang 133x0.009=1.197$.
Kim c 0.197$ li.
Gi s rng c n loi tin t nh s 1, 2, , n. V mt bng R kch thc nxn cho bit t l
hi oi. Mt n v tin i i c R[i, j] n v tin j.
a) Hy tm thut ton xc nh xem c th kim li t bng t gi hi oi ny bng
phng php Arbitrage hay khng?
b) Gi s rng nh bng thng minh v hiu ho Arbitrage, tnh t l tt nht c th
hon i gia hai loi tin t bt k.
Hng dn:
t R[i, j] := -ln(R[i, j]). Dng th G = (V, E) c n nh v ma trn trng s l R. Thm
vo G mt nh nh s 0 v ni n ti tt c nhng nh cn li bng cung c trng s 0.
a) Dng thut ton Ford-Bellman tm ng i ngn nht xut pht t 0. Sau khi thut ton
Ford-Bellman kt thc, xt tt c cc cp nh. Nu tn ti mt cp (u, v) m d[v] > d[u] +
R[u, v] th thng bo tn ti Arbitrage. Thut ton ny da trn nhn xt: T gi hi oi
cho c th dng Arbitrage nu v ch nu th c chu trnh m.
b) Nu t gi hi oi khng cho php Arbitrage tc l th G khng c chu trnh m. Dng
thut ton Floyd tm ng i ngn nht gia mi cp nh. T l tt nht c th hon i t
loi tin i sang loi tin j chnh l e-d[i, j], trong d[i, j] l di ng i ngn nht gia hai
nh i v j trn G.
Bi 7:
Cho mt th G = (V, E) gm cc cnh c gn trng s khng m. Cho hai nh A v B.
Hy ch ra hai ng i t a ti b tho mn:
Hai ng i ny khng c cnh chung
Tng di hai ng i l nh nht c th
Hng dn:
Coi mi cnh ca th tng ng vi hai cung c hng ngc chiu nhau, trng s trn
cung (u, v) c gn bng c[u, v].
Dng thut ton Dijkstra tm ng i ngn nht t A ti B: v0, v1, , vp. Dc trn ng
i Dijkstra, vi mi cnh (vi-1, vi), ta b i cung (vi-1, vi), gi li cung (vi, vi-1) v gn trng s
cung ny = -c[vi, vi-1]). Sau php bin i c nhng cung trng s m nhng khng to thnh
chu trnh m.
Dng thut ton Ford-Bellman tm ng i ngn nht t A ti B: u0, u1, , uq. Dc trn
ng i Ford-Bellman, vi mi cnh (ui-1, ui), ta b i cung (ui-1, ui).
L Minh Hong
246 Chuyn
3 5 8 3
1 2 3 4 5
4 5
ng i Dijkstra 1, 2, 4, 5 ( di 10):
8
3 5 8 3
1 2 3 4 5
4 5
B i cc cung (1, 2), (2, 4), (4, 5). t li trng s cc cung ngc chiu ng i:
c[2, 1] := -3; c[4, 2] := -4; c[5, 4] := -3;
8
-3 5 8 -3
1 2 3 4 5
-4 5
ng i Ford-Bellman 1, 4, 2, 3, 5 ( di 14):
8
-3 5 8 -3
1 2 3 4 5
-4 5
-3 5 8 -3
1 2 3 4 5
1 2 3 4 5
HSPHN 1999-2004
L thuyt th 247
L Minh Hong
248 Chuyn
HSPHN 1999-2004
L thuyt th 249
r1 r1
r2 r2
u u
v v
Tuy nhin, thut ton lm vic hiu qu, trnh trng hp cy to thnh b suy bin khin
cho hm GetRoot hot ng chm, ngi ta thng nh gi: hp hai cy li thnh mt,
th gc cy no t nt hn s b coi l con ca gc cy kia.
L Minh Hong
250 Chuyn
HSPHN 1999-2004
L thuyt th 251
n, m: Integer;
Connected: Boolean;
procedure LoadGraph;
var
i: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n, m);
for i := 1 to m do
with e[i] do
ReadLn(f, u, v, c);
Close(f);
end;
procedure Init;
var
i: Integer;
begin
for i := 1 to n do Lab[i] := -1; {Rng ban u, mi nh l gc ca cy gm ng mt nt}
for i := 1 to m do e[i].Mark := False;
end;
procedure AdjustHeap(root, last: Integer); {Vun thnh ng, dng cho HeapSort}
var
Key: TEdge;
child: Integer;
begin
Key := e[root];
while root * 2 <= Last do
begin
child := root * 2;
if (child < Last) and (e[child + 1].c < e[child].c)
then Inc(child);
if Key.c <= e[child].c then Break;
e[root] := e[child];
root := child;
end;
e[root] := Key;
L Minh Hong
252 Chuyn
end;
procedure Kruskal;
var
i, r1, r2, Count, a: Integer;
tmp: TEdge;
begin
Count := 0;
Connected := False;
for i := m div 2 downto 1 do AdjustHeap(i, m);
for i := m - 1 downto 0 do
begin
tmp := e[1]; e[1] := e[i + 1]; e[i + 1] := tmp;
AdjustHeap(1, i);
r1 := GetRoot(e[i + 1].u); r2 := GetRoot(e[i + 1].v);
if r1 <> r2 then {Cnh e[i + 1] ni hai cy khc nhau}
begin
e[i + 1].Mark := True; {Kt np cnh vo cy}
Inc(Count); {m s cnh}
if Count = n - 1 then {Nu s th thnh cng}
begin
Connected := True;
Exit;
end;
Union(r1, r2); {Hp nht hai cy thnh mt cy}
end;
end;
end;
procedure PrintResult;
var
i, Count, W: Integer;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
if not Connected then
WriteLn(f, 'Error: Graph is not connected')
else
begin
WriteLn(f, 'Minimal spanning tree: ');
Count := 0;
W := 0;
for i := 1 to m do {Duyt danh sch cnh}
with e[i] do
begin
if Mark then {Lc ra nhng cnh kt np vo cy khung}
begin
WriteLn(f, '(', u, ', ', v, ') = ', c);
Inc(Count);
W := W + c;
end;
if Count = n - 1 then Break; {Cho ti khi n - 1 cnh}
end;
WriteLn(f, 'Weight = ', W);
end;
Close(f);
end;
begin
LoadGraph;
Init;
Kruskal;
PrintResult;
HSPHN 1999-2004
L thuyt th 253
end.
Xt v phc tp tnh ton, ta c th chng minh c rng thao tc GetRoot c phc tp
l O(lgn), cn thao tc Union l O(1). Gi s ta c danh sch cnh sp xp ri th xt
vng lp dng cy khung, n duyt qua danh sch cnh v vi mi cnh n gi 2 ln thao tc
GetRoot, vy th phc tp l O(mlgn), nu th c cy khung th m n-1 nn ta thy chi
ph thi gian ch yu s nm thao tc sp xp danh sch cnh bi phc tp ca HeapSort
l O(mlgm). Vy phc tp tnh ton ca thut ton l O(mlgm) trong trng hp xu nht.
Tuy nhin, phi lu rng xy dng cy khung th t khi thut ton phi duyt ton b
danh sch cnh m ch mt phn ca danh sch cnh m thi.
L Minh Hong
254 Chuyn
procedure Init;
var
v: Integer;
begin
d[1] := 0; {nh 1 c nhn khong cch l 0}
for v := 2 to n do d[v] := maxC; {Cc nh khc c nhn khong cch +}
FillChar(Free, SizeOf(Free), True); {Cy T ban u l rng}
end;
procedure Prim;
var
k, i, u, v, min: Integer;
begin
Connected := True;
for k := 1 to n do
begin
u := 0; min := maxC; {Chn nh u cha b kt np c d[u] nh nht}
for i := 1 to n do
if Free[i] and (d[i] < min) then
begin
min := d[i];
u := i;
end;
if u = 0 then {Nu khng chn c u no c d[u] < + th th khng lin thng}
HSPHN 1999-2004
L thuyt th 255
begin
Connected := False;
Break;
end;
Free[u] := False; {Nu chn c th nh du u b kt np, lp ln 1 th d nhin u = 1 bi d[1] = 0}
for v := 1 to n do
if Free[v] and (d[v] > c[u, v]) then {Tnh li cc nhn khong cch d[v] (v cha kt np)}
begin
d[v] := c[u, v]; {Ti u nhn d[v] theo cng thc}
Trace[v] := u; {Lu vt, nh ni vi v cho khong cch ngn nht l u}
end;
end;
end;
procedure PrintResult;
var
v, W: Integer;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
if not Connected then {Nu th khng lin thng th tht bi}
WriteLn(f, 'Error: Graph is not connected')
else
begin
WriteLn(f, 'Minimal spanning tree: ');
W := 0;
for v := 2 to n do {Cy khung nh nht gm nhng cnh (v, Trace[v])}
begin
WriteLn(f, '(', Trace[v], ', ', v, ') = ', c[Trace[v], v]);
W := W + c[Trace[v], v];
end;
WriteLn(f, 'Weight = ', W);
end;
Close(f);
end;
begin
LoadGraph;
Init;
Prim;
PrintResult;
end.
Xt v phc tp tnh ton, thut ton Prim c phc tp l O(n2). Tng t thut ton
Dijkstra, nu kt hp thut ton Prim vi cu trc Heap s c mt thut ton vi phc
tp O((m+n)lgn). Tuy nhin nu phi lm vic vi th tha, ngi ta thng s dng thut
ton Kruskal tm cy khung ch khng dng thut ton Prim vi cu trc Heap.
Bi tp
Bi 1
So snh hiu qu ca thut ton Kruskal v thut ton Prim v tc .
Bi 2
Trn mt nn phng vi h to Decattes vung gc t n my tnh, my tnh th i c t
to (x[i], y[i]). c sn mt s dy cp mng ni gia mt s cp my tnh. Cho php
ni thm cc dy cp mng ni gia tng cp my tnh. Chi ph ni mt dy cp mng t l
L Minh Hong
256 Chuyn
thun vi khong cch gia hai my cn ni. Hy tm cch ni thm cc dy cp mng cho
cc my tnh trong ton mng l lin thng v chi ph ni mng l nh nht.
Hng dn:
Xy dng th y G = (V, E). Mi nh tng ng vi mt my tnh.
Trng s cnh (u, v) s c t bng
0, nu c sn cp mng ni hai my u, v.
( x u x v ) + ( yu y v )
2 2
, nu cha c sn cp mng ni hai my u v v
HSPHN 1999-2004
L thuyt th 257
6 5
2 4 2 4
6 6
5 5 1
3
1 6 1 6
3 0
5 6 2 1
3 5 3 5
1 1
L Minh Hong
258 Chuyn
Khng gim tnh tng qut, trong bi ton tm lung cc i, ta c th gi thit rng vi mi
lung th lung trn cung (u, v) v lung trn cung (v, u) khng ng thi l s dng (u,
v V). Bi nu khng ta ch vic bt c [u, v] v [v, u] i mt lng bng min([u, v],
[v, u]) th c mt lung mi c gi tr bng lung ban u trong hoc [u, v] bng 0
hoc [v, u] bng 0.
10.1.4. nh ngha 2
Nu c mng G = (V, E), ta gi lung f trn mng G l mt php gn cho mi cung e = (u, v)
mt s thc f(e) = f[u, v] gi l lung trn cung e, tho mn 3 tnh cht:
Tnh cht 1: (Capacity constraint): Lung trn mi cng khng c vt qu kh nng
thng qua ca cung : f[u, v] c[u, v], (u, v V) .
Tnh cht 2: (Skew symmetry): Lung trn cung (u, v) v lung trn cung (v, u) c cng
gi tr tuyt i nhng tri du nhau: f[u, v] = f[v, u], (u, v V) .
Tnh cht 3: (Flow conservation): Vi mi nh u khng phi nh pht v cng khng
phi nh thu, tng lung trn cc cung i ra khi u bng 0: f[u, v]=0, (u V \{s, t}) .
vV
V gi tr lung, ta c:
f = f[s,v] = ([s,v]-[v,s]) = [s,v] [v,s] =
vV vV vV vV
Tnh cht 1: u, v V, r rng [u, v] khng m v [u, v] = max(f[u, v], 0) c[u, v].
Tnh cht 2: u, v V, ta c f[u, v] = [u, v] - [v, u] bi
Nu f[u, v] 0 th [u, v] = f[u, v] v [v, u] = 0 f[u, v] = [u, v] - [v, u]
Nu f[u, v] < 0 th [u, v] = 0 v [v, u] = f[v, u] = -f[u, v] f[u, v] = [u, v] - [v, u]
Ta li c tng lung trn cc cung i vo v = [u, v] , tng lung trn cc cung i ra
uV
khi v = [v, u] . Hiu s gia tng lung trn cc cung i vo v v tng lung trn cc
uV
nh l c chng minh.
nh ngha 1 trc quan v d hiu hn nh ngha 2, tuy nhin nh ngha 2 li thch hp hn
cho vic trnh by v chng minh cc thut ton trong bi. Ta s s dng nh ngha 1 trong
cc hnh v v output (ch quan tm ti cc gi tr lung dng) cn cc khi nim khi din
gii thut ton s c hiu theo nh ngha 2.
10.1.5. Cc tnh cht c bn
Cho X v Y l hai tp con ca nh V, ta gi kh nng thng qua t X n Y l:
c(X, Y) =
uX,vY
c[u,v]
nh l 2:
Vi X V, ta c f(X, X) = 0
Vi X, Y V, ta c f(X, Y) = -f(Y, X)
Vi X, Y, Z V, X Y = , ta c f(X, Z) + f(Y, Z) = f(X Y, Z)
Vi X V\{s, t}, ta c f(X, V) = 0
Chng minh:
Vi X V, ta c f (X, X) = f[u,v] , nh vy nu f[u, v] xut hin trong tng th f[v, u]
u,vX
L Minh Hong
260 Chuyn
Vi X, Y V, ta c f (X, Y) =
uX,vY
f[u,v] v f (Y, X) =
vY,uX
f[v,u] , nu hng t f[u, v]
xut hin trong tng th nht th hng t f[v, u] xut hin trong tng th hai v ngc li.
Suy ra f(X, Y) = -f(Y, X) theo tnh cht 2 ca lung.
f(X Y,Z)=
uX Y,vZ
f[u,v] =
uX,vZ
f[u,v] +
uY,vZ
f[u,v] = f (X, Z) + f (Y, Z)
HSPHN 1999-2004
L thuyt th 261
5:6 5
2 4 2 4
5:5 6:6 5 6
1:3
3 1
1 6 1 2 6
0:3 2 1
2:5 1:6
3 5
3 5 3 5
1:1 1
Hnh 78: Mng G v mng thng d Gf tng ng (k hiu f[u,v]:c[u,v] ch lung f[u, v] v kh nng
thng qua c[u, v] trn cung (u, v))
nh l 4: Cho mng G v lung f. Gi f' l mt lung trn mng Gf. Khi (f+f') cng l
mt lung trn G vi gi tr lung bng |f|+|f'|. Trong lung (f+f') c nh ngha nh sau:
(f+f')[u, v] = f[u, v] + f'[u, v] (u, v V)
Chng minh: Ta chng minh (f+f') tho mn 3 tnh cht ca lung.
Vi u, v V. V f'[u, v] cf[u, v] = c[u, v] - f[u, v] nn f[u, v] + f'[u, v] c[u, v]. Tnh
cht 1 c tho mn
Vi u, v V. (f+f')[u, v] = f[u, v] + f'[u, v] = -f[v, u] - f'[v, u] = -(f+f')[v, u]. Tnh cht 2
tho mn
Vi u V\{s, t}. (f + f ')[u,v] = f[u,v] + f '[u,v] = f[u,v] + f '[u,v] =0. Tnh cht
vV vV vV vV
3 c tho mn.
V gi tr lung. Ta c
f + f ' = (f + f ')[s,v] = f[s,v]+f'[s,v]= f[s,v] + f'[s,v] = f + f '
vV vV vV vV
nh l c chng minh.
10.2.2. ng tng lung
Cho mng G v lung f, mt ng i c bn t A ti B trn mng Gf gi l mt ng tng
lung (Augmenting Path).
Vi mt ng tng lung P, ta t P := min{cf(u, v)|(u, v) P} l gi tr nh nht ca cc
kh nng thng qua trn cc cung trn P v gi P l gi tr thng d (Residual capacity) ca
ng P.
L Minh Hong
262 Chuyn
5:6 5
2 4 2 4
5:5 6:6 5 6
1:3
3 1
1 6 1 2 6
0:3 2 1
2:5 1:6
3 5
3 5 3 5
1:1 1
5 3
2 4 2 4
5 6 5 6
1 3
1 6 1 6
0 2
2 1 4 3
3 5 3 5
1 1
HSPHN 1999-2004
L thuyt th 263
f (X, Y) =
uX,vY
f[u,v] .
nh l 7: Cho mng G v lung f, khi lung thng qua lt ct s-t bt k bng |f|.
Chng minh: Vi (X, Y) l mt lt ct s-t bt k,
f(X, Y) = f(X, V) - f(X, V\Y) (nh l 2)
= f(X, V) - f(X, X) (V\Y = X)
= f(X, V) (nh l 2)
= f(s, V) + f(X\{s}, V) (nh l 2)
= f(s, V) (nh l 2, X\{s} khng cha c s v t)
= |f|
nh l 8: Cho mng G v lung f, v (X, Y) l mt lt ct s-t, khi lung thng qua lt ct
(X, Y) khng vt qu kh nng thng qua ca lt ct (X, Y): f(X, Y) c(X, Y).
Chng minh: f (X, Y) =
uX,yV
f[u,v]
uX,yV
c[u,v] = c(X, Y)
L Minh Hong
264 Chuyn
HSPHN 1999-2004
L thuyt th 265
c[1..n, 1..n]: Ma trn biu din kh nng thng qua ca cc cung trn mng
f^[1..n, 1..n]: Ma trn biu din lung trn cc cung
Trace[1..n]: Dng lu vt ng tng lung, thut ton tm ng tng lung s s
dng l thut ton tm kim theo chiu rng (BFS)
Ta c th kim tra (u, v) c phi l cung trn mng thng d Gf khng bng ng thc: c[u,
v] > f^[u, v]. Nu (u, v) l cung trn Gf th kh nng thng qua ca n l c[u, v] - f^[u, v].
P_4_10_1.PAS * Thut ton Ford-Fulkerson
program Max_Flow_by_Ford_Fulkerson;
const
InputFile = 'MAXFLOW.INP';
OutputFile = 'MAXFLOW.OUT';
max = 100;
type
TCapacities = array[1..max, 1..max] of LongInt;
var
c: TCapacities;
f: ^TCapacities;
Trace: array[1..max] of Integer;
n, s, t: Integer;
function FindPath: Boolean; {Tm ng tng lung trn Gf, tr v True tm thy}
var
u, v: Integer;
Queue: array[1..max] of Integer; {Hng i dng cho BFS}
Front, Rear: Integer;
begin
FillChar(Trace, SizeOf(Trace), 0);
Front := 1; Rear := 1;
Queue[1] := s;
Trace[s] := n + 1; {Trace[v] = 0 v cha thm}
repeat
u := Queue[Front]; Inc(Front); {Ly u khi Queue}
for v := 1 to n do
if (Trace[v] = 0) and (c[u, v] > f^[u, v]) then {Xt v cha thm k u trn Gf}
begin
Trace[v] := u;
if v = t then {n c t th thut ton dng}
begin
FindPath := True; Exit;
end;
Inc(Rear); Queue[Rear] := v; {y v vo Queue}
end;
until Front > Rear;
FindPath := False;
end;
L Minh Hong
266 Chuyn
procedure PrintResult;
var
u, v: Integer;
m: LongInt;
fo: Text;
begin
Assign(fo, OutputFile); Rewrite(fo);
m := 0;
for u := 1 to n do
for v := 1 to n do
if f^[u, v] > 0 then {Ch quan tm n nhng cung c lung dng}
begin
WriteLn(fo, 'f[', u, ', ', v, '] = ', f^[u, v]);
if u = s then m := m + f^[s, v];
end;
WriteLn(fo, 'Max Flow: ', m);
Close(fo);
end;
begin
Enter;
New(f);
FillChar(f^, SizeOf(f^), 0);
repeat
if not FindPath then Break;
IncFlow;
until False;
PrintResult;
Dispose(f); {Gii phng b nh cp cho f^}
end.
nh l 10: (Tnh nguyn): Nu tt c cc kh nng thng qua l s nguyn th thut ton trn
lun tm c lung cc i vi lung trn cung l cc s nguyn.
Chng minh: Ban u khi to lung 0 th tc cc lung trn cung l nguyn. Mi ln tng
lung ln mt lng bng trng s nh nht trn cc cung ca ng tng lung cng l s
nguyn nn cui cng lung cc i tt s phi c lung trn cc cung l nguyn.
HSPHN 1999-2004
L thuyt th 267
nh l 11: ( phc tp tnh ton): Edmonds v Karp chng minh rng nu dng thut ton
BFS tm ng tng lung trn mng c biu din theo kiu danh sch k th c th ci
t thut ton Ford-Fulkerson bng gii thut c phc tp O(nm2). Tuy nhin nu kh
nng thng qua trn cc cung ca mng l s nguyn th c mt cch nh gi khc da trn
gi tr lung cc i: phc tp tnh ton ca thut ton Ford-Fulkerson l O(|f*|.m) vi |f*|
l gi tr lung cc i trn mng.
HSPHN 1999-2004
L thuyt th 269
Init;
while <Cn nh b qu ti u> do
if <v V c th thc hin thao tc Push(u, v)> then
Push(u, v)
else
Lift(u);
<Output f>
Vic chng minh tnh ng n ca thut ton Preflow-push c th suy ra t cc nh l sau:
nh l 12: cao ca cc nh khng bao gi b gim i c.
Chng minh: D thy bi ch c thao tc Lift thay i cao ca nh, thao tc ny ch nng
cao mt nh ln ch khng gim i.
nh l 13: Cc cao h[.] lun tho mn rng buc: (u, v) Ef th h[u] h[v] + 1. Rng
buc ny gi l rng buc cao
Chng minh: R rng ti bc khi to, cc cao h[.] tho mn:
(u, v) Ef h[u] h[v] + 1.
Thao tc Lift(u)
Vi mi cung (u, v) Ef, thao tc Lift t h[u] := 1 + min{h[v]|(u, v) Ef} y u ln cao
hn nhng khng qu h[v] + 1.
Vi mi cung (w, u) Ef, trc khi vo th tc Lift th h[w] h[u] + 1 theo gi thit, vy
nu y u ln cao hn th h[w] vn khng qu h[u] + 1.
Thao tc Push(u, v)
Ch rng thao tc Push(u, v) ch thc hin c nu h[u] > h[v]. Thao tc Push trc ht
thm vo Ef cung (v, u) khi ta c h[v] < h[u], rng buc cao c duy tr. Sau thao
tc Push c th d b cung (u, v) t Ef, vic d b ny cng b lun rng buc cao (h[u]
phi h[v] + 1).
nh l c chng minh.
Ni thm rng c th chng minh c thao tc Push(u, v) ch thc hin c nu u cao hn
v ng 1 n v (h[u] = h[v] + 1). iu ny c th suy ra t rng buc cao h[u] h[v] + 1
v iu kin h[u] > h[v] ca thao tc Push.
nh l 14: Cho G = (V, E) l mt mng vi im pht s v im thu t, gi f l mt preflow
trn G. Khi nu tn ti mt hm cao h trn V tho mn rng buc cao th khng c
ng i t s ti t trong Gf.
Chng minh: Gi s phn chng rng c ng i P = s = v0, v1, vk = t, khng gim tnh
tng qut, c th coi P l ng i c bn, tc l k < n. T rng buc cao ta c:
h[s] = h[v0] h[v1] + 1 h[v2] + 2 h[vk] + k = h[t] + k.
Bi h[t] = 0, ta c h[s] k < n. Mu thun vi vic h[s] c khi to bng n v khng bao
gi b thay i c.
nh l 15: Thut ton Preflow-push l ng n v c phc tp tnh ton O(n2m).
L Minh Hong
270 Chuyn
Chng minh: C th chng minh thut ton Preflow-Push dng trong thi gian O(n2m). Nu
thut ton dng th khng cn nh no b qu ti, ta c f l lung. Theo nh l 14, khng cn
ng i t s ti t trn Gf. p dng nh l 9, ta c f l lung cc i trn mng.
C th a vo mt s ci tin, chng hn t chc danh sch cc nh qu ti theo dng Queue,
sau vi mi thao tc, thut ton y thm nhng nh qu ti mi pht hin trong mi thao
tc Push vo ch trong Queue khng tn thi gian tm nh qu ti. Thut ton tin hnh
theo cch ny c phc tp tnh ton O(n3).
10.4.6. Ci t
Chng trnh ci t thut ton Preflow-push c Input v Output ging chng trnh ci t
thut ton Ford-Fulkerson.
Cc nh qu ti s c lu trong mt cu trc d liu Queue dng danh sch vng (xem
PHN 2, 5, 5.2.2). Mng Boolean InQueue[1..n], trong InQueue[u] cho bit nh u c
mt trong Queue cha. Hm Discharge(u) c thc hin vi mt nh u b qu ti, hm ny
s c gng chuyn ti t u sang nhng nh v k vi u trn Gf qua thao tc Push. Nu gim ti
c cho u th hm tr v True, ngc li hm tr v False bo cho chng trnh bit phi
thc hin thao tc Lift(u).
P_4_10_2.PAS * Thut ton Preflow-push
program MaximumFlowByPreFlowPush;
const
InputFile = 'MAXFLOW.INP';
OutputFile = 'MAXFLOW.OUT';
max = 100;
type
TCapacities = array[1..max, 1..max] of LongInt;
var
c: TCapacities;
f: ^TCapacities;
FlowIn: array[1..max] of LongInt;
h: array[1..max] of Integer;
Queue: array[0..max - 1] of Integer;
InQueue: array[1..max] of Boolean;
n, s, t, Front, Rear: Integer;
HSPHN 1999-2004
L thuyt th 271
var
v: Integer;
begin
New(f);
FillChar(f^, SizeOf(f^), 0);
FillChar(InQueue, SizeOf(InQueue), False);
FillChar(h, SizeOf(h), 0); {Khi to hm cao}
h[s] := n;
Rear := n - 1;
for v := 1 to n do {Cho s pht ht cng sut ln cc cung lin thuc (s, v)}
begin
f^[s, v] := c[s, v];
f^[v, s] := -c[s, v];
FlowIn[v] := c[s, v];
if OverFlow(v) then {Nu v b qu ti th a v vo Queue}
begin
Rear := (Rear + 1) mod n;
Queue[Rear] := v;
InQueue[v] := True;
end;
end;
Front := 0;
end;
L Minh Hong
272 Chuyn
end;
Discharge := Pushed;
end;
begin
Enter;
Init;
Preflowpush;
PrintResult;
Dispose(f);
end.
Thc ra tn gi preflow-push l mt tn gi chung cho mt lp thut ton m tng ban u
ca n c pht trin bi Karzanov nm 1974, m hnh chung nht cho thut ton preflow-
push u tin l generic preflow-push c Goldberg a ra nm 1987 trong lun vn PhD
ca ng. Sau c rt nhiu ci tin t m hnh ny chng hn: FIFO Preflow-push s dng
hng i nh chng ta ci t trn, Highest Label Preflow-push (lun chn nh qu ti nm
HSPHN 1999-2004
L thuyt th 273
10.5. MT S M RNG
Sau khi hiu cn k hai nh ngha v lung dng v lung (mc 10.1), di y ta s s
dng nh ngha 1 v lung cho d trnh by cc khi nim.
10.5.1. Mng vi nhiu im pht v nhiu im thu
Xt mng G vi p im pht s[1], s[2], , s[p] v q im thu t[1], t[2], , t[q]. Mt lung c
th i t mt im pht bt k n mt im thu bt k, c nh ngha tng t nh trong
bi ton lung cc i. Bi ton tm lung cc i t cc im pht n cc im thu c th
a v bi ton vi mt im pht v mt im thu bng cch a vo thm mt im pht
gi s v mt im thu gi t. nh s c ni ti tt c cc im pht s[1],..., s[p] v nh t
c ni t tt c cc nh thu t[1], , t[q] bng cung c kh nng thng qua l + (Hnh 81),
sau tm lung cc i trn mng v cui cng d b hai nh gi cng nh cc cung gi
mi thm vo.
s1 t1
+ +
+ a
s21 at21 +
s t
+ +
+ +
sp tq
Nu ta thay mi nh v trn th bng hai nh vin, vout v mt cung (vin, vout) c kh nng
thng qua l d[v], sau thay mi cung i vo v thnh cung i vo vin v thay mi cung i ra
t v bng cung i ra t vout (Hnh 82) th bi ton tm lung cc i trn mng G c th gii
quyt bng cch tm lung cc i trn mng gi ny v gn lung trn mi cung (u, v) trn
mng ban u bng gi tr lung trn cung (uout, vin) trn mng gi.
L Minh Hong
274 Chuyn
d
in out
10.5.3. Mng vi rng buc lung thng qua ca cc cung b chn c trn v di
Xt mng G trong mi cung (u, v) ngoi kh nng thng qua c[u, v] cn c gn mt s
khng m d[u, v] l cn di ca lung. Bi ton t ra l c tn ti lung tng thch trn G
hay khng. (Lung tng thch trn G l mt php gn cho mi cung (u, v) mt gi tr f[u, v]
tha mn: d[u, v] f[u, v] c[u, v] ).
a vo mng G mt nh pht gi s' v mt nh thu gi t', xy dng mt mng gi G theo
quy tc: vi mi cung (u, v) trn G s tng ng vi 3 cung trn G: cung (s', v) v (u, t') vi
kh nng thng qua l d[u, v], cung (u, v) vi kh nng thng qua l c[u, v] - d[u, v]. Ngoi ra
thm vo mt cung (t, s) trn G vi kh nng thng qua + (Hnh 83).
c[u,v]-d[u,v]
s u v t
d[u,v] d[u,v]
t s
Hnh 83: Mng gi ca mng c kh nng thng qua ca cc cung b chn hai pha
HSPHN 1999-2004
L thuyt th 275
L Minh Hong
276 Chuyn
Hy tm ph ng gm t ng i nht (Pmin).
Hng dn:
Gi s V = {1, , n}. Xy dng th G'=(V', E'), trong :
V' = {x0, x1, , xn} {y0, y1, , yn}
E' = {(x0, xi)|i V} {(yj, y0)|j V} {(xi, yj)|(i, j) E}
Tm lung nguyn cc i trn mng G' vi nh pht x0, nh thu y0 v tt c kh nng thng
qua ca cc cung c gn bng 1. Mi cung (xi, yj) trn G' c lung i qua s tng ng vi
mt cung (i, j) ca G c chn vo mt ng i no trong P. Cui cng, nhng nh no
ca G cha thuc P s c a nt vo P vi t cch l ng i di 0.
x1 y1
1 2 x2 y2
x3 y3
3 4 y0 P={(1, 3, 5), (2, 4, 6)}
x0
x4 y4
5 6
x5 y5
x6 y6
G G
HSPHN 1999-2004
L thuyt th 277
L Minh Hong
278 Chuyn
HSPHN 1999-2004
L thuyt th 279
nh l 19: Bi ton tm lt ct tng qut hp nht trn th c th gii quyt bng thut ton
c phc tp O(n(m+n)lgn), vi n v m ln lt l s cnh v s nh ca th.
Chng minh: Vi vic p dng k thut gn nhn tng t nh thut ton Prim kt hp vi
vic s dng cu trc Heap chn ra nh gn vi A cht nht, vic xc nh s, t v chn ra
lt ct s-t hp nht c phc tp O((m+n)lgn). Sau khi ghi nhn lt ct s-t hp nht ny, ta
chp s v t li thnh mt nh st v lp li vi th G/{s, t}. Tng cng c n - 2 ln lp, t
suy ra kt qu.
y l mt bi ton hay, vic chng minh tnh ng n ca thut ton phi da trn l thuyt
v lung cc i v lt ct s-t hp nht, nhng lp trnh gii bi ton lt ct tng qut hp
nht th khng cn ng chm g n cc thut ton tm lung cc i c.
L Minh Hong
280 Chuyn
X
Y
kim tra mt th lin thng c phi l th hai pha hay khng, ta c th p dng thut
ton sau:
Vi mt nh v bt k:
X := {v}; Y := ;
repeat
Y := Y K(X);
X := X K(Y);
until (X Y ) or X v Y l ti i - khng b sung c na;
if X Y then
Khng phi th hai pha
else
y l th hai pha,
X l tp cc nh tri: cc nh n c t v qua mt s chn cnh
Y l tp cc nh phi: cc nh n c t v qua mt s l cnh;
th hai pha gp rt nhiu m hnh trong thc t. Chng hn quan h hn nhn gia tp
nhng ngi n ng v tp nhng ngi n b, vic sinh vin chn trng, thy gio chn
tit dy trong thi kho biu v.v
HSPHN 1999-2004
L thuyt th 281
1 1
2 2
3 3
X Y
Hnh 85: th hai pha v b ghp M
L Minh Hong
282 Chuyn
11.4. CI T
11.4.1. Biu din th hai pha
Gi s th hai pha G = (X Y, E) c cc X_nh k hiu l x[1], x[2], , x[m] v cc
Y_nh k hiu l y[1], y[2], , y[n]. Ta s biu din th hai pha ny bng ma trn A c
mxn. Trong :
A[i, j] = TRUE c cnh ni nh x[i] vi nh y[j].
11.4.2. Biu din b ghp
biu din b ghp, ta s dng hai mng: matchX[1..m] v matchY[1..n].
matchX[i] l ch s ca nh thuc tp Y ghp vi nh x[i]
matchY[j] l ch s ca nh thuc tp X ghp vi nh y[j].
Tc l nu nh cnh (x[i], y[j]) thuc b ghp th matchX[i] = j v matchY[j] = i.
Quy c rng:
Nu nh x[i] cha ghp vi nh no ca tp Y th matchX[i] = 0
Nu nh y[j] cha ghp vi nh no ca tp X th matchY[j] = 0.
Suy ra
Thm mt cnh (x[i], y[j]) vo b ghp t matchX[i] := j v matchY[j] := i;
Loi mt cnh (x[i], y[j]) khi b ghp t matchX[i] := 0 v matchY[j] := 0;
HSPHN 1999-2004
L thuyt th 283
11.4.3. Tm ng m nh th no.
V ng m bt u t mt X_nh cha ghp, i theo mt cnh cha ghp sang tp Y, ri
theo mt ghp v tp X, ri li mt cnh cha ghp sang tp Y cui cng l cnh
cha ghp ti mt Y_nh cha ghp. Nn c th thy ngay rng di ng m l l v
trn ng m s cnh M t hn s cnh M l 1 cnh. V cng d thy rng gii thut tm
ng m nn s dng thut ton tm kim theo chiu rng ng m tm c l ng
i ngn nht, gim bt cng vic cho bc tng cp ghp.
Ta khi to mt hng i (Queue) ban u cha tt c cc X_nh cha ghp. Thut ton tm
kim theo chiu rng lm vic theo nguyn tc ly mt nh v khi Queue v li y Queue
nhng ni t v cha c thm. Nh vy nu thm ti mt Y_nh cha ghp th tc l ta tm
ng m kt thc Y_nh cha ghp , qu trnh tm kim dng ngay. Cn nu ta thm
ti mt nh y[j] Y ghp, da vo s kin: t y[j] ch c th ti c matchY[j] theo
duy nht mt cnh ghp nh hng ngc t Y v X, nn ta c th nh du thm y[j],
thm lun c matchY[j], v y vo Queue phn t matchY[j] X (Thm lin 2 bc).
Input: file vn bn MATCH.INP
Dng 1: cha hai s m, n (m, n 100) theo th t l s X_nh v s Y_nh cch nhau t
nht mt du cch
Cc dng tip theo, mi dng ghi hai s i, j cch nhau t nht mt du cch th hin c
cnh ni hai nh (x[i], y[j]).
Output: file vn bn MATCH.OUT, ghi b ghp cc i tm c
1 MATCH.INP MATCH.OUT
1 45 Match:
11 1) x[1] - y[1]
2 14 2) x[2] - y[4]
2 21 3) x[3] - y[3]
22 4) x[4] - y[2]
3 24
3 32
33
4 42
4 43
5
X Y
procedure Enter;
var
L Minh Hong
284 Chuyn
i, j: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
FillChar(a, SizeOf(a), False);
ReadLn(f, m, n);
while not SeekEof(f) do
begin
ReadLn(f, i, j);
a[i, j] := True;
end;
Close(f);
end;
HSPHN 1999-2004
L thuyt th 285
matchX[x] := f;
matchY[f] := x;
f := next;
until f = 0;
end;
begin
Enter;
Init;
Solve;
PrintResult;
end.
Kho st tnh ng n ca thut ton cho ta mt kt qu kh th v:
Nu ta thm mt nh A v cho thm m cung t A ti tt c nhng nh ca tp X, thm mt
nh B v ni thm n cung t tt c cc nh ca Y ti B. Ta c mt mng vi nh pht A
v nh thu B.
1 1
2 2
A B
3 3
4 4
X Y
L Minh Hong
286 Chuyn
HSPHN 1999-2004
L thuyt th 287
L Minh Hong
288 Chuyn
HSPHN 1999-2004
L thuyt th 289
0 0 0 1 0 0 x[1]-y[3]
x[2]-y[2]
-1
0 1 7 0 0 6 x[3]-y[1]
-1 0 8 9 0 7 8
+1
Hnh 87: Php xoay trng s cnh
L Minh Hong
290 Chuyn
HSPHN 1999-2004
L thuyt th 291
until Tm thy ng m;
Dc theo ng m, loi b nhng cnh ghp khi M v thm vo M nhng cnh cha ghp;
end;
Output: M l b ghp cn tm;
V d minh ho:
khng b ri hnh, ta hiu nhng cnh khng ghi trng s l nhng 0_cnh, nhng cnh
khng v mang trng s rt ln trong trng hp ny khng cn thit phi tnh n. Nhng
cnh nt m l nhng cnh ghp, nhng cnh nt thanh l nhng cnh cha ghp.
1 1 1 1
2 2 2 2
x* = x1, tm thy ng m
2 1 2 1
x1 y1
Tng cp
3 3 3 3
4 9 4 4 9 4
1 1 1 1
2 2 x* = x2, tm thy ng m 2 2
2 1 x2 y1 x1 y2 2 1
Tng cp
3 3 3 3
4 9 4 4 9 4
1 1 1 1
2 2 2 2
x* = x3, tm thy ng m
2 1 2 1
y3 y3
Tng cp
3 3 3 3
4 9 4 4 9 4
1 1 1 1
-1 4 9 4 4 8 4
L Minh Hong
292 Chuyn
-2 1 1 +2 1 1
-2 4 8 4 4 6 4
1 1 1 1
2 2 x* = x4, Tm thy ng m 2 2
x4y3x3y2x1y1x2y4.
Tng cp
3 3 Xong 3 3
4 8 4 4 6 4
HSPHN 1999-2004
L thuyt th 293
1 2 3 4
1 0 0 M M Fx[1] = 2
2 0 M M 2 Fx[2] = 2
3 M 1 0 M Fx[3] = 3
4 M M 0 9 Fx[4] = 3
L Minh Hong
294 Chuyn
cho mt cch tng minh bng gi tr c[i, j] m li cho bng hm c(i, j): trong trng hp ny,
vic tr hng/cng ct trc tip trn ma trn chi ph C l khng th thc hin c.
12.3.4. Ci t
a) Biu din b ghp
biu din b ghp, ta s dng hai mng: matchX[1..k] v matchY[1..k].
matchX[i] l ch s ca nh thuc tp Y ghp vi nh x[i]
matchY[j] l ch s ca nh thuc tp X ghp vi nh y[j].
Tc l nu nh cnh (x[i], y[j]) thuc b ghp th matchX[i] = j v matchY[j] = i.
Quy c:
Nu nh x[i] cha ghp vi nh no ca tp Y th matchX[i] = 0
Nu nh y[j] cha ghp vi nh no ca tp X th matchY[j] = 0
Suy ra:
Thm mt cnh (x[i], y[j]) vo b ghp t matchX[i] := j v matchY[j] := i;
Loi mt cnh (x[i], y[j]) khi b ghp t matchX[i] := 0 v matchY[j] := 0;
b) Tm ng m nh th no
Ta s tm ng m v xy dng hai tp VisitedX v VisitedY bng thut ton tm kim theo
chiu rng, ch xt nhng 0_cnh nh hng nh ni trong phn u:
Khi to mt hng i (Queue) ban u ch c mt nh x*. Thut ton tm kim theo chiu
rng lm vic theo nguyn tc ly mt nh v khi Queue v li y Queue nhng ni t v
cha c thm. Nh vy nu thm ti mt Y_nh cha ghp th tc l ta tm ng m kt
thc Y_nh cha ghp , qu trnh tm kim dng ngay. Cn nu ta thm ti mt nh y[j]
Y ghp, da vo s kin: t y[j] ch c th ti c matchY[j] theo duy nht mt 0_cnh
nh hng, nn ta c th nh du thm y[j], thm lun c matchY[j], v y vo Queue
phn t matchY[j] X.
Input: file vn bn ASSIGN.INP
Dng 1: Ghi hai s m, n theo th t l s th v s vic cch nhau 1 du cch (m, n 100)
Cc dng tip theo, mi dng ghi ba s i, j, c[i, j] cch nhau 1 du cch th hin th i lm
c vic j v chi ph lm l c[i, j] (1 i m; 1 j n; 0 c[i, j] 100).
Output: file vn bn ASSIGN.OUT, m t php phn cng ti u tm c.
HSPHN 1999-2004
L thuyt th 295
ASSIGN.INP ASSIGN.OUT
1 1
56 Optimal assignment:
110 1) x[1] - y[1] 0
120 2) x[2] - y[4] 2
2 2
210 3) x[3] - y[2] 1
2 1 242 4) x[4] - y[3] 0
321 Cost: 3
3 3 330
6
430
449
4 9 4 5 4 19
19
5 5
X Y
L Minh Hong
296 Chuyn
Queue[1] := start;
Front := 1; Rear := 1;
repeat
i := Queue[Front]; Inc(Front); {Ly i ra khi Queue, xt x[i]}
for j := 1 to k do
if (Trace[j] = 0) and (GetC(i, j) = 0) then {Ny y[j] cha thm v k vi x[i] qua 0_cnh}
begin
Trace[j] := i; {Lu vt ng i}
if matchY[j] = 0 then {Nu y[j] ghp th ghi nhn v thot ngay}
begin
finish := j;
Exit;
end;
Inc(Rear); Queue[Rear] := matchY[j]; {Khng th y matchY[j] vo Queue, ch duyt tip}
end;
until Front > Rear;
end;
HSPHN 1999-2004
L thuyt th 297
begin
for i := 1 to k do
begin
start := i; finish := 0;
repeat {Tm cch ghp x[start]}
FindAugmentingPath;
if finish = 0 then SubX_AddY; {Nu khng tm ra ng m xut pht t x[start] th xoay cc trng s cnh}
until finish <> 0;
Enlarge; {Khi tm ra ng m th ch cn tng cp theo ng m}
end;
end;
begin
Enter;
Init;
Solve;
Result;
end.
Nhn xt:
C th gii quyt bi ton phn cng nu nh ma trn chi ph C c phn t m bng cch
sa li mt cht trong th tc khi to (Init): Vi i, thay v gn Fx[i] := 0, ta gn Fx[i] :=
gi tr nh nht trn hng i ca ma trn C, khi s m bo c[i, j] - Fx[i] - Fy[j] 0 (i, j).
Sau khi kt thc thut ton, tng tt c cc phn t hai dy Fx, Fy bng trng s cc tiu
ca b ghp y tm c trn th ban u.
Mt vn na phi ht sc cn thn trong vic c lng ln ca cc phn t Fx[.] v
Fy[.], cc gi tr ny c th ln hn rt nhiu ln so vi gi tr ln nht ca cc c[i, j]. Hy
t tm v d gii thch ti sao.
L Minh Hong
298 Chuyn
12.5. NNG CP
Da vo m hnh ci t thut ton Kuhn-Munkres trn, ta c th nh gi v phc tp
tnh ton l thuyt ca cch ci t ny:
Thut ton tm kim theo chiu rng c s dng tm ng m c phc tp O(k2),
mi ln xoay trng s cnh mt mt chi ph thi gian c O(k2). Vy mi ln tng cp, cn ti
a k ln d ng v k ln xoay trng s cnh, mt mt chi ph thi gian c O(k3). Thut ton
cn k ln tng cp nn phc tp tnh ton trn l thuyt ca phng php ny c O(k4).
HSPHN 1999-2004
L thuyt th 299
-
X
+ +
Y
- -
X
0
+ + +
Y
- - -
X
0
Y
Y
Tm thy ng m
12.5.2. Nhn xt 2
Vic xc nh trng s nh nht ca cnh ni mt X_nh trong cy pha vi mt Y_nh
ngoi cy pha c th kt hp ngay trong bc dng cy pha m khng lm tng cp phc tp
tnh ton. thc hin iu ny, ta s dng k thut nh trong thut ton Prim:
Vi mi y[j]Y, gi d[j] := khong cch t y[j] n cy pha gc x*. Ban u d[j] c khi
to bng trng s cnh (x*, y[j]) (cy pha ban u ch c ng mt nh x*).
Trong bc tm ng bng BFS, mi ln rt mt nh x[i] ra khi Queue, ta xt nhng nh
y[j]Y cha thm v t li d[j]mi := min(d[j]c, trng s cnh (x[i], y[j])) sau mi kim
tra xem (x[i], y[j]) c phi l 0_cnh hay khng tip tc cc thao tc nh trc. Nu qu
trnh BFS khng tm ra ng m th gi tr xoay chnh l gi tr nh nht trong cc d[j]
dng. Ta bt c mt on chng trnh tm gi tr xoay c phc tp O(k2). Cng vic
ti mi bc xoay ch l tm gi tr nh nht trong cc d[j] dng v thc hin php cng, tr
trn hai dy i ngu Fx v Fy, n c phc tp tnh ton O(k). Ti a c k ln xoay tm
ng m nn tng chi ph thi gian thc hin cc ln xoay cho ti khi tm ra ng m c
O(k2). Lu rng th ang xt l th hai pha y nn sau khi xoay cc trng s cnh
bng gi tr xoay , tt c cc cnh ni t X_nh trong cy pha ti Y_nh ngoi cy pha u
b gim trng s i , chnh v vy sau mi bc xoay, ta phi tr tt c cc d[j] > 0 i
gi c tnh hp l ca cc d[j].
L Minh Hong
300 Chuyn
12.5.3. Nhn xt 3
Ta c th tn dng kt qu ca qu trnh tm kim theo chiu rng bc trc ni rng
cy pha cho bc sau (grow alternating tree) m khng phi dng cy pha li t u (BFS li
bt u t x*).
Khi khng tm thy ng m, bc xoay trng s cnh s c thc hin. Sau khi xoay, ta
s thm lun nhng nh y[j]Y cha thm to vi mt X_nh thm mt 0_cnh (nhng
y[j] cha thm c d[j] = 0), nu tm thy ng m th dng ngay, nu khng thy th y tip
nhng nh matchY[j] vo hng i v lp li thut ton tm kim theo chiu rng bt u t
nhng nh ny. Vy nu xt tng th, mi ln tng cp ta ch thc hin mt ln dng cy pha,
tc l tng chi ph thi gian ca nhng ln thc hin gii thut tm kim trn th sau mi
ln tng cp ch cn l O(k2).
12.5.4. Nhn xt 4
Th tc tng cp da trn ng m (Enlarge) c phc tp O(k)
T 3 nhn xt trn, phng php i ngu Kuhn-Munkres c th ci t bng mt chng
trnh c phc tp tnh ton O(k3) bi n cn k ln tng cp v chi ph cho mi ln l O(k2).
P_4_12_2.PAS * Ci t phng php Kuhn-Munkres O(k3)
program AssignmentProblemSolve;
const
InputFile = 'ASSIGN.INP';
OutputFile = 'ASSIGN.OUT';
max = 100;
maxC = 10001;
var
c: array[1..max, 1..max] of Integer;
Fx, Fy, matchX, matchY: array[1..max] of Integer;
Trace, Queue, d, arg: array[1..max] of Integer;
Front, Rear: Integer;
start, finish: Integer;
m, n, k: Integer;
HSPHN 1999-2004
L thuyt th 301
L Minh Hong
302 Chuyn
begin
{Trc ht tnh Delta := Gi tr nh nht trong s cc d[j] m y[j] cha thm}
Delta := maxC;
for j := 1 to k do
if (Trace[j] = 0) and (d[j] < Delta) then Delta := d[j];
{Xoay}
Fx[start] := Fx[start] + Delta;
for j := 1 to k do
if Trace[j] <> 0 then
begin
i := matchY[j];
Fy[j] := Fy[j] - Delta;
Fx[i] := Fx[i] + Delta;
end
else
d[j] := d[j] - Delta;
for j := 1 to k do
if (Trace[j] = 0) and (d[j] = 0) then {Xt nhng y[j] ni vi cy pha qua mt 0_cnh mi pht sinh}
begin
Trace[j] := arg[j];
if matchY[j] = 0 then {y[j] cha ghp tm thy ng m kt thc y[j]}
begin
finish := j;
Exit;
end;
Push(matchY[j]); {y[j] ghp, y matchY[j] vo Queue ch duyt tip}
end;
end;
HSPHN 1999-2004
L thuyt th 303
begin
Enter;
Init;
Solve;
Result;
end.
L Minh Hong
304 Chuyn
3 4
8 1 2
5 6
9
HSPHN 1999-2004
L thuyt th 305
L Minh Hong
306 Chuyn
Shrink Shrink
Blossom
Blossom
Expand Expand
HSPHN 1999-2004
L thuyt th 307
Nu:
v l nh cha ghp Tm thy ng m kt thc v, dng
v l nh ghp thm v thm lun match[v] v y match[v] vo Queue.
Lu vt: Cp nht hai nhn S v T
Nu v thm
Nu v l nh nht hoc b[v] = b[u] b qua
Nu v l nh m v b[v] b[u] ta pht hin c blossom mi cha u v v, khi :
Pht hin nh c s: Truy vt ng i ngc t hai nh m u v v theo hai ng
pha v nt gc, chn ly nh a l nh m chung gp u tin trong qu trnh truy
vt ngc. Khi Blossom mi pht hin s c nh c s l a.
Gn li vt: Gi (a = i[1], i[2], , i[p] = u) v (a = j[1], j[2], , j[q] = v) ln lt l
hai ng pha dn t a ti u v v. Khi (a = i[1], i[2], , i[p] = u, j[q] = v, j[q-
1], , j[1] = a) l mt chu trnh pha i t a ti u v v ri quay tr v a. Bng cch i
dc theo chu trnh ny theo hai hng ngc nhau, ta c th gn li tt c cc nhn S
v T ca nhng nh trn chu trnh. Lu rng khng c gn li nhn S v T cho
nhng nh k m b[k] = a, v vi nhng nh k c b[k] a th bt buc phi gn li
nhn S v T theo chu trnh ny bt k S[k] v T[k] trc c hay cha.
Chp Blossom: Xt nhng nh v m b[v]{b[i[1]], b[i[2]], , b[i[p]], b[j[1]],
b[j[2]], , b[j[q]]}, gn li b[v] = a. Nu v l nh m (c nhn S[v] 0) m cha
c duyt ti (cha bao gi c y vo Queue) th y v vo Queue ch duyt
tip ti nhng bc sau.
Bc 3:
Nu bc 2 tm ra ng m th tr v ng m, nu bc 2 khng tm thy ng m
v thot ra do hng i rng th kt lun khng tm thy ng m.
x 1 2 x 1 2
T:1 T:1
Tm thy ng m
Trng hp 2: v cha thm v ghp
HSPHN 1999-2004
L thuyt th 309
x 1 2 x 1 2
T:1 T:1
T:3 T:7
S:5 S:4
4 5
u
x 1 2 3
T:1 S:2
6 7 T:5
S:6
T:3 v
b[.] = 3
S:7
T:3 T:7
T:3 S:4
S:5 S:4
4 5 4 5
a
x 1 2 3 x 1 2 3
T:1 S:2 T:1 S:2
6 7 6 7
T:3 S:6 T:3 T:5
S:7 S:6
8 8
T tng chnh ca phng php Lawler l dng cc nhn b[v] thay cho thao tc chp trc
tip Blossom, dng cc nhn S v T truy vt tm ng m, trnh thao tc n Blossom.
Phng php ny da trn mt nhn xt: Mi khi tm ra ng m, nu ng m xuyn
qua mt Blossom ngoi nht th chc chn n phi i vo Blossom ny t nt c s v thot
ra khi Blossom bng mt cnh nht.
13.4. CI T
Ta s ci t phng php Lawler vi khun dng Input/Output nh sau:
Input: file vn bn GMATCH.INP
L Minh Hong
310 Chuyn
procedure Enter;
var
i, m, u, v: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
FillChar(a, SizeOf(a), False);
HSPHN 1999-2004
L thuyt th 311
ReadLn(f, n, m);
for i := 1 to m do
begin
ReadLn(f, u, v);
a[u, v] := True;
a[v, u] := True;
end;
Close(f);
end;
{Kh nht ca phng php Lawler l th tc ny: Th tc x l khi gp cnh nht ni hai nh m p, q}
procedure BlossomShrink(p, q: Integer);
var
i, NewBase: Integer;
Mark: array[1..max] of Boolean;
L Minh Hong
312 Chuyn
q := b[q];
if InPath[q] then Break; {Tuy nhin nu chm vo ng pha ca p th dng ngay}
q := T[match[q]];
until False;
FindCommonAncestor := q; {Ghi nhn nh c s mi}
end;
begin {BlossomShrink}
FillChar(Mark, SizeOf(Mark), False); {Tt c cc nhn b[v] c khi to l cha b nh du}
NewBase := FindCommonAncestor(p, q); {xc nh nt c s}
ResetTrace(p); ResetTrace(q); {Gn li nhn}
if b[p] <> NewBase then T[p] := q;
if b[q] <> NewBase then T[q] := p;
{Chp blossom gn li cc nhn b[i] cho nh i nu blossom b[i] b nh du}
for i := 1 to n do
if Mark[b[i]] then b[i] := NewBase;
{Xt nhng nh m i cha c a vo Queue nm trong Blossom mi, y i v Queue ch duyt sau}
for i := 1 to n do
if not InQueue[i] and (b[i] = NewBase) then
Push(i);
end;
{Th tc tm ng m}
procedure FindAugmentingPath;
var
u, v: Integer;
begin
InitBFS; {Khi to}
repeat {BFS}
u := Pop; {Rt mt nh m u ra khi hng i}
{Xt nhng nh v k u qua mt cnh nht m v khng nm cng blossom vi u}
for v := 1 to n do
if (a[u, v]) and (match[u] <> v) and (b[u] <> b[v]) then
if (v = start) or (match[v] <> 0) and (T[match[v]] <> 0) then {Nu v l nh m}
BlossomShrink(u, v) {th gn li vt, chp blossom...}
else
if T[v] = 0 then {Nu v l nh nht cha thm ti}
if match[v] = 0 then {Nu v cha ghp ngha tm c ng m kt thc v, thot}
begin
T[v] := u;
finish := v;
Exit;
end
else {Nu v ghp th ghi vt ng i, thm v, thm lun c match[v] v y match[v] vo Queue}
begin
T[v] := u;
Push(match[v]);
end;
HSPHN 1999-2004
L thuyt th 313
begin
Enter;
Init;
Solve;
Result;
end.
L Minh Hong
314 Chuyn
Cho n nay, phng php tt nht gii bi ton tm b ghp tng qut trn th c
bit n l ca Micali v Vazizani (1980), n c phc tp tnh ton l O( n.m) . Bn c
th tham kho trong cc ti liu khc.
HSPHN 1999-2004
TI LIU C THM
Di y l hai cun sch c th ni l kinh in m hu ht cc ti liu v thut ton u
trch dn t nhiu t hai cun sch ny. Cc bn nn tm mi cch c.
Title: The Art of Computer Programming
Author: Donald E. Knuth
Volume 1: Fundamental Algorithms
Volume 2: Seminumerical Algorithms
Volume 3: Sorting and Searching
Volume 4: Combinatorial Algorithms (in preparation)
Volume 5: Syntactic Algorithms (in preparation)
Title: Introduction to Algorithms
Authors: Thomas H.Cormen, Charles E.Leiserson, Ronald L.Rivest