Professional Documents
Culture Documents
Giai Thuat Lap Trinh Cua TS Le Minh Hoang PDF
Giai Thuat Lap Trinh Cua TS Le Minh Hoang PDF
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 ..............................................................................................................75
6.5. CY K_PHN ..........................................................................................................................................76
6.6. CY TNG QUT...................................................................................................................................77
8. SP XP (SORTING) .................................................................................................................. 89
8.1. BI TON SP XP................................................................................................................................89
8.2. THUT TON SP XP KIU CHN (SELECTIONSORT) ...............................................................91
8.3. THUT TON SP XP NI BT (BUBBLESORT)...........................................................................92
8.4. THUT TON SP XP KIU CHN (INSERTIONSORT) ................................................................92
8.5. SP XP CHN VI DI BC GIM DN (SHELLSORT) .....................................................94
8.6. THUT TON SP XP KIU PHN ON (QUICKSORT) ............................................................95
8.7. THUT TON SP XP KIU VUN NG (HEAPSORT) ..............................................................101
8.8. SP XP BNG PHP M PHN PHI (DISTRIBUTION COUNTING)......................................104
8.9. TNH N NH CA THUT TON SP XP (STABILITY) .........................................................105
8.10. THUT TON SP XP BNG C S (RADIX SORT) .................................................................106
8.11. THUT TON SP XP TRN (MERGESORT)..............................................................................111
8.12. CI T ...............................................................................................................................................114
8.13. NH GI, NHN XT......................................................................................................................122
HNH V
Hnh 37: My Pentium 4, 3.2GHz, 2GB RAM t ra chm chp khi sp xp 108 kho [0..7.107] cho d nhng
thut ton sp xp tt nht c p dng .............................................................................................. 123
Hnh 38: Cy nh phn tm kim ......................................................................................................................... 128
Hnh 39: Xa nt l cy BST ........................................................................................................................... 129
Hnh 40. Xa nt ch c mt nhnh con trn cy BST ........................................................................................ 130
Hnh 41: Xa nt c c hai nhnh con trn cy BST thay bng nt cc phi ca cy con tri............................ 130
Hnh 42: Xa nt c c hai nhnh con trn cy BST thay bng nt cc tri ca cy con phi............................ 131
Hnh 43: nh s cc bit ..................................................................................................................................... 133
Hnh 44: Cy tm kim s hc............................................................................................................................. 134
Hnh 45: Cy tm kim c s............................................................................................................................... 136
Hnh 46: Vi di dy bit z = 3, cy tm kim c s gm cc kho 2, 4, 5 v sau khi thm gi tr 7............... 137
Hnh 47: RST cha cc kho 2, 4, 5, 7 v RST sau khi loi b gi tr 7 ............................................................. 138
Hnh 48: Cy tm kim c s a) v Trie tm kim c s b).................................................................................. 140
Hnh 49: Hm quy tnh s Fibonacci .............................................................................................................. 151
Hnh 50: Tnh ton v truy vt ............................................................................................................................ 154
Hnh 51: Truy vt ................................................................................................................................................ 163
Hnh 52: V d v m hnh th........................................................................................................................ 178
Hnh 53: Phn loi th..................................................................................................................................... 179
Hnh 54................................................................................................................................................................ 182
Hnh 55................................................................................................................................................................ 183
Hnh 56: th v ng i................................................................................................................................ 186
Hnh 57: th v cy DFS ................................................................................................................................ 189
Hnh 58: Th t thm nh ca BFS ................................................................................................................... 189
Hnh 59: th v cy BFS ................................................................................................................................ 192
Hnh 60: th G v cc thnh phn lin thng G1, G2, G3 ca n .................................................................. 193
Hnh 61: Khp v cu.......................................................................................................................................... 193
Hnh 62: Lin thng mnh v lin thng yu ...................................................................................................... 194
Hnh 63: th y ........................................................................................................................................ 195
Hnh 64: n th v hng v bao ng ca n............................................................................................. 195
Hnh 65: Ba dng cung ngoi cy DFS ............................................................................................................... 198
Hnh 66: Thut ton Tarjan b cy DFS .......................................................................................................... 200
Hnh 67: 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)........................................................................................................... 206
Hnh 68: th G v mt s v d cy khung T1, T2, T3 ca n ....................................................................... 209
Hnh 69: Cy khung DFS (a) v cy khung BFS (b) (Mi tn ch chiu i thm cc nh) ................................ 209
Hnh 70: Php nh chiu DFS............................................................................................................................ 212
Hnh 71: Php nh s v ghi nhn cung ngc ln cao nht ............................................................................. 214
Hnh 72: M hnh th ca bi ton by ci cu ............................................................................................... 217
Hnh 73................................................................................................................................................................ 218
Hnh 74................................................................................................................................................................ 218
viii
Hnh 75 ................................................................................................................................................................224
Hnh 76: Php nh li ch s theo th t tp....................................................................................................239
Hnh 77: Hai cy gc r1 v r2 v cy mi khi hp nht chng .............................................................................249
Hnh 78: Mng vi cc kh nng thng qua (1 pht, 6 thu) v mt lung ca n vi gi tr 7............................257
Hnh 79: Mng G v mng thng d Gf tng ng (k hiu c[u,v]:f[u,v] ch kh nng thng qua c[u, v] v lung
dng tng ng f[u, v] trn cung (u, v)) ..................................................................................................260
Hnh 80: Mng thng d v ng tng lung ....................................................................................................261
Hnh 81: Lung dng trn mng G trc v sau khi tng .................................................................................262
Hnh 82: Mng gi ca mng c nhiu im pht v nhiu im thu..................................................................273
Hnh 83: Thay mt nh u bng hai nh uin, uout .................................................................................................273
Hnh 84: Mng gi ca mng c kh nng thng qua ca cc cung b chn hai pha ..........................................274
Hnh 85: th hai pha ......................................................................................................................................280
Hnh 86: th hai pha v b ghp M ...............................................................................................................281
Hnh 87: M hnh lung ca bi ton tm b ghp cc i trn th hai pha...................................................285
Hnh 88: Php xoay trng s cnh .......................................................................................................................289
Hnh 89: Thut ton Hungari ...............................................................................................................................292
Hnh 90: Cy pha mc ln hn sau mi ln xoay trng s cnh v tm ng................................................299
Hnh 91: th G v mt b ghp M ..................................................................................................................304
Hnh 92: Php chp Blossom...............................................................................................................................306
Hnh 93: 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)!
k
n!
= S t hp chp k ca n phn t =
k!( 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
Vy c th ng nht f vi dy gi tr (f(1), f(2), , f(k)) v coi dy gi tr ny cng l mt
chnh hp lp chp k ca S. Nh v d trn (E, C, E) l mt chnh hp lp chp 3 ca S. D
dng chng minh c kt qu sau bng quy np hoc bng phng php nh gi kh nng
la chn:
S chnh hp lp chp k ca tp gm n phn t l n k
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-2006
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-2006
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-2006
Bi ton lit k 7
L Minh Hong
8 Chuyn
HSPHN 1999-2006
Bi ton lit k 9
L Minh Hong
10 Chuyn
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n);
Close(f);
Assign(f, OutputFile); Rewrite(f);
for i := 1 to n do x[i] := i; {Khi to cu hnh u: x[1] := 1; x[2] := 2; , x[n] := n}
repeat
for i := 1 to n do Write(f, x[i], ' '); {In ra cu hnh hon v hin ti}
WriteLn(f);
i := n - 1;
while (i > 0) and (x[i] > x[i + 1]) do Dec(i);
if i > 0 then {Cha gp phi hon v cui (n, n-1, , 1)}
begin
k := n; {x[k] l phn t cui dy}
while x[k] < x[i] do Dec(k); {Li dn k tm gp x[k] u tin ln hn x[i]}
Swap(x[k], x[i]); {i ch x[k] v x[i]}
a := i + 1; b := n; {Lt ngc on cui gim dn, a: u on, b: cui on}
while a < b do
begin
Swap(x[a], x[b]); {o gi tr x[a] v x[b]}
Inc(a); {Tin a v li b, tip tc cho ti khi a, b chm nhau}
Dec(b);
end;
end;
until i = 0; {Ton dy l dy gim dn - khng sinh tip c - ht cu hnh}
Close(f);
end.
Bi tp:
Bi 1
Cc chng trnh trn x l khng tt trong trng hp tm thng, l trng hp n = 0
i vi chng trnh lit k dy nh phn cng nh trong chng trnh lit k hon v, trng
hp k = 0 i vi chng trnh lit k t hp, hy khc phc iu .
Bi 2
Lit k cc dy nh phn di n c th coi l lit k cc chnh hp lp chp n ca tp 2 phn
t {0, 1}. Hy lp chng trnh:
Nhp vo hai s n v k, lit k cc chnh hp lp chp k ca {0, 1, , n -1}.
Hng dn: thay h c s 2 bng h c s n.
Bi 3
Hy lit k cc dy nh phn di n m trong cm ch s 01 xut hin ng 2 ln.
Bi 4.
Nhp vo mt danh sch n tn ngi. Lit k tt c cc cch chn ra ng k ngi trong s n
ngi .
Bi 5
Lit k tt c cc tp con ca tp {1, 2, , n}. C th dng phng php lit k tp con nh
trn hoc dng phng php lit k tt c cc dy nh phn. Mi s 1 trong dy nh phn
tng ng vi mt phn t c chn trong tp. V d vi tp {1, 2, 3, 4} th dy nh phn
HSPHN 1999-2006
Bi ton lit k 11
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:
n) Xt tt c cc gi tr x[n] c th nhn, th cho x[n] nhn ln lt cc gi tr , thng bo
cu hnh tm c x[1], x[2], , x[n].
Trn phng din quy np, c th ni rng thut ton quay lui lit k cc cu hnh n phn t
dng x[1..n] bng cch th cho x[1] nhn ln lt cc gi tr c th. Vi mi gi tr th gn
cho x[1] bi ton tr thnh lit k tip cu hnh n - 1 phn t x[2..n].
M hnh ca thut ton quay lui c th m t nh sau:
{Th tc ny th cho x[i] nhn ln lt cc gi tr m n c th nhn}
procedure Attempt(i);
begin
for mi gi tr V c th gn cho x[i] do
begin
Th cho x[i] := V;
if x[i] l phn t cui cng trong cu hnh then
Thng bo cu hnh tm c
else
begin
Ghi nhn vic cho x[i] nhn gi tr V (nu cn);
Attempt(i + 1); {Gi quy chn tip x[i+1]}
Nu cn, b ghi nhn vic th x[i] := V th gi tr khc;
end;
end;
end;
Thut ton quay lui s bt u bng li gi Attempt(1)
HSPHN 1999-2006
Bi ton lit k 13
InputFile = 'BSTR.INP';
OutputFile = 'BSTR.OUT';
max = 100;
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);
Attempt(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)
L Minh Hong
14 Chuyn
begin
Assign(f, InputFile); Reset(F);
ReadLn(f, n, k);
Close(f);
Assign(f, OutputFile); Rewrite(f);
HSPHN 1999-2006
Bi ton lit k 15
x[0] := 0;
Attempt(1);
Close(f);
end.
L Minh Hong
16 Chuyn
ARRANGE.INP ARRANGE.OUT
32 12
13
21
23
31
32
P_1_03_3.PAS * Thut ton quay lui lit k cc chnh hp khng lp chp k
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Arrangement_Enumeration;
const
InputFile = 'ARRANGES.INP';
OutputFile = 'ARRANGES.OUT';
max = 100;
var
x: array[1..max] of Integer;
c: array[1..max] of Boolean;
n, k: Integer;
f: Text;
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}
Attempt(1); {Th cc cch chn gi tr ca x[1]}
Close(f);
end.
HSPHN 1999-2006
Bi ton lit k 17
L Minh Hong
18 Chuyn
ANALYSE.INP ANALYSE.OUT
6 6 = 1+1+1+1+1+1
6 = 1+1+1+1+2
6 = 1+1+1+3
6 = 1+1+2+2
6 = 1+1+4
6 = 1+2+3
6 = 1+5
6 = 2+2+2
6 = 2+4
6 = 3+3
6=6
P_1_03_4.PAS * Thut ton quay lui lit k cc cch phn tch s
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Analysis_Enumeration;
const
InputFile = 'ANALYSE.INP';
OutputFile = 'ANALYSE.OUT';
max = 100;
var
n: Integer;
x: array[0..max] of Integer;
t: array[0..max] of Integer;
f: Text;
begin
Init;
Assign(f, OutputFile); Rewrite(f);
Attempt(1);
Close(f);
HSPHN 1999-2006
Bi ton lit k 19
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:
L Minh Hong
20 Chuyn
1 2 3 4 5 6 7 8
1 N
4
W E
5
6
8 S
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
HSPHN 1999-2006
Bi ton lit k 21
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;
L Minh Hong
22 Chuyn
begin
x[i] := j; {Th t qun hu i vo ct j}
if i = n then PrintResult
else
begin
a[j] := False; b[i + j] := False; c[i - j] := False; {nh du}
Attempt(i + 1); {Tm cc cch t qun hu th i + 1}
a[j] := True; b[i + j] := True; c[i - j] := True; {B nh du}
end;
end;
end;
begin
Init;
Assign(f, OutputFile); Rewrite(f);
Attempt(1);
Close(f);
end.
Tn gi thut ton quay lui, ng trn phng din ci t c th nn gi l k thut vt cn
bng quay lui th chnh xc hn, tuy nhin ng trn phng din bi ton, nu nh ta coi
cng vic gii bi ton bng cch xt tt c cc kh nng cng l 1 cch gii th tn gi Thut
ton quay lui cng khng c g tri logic. Xt hot ng ca chng trnh trn cy tm kim
quay lui ta thy ti bc th chn x[i] n s gi quy tm tip x[i+1] c ngha l qu trnh
s duyt tin su xung pha di n tn nt l, sau khi duyt ht cc nhnh, tin trnh li
li th p t mt gi tr khc cho x[i], chnh l ngun gc ca tn gi thut ton quay
lui
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
HSPHN 1999-2006
Bi ton lit k 23
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-2006
Bi ton lit k 25
begin
Init;
Attempt(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-2006
Bi ton lit k 27
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;
Attempt(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:
L Minh Hong
28 Chuyn
C di N
Hai on con bt k lin nhau u khc nhau (on con l mt dy k t lin tip ca xu)
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
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
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}
HSPHN 1999-2006
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}
Attempt(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 Attempt 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
L Minh Hong
30 Chuyn
HSPHN 1999-2006
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-2006
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-2006
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-2006
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-2006
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-2006
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
ln 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-2006
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).
( 2)
lg n n
n
1
n lg n , k
k =1
HSPHN 1999-2006
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
( lg n ) , n lg( lg n )
lg n
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;
L Minh Hong
48 Chuyn
for i := 0 to m do
for j := 0 to n do
c[i + j] := c[i + j] + a[i] * b[j];
p n
a)(max(m, n)); b) (m.n)
Bi 3
Ch ra rng cch ni phc tp tnh ton ca gii thut A ti thiu phi l O(n2) l khng
thc s chnh xc.
(k php O khng lin quan g n chuyn nh gi ti thiu c).
Bi 4
Gii thch ti sao khng c k php (f(n)) ch nhng hm va l o(f(n)) va l (f(n)).
(V khng c hm no va l o(f(n)) va l (f(n)))
Bi 5
Chng minh rng
n! = o(nn)
n! = (2n)
lg(n!) = (nlgn)
n
n 1
Hng dn: Dng cng thc xp x ca Stirling: n! = 2n 1 +
e n
Bi 5
Ch ra ch sai trong chng minh sau
Gi s mt gii thut c thi gian thc hin T(n) cho bi
1, if n 1
T(n) =
2T ( n 2 ) +n, if n>1
T (n) = 2T ( n 2 ) + n
HSPHN 1999-2006
Cu trc d liu v gii thut 49
2c ( n 2 ) lg ( n 2 ) + n
= cn lg ( n 2 ) + n
= cn lg n cn lg 2 + n
= cn lg n + (1 c)n
b) T(n) = O(n)
Tht vy, ta li c th chn mt s dng c ln T ( n ) < cn vi n < 3 . Ta s chng
minh quy np cho trng hp n 3:
T (n) = 2T ( n 2 ) + n
c ( n + 1) + n (= nh thc bc nht ca 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-2006
Cu trc d liu v gii thut 51
L Minh Hong
52 Chuyn
2. X = 5 (l) X := 5 * 3 + 1; (16)
HSPHN 1999-2006
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-2006
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:
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Hanoi_Tower;
const
max = 64;
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: LongWord;
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;
HSPHN 1999-2006
Cu trc d liu v gii thut 57
end;
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 LongWord(1) shl (n - 1) - 1 + LongWord(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
A B C D E F H I J K L L
HSPHN 1999-2006
Cu trc d liu v gii thut 59
Gim n i 1
p
A B C D E F H I J K L
Gi tr
Lin kt
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
L Minh Hong
60 Chuyn
A B C D E
A B C D E
A B C E
HSPHN 1999-2006
Cu trc d liu v gii thut 61
Trng th ba (Prev) cha lin kt (con tr) ti nt lin trc, tc l cha mt thng tin
bit nt ng trc nt trong danh sch l nt no, trong trng hp l nt u tin
(khng c nt lin trc) trng ny c gn mt gi tr c bit.
Next
INFO
Prev
Khc vi danh sch ni n, danh sch ni kp c hai cht: Nt u tin trong danh sch
(First) v nt cui cng trong danh sch (Last). C hai cch duyt danh sch ni kp: 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 Last) 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 First) th dng li
First
A B C D E
Last
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
C n ngi nh s t 1 ti n ngi quanh mt vng trn (n 10000), cng chi mt tr chi:
Mt ngi no m 1, ngi k tip, theo chiu kim ng h m 2 c nh vy cho ti
ngi m n mt s nguyn t th phi ra khi vng trn, ngi k tip li m bt u t 1:
Hy lp chng trnh
Nhp vo 2 s n v S t bn phm
HSPHN 1999-2006
Cu trc d liu v gii thut 63
Cho bit nu ngi th nht l ngi m 1 th ngi cn li cui cng trong vng trn l
ngi th my
Cho bit nu ngi cn li cui cng trong vng trn l ngi th k th ngi m 1 l
ngi no?.
Gii quyt hai yu cu trn trong trng hp: u tin tr chi c m theo chiu kim ng
h, khi c mt ngi b ra khi cuc chi th vn l ngi k tip m 1 nhng qu trnh m
ngc li (tc l ngc chiu kim ng h)
L Minh Hong
64 Chuyn
5. NGN XP V HNG I
begin
StackInit;
HSPHN 1999-2006
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-2006
Cu trc d liu v gii thut 67
vn-1 ...
r
Re a
vn v2
t
v1
n
Fro
Lu l trong thao tc Push v Pop phi kim tra Queue trn hay Queue cn nn phi cp
nht li bin n. (Thc ra c th ch dng hai bin Front v Rear l c th kim tra c Queue
trn hay cn).
program QueueByCList;
const
max = 10000;
var
Queue: array[0..max - 1] of Integer;
i, n, Front, Rear: Integer;
L Minh Hong
68 Chuyn
begin
Rear := (Rear + 1) mod max; {Rear chy theo vng trn}
Queue[Rear] := V;
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-2006
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 3 n
C A
1 2 3 n
C A
B
Hnh 15: Di chuyn toa tu (2)
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
HSPHN 1999-2006
Cu trc d liu v gii thut 71
A 1
B C D 2
E F G H I 3
J K 4
( a + b ) c
d
e
a b c /
d e
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
8 9 10
f)
e)
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-2006
Cu trc d liu v gii thut 73
A 1
2 B E 3
C D F G
4 5 6 7
L Minh Hong
74 Chuyn
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
A B C D E
Hnh 22: Nhc im ca phng php biu din cy nh phn bng mng
INFO
Left Right
HSPHN 1999-2006
Cu trc d liu v gii thut 75
B C
D E F G
L
H I J K
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: K.i + j . Nu i khng phi l nt gc (I > 0)
i 1
th nt cha ca nt i l nt . Ta c th dng mt mng T nh s t 0 lu cc gi tr
K
trn cc nt: Gi tr ti nt th i c lu tr phn t T[i].
HSPHN 1999-2006
Cu trc d liu v gii thut 77
A
3
1
J
B
2
F
C M
4 12
D G I L
H
5 E 9 K 11
7
8
6 10
A B F J C D E G H I K L M
L Minh Hong
78 Chuyn
9
A
6
1
I
B
4
F
L
12
C
K
D G H
2 E J 11
3 7 8
5 10
1 2 3 4 5 6 7 8 9 10 11 12
Info: B C D F E I G H A J K L
Children: 2 3 5 7 8 10 11 12 1 4 6
1 2 3 4 5 6 7 8 9 10 11
Head: 0 3 3 3 5 5 8 8 8 11 11 11 11
1 2 3 4 5 6 7 8 9 10 11 12 13
Hnh 26: Biu din cy tng qut bng mng
HSPHN 1999-2006
Cu trc d liu v gii thut 79
INFO Sibling
FirstChild
L Minh Hong
80 Chuyn
3 7 4
6 2
HSPHN 1999-2006
Cu trc d liu v gii thut 81
L Minh Hong
82 Chuyn
10 y vo Stack 10
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.
Input: File vn bn CALRPN.INP ch gm 1 dng c khng qu 255 k t, cha cc s
thc v cc ton t {+, -, *, /}. Quy nh khun dng bt buc l hai s lin nhau trong
biu thc RPN phi vit cch nhau t nht mt du cch.
Output: Kt qu biu thc .
CALRPN.INP CALRPN.OUT
10 2/3 + 7 4 -* 10 2 / 3 + 7 4 - * = 24.0000
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.
P_2_07_1.PAS * Tnh gi tr biu thc RPN
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Calculating_RPN_Expression;
const
InputFile = 'CALRPN.INP';
OutputFile = 'CALRPN.OUT';
HSPHN 1999-2006
Cu trc d liu v gii thut 83
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
Assign(f, InputFile); Reset(f);
Readln(f, RPN);
Close(f);
Refine(RPN);
StackInit;
T := '';
L Minh Hong
84 Chuyn
( y vo Stack (
10 Output: 10 ( 10
HSPHN 1999-2006
Cu trc d liu v gii thut 85
c X l Stack Output
2 Output: 2 (/ 2
3 Output: 3 (+ 3
( y vo Stack (
7 Output: 7 ( 7
4 Output: 4 ( 4
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.
Input: File vn bn RPNCONV.INP ch gm 1 dng cha biu thc trung t.
Output: File vn bn RPNCONV.OUT ghi biu thc trung t sau khi hiu chnh v biu
thc RPN tng ng
V d:
RPNCONV.INP RPNCONV.OUT
(10/2 + 3)*(7-4) Refined: ( 10 / 2 + 3 ) * ( 7 - 4 )
RPN : 10 2 / 3 + 7 4 - *
P_2_07_2.PAS * Chuyn biu thc trung t sang dng RPN
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Converting_Infix_to_RPN;
const
InputFile = 'RPNCONV.INP';
OutputFile = 'RPNCONV.OUT';
Opt = ['(', ')', '+', '-', '*', '/'];
var
T, Infix, Stack: string;
p: Integer;
f: Text;
procedure StackInit;
begin
Stack := '';
L Minh Hong
86 Chuyn
end;
begin
Assign(f, InputFile); Reset(f);
HSPHN 1999-2006
Cu trc d liu v gii thut 87
Readln(f, Infix);
Close(f);
Assign(f, OutputFile); Rewrite(f);
Refine(Infix);
Writeln(f, 'Refined: ', Infix);
Write(f, 'RPN : ');
T := '';
for p := 1 to Length(Infix) do {Tch v x l tng phn t c c t biu thc trung t}
if Infix[p] <> ' ' then T := T + Infix[p]
else
begin
Process(T);
T := '';
end;
while Stack <> '' do Write(f, Pop, ' ');
Close(f);
end.
L Minh Hong
88 Chuyn
a) A (B + C)
b) A+B/ C+D
c) A (B + C)
d) A (B + C)d / e
e) A and B or C
f) A and (B or not C)
g) (A or B) and (C or (D and not E))
h) (A = B) or (C = D)
i) (A < 9) and (A > 3) or not (A > 0)
j) ((A > 0) or (A < 0)) and (B B 4 A C < 0)
Bi 4
Vit chng trnh tnh biu thc logic dng RPN vi cc ton t and, or, not v cc ton hng
l TRUE hay FALSE.
Bi 5
Vit chng trnh hon chnh tnh gi tr biu thc trung t.
HSPHN 1999-2006
Cu trc d liu v gii thut 89
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
90 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-2006
Cu trc d liu v gii thut 91
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
92 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-2006
Cu trc d liu v gii thut 93
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], ta
c:
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
94 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;
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
HSPHN 1999-2006
Cu trc d liu v gii thut 95
L Minh Hong
96 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-1 ki kj kj+1 kH
HSPHN 1999-2006
Cu trc d liu v gii thut 97
Hai vng lp whiledo bn trong lun tm c hai kho k[i], k[j] m k[i] kho cht
k[j]. Khng c trng hp hai ch s i, j chy ra ngoi on (lun lun c L i, j H).
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
Hnh 30: Trng thi trc khi gi quy
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 ng v tr 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
L Minh Hong
98 Chuyn
HSPHN 1999-2006
Cu trc d liu v gii thut 101
c1 , if n 50
T(n) n 3n
c2 n + T 5 + T 4 , otherwise
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 cn.
Vi n > 50, gi thit quy np rng T(m) cm vi m < n, ta s chng minh T(n) cn, tht
vy:
n 3n 1 1 3
T(n) c 2 n + c + c c n + c n + c n = cn
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, ta c th coi thi gian
thc hin th tc sp xp l O(nlgn) vi mi tnh trng d liu vo.
L Minh Hong
102 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-2006
Cu trc d liu v gii thut 103
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
104 Chuyn
procedure HeapSort;
var
r, i: Integer;
HSPHN 1999-2006
Cu trc d liu v gii thut 105
L Minh Hong
106 Chuyn
bit 3 2 1 0
11 = 1 0 1 1 (z=4)
HSPHN 1999-2006
Cu trc d liu v gii thut 107
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
108 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, WORD, DWORD, QWORD...
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 tng chnh ca 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-2006
Cu trc d liu v gii thut 109
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
110 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-2006
Cu trc d liu v gii thut 111
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
112 Chuyn
HSPHN 1999-2006
Cu trc d liu v gii thut 113
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
114 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 106 kho v gi tr mi kho l s t nhin khng qu 106.
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 nu mt gi tr s t nhin x biu din bng d + 1 ch s trong
h 256: x = x d ...x1x 0 (256) th xp = x div 256p mod 256 = (x shr (p shl 3) ) and $FF (1 p d).
HSPHN 1999-2006
Cu trc d liu v gii thut 115
procedure Enter;
var
f: Text;
begin
Assign(f, InputFile); Reset(f);
n := 0;
MinV := High(Integer); SupV := 0;
while not SeekEof(f) do
begin
Inc(n); Read(f, k[n]);
if k[n] < MinV then MinV := k[n];
if k[n] > SupV then SupV := k[n];
end;
Close(f);
Inc(SupV);
StTime := GetCurrentTime;
end;
procedure PrintInput;
var
i: Integer;
begin
Enter;
for i := 1 to n do Write(k[i]:8);
Write('Press any key to return to menu...');
ReadKey;
end;
procedure PrintResult;
var
f: Text;
L Minh Hong
116 Chuyn
i: Integer;
ch: Char;
begin
Writeln('Running Time = ', GetCurrentTime - StTime:1:4, ' (s)');
Assign(f, OutputFile); Rewrite(f);
for i := 1 to n do Writeln(f, k[i]);
Close(f);
Write('Press <P> to print Output, another key to return to menu...');
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;
procedure SelectionSort;
var
i, j, jmin: Integer;
begin
Enter;
for i := 1 to n - 1 do
begin
jmin := i;
for j := i + 1 to n do
if k[j] < k[jmin] then jmin := j;
if jmin <> i then Swap(k[i], k[jmin]);
end;
PrintResult;
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;
HSPHN 1999-2006
Cu trc d liu v gii thut 117
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;
end;
procedure AdvancedInsertionSort;
var
i, inf, sup, median, tmp: Integer;
begin
Enter;
for i := 2 to n do
begin
tmp := k[i];
inf := 1; sup := i - 1;
repeat
median := (inf + sup) shr 1;
if tmp < k[median] then sup := median - 1
else inf := median + 1;
until inf > sup;
Move(k[inf], k[inf + 1], (i - inf) * SizeOf(k[1]));
k[inf] := tmp;
end;
PrintResult;
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 }
L Minh Hong
118 Chuyn
procedure QuickSort;
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;
HSPHN 1999-2006
Cu trc d liu v gii thut 119
var
i, V: Integer;
begin
Enter;
FillChar(c, SizeOf(c), 0);
for i := 1 to n do Inc(c[k[i]]);
for V := MinV + 1 to SupV - 1 do c[V] := c[V - 1] + c[V];
for i := n downto 1 do
begin
V := k[i];
t[c[V]] := k[i];
Dec(c[V]);
end;
k := t;
PrintResult;
end;
procedure RadixExchangeSort;
var
MaskBit: array[0..BitCount - 1] of Integer;
i, maxbit: Integer;
begin
Enter;
maxbit := Trunc(Ln(SupV) / Ln(2));
for i := 0 to maxbit do MaskBit[i] := 1 shl i;
Partition(1, n, maxbit);
PrintResult;
end;
procedure StraightRadixSort;
const
Radix = 256;
var
p, maxDigit: Integer;
Flag: Boolean;
L Minh Hong
120 Chuyn
begin
Enter;
MaxDigit := Trunc(Ln(SupV) / Ln(Radix));
Flag := True;
for p := 0 to MaxDigit 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
Flag: Boolean;
len: Integer;
HSPHN 1999-2006
Cu trc d liu v gii thut 121
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;
if not (Selected in [1..nMenu]) then Continue;
Writeln(SMenu[selected]);
case selected of
1 : PrintInput;
2 : SelectionSort;
3 : BubbleSort;
4 : InsertionSort;
L Minh Hong
122 Chuyn
5 : AdvancedInsertionSort;
6 : ShellSort;
7 : QuickSort;
8 : HeapSort;
9 : DistributionCounting;
10: RadixExchangeSort;
11: StraightRadixSort;
12: MergeSort;
13: Halt;
end;
until False;
end.
HSPHN 1999-2006
Cu trc d liu v gii thut 123
Hnh 37: My Pentium 4, 3.2GHz, 2GB RAM t ra chm chp khi sp xp 108 kho [0..7.107] cho d
nhng thut ton sp xp tt nht c p dng
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 cn a vo mt s sa i nh.
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.
L Minh Hong
124 Chuyn
HSPHN 1999-2006
Cu trc d liu v gii thut 125
L Minh Hong
126 Chuyn
9. TM KIM (SEARCHING)
HSPHN 1999-2006
Cu trc d liu v gii thut 127
L Minh Hong
128 Chuyn
2 6
1 3 5 7
HSPHN 1999-2006
Cu trc d liu v gii thut 129
4 4
2 6 2 6
1 3 5 7 1 3 7
9 9
L Minh Hong
130 Chuyn
4
4
2
2 5
1 3 7
1 3 7
6 9
6 9
3
4
2 5
2 5
1 7
1 3 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.
HSPHN 1999-2006
Cu trc d liu v gii thut 131
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
L Minh Hong
132 Chuyn
HSPHN 1999-2006
Cu trc d liu v gii thut 133
bit 3 2 1 0
11 = 1 0 1 1 (z=4)
L Minh Hong
134 Chuyn
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
Gi s cu trc mt nt ca cy c c t di dng:
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-2006
Cu trc d liu v gii thut 135
L Minh Hong
136 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-2006
Cu trc d liu v gii thut 137
bit bng 1 th r sang nt con phi, c tip tc nh vy cho ti khi mt trong hai tnh hung
sau xy ra:
Hoc i ti mt nt rng (do r theo lin kt nil) qu trnh tm kim tht bi do X khng c
trong RST
Hoc duyt ht dy bit ca X v ang ng mt nt l, qu trnh tm kim thnh cng
v chc chn nt l cha gi tr ng bng X.
{Hm tm kim trn cy tm kim c s, tr v nt l 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 RSTSearch(X: TKey): PNode;
var
b: Integer;
p: PNode;
begin
b := z; p := Root; {Bt u vi nt gc, i vi RST th gc lun c sn}
repeat
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}
until (p = nil) or (b = 0);
RSTSearch := p;
end;
Thao tc chn mt gi tr X vo RST c thc hin nh sau: u tin, ta ng gc v
duyt dy bit ca X t tri qua phi (t bit z - 1 v bit 0), c gp 0 th r tri, gp 1 th r phi.
Nu qu trnh r theo mt lin kt nil (i ti nt rng) th lp tc to ra mt nt mi, v ni
vo theo lin kt c ng i tip. Sau khi duyt ht dy bit ca X, ta s dng li mt
nt l ca RST, v cng vic cui cng l t gi tr X vo nt l .
V d:
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
138 Chuyn
0 0 1
1
1 1 1 0
0
1 0 0 1
0 0 1
2 4 5 7 2 4 5
HSPHN 1999-2006
Cu trc d liu v gii thut 139
L Minh Hong
140 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)
Hnh 48: Cy tm kim c s a) v Trie tm kim c s 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-2006
Cu trc d liu v gii thut 141
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-2006
Quy hoch ng 145
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
146 Chuyn
dng mng Current tnh mng Next, mng Next sau khi tnh s mang cc gi tr tng ng
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
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Analysis_Counting_2;
const
max = 100;
var
Current, Next: array[0..max] of Integer;
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
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Analysis_Counting_3;
const
max = 100;
var
B: array[1..2, 0..max] of Integer;{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-2006
Quy hoch ng 147
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
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Analysis_Counting_5;
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
L Minh Hong
148 Chuyn
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-2006
Quy hoch ng 149
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
150 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-2006
Quy hoch ng 151
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
152 Chuyn
HSPHN 1999-2006
Quy hoch ng 153
L Minh Hong
154 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:
i 0 1 2 3 4 5 6 7 8 9 10 11
a[i] 5 2 3 4 9 10 5 6 7 8 +
T[i] 2 8 3 4 7 6 11 8 9 10 11 Truy vt
procedure Enter;
var
i: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n);
HSPHN 1999-2006
Quy hoch ng 155
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:
Nhc li cng thc truy hi tnh cc L[.] l:
L [ n + 1] = 0
L [i ] = max L [ j] + 1; (i=0,n)
i < j n +1
a [i ]< a [ j]
L Minh Hong
156 Chuyn
L[n + 1] := 1;
StartOf[1] := n + 1;
m := 1; {m l di dy con n iu tng di nht ca dy a[i..n+1] ( bc khi to ny i = n + 1)}
for i := n downto 0 do
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;
3.1.4. Ci tin
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
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Finding_The_Longest_Sub_Sequence;
const
InputFile = 'INCSEQ.INP';
OutputFile = 'INCSEQ.OUT';
const
max = 1000000;
var
a, L, T, StartOf: array[0..max + 1] of Integer;
n, m: Integer;
procedure Enter;
var
i: Integer;
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;
HSPHN 1999-2006
Quy hoch ng 157
begin
a[0] := Low(Integer);
a[n + 1] := High(Integer);
m := 1;
L[n + 1] := 1;
StartOf[1] := n + 1;
end;
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;
L Minh Hong
158 Chuyn
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.
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]]
HSPHN 1999-2006
Quy hoch ng 159
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.
3.2.3. Tnh bng phng n:
Bng phng n F gm n + 1 dng, M + 1 ct, trc tin c in c s quy hoch ng:
Dng 0 gm ton s 0. S dng cng thc truy hi, dng dng 0 tnh dng 1, dng dng 1
tnh dng 2, v.v n khi tnh ht dng n.
F 0 1 2 ...... M
0 0 0 0 ...0... 0
1
2
... ... ... ... ... ...
n
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
L Minh Hong
160 Chuyn
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.
HSPHN 1999-2006
Quy hoch ng 161
STR.INP STR.OUT
PBBCEFATZ 7
QABCDABEFA 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
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
L Minh Hong
162 Chuyn
x1 x2 xm-1 xm:=yn
y1 y2 yn-1 yn
y1 y2 yn-1 yn
HSPHN 1999-2006
Quy hoch ng 163
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
Lu : khi truy vt, trnh truy nhp ra ngoi bng, nn to vin cho bng.
P_3_03_4.PAS * Bin i xu
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program String_Transformation;
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
164 Chuyn
begin
Enter;
Optimize;
Trace;
end.
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-2006
Quy hoch ng 165
(
T trn suy ra f [i, t ] = min f [i 1, t ] ,1 + f i 1, t A [i ]
)
C s quy hoch ng: f[0, 0] = 0; f[0, i] = + (vi i: 1 i < k).
P_3_03_5.PAS * Dy con c tng chia ht cho k
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Finding_The_Sub_Sequence;
const
InputFile = 'SUBSEQ.INP';
OutputFile = 'SUBSEQ.OUT';
maxN = 1000;
maxK = 1000;
var
a: array[1..maxN] of Integer;
f: array[0..maxN, 0..maxK - 1] of Integer;
n, k: Integer;
procedure Enter;
var
fi: Text;
i: Integer;
begin
Assign(fi, InputFile); Reset(fi);
L Minh Hong
166 Chuyn
ReadLn(fi, n, k);
for i := 1 to n do Read(fi, a[i]);
Close(fi);
end;
procedure Optimize;
var
i, t: Integer;
begin
{Khi to}
f[0, 0] := 0;
for t := 1 to k 1 do f[0, t] := maxK;
{Gii cng thc truy hi}
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: Integer;
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.
HSPHN 1999-2006
Quy hoch ng 167
f [i, t ] = max
0 j Count [i ]
( f i 1, t j.i + j)
Trace i 1,t j.i 1
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;
L Minh Hong
168 Chuyn
tmp := (x - y) mod k;
if tmp >= 0 then Sub := tmp
else Sub := tmp + k;
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 phn t mng Trace=-1}
Trace[0, 0] := Count[0]; {Ngoi tr Trace[0, 0] = Count[0]}
for i := 1 to k - 1 do
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: Integer;
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.
HSPHN 1999-2006
Quy hoch ng 169
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
1 0 2 4 0
1 2 34 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(pq) v B(qr) 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 ma trn c th nh gi qua s ln thc hin php nhn s hc,
vi gii thut nhn hai ma trn k trn, nhn ma trn A cp pxq vi ma trn 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]
L Minh Hong
170 Chuyn
j
tnh m [ t ] , c th c nhiu cch kt hp:
t =i
j
k j
m [ t ] = m [ u ] . m [ v ] ; k: i k<j
t =i u =i v = 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 [ u ] ) cng vi f[k+1, j] (l chi ph ti thiu tnh
u =i
m [ v] )
v = 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 [u ]
u =i
j
v ma trn m[v] ). T suy ra: do c nhiu cch kt hp, m ta cn chn cch kt hp
v = k +1
HSPHN 1999-2006
Quy hoch ng 171
j
u nhn m [ r ] (c km theo du ng m ngoc) ng thi vit thm du . vo
r = Tr[i, j]+1
L Minh Hong
172 Chuyn
j := i + len - 1;
for k := i to j - 1 do {Th cc v tr phn hoch k}
begin
p := a[i]; q := a[k + 1]; r := a[j + 1];
x := f[i, k] + f[k + 1, j] + p * q * r;
if x < f[i, j] then {Ti u ho f[i, j]}
begin
f[i, j] := x;
tr[i, j] := k;
end;
end;
end;
end;
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
HSPHN 1999-2006
Quy hoch ng 173
{ (
b [ V ] = min k ( A [ k ] V ) b V A [ k ] < k )}
Sau khi tnh ht dy b[1..M]. Nu b[M] vn bng + th c ngha l khng c phng n
chn. Nu khng th s chn gi p[1] = b[M], tip theo s chn gi p[2] = b[M - A[p[1]]], ri
li chn gi p[3] = b[M - A[p[1]] - A[p[2]]] n khi truy vt v ti b[0] th thi.
Bi 3
Cho n gi ko (n 200), mi gi cha khng qu 200 vin ko, hy chia cc gi ko ra lm
hai nhm sao cho s ko gia hai nhm chnh lch nhau t nht
Hng dn:
Gi S l tng s ko v M l na tng s ko, p dng cch gii nh bi 2. Sau
L Minh Hong
174 Chuyn
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 nt A[i, j]. R rng i vi nhng
ct 1 th B[i, 1] = A[i, 1]:
1 2 6 7 9 1 9 18 25 34
7 6 5 6 7 7 13 18 24 32
A= B=
1 2 3 4 2 1 9 16 23 28
4 7 8 7 6 4 11 19 26 32
HSPHN 1999-2006
Quy hoch ng 175
Bi 2
Xu k t S gi l xu con ca xu k t T nu c th xo bt mt s k t trong xu T
c xu S. Lp chng trnh nhp vo hai xu k t X, Y. Tm xu Z c di ln nht l
xu con ca c X v Y. V d: X = 'abcdefghi123'; Y = 'abc1def2ghi3' th Z l 'abcdefghi3'.
Bi 3
Mt xu k t X gi l cha xu k t Y nu nh c th xo bt mt s k t trong xu X
c xu Y: V d: Xu '1a2b3c45d' cha xu '12345'. Mt xu k t gi l i xng nu
n khng thay i khi ta vit cc k t trong xu theo th t ngc li: V d:
'abcABADABAcba', 'MADAM' l cc xu i xng.
Nhp mt xu k t S c di khng qu 128, hy tm xu k t T tho mn c 3 iu kin:
i xng
Cha xu S
C t k t nht (c di ngn nht)
Nu c nhiu xu T tho mn ng thi 3 iu kin trn th ch cn cho bit mt. Chng hn
vi S = 'a_101_b' th chn T = 'ab_101_ba' hay T = 'ba_101_ab' u ng.
V d:
S T
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
176 Chuyn
HSPHN 1999-2006
PHN 4. CC THUT TON TRN
TH
1. CC KHI NIM C BN
HSPHN 1999-2006
L thuyt th 179
n th a th
deg ( v ) = 2m
vV
L Minh Hong
180 Chuyn
deg ( v ) = deg ( v ) = m
vV
+
vV
HSPHN 1999-2006
L thuyt th 181
L Minh Hong
182 Chuyn
1 2
4 3
Hnh 54
Ci t trn mng:
1 2 3 4 5 6
HSPHN 1999-2006
L thuyt th 183
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
1 2 3 4 5
L Minh Hong
184 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 GraphInput;
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);
HSPHN 1999-2006
L thuyt th 185
L Minh Hong
186 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
PATH.INP PATH.OUT
8715 From 1 you can visit:
2 4
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
188 Chuyn
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
Enter;
HSPHN 1999-2006
L thuyt th 189
2nd 5th
2 4 2 4
6 6 6th
1 7 1 7
8 1st 8
3 5 3 5
3 rd 4th
Hnh 57: th v cy DFS
x1 x2 xp
L Minh Hong
190 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
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
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-2006
L thuyt th 191
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 59 l v
d v cy BFS.
L Minh Hong
192 Chuyn
2nd 4th
2 4 2 4
6 6 6th
1 7 1 7
8 1st 8
3 5 3 5
3 rd 5th
Hnh 59: th v cy BFS
HSPHN 1999-2006
L thuyt th 193
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
194 Chuyn
Weakly connected
Strongly connected
Hnh 62: Lin thng mnh v lin thng yu
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-2006
L thuyt th 195
K4 K5
K3
Hnh 63: th y
L Minh Hong
196 Chuyn
HSPHN 1999-2006
L thuyt th 197
max = 100;
var
a: array[1..max, 1..max] of Boolean; {Ma trn k ca th}
Free: array[1..max] of Boolean; {Free[v] = True v cha c lit k vo thnh phn lin thng no}
k, u, v, n: Integer;
Count: Integer;
fo: Text;
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
198 Chuyn
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-2006
L thuyt th 199
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
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
L Minh Hong
200 Chuyn
1
1
2
2
8
8
3
3
4
4
9 10
11 9 10
11
5
5
6
6
7
7
Trnh by di dng nh vy, nhng by gi chng ta mi tho lun ti vn quan trng nht:
Lm th no kim tra mt nh v no c phi l cht hay khng ?
Hy nhnh DFS gc nh r no .
Nhn xt 1: Nu nh t cc nh thuc nhnh gc r ny khng c cung ngc hay cung cho
no i ra khi nhnh th r l cht. iu ny d hiu bi nh vy c ngha l t r, i theo cc
cung ca th th ch n c nhng nh thuc nhnh m thi. Vy:
HSPHN 1999-2006
L thuyt th 201
L Minh Hong
202 Chuyn
begin
Thm vo th mt nh x v cc cung (x, v) vi mi v;
Count := 0;
L := ; {Khi to mt ngn xp rng}
HSPHN 1999-2006
L thuyt th 203
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
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
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
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;
L Minh Hong
204 Chuyn
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-2006
L thuyt th 205
Inc(ComponentCount);
WriteLn(fo, 'Component ', ComponentCount, ': ');
repeat
v := Pop; {Ly dn cc nh ra khi ngn xp}
Write(fo, v, ', '); {Lit k cc nh }
Free[v] := False; {Ri loi lun khi th}
until v = u; {Cho ti khi ly ti nh u}
WriteLn(fo);
end;
end;
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
Phng php ci t nh trn c th ni l rt hay v hiu qu, i hi ta phi hiu r bn cht
thut ton, nu khng th rt d nhm. Trn thc t, cn c mt phng php khc d hiu
hn, tuy c chm hn mt cht. Hy vit chng trnh m t phng php sau:
Vn dng thut ton tm kim theo chiu su vi th tc Visit ni u mc, nh s li cc
nh t 1 ti n theo th t duyt xong, sau o chiu tt c cc cung ca th. Xt ln
lt cc nh theo th t t nh duyt xong sau cng ti nh duyt xong u tin, vi mi
nh , ta li dng thut ton tm kim trn th (BFS hay DFS) lit k nhng nh no n
c t nh ang xt, chnh l mt thnh phn lin thng mnh. Lu l khi lit k xong
thnh phn no, ta loi ngay cc nh ca thnh phn khi th.
Tnh ng n ca phng php c th hnh dung khng my kh khn:
Trc ht ta thm vo th nh x v cc cung (x, v) vi mi v, sau gi Visit(x) xy
dng cy DFS gc x. Hin nhin x l cht ca thnh phn lin thng ch gm mi x. Sau
b nh x khi cy DFS, cy s phn r thnh cc cy con.
nh r duyt xong sau cng chc chn l gc ca mt cy con (bi khi duyt xong n chc
chn s li v x) suy ra r l cht. Hn th na, nu mt nh u no ti c r th u cng
phi thuc cy con gc r. Bi nu gi s phn chng rng u thuc cy con khc th u phi
c thm trc r (do cy con gc r c thm ti sau cng), c ngha l khi Visit(u) th r
cha thm. Vy nn r s thuc nhnh DFS gc u, mu thun vi lp lun r l gc. T suy
ra nu u ti c r th r ti c u, tc l khi o chiu cc cung, nu r ti c nh no th
nh thuc thnh phn lin thng cht r.
L Minh Hong
206 Chuyn
Loi b thnh phn lin thng vi cht r khi th. Cy con gc r li phn r thnh nhiu
cy con. Lp lun tng t nh trn vi v' l nh duyt xong sau cng (Hnh 67).
V d:
1 11
2 6
3 10
4 5
5 4
6 7 9 8
11 7
8 3
9 2
10 1
Hnh 67: 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
Thut ton Warshall c th p dng tm bao ng ca th c hng, vy hy kim tra tnh
lin thng mnh ca mt th c hng bng hai cch: Dng cc thut ton tm kim trn
th v thut ton Warshall, sau so snh u, nhc im ca mi phng php
Bi 3
Trn mt phng vi h to Decattes vung gc cho n ng trn, mi ng trn xc nh
bi b 3 s thc (X, Y, R) y (X, Y) l to tm v R l bn knh. Hai ng trn gi l
thng nhau nu chng c im chung. Hy chia cc ng trn thnh mt s ti thiu cc
nhm sao cho hai ng trn bt k trong mt nhm bt k c th i c sang nhau sau mt
s hu hn cc bc di chuyn gia hai ng trn thng nhau.
HSPHN 1999-2006
L thuyt th 207
L Minh Hong
208 Chuyn
HSPHN 1999-2006
L thuyt th 209
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
b)
a)
Hnh 69: Cy khung DFS (a) v cy khung BFS (b) (Mi tn ch chiu i thm cc nh)
L Minh Hong
210 Chuyn
HSPHN 1999-2006
L thuyt th 211
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.
L Minh Hong
212 Chuyn
1 1
2 3 2 3
6 6
4 5 4 5
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
phi thuc mt chu trnh c s ca cy DFS, nn s c mt chu trnh c s cha c u v v.
HSPHN 1999-2006
L thuyt th 213
Chu trnh c s ca cy DFS qua php nh chiu DFS vn l chu trnh trong G' nn i theo
cc cnh nh hng ca chu trnh , ta c th i t u ti v v ngc li trn G'.
Nu u v v l 2 nh bt k ca G th do G lin thng, tn ti mt ng i (u=x[0], x[1], ,
x[n]=v). V (x[i], x[i + 1]) l cnh ca G nn trong G', t x[i] c th n c x[i+1]. Suy ra
t u cng c th n c v bng cc cnh nh hng ca G'.
Vi nhng kt qu chng minh trn, ta cn suy ra c: Nu th lin thng v mi cnh
ca n nm trn t nht mt chu trnh n th php nh chiu DFS s cho mt th lin
thng mnh. Cn nu khng, th php nh chiu DFS s cho mt th nh hng c t
thnh phn lin thng mnh nht, mt cnh khng nm trn mt chu trnh n no (cu) ca
th ban u s c nh hng thnh cung ni gia hai thnh phn lin thng mnh.
Gii thut cho bi ton nh chiu th n y qu n gin nn c l khng cn ci t c
th chng trnh na. By gi song song vi vic nh chiu, ta m t phng php nh s
v ghi nhn cung ngc ln trn cao nht t mt nhnh cy DFS dng vo mt s bi ton
khc.
5.3.2. Php nh s v ghi nhn cung ngc ln cao nht trn cy DFS
Trong qu trnh nh chiu, ta thm vo thao tc nh s cc nh theo th t thm DFS,
gi Number[u] l s th t ca nh u theo cch nh s . nh ngha thm Low[u] l gi
tr Number[.] nh nht ca nhng nh n c t nhnh DFS gc u bng mt cung ngc.
Tc l nu nhnh DFS gc u c nhiu cung ngc hng ln pha gc th ta ghi nhn li cung
ngc hng ln cao nht. Nu nhnh DFS gc u khng cha cung ngc th ta cho Low[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 (Number[u]) v khi gn Low[u] = +, sau xt tt c nhng nh v k
u, nh chiu cnh (u, v) thnh cung (u, v). C hai kh nng xy ra:
v cha thm th ta gi Visit(v) thm v, khi th tc Visit(v) thot c ngha l xy dng
c nhnh DFS gc v nhnh DFS gc u, khi nhng cung ngc i t nhnh DFS
gc v c th coi l cung ngc i t nhnh DFS gc u ta cc tiu ho Low[u] theo cng
thc: Low[u]mi := min(Low[u]c, Low[v])
v thm th (u, v) l mt cung ngc i t nhnh DFS gc u ta s cc tiu ho Low[u]
theo cng thc: Low[u]mi := min(Low[u]c, Number[v])
L Minh Hong
214 Chuyn
1 1
1 1
2 3 2 3
4
6 2 4
4 5 7 8
2
7 10 4 4
8 9 5 6
10 2 + 9
th v hng th nh chiu
Gi tr Numbering[.] ghi trong vng trn
Gi tr Low[.] ghi bn ngoi vng trn
HSPHN 1999-2006
L thuyt th 215
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
6 27 3
4 5
36 5
45 6
7 47
8 9
10 5 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
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
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;
L Minh Hong
216 Chuyn
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.
HSPHN 1999-2006
L thuyt th 217
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 (G s l lin
thng mnh).
L Minh Hong
218 Chuyn
2 5
7
1 4
8
3 6
Hnh 73
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 74 bng nt lin, cc cnh b xo c v bng nt t.
2 5
7
1 4
8
3 6
Hnh 74
HSPHN 1999-2006
L thuyt th 219
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
1 2
EULER.INP EULER.OUT
5 1231341
121
132
141
231
4 3
341
P_4_06_1.PAS * Thut ton Fleury tm chu trnh Euler
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Finding_an_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);
ReadLn(f, n);
while not SeekEof(f) do
begin
ReadLn(f, u, v, k);
a[u, v] := k;
a[v, u] := k;
L Minh Hong
220 Chuyn
end;
Close(f);
end;
HSPHN 1999-2006
L thuyt th 221
begin
Enter;
FindEulerCircuit;
end.
L Minh Hong
222 Chuyn
OutputFile = 'EULER.OUT';
max = 100;
maxE = 20000; {S cnh ti a}
var
a: array[1..max, 1..max] of Integer;
stack: array[1..maxE] of Integer;
n, Top: Integer;
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
if a[u, v] > 0 then {Xt tt c cc cnh lin thuc vi u, nu thy}
begin
Dec(a[u, v]); Dec(a[v, u]); {Xo cnh khi th}
Push(v); {y nh tip theo vo ngn xp}
Break;
end;
if u = Get then {Nu phn t nh ngn xp vn l u vng lp trn khng tm thy nh no k vi u}
begin
HSPHN 1999-2006
L thuyt th 223
Inc(count);
Write(f, Pop, ' '); {In ra phn t nh ngn xp}
end;
end;
Close(f);
end;
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
L Minh Hong
224 Chuyn
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 75:
b c a b a b e
e d d c d c f g
G1 G2 G3
Hnh 75
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.
HSPHN 1999-2006
L thuyt th 225
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 phng php vi phc tp a thc tm 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
12 142531
5 2 13
24
35
41
52
4 3
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;
L Minh Hong
226 Chuyn
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);
Attempt(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:
HSPHN 1999-2006
L thuyt th 227
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).
L Minh Hong
228 Chuyn
HSPHN 1999-2006
L thuyt th 229
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.
L Minh Hong
230 Chuyn
s f2 f
HSPHN 1999-2006
L thuyt th 231
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
L Minh Hong
232 Chuyn
HSPHN 1999-2006
L thuyt th 233
end;
begin
LoadGraph;
Init;
Ford_Bellman;
PrintResult;
end.
L Minh Hong
234 Chuyn
HSPHN 1999-2006
L thuyt th 235
OutputFile = 'MINPATH.OUT';
max = 1000;
maxEC = 1000;
maxC = max * maxEC;
var
c: array[1..max, 1..max] of Integer;
d: array[1..max] of Integer;
Trace: array[1..max] of Integer;
Free: array[1..max] of Boolean; {Free[u] = True u c nhn t do}
n, s, f: Integer;
L Minh Hong
236 Chuyn
var
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;
end.
HSPHN 1999-2006
L thuyt th 237
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);
L Minh Hong
238 Chuyn
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
HSPHN 1999-2006
L thuyt th 239
procedure PrintResult;
var
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;
end.
1 2 1 2
4 3 5 7
7 4
5 6
6 3
L Minh Hong
240 Chuyn
v: Integer;
begin
nh du u thm;
for (v V: v cha thm k vi u) do Visit(v);{Thm tip nhng nh cha thm k vi u}
duyt xong nhnh DFS gc u, nh s mi cho nh u l count;
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
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program The_Critical_Path;
const
InputFile = 'MINPATH.INP';
OutputFile = 'MINPATH.OUT';
max = 1000;
maxEC = 1000;
maxC = max * maxEC;
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;
HSPHN 1999-2006
L thuyt th 241
end;
begin
FillChar(Free, SizeOf(Free), True);
count := n;
for u := 1 to n do
if Free[u] then Visit(u);
end;
L Minh Hong
242 Chuyn
end;
WriteLn(fo, s);
end;
Close(fo);
end;
begin
LoadGraph;
Numbering;
Init;
FindPath;
PrintResult;
end.
HSPHN 1999-2006
L thuyt th 243
Khi ci t, th ta s khng c cc khi nim ck[u, v] m s thao tc trc tip trn cc trng s
c[u, v]. c[u, v] ti bc ti u th k s c tnh ton ti u qua cc gi tr c[u, v]; c[u, k]
v c[k, v] ti bc th k - 1. Tnh chnh xc ca cch ci t di dng ba vng lp for lng
nh trn c th thy c do s ti u bc cu ch lm tng tc ti u cc c[u, v] trong mi
bc
P_4_08_5.PAS * Thut ton Floyd
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Finding_the_Shortest_Path_using_Floyd_Algorithm;
const
InputFile = 'MINPATH.INP';
OutputFile = 'MINPATH.OUT';
max = 1000;
maxEC = 1000;
maxC = max * maxEC;
var
c: array[1..max, 1..max] of Integer;
Trace: array[1..max, 1..max] of Integer; {Trace[u, v] = nh lin sau u trn ng i t u ti v}
n, s, f: Integer;
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;
L Minh Hong
244 Chuyn
repeat
Write(fo, s, '->');
s := Trace[s, f]; {Nhc li rng Trace[s, f] l nh lin sau s trn ng i ti f}
until s = f;
WriteLn(fo, f);
end;
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 .
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
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:
HSPHN 1999-2006
L thuyt th 245
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
1$ mua c 0.7
1 mua c 190
1 mua c 0.009$
L Minh Hong
246 Chuyn
HSPHN 1999-2006
L thuyt th 247
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
-3 5 -3
1 2 3 4 5
L Minh Hong
248 Chuyn
HSPHN 1999-2006
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-2006
L thuyt th 251
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;
L Minh Hong
252 Chuyn
e[root] := Key;
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); {Vun danh sch cnh thnh ng}
for i := m - 1 downto 0 do {Rt ln lt cc cnh khi ng, t cnh ngn ti cnh di}
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, 'Minimum 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;
HSPHN 1999-2006
L thuyt th 253
PrintResult;
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
begin
d[v] := c[u, v];
Trace[v] := u;
end;
end;
Thng bo cy khung gm c cc cnh (Trace[v], v) vi v V: v 1);
P_4_09_2.PAS * Thut ton Prim
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Finidng_Minimum_Spanning_Tree_using_Prim_Algorithm;
const
InputFile = 'MINTREE.INP';
OutputFile = 'MINTREE.OUT';
max = 1000;
maxCE = 1000;
maxC = max * maxCE;
var
c: array[1..max, 1..max] of Integer;
d: array[1..max] of Integer;
Free: array[1..max] of Boolean;
Trace: array[1..max] of Integer; {Vt, Trace[v] l nh cha ca v trong cy khung nh nht}
n, m: Integer;
Connected: Boolean;
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];
HSPHN 1999-2006
L thuyt th 255
u := i;
end;
if u = 0 then {Nu khng chn c u no c d[u] < + th th khng lin thng}
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, 'Minimum 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
L Minh Hong
256 Chuyn
( x u x v ) + ( yu y v )
2 2
, nu cha c sn cp mng ni hai my u v v
HSPHN 1999-2006
L thuyt th 257
6 5
2 4 2 4
5 6 5 6
3 1
1 6 1 6
3 0
5 6 2 1
3 5 3 5
1 1
L Minh Hong
258 Chuyn
Rng buc 2: Tnh i xng lch (Skew symmetry): Vi u, v V, 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 ] .
V gi tr lung, ta c:
f = f [s,v ] = ( [s,v ] - [ v,s ]) = [s,v ] [ v,s ] =
vV vV vV vV
HSPHN 1999-2006
L thuyt th 259
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 ) = c [ u,v]
uX,vY
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,vX
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.
L Minh Hong
260 Chuyn
6:5 5
2 4 2 4
5:5 6:6 5 6
3:1
3 1
1 6 1 2 6
3:0 2 1
5:2 6:1
3 5
3 5 3 5
1:1 1
Hnh 79: Mng G v mng thng d Gf tng ng (k hiu c[u,v]:f[u,v] ch kh nng thng qua c[u, v] v
lung dng tng ng f[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:
HSPHN 1999-2006
L thuyt th 261
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.
6:5 5
2 4 2 4
5:5 6:6 5 6
3:1
3 1
1 6 1 2 6
3:0 2 1
5:2 6:1
3 5
3 5 3 5
1:1 1
L Minh Hong
262 Chuyn
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
Hnh 81: Lung dng trn mng G trc v sau khi tng
f ( X, Y ) = f [ u,v ] .
uX
vY
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)
HSPHN 1999-2006
L thuyt th 263
L Minh Hong
264 Chuyn
10.3.2. Ci t
Ta s ci t thut ton Ford-Fulkerson vi Input v Output nh sau
Input: file vn bn MAXFLOW.INP. Trong :
Dng 1: Cha s nh n ( 1000), s cnh m ca th, nh pht s, nh thu t theo ng
th t cch nhau t nht mt du cch
m dng tip theo, mi dng c dng ba s u, v, c[u, v] cch nhau t nht mt du cch th
hin c cung (u, v) trong mng v kh nng thng qua ca cung l c[u, v] (c[u, v] l s
nguyn dng khng qu 106)
Output: file vn bn MAXFLOW.OUT, ghi lung trn cc cung v gi tr lung cc i tm
c
MAXFLOW.INP MAXFLOW.OUT
6 6816 f[1, 2] = 5
2 4 125 f[1, 3] = 4
5 6
3 135 f[2, 4] = 3
246 f[2, 5] = 2
1 6
253 f[3, 4] = 3
3
6
343 f[3, 5] = 1
5
3 5 351 f[4, 6] = 6
1
466 f[5, 6] = 3
566 Max Flow: 9
Ta s dng mt s bin vi cc ngha nh sau
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
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Finding_the_Maximum_Flow_using_Ford_Fulkerson_Algorithm;
const
InputFile = 'MAXFLOW.INP';
OutputFile = 'MAXFLOW.OUT';
max = 1000;
type
TCapacities = array[1..max, 1..max] of Integer;
var
c: TCapacities;
f: TCapacities;
Trace: array[1..max] of Integer;
n, s, t: Integer;
HSPHN 1999-2006
L thuyt th 265
ReadLn(fi, n, m, s, t);
for i := 1 to m do
ReadLn(fi, u, v, c[u, v]);
Close(fi);
end;
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;
procedure PrintResult;
var
u, v: Integer;
m: Integer;
fo: Text;
begin
Assign(fo, OutputFile); Rewrite(fo);
m := 0;
for u := 1 to n do
L Minh Hong
266 Chuyn
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;
FillChar(f, SizeOf(f), 0);
repeat
if not FindPath then Break;
IncFlow;
until False;
PrintResult;
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.
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-2006
L thuyt th 267
Rng buc 2: Tnh i xng lch (Skew symmetry): preflow trn cung (u, v) v preflow
trn cung (v, u) c cng gi tr tuyt i nhng tri du nhau: f [ u, v ] = f [ v, u ]
L Minh Hong
268 Chuyn
HSPHN 1999-2006
L thuyt th 269
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).
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
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Finding_the_Maximum_Flow_using_Preflow_Push_Algorithm;
const
InputFile = 'MAXFLOW.INP';
OutputFile = 'MAXFLOW.OUT';
L Minh Hong
270 Chuyn
max = 1000;
type
TCapacities = array[1..max, 1..max] of Integer;
var
c: TCapacities;
f: TCapacities;
FlowIn: array[1..max] of Integer;
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-2006
L thuyt th 271
L Minh Hong
272 Chuyn
begin
Enter;
Init;
Preflowpush;
PrintResult;
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
cao nht gim ti trc), Lift-to-front Preflow-push, Cc bn c th tham kho
trong cc ti liu chuyn su v bi ton lung.
10.5. MT S M RNG
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 82),
sau tm lung cc i trn mng v cui cng d b hai nh gi cng nh cc cung gi
mi thm vo.
HSPHN 1999-2006
L thuyt th 273
s1 t1
+ +
+ s2 t2 +
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 83) th bi ton tm lung dng cc i trn mng G c th
gii quyt bng cch tm lung dng cc i trn mng gi ny sau gn lung dng trn
mi cung (u, v) trn mng ban u bng gi tr lung trn cung (uout, vin) trn mng gi.
d
in out
10.5.3. Mng vi rng buc lung thng qua ca cc cung b chn hai pha
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 dng tng thch
(feasible positive flow) trn G hay khng. (Lung dng tng thch trn G l mt lung
dng tha mn: d [ u, v ] [ u, v ] c [ u, v ] -Xem li nh ngha 1 v lung dng trong bi).
L Minh Hong
274 Chuyn
c[u,v]-d[u,v]
s u v t
d[u,v] d[u,v]
t s
Hnh 84: Mng gi ca mng c kh nng thng qua ca cc cung b chn hai pha
phi l lung cc i trn G. Mun ch ra mt lung dng tng thch trn G, trc ht ta
tm lung dng cc i trn G, sau vi mi cung (u, v) ta em lung dng tm c
trn cung ([u, v]) cng thm d[u, v] l c lung dng trn cung (u, v) ca G ([u, v])
tng ng vi lung dng tng thch cn tm: [u, v] := [u, v] + d[u, v] (u, v V).
G trong thut ton nu trn l a th, tuy nhin trong ci t c th, ta c th biu din G
di dng n th bng cch: nu c nhiu cung ni (u, v) th thay bng mt cung (u, v)
duy nht c kh nng thng qua bng tng kh nng thng qua ca cc cung .
10.5.4. Mng c cc kh nng thng qua m
Ta m rng khi nim kh nng thng qua ca cc cung bng cch cho php c nhng kh
nng thng qua l s m. Bi ton t ra l tm lung cc i trn mng cho tho mn tt
c cc rng buc ca lung.
Thut ton cho bi ton ny c th din gii nh sau:
Input: Mng G = (V, E) vi nh pht s, nh thu t, cc kh nng thng qua c(u, v)
Output: Lung cc i trn G t s ti t.
Gii thut: Xut pht t mt lung f bt k trn G, xy dng mng thng d Gf tng ng
vi G. Lu rng cc cung trn Gf s c kh nng thng qua l s dng, tm lung cc
i f trn Gf bng mt thut ton tm lung cc i bt k, khi (f+f) s l lung cc i
cn tm.
Vic chng minh tnh ng n ca thut ton c th thc hin tng t nh trong chng
minh nh l 4 v nh l 9, chng ta coi nh bi tp. Vn kh nht ca thut ton li nm
bc khi to: xut pht t mt lung f bt k....
HSPHN 1999-2006
L thuyt th 275
L Minh Hong
276 Chuyn
1 2 x2 x2
x3 x3
P={1, 3, 5, 2, 4, 6}
3 4 x0 y0
x4 x4
5 6
x5 x5
x6 x6
G
G
HSPHN 1999-2006
L thuyt th 277
L Minh Hong
278 Chuyn
HSPHN 1999-2006
L thuyt th 279
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-2006
L thuyt th 281
1 1
2 2
3 3
X Y
L Minh Hong
282 Chuyn
Bc 3:
Nu bc 2 tm c ng m th m rng b ghp M: Trn ng m, loi b nhng
cnh ghp khi M v thm vo M nhng cnh cha ghp. Sau lp li bc 2.
Nu bc 2 khng tm c ng m th thut ton kt thc
Khi to mt b ghp M;
while C ng m xut pht t x ti mt nh y cha ghp Y do
Dc trn ng m, xo b khi M cc cnh ghp v thm vo M nhng cnh cha ghp;
{Sau thao tc ny, nh x v y tr thnh ghp, s cnh ghp tng ln 1}
Nh v d trn, vi b ghp hai cnh M = {(x[1], y[1]), (x[2], y[2])} v ng m tm c
gm cc cnh:
(x[3], y[2]) M
(y[2], x[2]) M
(x[2], y[1]) M
(y[1], x[1]) M
(x[1], y[3]) M
Vy th ta s loi i cc cnh (y[2], x[2]) v (y[1], x[1]) trong b ghp c v thm vo cc
cnh (x[3], y[2]), (x[2], y[1]), (x[1], y[3]) c b ghp 3 cnh.
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-2006
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 1000) 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]
24
3
32
3
33
42
4 43
4
5
X Y
L Minh Hong
284 Chuyn
procedure Enter;
var
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-2006
L thuyt th 285
repeat x f x f
x := Trace[f];
next := matchX[x]; next next
matchX[x] := f;
matchY[f] := x;
f := next;
until f = 0; start start
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 s v cho thm m cung t s ti tt c nhng nh ca tp X, thm mt
nh t v ni thm n cung t tt c cc nh ca Y ti t. Ta c mt mng vi nh pht s v
nh thu t.
x1 y1
x2 y2
s t
x3 y3
x4 y4
X Y
L Minh Hong
286 Chuyn
HSPHN 1999-2006
L thuyt th 287
L Minh Hong
288 Chuyn
HSPHN 1999-2006
L thuyt th 289
0 0 0 1 0 0 x [1] y [3]
-1 0 1 7 0 0 6 x [ 2] y [ 2]
x [3] y [1]
-1 0 8 9 0 7 8
+1
Hnh 88: Php xoay trng s cnh
L Minh Hong
290 Chuyn
HSPHN 1999-2006
L thuyt th 291
1 1 1 1
2 2 2 2
x* = x1, tm thy ng m
2 1 2 1
x1 x1
Tng cp
3 3 3 3
4 9 4 4 9 4
1 1 1 1
2 2 2 2
x* = x2, tm thy ng m
2 1 2 1
x2 y1 x1 y2
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
x3 y3
Tng cp
3 3 3 3
4 9 4 4 9 4
L Minh Hong
292 Chuyn
1 1 1 1
x = x4, khng thy ng
*
m
2 2 VisitedX = {x3, x4} 2 2
VisitedY = {y3}
2 1= Gi tr xoay = 1 (=c[3,2]) 2 0
Tr trng s nhng cnh
-1 3 3 +1 lin thuc vi {x3,x4} i 1 3 3
Cng trng s nhng cnh
lin thuc vi {y3} ln 1
-1 4 9 4 4 8 4
-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
0 x4y3x3y2x1y1x2y4.
Tng cp
3 3 Xong 3 3
4 6 4 4 6 4
HSPHN 1999-2006
L thuyt th 293
R rng nu tm c hai dy s tho mn trn th ta ch vic thc hin hai thao tc:
Vi mi nh x[i], tr tt c trng s ca nhng cnh lin thuc vi x[i] i Fx[i]
Vi mi nh y[j], tr tt c trng s ca nhng cnh lin thuc vi y[j] i Fy[j]
(Hai thao tc ny tng ng vi vic tr tt c trng s ca cc cnh (x[i], y[j]) i mt
lng Fx[i] + Fy[j] tc l c[i, j] := c[i, j] - Fx[i] - Fy[j])
Th d thy th mi to thnh s gm c cc cnh trng s khng m v nhng 0_cnh ca
th cha trn mt b ghp y .
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
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
begin
FillChar(Trace, SizeOf(Trace), 0);
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-2006
L thuyt th 297
var
i: Integer;
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[.] khi khai bo mng, 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:
HSPHN 1999-2006
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
L Minh Hong
300 Chuyn
HSPHN 1999-2006
L thuyt th 301
begin
FillChar(matchX, SizeOf(matchX), 0);
FillChar(matchY, SizeOf(matchY), 0);
FillChar(Fx, SizeOf(Fx), 0);
FillChar(Fy, SizeOf(Fy), 0);
end;
L Minh Hong
302 Chuyn
HSPHN 1999-2006
L thuyt th 303
end;
begin
Enter;
Init;
Solve;
Result;
end.
L Minh Hong
304 Chuyn
3 4
8 1 2
5 6
9
HSPHN 1999-2006
L thuyt th 305
L Minh Hong
306 Chuyn
Shrink Shrink
Blossom
Blossom
= nh c s ca blossom
Expand Expand
HSPHN 1999-2006
L thuyt th 307
L Minh Hong
308 Chuyn
1 2 1 2
x T:1 x T:1
Tm thy ng m 1, 2, 3, 4
Trng hp 2: v cha thm v ghp
HSPHN 1999-2006
L thuyt th 309
1 2 1 2
x T:1 x 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 u
u
a
1 2 3 1 2 3
x T:1 S:2 x S:2
T:1
6 7 v 6 7 v
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);
HSPHN 1999-2006
L thuyt th 311
{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
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]);
HSPHN 1999-2006
L thuyt th 313
end;
until Front > Rear;
end;
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
HSPHN 1999-2006
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, 3rd edition
Author: Donald E. Knuth
Volume 1: Fundamental Algorithms, ISBN: 0-201-89683-4
Volume 2: Seminumerical Algorithms, ISBN: 0-201-89684-2
Volume 3: Sorting and Searching, ISBN: 0-201-89685-0
Volume 4: Combinatorial Algorithms (in preparation)
Volume 5: Syntactic Algorithms (in preparation)
Publisher: Addison-Wesley, 1998
Title: Introduction to Algorithms, 2nd edition, ISBN: 0262032937
Authors: Thomas H.Cormen, Charles E.Leiserson, Ronald L.Rivest
Publisher: The MIT Press, 2001