Professional Documents
Culture Documents
Le Minh Hoang - Bai Giang Cac Chuyen de PDF
Le Minh Hoang - Bai Giang Cac Chuyen de PDF
MC LC
0. GII THIU...................................................................................................................................... 2
1. NHC LI MT S KIN THC I S T HP....................................................................... 3
I. CHNH HP LP ...........................................................................................................................................3
II. CHNH HP KHNG LP...........................................................................................................................3
III. HON V ......................................................................................................................................................3
IV. T HP.........................................................................................................................................................3
2. PHNG PHP SINH (GENERATE) ............................................................................................ 5
I. SINH CC DY NH PHN DI N.......................................................................................................6
II. LIT K CC TP CON K PHN T........................................................................................................7
III. LIT K CC HON V .............................................................................................................................9
3. THUT TON QUAY LUI ............................................................................................................. 12
I. LIT K CC DY NH PHN DI N...............................................................................................13
II. LIT K CC TP CON K PHN T......................................................................................................14
III. LIT K CC CHNH HP KHNG LP CHP K ..............................................................................15
IV. BI TON PHN TCH S .....................................................................................................................16
V. BI TON XP HU.................................................................................................................................18
4. K THUT NHNH CN.............................................................................................................. 22
I. BI TON TI U......................................................................................................................................22
II. S BNG N T HP...............................................................................................................................22
III. M HNH K THUT NHNH CN.....................................................................................................22
IV. BI TON NGI DU LCH...................................................................................................................23
V. DY ABC ....................................................................................................................................................25
L Minh Hong
Bi ton lit k \ 2[
0. GII THIU
Trong thc t, c mt s bi ton yu cu ch r: trong mt tp cc i tng cho trc c bao
nhiu i tng tho mn nhng iu kin nht nh. Bi ton gi l bi ton m cu hnh t
hp.
Trong lp cc bi ton m, c nhng bi ton cn yu cu ch r nhng cu hnh tm c tho
mn iu kin cho l nhng cu hnh no. Bi ton yu cu a ra danh sch cc cu hnh c th
c gi l bi ton lit k t hp.
gii bi ton lit k, cn phi xc nh c mt thut ton c th theo ln lt xy dng
c tt c cc cu hnh ang quan tm. C nhiu phng php lit k, nhng chng cn phi p
ng c hai yu cu di y:
Khng c lp li mt cu hnh
Khng c b st mt cu hnh
C th ni rng, phng php lit k l phng k cui cng gii c mt s bi ton t hp
hin nay. Kh khn chnh ca phng php ny chnh l s bng n t hp. xy dng 1 t cu
hnh (con s ny khng phi l ln i vi cc bi ton t hp - V d lit k cc cch xp n13
ngi quanh mt bn trn) v gi thit rng mi thao tc xy dng mt khong 1 giy, ta phi mt
qung 31 nm mi gii xong. Tuy nhin cng vi s pht trin ca my tnh in t, bng phng
php lit k, nhiu bi ton t hp tm thy li gii. Qua , ta cng nn bit rng ch nn dng
phng php lit k khi khng cn mt phng php no khc tm ra li gii. Chnh nhng n
lc gii quyt cc bi ton thc t khng dng phng php lit k thc y s pht trin ca
nhiu ngnh ton hc.
Cui cng, nhng tn gi sau y, tuy v ngha khng phi ng nht, nhng trong mt s trng
hp ngi ta c th dng ln ngha ca nhau c. l:
Phng php lit k
Phng php vt cn trn tp phng n
Phng php duyt ton b
L Minh Hong
Bi ton lit k \ 3[
III. 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
rng khi k = n th s phn t ca tp X = {1, 2, .., n} ng bng s phn t ca S. Do tnh cht
i mt khc nhau nn dy f(1), f(2), ..., f(n) s lit k c ht cc phn t trong S. Nh vy f l
ton nh. Mt khc do gi thit f l chnh hp khng lp nn f l n nh. Ta c tng ng 1-1 gia
cc phn t ca X v S, do f l song nh. Vy nn ta c th nh ngha mt hon v ca S l mt
song nh gia {1, 2, ..., n} v S.
S hon v ca tp gm n phn t = s chnh hp khng lp chp n:
Pn = n!
IV. T HP
Mt tp con gm k phn t ca S c gi l mt t hp chp k ca S.
L Minh Hong
Bi ton lit k \ 4[
L Minh Hong
Bi ton lit k \ 5[
Th t t in
Trn cc kiu d liu n gin chun, ngi ta thng ni ti khi nim th t. V d trn kiu s
th c quan h: 1 < 2; 2 < 3; 3 < 10; ..., trn kiu k t Char th cng c quan h 'A' < 'B'; 'C' < 'c'...
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, (ta ngm hiu cc k hiu nh , >,
khi phi nh ngha)
V d nh quan h "" trn cc s nguyn cng nh trn cc kiu v hng, lit k l quan h th t
ton phn.
Trn cc dy hu hn, ngi ta cng xc nh mt quan h th t:
Xt a = (a1, a2, ..., an) v b = (b1, b2, ..., bn); trn cc phn t ca a1, ..., an, b1, ..., bn c quan h
th t "". Khi a b nu nh
Hoc ai = bi vi i: 1 i n.
Hoc tn ti mt s nguyn dng k: 1 k < n :
a1 = b1
a2 = b2
...
ak-1 = bk-1
ak = bk
ak+1 < bk+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
L Minh Hong
Bi ton lit k \ 6[
L Minh Hong
Bi ton lit k \ 7[
var
x: array[1..max] of Integer;
n, i: Integer;
begin
{nh ngha li thit b nhp/xut chun}
Assign(Input, 'BSTR.INP'); Reset(Input);
Assign(Output, 'BSTR.OUT'); Rewrite(Output);
ReadLn(n);
FillChar(x, SizeOf(x), 0); {Cu hnh ban u x1 = x2 = ... = xn := 0}
repeat {Thut ton sinh}
for i := 1 to n do Write(x[i]); {In ra cu hnh hin ti}
WriteLn;
i := n; {xi l phn t cui dy, li dn i cho ti khi gp s 0 hoc khi i = 0 th dng}
while (i > 0) and (x[i] = 1) do Dec(i);
if i > 0 then {Cha gp phi cu hnh 11...1}
begin
x[i] := 1; {Thay xi bng s 1}
FillChar(x[i + 1], (n - i) * SizeOf(x[1]), 0); {t xi + 1 = xi + 2 = ... = xn := 0}
end;
until i = 0; { ht cu hnh}
{ng thit b nhp xut chun, thc ra khng cn v BP s t ng ng Input v Output trc khi thot chng trnh}
Close(Input); Close(Output);
end.
L Minh Hong
Bi ton lit k \ 8[
L Minh Hong
Bi ton lit k \ 9[
L Minh Hong
Bi ton lit k \ 10[
begin
Assign(Input, 'PERMUTE.INP'); Reset(Input);
Assign(Output, 'PERMUTE.OUT'); Rewrite(Output);
ReadLn(n);
for i := 1 to n do x[i] := i; {Khi to cu hnh u: x1 := 1; x2 := 2; ..., xn := n}
repeat
for i := 1 to n do Write(x[i], ' '); {In ra cu hnh hon v hin ti}
WriteLn;
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; {xk l phn t cui dy}
while x[k] < x[i] do Dec(k); {Li dn k tm gp xk u tin ln hn xi }
Swap(x[k], x[i]); {i ch xk v xi}
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]); {i ch xa v xb}
Inc(a); {Tin a v li b, i ch tip 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(Input); Close(Output);
end.
Bi tp:
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 .
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}.
Gi : thay h c s 2 bng h c s n.
3. Hy lit k cc dy nh phn di n m trong cm ch s "01" xut hin ng 2 ln.
Bi tp:
4. Nhp vo mt danh sch n tn ngi. Lit k tt c cc cch chn ra ng k ngi trong s n
ngi .
Gi : xy dng mt nh x t tp {1, 2, ..., n} n tp cc tn ngi. V d xy dng mt mng
Tn: Tn[1] := 'Nguyn vn A'; Tn[2] := 'Trn th B';.... sau lit k tt c cc tp con k phn t
L Minh Hong
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
Bi ton lit k \ 12[
Try(2) Try(2)
L Minh Hong
Bi ton lit k \ 13[
I. LIT K CC DY NH PHN DI N
Input/Output vi khun dng nh trong PROG2_1.PAS
Biu din dy nh phn di N di dng (x1, x2, ..., xn). Ta s lit k cc dy ny bng cch th
dng cc gi tr {0, 1} gn cho xi. Vi mi gi tr th gn cho xi li th cc gi tr c th gn cho
xi+1.Chng trnh lit k bng thut ton quay lui c th vit:
PROG03_1.PAS * Thut ton quay lui lit k cc dy nh phn di n
program BinaryStrings;
const
max = 30;
var
x: array[1..max] of Integer;
n: Integer;
begin
Assign(Input, 'BSTR.INP'); Reset(Input);
Assign(Output, 'BSTR.OUT'); Rewrite(Output);
ReadLn(n); {Nhp d liu}
Try(1); {Th cc cch chn gi tr x1}
Close(Input);
Close(Output);
end.
V d: Khi n = 3, cy tm kim quay lui nh sau:
Try(1)
x1 := 0 x1 := 1
Try(2) Try(2)
x2 := 0 x2 := 1 x2 := 0 x2 := 1
L Minh Hong
Bi ton lit k \ 14[
begin
Assign(Input, 'SUBSET.INP'); Reset(Input);
Assign(Output, 'SUBSET.OUT'); Rewrite(Output);
ReadLn(n, k);
x[0] := 0;
Try(1);
Close(Input); Close(Output);
end.
L Minh Hong
Bi ton lit k \ 15[
L Minh Hong
Bi ton lit k \ 16[
var
i: Integer;
begin
for i := 1 to k do Write(x[i],' ');
WriteLn;
end;
begin
Assign(Input, 'ARRANGES.INP'); Reset(Input);
Assign(Output, 'ARRANGES.OUT'); Rewrite(Output);
ReadLn(n, k);
FillChar(c, SizeOf(c), True); {Tt c cc s u cha b chn}
Try(1); {Th cc cch chn gi tr ca x1}
Close(Input); Close(Output);
end.
Bi ton
Cho mt s nguyn dng n 30, hy tm tt c cc cch phn tch s n thnh tng ca cc s
nguyn dng, cc cch phn tch l hon v ca nhau ch tnh l 1 cch.
Cch lm:
1. Ta s lu nghim trong mng x, ngoi ra c mt mng t. Mng t xy dng nh sau: ti s l tng
cc phn t trong mng x t x1 n xi: ti := x1 + x2 + ... + xi.
2. Khi lit k cc dy x c tng cc phn t ng bng n, trnh s trng lp ta a thm rng
buc xi-1 xi.
3. V s phn t thc s ca mng x l khng c nh nn th tc PrintResult dng in ra 1 cch
phn tch phi c thm tham s cho bit s in ra bao nhiu phn t.
4. Th tc quy Try(i) s th cc gi tr c th nhn ca xi (xi xi - 1)
5. Khi no th in kt qu v khi no th gi quy tm tip ?
Lu rng ti - 1 l tng ca tt c cc phn t t x1 n xi-1 do
Khi ti = n tc l (xi = n - ti - 1) th in kt qu
Khi tm tip, xi+1 s phi ln hn hoc bng xi. Mt khc ti+1 l tng ca cc s t x1 ti xi+1
khng c vt qu n. Vy ta c ti+1 n ti-1 + xi + xi+1 n xi + xi + 1 n - ti - 1 tc l xi
L Minh Hong
Bi ton lit k \ 17[
L Minh Hong
Bi ton lit k \ 18[
t[i] := t[i - 1] + j;
Try(i + 1);
end;
x[i] := n - T[i - 1]; {Nu xi l phn t cui th n bt buc phi l ... v in kt qu}
PrintResult(i);
end;
begin
Assign(Input, 'ANALYSE.INP'); Reset(Input);
Assign(Output, 'ANALYSE.OUT'); Rewrite(Output);
Init;
Try(1);
Close(Input);
Close(Output);
end.
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
Bi ton lit k \ 19[
1 2 3 4 5 6 7 8
2
N
3
W E 4
5
S
6
L Minh Hong
Bi ton lit k \ 20[
QUEENS.INP QUEENS.OUT
5 (1, 1); (2, 3); (3, 5); (4, 2); (5, 4);
(1, 1); (2, 4); (3, 2); (4, 5); (5, 3);
(1, 2); (2, 4); (3, 1); (4, 3); (5, 5);
(1, 2); (2, 5); (3, 3); (4, 1); (5, 4);
(1, 3); (2, 1); (3, 4); (4, 2); (5, 5);
(1, 3); (2, 5); (3, 2); (4, 4); (5, 1);
(1, 4); (2, 1); (3, 3); (4, 5); (5, 2);
(1, 4); (2, 2); (3, 5); (4, 3); (5, 1);
(1, 5); (2, 2); (3, 4); (4, 1); (5, 3);
(1, 5); (2, 3); (3, 1); (4, 4); (5, 2);
procedure Init;
begin
ReadLn(n);
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('(', i, ', ', x[i], '); ');
WriteLn;
end;
begin
Assign(Input, 'QUEENS.INP'); Reset(Input);
Assign(Output, 'QUEENS.OUT'); Rewrite(Output);
Init;
L Minh Hong
Bi ton lit k \ 21[
Try(1);
Close(Input); Close(Output);
end.
Bi tp:
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
2. Vit chng trnh lit k cc chnh hp lp chp k ca n phn t
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.
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}
5. Lit k tt c cc tp con ca tp S gm n s nguyn {S1, S2, ..., Sn} nhp vo t bn phm
6. Tng t nh bi 5 nhng ch lit k cc tp con c max - min T (T cho trc).
7. Mt dy (x1, x2, ..., xn) gi l mt hon v hon ton ca tp {1, 2,..., n} nu n l mt hon v v
tho mn xi i vi i: 1 i n. Hy vit chng trnh lit k tt c cc hon v hon ton ca tp
trn (n vo t bn phm).
8. Sa li th tc in kt qu (PrintResult) trong bi xp hu c th v hnh bn c v cc cch t
hu ra mn hnh.
9. Bi ton m i tun: Cho bn c tng qut kch thc nxn v mt qun M, hy ch ra mt hnh
trnh ca qun M xut pht t ang ng i qua tt c cc cn li ca bn c, mi ng 1 ln.
10. Chuyn tt c cc bi tp trong bi trc ang vit bng sinh tun t sang quay lui.
11. Xt s giao thng gm n nt giao thng nh s t 1 ti n v m on ng ni chng, mi
on ng ni 2 nt giao thng. Hy nhp d liu v mng li giao thng , nhp s hiu hai
nt giao thng s v d. Hy in ra tt c cc cch i t s ti d m mi cch i khng c qua nt giao
thng no qu mt ln.
L Minh Hong
Bi ton lit k \ 22[
4. K THUT NHNH CN
I. 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.
II. 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 xi s ng vi ch 2 nt tng ng vi 2 gi tr m xi+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 xi 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 xi+1, xi+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.
III. M HNH K THUT NHNH CN
Da trn m hnh thut ton quay lui, ta xy dng m hnh sau:
procedure Init;
begin
<Khi to mt cu hnh bt k BESTCONFIG>;
end;
begin
Init;
Try(1);
<Thng bo cu hnh ti u BESTCONFIG>
end.
L Minh Hong
Bi ton lit k \ 23[
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 xi 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
IV. BI TON NGI DU LCH
Bi ton
Cho n thnh ph nh s t 1 n n v m tuyn ng giao thng hai chiu gia chng, mng li
giao thng ny c cho bi bng C cp nxn, y Cij = Cji = Chi ph i on ng trc tip t
thnh ph i n thnh ph j. Gi thit rng Cii = 0 vi i, Cij = + nu khng c ng trc tip t
thnh ph i n thnh ph j.
Mt ngi du lch xut pht t thnh ph 1, mun i thm tt c cc thnh ph cn li mi thnh
ph ng 1 ln v cui cng quay li thnh ph 1. Hy ch ra cho ngi hnh trnh vi chi ph t
nht. Bi ton gi l bi ton ngi du lch hay bi ton hnh trnh ca mt thng gia
(Traveling Salesman)
Cch gii
1) Hnh trnh cn tm c dng (x1 = 1, x2, ..., xn, xn+1 = 1) y gia xi v xi+1: hai thnh ph lin
tip trong hnh trnh phi c ng i trc tip (Cij +) v ngoi tr thnh ph 1, khng thnh
ph no c lp li hai ln. C ngha l dy (x1, x2, ..., xn) lp thnh 1 hon v ca (1, 2, ..., n).
2) Duyt quay lui: x2 c th chn mt trong cc thnh ph m x1 c ng i ti (trc tip), vi
mi cch th chn x2 nh vy th x3 c th chn mt trong cc thnh ph m x2 c ng i ti
(ngoi x1). Tng qut: xi c th chn 1 trong cc thnh ph cha i qua m t xi-1 c ng i
trc tip ti.(1 i n)
3) Nhnh cn: Khi to cu hnh BestConfig c chi ph = +. Vi mi bc th chn xi xem chi
ph ng i cho ti lc c < Chi ph ca cu hnh BestConfig?, nu khng nh hn th th
gi tr khc ngay bi c i tip cng ch tn thm. Khi th c mt gi tr xn ta kim tra xem xn
c ng i trc tip v 1 khng ? Nu c nh gi chi ph i t thnh ph 1 n thnh ph xn
cng vi chi ph t xn i trc tip v 1, nu nh hn chi ph ca ng i BestConfig th cp
nht li BestConfig bng cch i mi.
4) Sau th tc tm kim quay lui m chi ph ca BestConfig vn bng + th c ngha l n khng
tm thy mt hnh trnh no tho mn iu kin bi cp nht BestConfig, bi ton khng
c li gii, cn nu chi ph ca BestConfig < + th in ra cu hnh BestConfig - l hnh trnh
t tn km nht tm c
Input: file vn bn TOURISM.INP
Dng 1: Cha s thnh ph n (1 n 20) v s tuyn ng m trong mng li giao thng
m dng tip theo, mi dng ghi s hiu hai thnh ph c ng i trc tip v chi ph i trn
qung ng (chi ph ny l s nguyn dng 100)
Output: file vn bn TOURISM.OUT
Ghi hnh trnh tm c.
L Minh Hong
Bi ton lit k \ 24[
TOURISM.INP TOURISM.OUT
4 6 1->3->2->4->1
1 2 3 Cost: 6
3 1 3 2
2 1 2
1 4 1
2 3 1
2 2 4 2
1 1 3 4 4
4 3
4
procedure Enter;
var
i, j, k: Integer;
begin
ReadLn(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(i, j, C[i, j]);
C[j, i] := C[i, j]; {Chi ph nh nhau trn 2 chiu}
end;
end;
L Minh Hong
Bi ton lit k \ 25[
procedure PrintResult;
var
i: Integer;
begin
if MinSpending = maxC then WriteLn('NO SOLUTION')
else
for i := 1 to n do Write(BestWay[i], '->');
WriteLn(1);
WriteLn('Cost: ', MinSpending);
end;
begin
Assign(Input, 'TOURISM.INP'); Reset(Input);
Assign(Output, 'TOURISM.OUT'); Rewrite(Output);
Enter;
Init;
Try(2);
PrintResult;
Close(Input); Close(Output);
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 .
V. DY ABC
Cho trc mt s nguyn dng N (N 100), hy tm mt xu ch gm cc k t A, B, C tho mn
3 iu kin:
C di N
Hai on con bt k lin nhau u khc nhau (on con l mt dy k t lin tip ca xu)
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 X1X2...Xn 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 Xi, nu ta c Ti k t "C" trong on chn t X1 n Xi, 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 Xi nh th ny th s k t "C" trong dy kt qu (khi
chn n Xn) cho d c lm tt n u cng Ti + (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.
L Minh Hong
Bi ton lit k \ 26[
PROG04_2.PAS * Dy ABC
program ABC_STRING;
const
max = 100;
var
N, MinC: Integer;
X, Best: array[1..max] of 'A'..'C';
T: array[0..max] of Integer; {Ti cho bit s k t "C" trong on t X1 n Xi}
{Hm Check(i) cho bit Xi c lm hng tnh khng lp ca dy X1X2 ... Xi hay khng}
function Check(i: Integer): Boolean;
var
l: Integer;
begin
for l := 1 to i div 2 do{Th cc di l}
if Same(i, l) then{Nu c xu di l kt thc bi Xi b trng vi xu lin trc}
begin
Check := False; Exit;
end;
Check := True;
end;
L Minh Hong
Bi ton lit k \ 27[
procedure PrintResult;
var
i: Integer;
begin
for i := 1 to N do Write(Best[i]);
WriteLn;
WriteLn('"C" Letter Count : ', MinC);
end;
begin
Assign(Input, 'ABC.INP'); Reset(Input);
Assign(Output, 'ABC.OUT'); Rewrite(Output);
ReadLn(N);
T[0] := 0;
MinC := N; {Khi to cu hnh BestConfig ban u ht sc ti}
Try(1);
PrintResult;
Close(Input); Close(Output);
end.
Nu ta thay bi ton l tm xu t k t 'B' nht m vn vit chng trnh tng t nh trn th
chng trnh s chy chm hn cht t. L do: th tc Try trn s th ln lt cc gi tr 'A', 'B',
ri mi n 'C'. C ngha ngay trong cch tm, n tit kim s dng k t 'C' nht nn trong phn
ln cc b d liu n nhanh chng tm ra li gii hn so vi bi ton tng ng tm xu t k t 'B'
nht. Chnh v vy m nu nh bi yu cu t k t 'B' nht ta c lp chng trnh lm yu cu t
k t 'C' nht, ch c iu khi in kt qu, ta i vai tr 'B', 'C' cho nhau. y l mt v d cho thy
sc mnh ca thut ton quay lui khi kt hp vi k thut nhnh cn, nu vit quay lui thun tu
hoc nh gi nhnh cn khng tt th vi N = 100, ti cng khng kin nhn i chng
trnh cho kt qu (ch bit rng > 3 gi). Trong khi khi N = 100, vi chng trnh trn ch chy
ht hn 3 giy cho kt qu l xu 27 k t 'C'.
Ni chung, t khi ta gp bi ton m ch cn s dng mt thut ton, mt m hnh k thut ci t l
c th gii c. Thng thng cc bi ton thc t i hi phi c s tng hp, pha trn nhiu
thut ton, nhiu k thut mi c c mt li gii tt. Khng c lm dng mt k thut no v
cng khng xem thng mt phng php no khi bt tay vo gii mt bi ton tin hc. Thut ton
quay lui cng khng phi l ngoi l, ta phi bit phi hp mt cch uyn chuyn vi cc thut ton
khc th khi n mi thc s l mt cng c mnh.
Bi tp:
1. Mt dy du ngoc hp l l mt dy cc k t "(" v ")" c nh ngha nh sau:
i. Dy rng l mt dy du ngoc hp l su 0
ii. Nu A l dy du ngoc hp l su k th (A) l dy du ngoc hp l su k + 1
iii. Nu A v B l hay dy du ngoc hp l vi su ln lt l p v q th AB l dy du ngoc
hp l su l max(p, q)
di ca mt dy ngoc l tng s k t "(" v ")"
V d: C 5 dy du ngoc hp l di 8 v su 3:
1. ((()()))
2. ((())())
L Minh Hong
Bi ton lit k \ 28[
3. ((()))()
4. (()(()))
5. ()((()))
Bi ton t ra l khi cho bit trc hai s nguyn dng n v k. Hy lit k ht cc dy ngoc
hp l c di l n v su l k (lm c vi n cng ln cng tt).
2. Cho mt bi mn kch thc mxn vung, trn mt c th c cha mt qu mn hoc khng,
biu din bn mn , ngi ta c hai cch:
Cch 1: dng bn nh du: s dng mt li vung kch thc mxn, trn ti (i, j) ghi
s 1 nu c mn, ghi s 0 nu khng c mn
Cch 2: dng bn mt : s dng mt li vung kch thc mxn, trn ti (i, j) ghi
mt s trong khong t 0 n 8 cho bit tng s mn trong cc ln cn vi (i, j) ( ln cn
vi (i, j) l c chung vi (i, j) t nht 1 nh).
Gi thit rng hai bn c ghi chnh xc theo tnh trng mn trn hin trng.
V d: Bn nh du v bn mt tng ng: (m = n = 10)
1 0 1 0 1 0 1 0 0 0 1 3 1 2 1 3 1 2 2 2
0 1 0 0 0 1 0 0 1 1 2 3 3 4 3 3 2 2 2 2
0 0 1 0 1 0 0 0 0 1 2 4 4 5 3 3 2 3 5 3
0 1 1 1 1 0 0 1 1 0 2 4 6 6 3 2 2 2 4 3
0 1 1 1 0 0 0 1 0 1 2 3 6 5 5 2 4 3 5 1
0 0 0 1 0 1 0 1 0 0 3 5 6 3 4 2 5 3 5 3
1 1 1 0 0 1 1 0 1 1 2 3 3 3 5 3 5 4 4 2
1 0 0 1 0 1 0 1 0 1 2 5 4 3 5 5 7 5 6 3
0 0 1 0 1 1 1 1 1 0 2 3 1 3 4 4 5 3 3 2
1 0 0 0 0 1 0 0 0 0 0 2 1 2 3 3 4 3 2 1
L Minh Hong
Cu trc d liu v gii thut \1[
MC LC
L Minh Hong
Cu trc d liu v gii thut \2[
L Minh Hong
Cu trc d liu v gii thut \3[
L Minh Hong
Cu trc d liu v gii thut \4[
L Minh Hong
Cu trc d liu v gii thut \5[
begin
Input: a, b
No
b>0? Output a;
Yes
r := a mod b;
a := b;
b := r;
end
L Minh Hong
Cu trc d liu v gii thut \6[
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.
V. KIM TH
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.
Li thut ton: Li ny t gp nht nhng nguy him nht, nu nh th phi iu chnh li thut
ton, nu nng th c khi phi loi b hon ton thut ton sai v lm li t u.
2. Xy dng cc b test
C nhiu chng trnh rt kh kim tra tnh ng n. Nht l khi ta khng bit kt qu ng l th
no?. V vy nu nh chng trnh vn chy ra kt qu (khng bit ng sai th no) th vic tm li
rt kh khn. Khi ta nn lm cc b test th chng trnh ca mnh.
Cc b test nn t trong cc file vn bn, bi vic to mt file vn bn rt nhanh v mi ln chy
th ch cn thay tn file d liu vo l xong, khng cn g li b test t bn phm. Kinh nghim lm
cc b test l:
Bt u vi mt b test nh, n gin, lm bng tay cng c c p s so snh vi kt qu
chng trnh chy ra.
Tip theo vn l cc b test nh, nhng cha cc gi tr c bit hoc tm thng. Kinh nghim
cho thy y l nhng test d sai nht.
Cc b test phi a dng, trnh s lp i lp li cc b test tng t.
C mt vi test ln ch kim tra tnh chu ng ca chng trnh m thi. Kt qu c ng
hay khng th trong a s trng hp, ta khng th kim chng c vi test ny.
Lu rng chng trnh chy qua c ht cc test khng c ngha l chng trnh ng. Bi
c th ta cha xy dng c b test lm cho chng trnh chy sai. V vy nu c th, ta nn tm
cch chng minh tnh ng n ca thut ton v chng trnh, iu ny thng rt kh.
VI. TI U CHNG TRNH
Mt chng trnh chy ng khng c ngha l vic lp trnh xong, ta phi sa i li mt vi
chi tit chng trnh c th chy nhanh hn, hiu qu hn. Thng thng, trc khi kim th th
ta nn t mc tiu vit chng trnh sao cho n gin, min sao chy ra kt qu ng l c,
sau khi ti u chng trnh, ta xem li nhng ch no vit cha tt th ti u li m lnh
chng trnh ngn hn, chy nhanh hn. Khng nn vit ti u ti u m n , bi chng trnh
c m lnh ti u thng phc tp v kh kim sot.
Ta nn ti u chng trnh theo cc tiu chun sau:
L Minh Hong
Cu trc d liu v gii thut \7[
1. Tnh tin cy
Chng trnh phi chy ng nh d nh, m t ng mt gii thut ng. Thng thng khi vit
chng trnh, ta lun c thi quen kim tra tnh ng n ca cc bc mi khi c th.
2. Tnh uyn chuyn
Chng trnh phi d sa i. Bi t c chng trnh no vit ra hon ho ngay c m vn cn
phi sa i li. Chng trnh vit d sa i s lm gim bt cng sc ca lp trnh vin khi pht
trin chng trnh.
3. Tnh trong sng
Chng trnh vit ra phi d c d hiu, sau mt thi gian di, khi c li cn hiu mnh lm ci
g?. nu c iu kin th cn c th sa sai (nu pht hin li mi), ci tin hay bin i c
chng trnh gii quyt bi ton khc. Tnh trong sng ca chng trnh ph thuc rt nhiu vo
cng c lp trnh v phong cch lp trnh.
4. Tnh hu hiu
Chng trnh phi chy nhanh v t tn b nh, tc l tit kim c c v khng gian v thi gian.
c mt chng trnh hu hiu, cn phi c gii thut tt v nhng tiu xo khi lp trnh. Tuy
nhin, vic p dng qu nhiu tiu xo c th khin chng trnh tr nn ri rm, kh hiu khi sa
i. Tiu chun hu hiu nn dng li mc chp nhn c, khng quan trng bng ba tiu chun
trn. Bi phn cng pht trin rt nhanh, yu cu hu hiu khng cn phi t ra qu nng.
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
Cu trc d liu v gii thut \8[
L Minh Hong
Cu trc d liu v gii thut \9[
2. Quy tc nhn
Nu on chng trnh P c thi gian thc hin l T(n) = O(f(n)). Khi , nu thc hin k(n) ln
on chng trnh P vi k(n) = O(g(n)) th phc tp tnh ton s l O(g(n).f(n))
Chng minh:
Thi gian thc hin k(n) ln on chng trnh P s l k(n)T(n). Theo nh ngha:
ck 0 v nk k(n) ck(g(n)) vi n nk
cT 0 v nT T(n) cT(f(n)) vi n nT
Vy vi n max(nT, nk) ta c k(n).T(n) cT.ck(g(n).f(n))
3. Mt s tnh cht
Theo nh ngha v phc tp tnh ton ta c mt s tnh cht:
a) Vi P(n) l mt a thc bc k th O(P(n)) = O(nk). V th, mt thut ton c phc tp cp a
thc, ngi ta thng k hiu l O(nk)
b) Vi a v b l hai c s tu v f(n) l mt hm dng th logaf(n) = logab.logbf(n). Tc l:
O(logaf(n)) = O(logbf(n)). Vy vi mt thut ton c phc tp cp logarit ca f(n), ngi ta k
hiu l O(logf(n)) m khng cn ghi c s ca logarit.
c) 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 O(1).
d) Mt gii thut c cp l cc hm nh 2n, n!, nn c gi l mt gii thut c phc tp hm m.
Nhng gii thut nh vy trn thc t thng c tc rt chm. Cc gii thut c cp l cc hm
a thc hoc nh hn hm a thc th thng chp nhn c.
e) Khng phi lc no mt gii thut cp O(n2) cng tt hn gii thut cp O(n3). Bi nu nh gii
thut cp O(n2) c thi gian thc hin l 1000n2, cn gii thut cp O(n3) li ch cn thi gian thc
hin l n3, th vi n < 1000, r rng gii thut O(n3) tt hn gii thut O(n2). Trn y l xt trn
phng din tnh ton l thuyt nh ngha gii thut ny "tt" hn gii thut kia, khi chn mt
thut ton gii mt bi ton thc t phi c mt s mm do nht nh.
f) Cng theo nh ngha v phc tp tnh ton
Mt thut ton c cp O(1) cng c th vit l O(logn)
Mt thut ton c cp O(logn) cng c th vit l O(n)
Mt thut ton c cp O(n) cng c th vit l O(n.logn)
Mt thut ton c cp O(n.logn) cng c th vit l O(n2)
Mt thut ton c cp O(n2) cng c th vit l O(n3)
Mt thut ton c cp O(n3) cng c th vit l O(2n)
Vy phc tp tnh ton ca mt thut ton c nhiu cch k hiu, thng thng ngi ta chn
cp thp nht c th, tc l chn k php O(f(n)) vi f(n) l mt hm tng chm nht theo n.
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.
log2n n nlog2n 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
4 16 64 256 4096 65536
5 32 160 1024 32768 2147483648
V d:
Thut ton tnh tng cc s t 1 ti n:
L Minh Hong
Cu trc d liu v gii thut \ 10 [
{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
Cu trc d liu v gii thut \ 11 [
vic xc nh phc tp tnh ton trong trng hp trung bnh (bi vic xc nh T(n) trung bnh
thng phi dng ti nhng cng c ton phc tp), ngi ta thng ch nh gi phc tp tnh
ton trong trng hp xu nht.
VI. CHI PH THC HIN THUT TON
Khi nim phc tp tnh ton t ra l nh gi chi ph thc hin mt gii thut v mt thi
gian. Nhng chi ph thc hin gii thut cn c rt nhiu yu t khc na: khng gian b nh phi
s dng l mt v d. Tuy nhin, trn phng din phn tch l thuyt, ta ch c th xt ti vn
thi gian bi vic xc nh cc chi ph khc nhiu khi rt m h v phc tp. i vi ngi lp
trnh th khc, mt thut ton vi phc tp d rt thp cng s l v dng nu nh khng th ci
t c trn my tnh, chnh v vy khi bt tay ci t mt thut ton, ta phi bit cch t chc d
liu mt cch khoa hc, trnh lng ph b nh khng cn thit. C mt quy lut tng i khi t
chc d liu: Tit kim c b nh th thi gian thc hin thng s chm hn v ngc li. Bit
cn i, dung ho hai yu t l mt k nng cn thit ca ngi lp trnh, m k nng li ch
t kinh nghim mi c ch khng th hc c qua sch v.
Bi tp
1. Chng minh mt cch cht ch: Ti sao vi P(n) l a thc bc k th mt gii thut cp O(P(n))
cng c th coi cp l cp O(nk)
2. Xc nh phc tp tnh ton ca nhng gii thut sau bng k php ch O ln:
a) on chng trnh tnh tng n s nhp t bn phm
Sum := 0;
for i := 1 to n do
begin
Write('Nhp s th ', i, ': '); ReadLn(x);
Sum := Sum + x;
end;
b) on chng trnh tnh tng hai a thc:
P(X) = amxm + am-1xm-1 + ... + a1x + a0 v Q(X) = bnxn + an-1xn-1 + ... + b1x + b0
c a thc
R(X) = cpxp + cp-1xp-1 + ... + c1x + c0
if m < n then p := m else p := n; {p = min(m, n)}
for i := 0 to p do c[i] := a[i] + b[i];
if p < m then
for i := p + 1 to m do c[i] := a[i]
else
for i := p + 1 to n do c[i] := b[i];
while (p > 0) and (c[p] = 0) do p := p - 1;
b) on chng trnh tnh tch hai a thc:
P(X) = amxm + am-1xm-1 + ... + a1x + a0 v Q(X) = bnxn + an-1xn-1 + ... + b1x + b0
c a thc
R(X) = cpxp + cp-1xp-1 + ... + c1x + c0
p := m + n;
for i := 0 to p do c[i] := 0;
for i := 0 to m do
for j := 0 to n do
c[i + j] := c[i + j] + a[i] * b[j];
L Minh Hong
Cu trc d liu v gii thut \ 12 [
L Minh Hong
Cu trc d liu v gii thut \ 13 [
L Minh Hong
Cu trc d liu v gii thut \ 14 [
D thy rng li gii ca bi ton gn nh th t ngc ca php bin i Collatz: biu din s
X > 1 bng mt biu thc bt u bng s 1 v hai php ton "* 2", "div 3". Ta chia hai trng hp:
Nu X chn, th ta tm cch biu din s X div 2 v vit thm php ton * 2 vo cui
Nu X l, th ta tm cch biu din s X * 3 + 1 v vit thm php ton div 3 vo cui
procedure Solve(X: Integer); {In ra cch biu din s X}
begin
if X = 1 then Write(X) {Phn neo}
else {Phn quy}
if X mod 2 = 0 then {X chn}
begin
Solve(X div 2); {Tm cch biu din s X div 2}
Write(' * 2'); {Sau vit thm php ton * 2}
end
else {X l}
begin
Solve(X * 3 + 1); {Tm cch biu din s X * 3 + 1}
Write(' div 3'); {Sau vit thm php ton div 3}
end;
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
Cu trc d liu v gii thut \ 15 [
4. Bi ton Thp H Ni
y l mt bi ton mang tnh cht mt tr chi, ni dung nh sau: C n a ng knh hon ton
phn bit, t chng ln nhau, cc a c xp theo th t gim dn ca ng knh tnh t di
ln, a to nht c t st t. C ba v tr c th t cc a nh s 1, 2, 3. Chng a ban u
c t v tr 1:
1 2 3
Hnh 2: Thp H Ni
Ngi ta mun chuyn c chng a t v tr 1 sang v tr 2, theo nhng iu kin:
Khi di chuyn mt a, phi t n vo mt trong ba v tr cho
Mi ln ch c th chuyn mt a v phi l a trn cng
Ti mt v tr, a no mi chuyn n s phi t ln trn cng
a ln hn khng bao gi c php t ln trn a nh hn (hay ni cch khc: mt a ch
c t trn mt t hoc t trn mt a ln hn)
Trong trng hp c 2 a, cch lm c th m t nh sau:
Chuyn a nh sang v tr 3, a ln sang v tr 2 ri chuyn a nh t v tr 3 sang v tr 2.
Nhng ngi mi bt u c th gii quyt bi ton mt cch d dng khi s a l t, nhng h s
gp rt nhiu kh khn khi s cc a nhiu hn. Tuy nhin, vi t duy quy np ton hc v mt
my tnh th cng vic tr nn kh d dng:
C n a.
Nu n = 1 th ta chuyn a duy nht t v tr 1 sang v tr 2 l xong.
Gi s rng ta c phng php chuyn c n - 1 a t v tr 1 sang v tr 2, th cch chuyn n -
1 a t v tr x sang v tr y (1 x, y 3) cng tng t.
Gi s rng ta c phng php chuyn c n - 1 a gia hai v tr bt k. chuyn n a t
v tr x sang v tr y, ta gi v tr cn li l z (=6 - x - y). Coi a to nht l ... mt t, chuyn n -
1 a cn li t v tr x sang v tr z, sau chuyn a to nht sang v tr y v cui cng li
coi a to nht l mt t, chuyn n - 1 a cn li ang v tr z sang v tr y chng ln a to
nht .
Cch lm c th hin trong th tc quy di y:
procedure Move(n, x, y: Integer); {Th tc chuyn n a t v tr x sang v tr y}
begin
if n = 1 then WriteLn('Chuyn 1 a t ', x, ' sang ', y)
else { chuyn n > 1 a t v tr x sang v tr y, ta chia lm 3 cng on}
begin
Move(n - 1, x, 6 - x - y); {Chuyn n - 1 a t x sang v tr cn li}
Move(1, x, y); {Chuyn a to nht t x sang y}
Move(n - 1, 6 - x - y, y); {Chuyn n - 1 a t v tr cn li sang v tr y}
end;
end;
Chng trnh chnh rt n gin, ch gm c 2 vic: Nhp vo s n v gi Move(n, 1, 2).
IV. HIU LC CA QUY
Qua cc v d trn, ta c th thy quy l mt cng c mnh gii cc bi ton. C nhng bi
ton m bn cnh gii thut quy vn c nhng gii thut lp kh n gin v hu hiu. Chng
L Minh Hong
Cu trc d liu v gii thut \ 16 [
hn bi ton tnh giai tha hay tnh s Fibonacci. Tuy vy, quy vn c vai tr xng ng ca n,
c nhiu bi ton m vic thit k gii thut quy n gin hn nhiu so vi li gii lp v trong
mt s trng hp chng trnh quy hot ng nhanh hn chng trnh vit khng c quy.
Gii thut cho bi Thp H Ni v thut ton sp xp kiu phn on (Quick Sort) m ta s ni ti
trong cc bi sau l nhng v d.
C mt mi quan h khng kht gia quy v quy np ton hc. Cch gii quy cho mt bi ton
da trn vic nh r li gii cho trng hp suy bin (neo) ri thit k lm sao li gii ca bi
ton c suy ra t li gii ca bi ton nh hn cng loi nh th. Tng t nh vy, quy np ton
hc chng minh mt tnh cht no ng vi s t nhin cng bng cch chng minh tnh cht
ng vi mt s trng hp c s (thng ngi ta chng minh n ng vi 0 hay ng vi 1) v
sau chng minh tnh cht s ng vi n bt k nu n ng vi mi s t nhin nh hn n.
Do ta khng ly lm ngc nhin khi thy quy np ton hc c dng chng minh cc tnh
cht c lin quan ti gii thut quy. Chng hn: Chng minh s php chuyn a gii bi ton
Thp H Ni vi n a l 2n-1:
R rng l tnh cht ny ng vi n = 1, bi ta cn 21 - 1 = 1 ln chuyn a thc hin yu
cu
Vi n > 1; Gi s rng chuyn n - 1 a gia hai v tr ta cn 2n-1 - 1 php chuyn a, khi
chuyn n a t v tr x sang v tr y, nhn vo gii thut quy ta c th thy rng trong
trng hp ny n cn (2n-1 - 1) + 1 + (2n-1 - 1) = 2n - 1 php chuyn a. Tnh cht c chng
minh ng vi n
Vy th cng thc ny s ng vi mi n.
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
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.
2. Vit mt hm quy tnh C kn theo cng thc truy hi sau:
C 0n = C nn = 1
Vi 0 < k < n: C kn = C kn11 + C kn1
n!
Chng minh rng hm cho ra ng gi tr C kn = .
k!(n k)!
3. Nu r cc bc thc hin ca gii thut cho bi Thp H Ni trong trng hp n = 3.
L Minh Hong
Cu trc d liu v gii thut \ 17 [
L Minh Hong
Cu trc d liu v gii thut \ 18 [
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
Value 1 Value 2 ... Value n-1 Value n
...
Head
... ...
Head q p
... ...
Head q p
... ...
Head q p
... ...
Head q p
L Minh Hong
Cu trc d liu v gii thut \ 19 [
...
Vic chn / xo vo danh sch ni kp cng n gin ch l k thut chnh li cc mi lin kt gia
cc nt cho hp l, ta coi nh bi tp.
4. Ci t bng danh sch ni vng mt hng
Trong danh sch ni n, phn t cui cng trong danh sch c trng lin kt c gn mt gi tr
c bit (thng s dng nht l gi tr nil). Nu ta cho trng lin kt ca phn t cui cng tr
thng v phn t u tin ca danh sch th ta s c mt kiu danh sch mi gi l danh sch ni
vng mt hng.
A ... G H I ... Z
... ...
Head q p
L Minh Hong
Cu trc d liu v gii thut \ 20 [
Value 1 Value n
...
...
Bi tp
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.
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
a) Nhp vo 2 s n v S t bn phm
b) Cho bit nu ngi th nht l ngi m 1 th ngi cn li cui cng trong vng trn l ngi
th my
c) Cho bit nu ngi cn li cui cng trong vng trn l ngi th k th ngi m 1 l ngi
no?.
d) 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
Cu trc d liu v gii thut \ 21 [
4. NGN XP V HNG I
I. NGN XP (STACK)
Ngn xp l mt kiu danh sch c trang b hai php ton b sung mt phn t vo cui danh
sch v loi b mt phn t cng cui danh sch.
C th hnh dung ngn xp nh hnh nh mt chng a, a no c t vo chng sau cng s
nm trn tt c cc a khc v s c ly ra u tin. V nguyn tc"vo sau ra trc" , Stack
cn c tn gi l danh sch kiu LIFO (Last In First Out) v v tr cui danh sch c gi l nh
(Top) ca Stack.
1. M t Stack bng mng
Khi m t Stack bng mng:
Vic b sung mt phn t vo Stack tng ng vi vic thm mt phn t vo cui mng.
Vic loi b mt phn t khi Stack tng ng vi vic loi b mt phn t cui mng.
Stack b trn khi b sung vo mng y
Stack l rng khi s phn t thc s ang cha trong mng = 0.
program StackByArray;
const
max = 10000;
var
Stack: array[1..max] of Integer;
Last: Integer;
begin
StackInit;
<Test>;
end.
Khi ci t bng mng, tuy cc thao tc i vi Stack vit ht sc n gin nhng y ta vn chia
thnh cc chng trnh con, mi chng trnh con m t mt thao tc, t v sau, ta ch cn
bit rng chng trnh ca ta c mt cu trc Stack, cn ta m phng c th nh th no th khng
L Minh Hong
Cu trc d liu v gii thut \ 22 [
...
Last
program StackByLinkedList;
type
PNode = ^TNode; {Con tr ti mt nt ca danh sch}
TNode = record {Cu trc mt nt ca danh sch}
Value: Integer;
Link: PNode;
end;
var
Last: PNode; {Con tr nh Stack}
begin
StackInit;
<Test>
end.
L Minh Hong
Cu trc d liu v gii thut \ 23 [
begin
QueueInit;
<Test>
end.
Xem li chng trnh ci t Stack bng mt mng kch thc ti a 10000 phn t, ta thy rng
nu nh ta lm 6000 ln Push ri 6000 ln Pop ri li 6000 ln Push th vn khng c vn g xy
ra. L do l v ch s Last lu nh ca Stack s c tng ln 6000 ri li gim n 0 ri li tng
L Minh Hong
Cu trc d liu v gii thut \ 24 [
Last
...
First
Lu l trong thao tc Push v Pop phi kim tra Queue trn hay Queue cn nn phi cp nht
li bin n. (Thc ra y dng thm bin n cho d hiu ch trn thc t ch cn hai bin First v
Last l ta c th kim tra c Queue trn hay cn ri)
program QueueByCList;
const
max = 10000;
var
Queue: array[1..max] of Integer;
i, n, First, Last: Integer;
begin
L Minh Hong
Cu trc d liu v gii thut \ 25 [
QueueInit;
<Test>
end.
2. 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.
V1 V2 ... Vn-1 Vn
...
First Last
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
First, Last: PNode; {Hai con tr ti nt u v nt cui ca danh sch}
begin
QueueInit;
<Test>
end.
Bi tp
1. Vit chng trnh m t cch i c s t h thp phn sang h c s R dng ngn xp
2. Tm hiu c ch xp chng ca th tc quy, phng php dng ngn xp kh quy.
3. C cu ng tu ti mt ga xe la nh sau:
L Minh Hong
Cu trc d liu v gii thut \ 26 [
1 2 ... n
C A
L Minh Hong
Cu trc d liu v gii thut \ 27 [
5. CY (TREE)
I. 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:
1. Mi nt l mt cy, nt cng l gc ca cy y
2. 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.
3. tin, ngi ta cn cho php tn ti mt cy khng c nt no m ta gi l cy rng (null
tree).
Xt cy di y:
A
B C D
E F G H I
J K
Hnh 3: Cy
A l cha ca B, C, D, cn G, H, I l con ca D
S cc con ca mt nt c gi l cp ca nt , v d cp ca A l 3, cp ca B l 2, cp
ca C l 0.
Nt c cp bng 0 c gi l nt l (leaf) hay nt tn cng. V d nh trn, cc nt E, F, C,
G, J, K v I l cc nt l. Nhng nt khng phi l l c gi l nt nhnh (branch)
Cp cao nht ca mt nt trn cy gi l cp ca cy , cy hnh trn l cy cp 3.
Gc ca cy ngi ta gn cho s mc l 1, nu nt cha c mc l i th nt con s c mc l i +
1. Mc ca cy trn c ch ra trong hnh sau:
A 1
2 B 2 C 2 D
3 E 3 F 3 G 3 H 3 I
4 J K 4
Hnh 4: Mc ca cc nt trn cy
Chiu cao (height) hay chiu su (depth) ca mt cy l s mc ln nht ca nt c trn cy
Cy trn c chiu cao l 4
Mt tp hp cc cy phn bit c gi l rng (forest), mt cy cng l mt rng. Nu b nt
gc trn cy th s to thnh mt rng cc cy con.
L Minh Hong
Cu trc d liu v gii thut \ 28 [
V d:
Mc lc ca mt cun sch vi phn, chng, bi, mc v.v... c cu trc ca cy
Cu trc th mc trn a cng c cu trc cy, th mc gc c th coi l gc ca cy vi cc
cy con l cc th mc con v tp nm trn th mc gc.
Gia ph ca mt h tc cng c cu trc cy.
Mt biu thc s hc gm cc php ton cng, tr, nhn, chia cng c th lu tr trong mt cy
m cc ton hng c lu tr cc nt l, cc ton t c lu tr cc nt nhnh, mi nhnh
l mt biu thc con:
*
+ -
(a + b)*(c - d / e)
a b c /
d e
2 2 2
2
3 3
3 3
4 4 4
4
5 5
5 5
a) b) c) d)
Hnh 6: Cc dng cy nh phn suy bin
Cc cy nh phn trong Hnh 6 c gi l cy nh phn suy bin (degenerate binary tree), cc nt
khng phi l l ch c mt nhnh con. Cy a) c gi l cy lch tri, cy b) c gi l cy lch
phi, cy c) v d) c gi l cy zc-zc.
L Minh Hong
Cu trc d liu v gii thut \ 29 [
1 1
2 3 2 3
4 5 6 7 4 5 6 7
8 9 10
e) f)
Hnh 7: Cy nh phn hon chnh v cy nh phn y
Cc cy trong Hnh 7 c gi l cy nh phn hon chnh (complete binary tree): Nu chiu cao
ca cy l h th mi nt c mc < h - 1 u c ng 2 nt con. Cn nu mi nt c mc h - 1 u
c ng 2 nt con nh trng hp cy f) trn th cy c gi l cy nh phn y (full
binary tree). Cy nh phn y l trng hp ring ca cy nh phn hon chnh.
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, khng y , c n nt th chiu cao ca n l h = [log2(n + 1)] + 1.
Cy nh phn y c n nt th chiu cao ca n l h = log2(n + 1)
III. BIU DIN CY NH PHN
B 2 E 3
C 4 D 5 F 6 G 7
L Minh Hong
Cu trc d liu v gii thut \ 30 [
A B C D E
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
Ngoi ra nu cu trc ca cy lun lun bin ng (tc l thng xuyn c nhng thao tc thm vo
hay loi b mt nhnh con) th cc lu tr ny c th khin cho cc thao tc km hiu qu.
2. Biu din bng cu trc lin kt.
Khi biu din cy nh phn bng cu trc lin kt, mi nt ca cy l mt bn ghi (record) gm 3
trng:
Trng Info: Cha gi tr lu ti nt
Trng Left: Cha lin kt (con tr) ti nt con tri, tc l cha mt thng tin bit nt
con tri ca nt l nt no, trong trng hp khng c nt con tri, trng ny c gn mt
gi tr c bit.
Trng Right: Cha lin kt (con tr) ti nt con phi, tc l cha mt thng tin bit nt
con phi ca nt l nt no, trong trng hp khng c nt con phi, trng ny c gn
mt gi tr c bit.
i vi cy ta ch cn phi quan tm gi li nt gc, bi t nt gc, i theo cc hng lin kt Left,
Right ta c th duyt mi nt khc.
A
L R
B C
L R L R
D E F G
L R L R L R L R
H I J
L R L R L R
L Minh Hong
Cu trc d liu v gii thut \ 31 [
Gi s rng nu nh mt nt khng c nt con tri (hoc nt con phi) th lin kt Left (Right) ca
nt c lin kt thng ti mt nt c bit m ta gi l NIL (hay NULL), nu cy rng th nt
gc ca cy cng c gn bng NIL. Khi c ba cch duyt cy hay c s dng:
1. Duyt theo th t trc (preorder traversal)
Trong php duyt theo th t trc th gi tr trong mi nt bt k s c lit k trc gi tr lu
trong hai nt con ca n, c th m t bng th tc quy sau:
procedure Visit(N); {Duyt nhnh cy nhn N l nt gc ca nhnh }
begin
if N nil then
begin
<Output trng Info ca nt N>
Visit(Nt con tri ca N);
Visit(Nt con phi ca N);
end;
end;
Qu trnh duyt theo th t trc bt u bng li gi Visit(nt gc).
Nh cy trn, nu ta duyt theo th t trc th cc gi tr s ln lt c lit k theo th t:
ABDHIECFJG
2. Duyt theo th t gia (inorder traversal)
Trong php duyt theo th t gia th gi tr trong mi nt bt k s c lit k sau gi tr lu
nt con tri v c lit k trc gi tr lu nt con phi ca nt , c th m t bng th tc
quy sau:
procedure Visit(N); {Duyt nhnh cy nhn N l nt gc ca nhnh }
begin
if N nil then
begin
Visit(Nt con tri ca N);
<Output trng Info ca nt N>
Visit(Nt con phi ca N);
end;
end;
Qu trnh duyt theo th t gia cng bt u bng li gi Visit(nt gc).
Nh cy trn, nu ta duyt theo th t gia th cc gi tr s ln lt c lit k theo th t:
HDIBEAFJCG
3. Duyt theo th t sau (postorder traversal)
Trong php duyt theo th t sau th gi tr trong mi nt bt k s c lit k sau gi tr lu hai
nt con ca nt , c th m t bng th tc quy sau:
procedure Visit(N); {Duyt nhnh cy nhn N l nt gc ca nhnh }
begin
if N nil then
begin
Visit(Nt con tri ca N);
Visit(Nt con phi ca N);
<Output trng Info ca nt N>
end;
end;
Qu trnh duyt theo th t sau cng bt u bng li gi Visit(nt gc).
Cng vi cy trn, nu ta duyt theo th t sau th cc gi tr s ln lt c lit k theo th t:
HIDEBJFGCA
L Minh Hong
Cu trc d liu v gii thut \ 32 [
V. 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).
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:
0
A
1
2 3
B J
F
G I M
C 7 12
4 9
H L
D 8 11
5 E K
6 10
Hnh 10: nh s cc nt ca cy 3_phn biu din bng mng
Theo cch nh s ny, nt con th j ca nt i l: i * K + j. Nt cha ca nt x l nt (x - 1) div K. Ta
c th dng mt mng T nh s t 0 lu cc gi tr trn cc nt: Gi tr ti nt th i c lu tr
phn t T[i].
A B F J C D E G H I K L M
0 1 2 3 4 5 6 7 8 9 10 11 12
L Minh Hong
Cu trc d liu v gii thut \ 33 [
G M
C 7 12
3
H L
D 8 11
5 E K
6 10
Mng Info:
Info[i] B F C J D E G H A K L M
i 1 2 3 4 5 6 7 8 9 10 11 12
Mng Children:
Children[i] 3 5 6 7 8 10 11 12 1 2 4
i 1 2 3 4 5 6 7 8 9 10 11
on 1 on 2 on 4 on 9
(Cc on 3, 5, 6, 7, 8, 10, 11, 12 l rng)
Mng Head:
Head[i] 1 4 6 6 9 9 9 9 9 12 12 12 12
i 1 2 3 4 5 6 7 8 9 10 11 12 13
Bi tp
1. Vit chng trnh m t cy nh phn dng cu trc lin kt, mi nt cha mt s nguyn, v vit
cc th tc duyt trc, gia, sau.
2. Chng minh rng nu cy nh phn c x nt l v y nt cp 2 th x = y + 1
L Minh Hong
Cu trc d liu v gii thut \ 34 [
L Minh Hong
Cu trc d liu v gii thut \ 35 [
L R
+ -
L R L R
/ 3 7 4
L R L R L R L R
6 2
L R L R
L Minh Hong
Cu trc d liu v gii thut \ 36 [
L Minh Hong
Cu trc d liu v gii thut \ 37 [
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.
L Minh Hong
Cu trc d liu v gii thut \ 38 [
x, y: Extended;
e: Integer;
begin
if not (T[1] in Opt) then {T l ton hng}
begin
Val(T, x, e); Push(x); {i T thnh s v y gi tr vo Stack}
end
else {T l ton t}
begin
y := Pop; x := Pop; {Ra hai}
case T[1] of
'+': x := x + y;
'-': x := x - y;
'*': x := x * y;
'/': x := x / y;
end;
Push(x); {Vo mt}
end;
end;
begin
Write('Enter RPN Expression: '); ReadLn(RPN);
Refine(RPN);
StackInit;
T := '';
for p := 1 to Length(RPN) do {Xt cc k t ca biu thc RPN t tri qua phi}
if RPN[p] <> ' ' then T := T + RPN[p] {nu khng phi du cch th ni n vo sau xu T}
else {Nu gp du cch}
begin
Process(T); {X l phn t va c xong}
T := ''; {t li T chun b c phn t mi}
end;
WriteLn(RPN, ' = ', Pop:0:4); {In gi tr biu thc RPN c lu trong Stack}
end.
Stack := ;
for <Phn t T c c t biu thc infix> do
{T c th l hng, bin, ton t hoc du ngoc c c t biu thc infix theo th t t tri qua phi}
case T of
'(': Push(T);
')':
repeat
x := Pop;
L Minh Hong
Cu trc d liu v gii thut \ 39 [
{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cc thao tc i vi Stack - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
procedure StackInit;
begin
Stack := '';
L Minh Hong
Cu trc d liu v gii thut \ 40 [
end;
begin
Write('Infix = '); ReadLn(Infix);
Refine(Infix);
L Minh Hong
Cu trc d liu v gii thut \ 41 [
L Minh Hong
Cu trc d liu v gii thut \ 42 [
7. SP XP (SORTING)
I. 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.
Sau khi sp xp theo trt t im cao nht ti im thp nht, bng kho s tr thnh:
L Minh Hong
Cu trc d liu v gii thut \ 43 [
im thi STT
25 2
21 4
20 1
18 3
Da vo bng kho, ta c th bit c rng ngi c im cao nht l ngi mang s th t 2,
tip theo l ngi mang s th t 4, tip na l ngi mang s th t 1, v cui cng l ngi
mang s th t 3, cn mun lit k danh sch y th ta ch vic i chiu vi bng ban u v
lit k theo th t 2, 4, 1, 3.
C th cn ci tin tt hn da vo nhn xt sau: Trong bng kho, ni dung ca trng kho hon
ton c th suy ra c t trng lin kt bng cch: Da vo trng lin kt, tm ti bn ghi tng
ng trong bng chnh ri truy xut trng kho trong bng chnh. Nh v d trn th ngi mang s
th t 1 chc chn s phi c im thi l 20, cn ngi mang s th t 3 th chc chn phi c im
thi l 18. Vy th bng kho c th loi b i trng kho m ch gi li trng lin kt. Trong
trng hp cc phn t trong bng ban u c nh s t 1 ti n v trng lin kt chnh l s
th t ca bn ghi trong bng ban u nh v d trn, ngi ta gi k thut ny l k thut sp
xp bng ch s: Bng ban u khng h b nh hng g c, vic sp xp ch n thun l nh li
ch s cho cc bn ghi theo th t sp xp. C th hn:
Nu r[1], r[2], ..., r[n] l cc bn ghi cn sp xp theo mt th t nht nh th vic sp xp bng ch
s tc l xy dng mt dy Index[1], Index[2], ..., Index[n] m y:
Index[j] := Ch s ca bn ghi s ng th j khi sp th t
(Bn ghi r[index[j]] s phi ng sau j - 1 bn ghi khc khi sp xp)
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 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 k1 k2 ... kn.
Gi s cu trc d liu cho dy kho c m t nh sau:
const
n = ...; {S kho trong dy kho, c th khai 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}
L Minh Hong
Cu trc d liu v gii thut \ 44 [
L Minh Hong
Cu trc d liu v gii thut \ 45 [
L Minh Hong
Cu trc d liu v gii thut \ 46 [
for i := 2 to n do
begin
tmp := ki; {Gi li gi tr ki}
inf := 1; sup := i - 1; {Tm ch chn gi tr tmp vo on t kinf ti ksup+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 phn t t kinf ti ki-1 li sau mt v tr>
kinf := tmp; {a gi tr tmp vo "khong trng" mi to ra}
end;
end;
V. SHELL SORT
Nhc im ca thut ton sp xp kiu chn th hin khi m ta lun phi chn mt kha vo v tr
gn u dy. Trong trng hp , ngi ta s dng phng php Shell Sort.
Xt dy kho: k1, k2, ..., kn. Vi mt s nguyn dng h: 1 h n, ta c th chia dy thnh h dy
con:
Dy con 1: k1, k1+h, k1 + 2h, ...
Dy con 2: k2, k2+h, k2 + 2h, ...
...
Dy con h: kh, k2h, k3h, ...
L Minh Hong
Cu trc d liu v gii thut \ 47 [
j := j - h;
end;
kj+h := tmp;
end;
h := h div 2;
end;
end;
begin
Partition(1, n);
end;
Ta th phn tch xem ti sao on chng trnh trn hot ng ng: Xt vng lp repeat...until
trong ln lp u tin, vng lp while th nht chc chn s tm c kho ki kho cht bi
chc chn tn ti trong on mt kho bng kha cht. Tng t nh vy, vng lp while th hai
L Minh Hong
Cu trc d liu v gii thut \ 48 [
procedure QuickSort;
L Minh Hong
Cu trc d liu v gii thut \ 49 [
var
i, j: Integer;
begin
repeat
if L H then Exit;
<Phn on [L, H] c hai on con [L, j] v [i, R]>
if <on [L, j] ngn hn on [i, R]> then
begin
Partition(L, j); L := i;
end
else
begin
Partition(i, R); R := j;
end;
until False;
end;
begin
Partition(1, n);
end;
Ci tin th hai i vi Quick Sort l qu trnh phn on nn ch lm n mt mc no , n khi
on ang xt c di M (M l mt s nguyn t chn nm trong khong t 9 ti 25) th khng
phn on tip m nn p dng thut ton sp xp kiu chn.
Ci tin th ba ca Quick Sort l: Nn ly trung v ca mt dy con trong on lm cht, (trung
v ca mt dy n phn t l phn t ng th n / 2 khi sp th t). Cch chn c nh gi cao
nht l chn trung v ca ba phn t u, gia v cui on.
Cui cng, ta c nhn xt: Quick Sort l mt cng c sp xp mnh, ch c iu kh chu gp phi
l trng hp suy bin ca Quick Sort (qu trnh phn on chia thnh mt dy rt ngn v mt dy
rt di). V iu ny trn phng din l thuyt l khng th khc phc c: V d vi n = 10000.
Nu nh chn cht l kho u on (Thay dng chn kho cht bng Key := kL) hay chn cht
l kho cui on (Thay bng Key := kH) th vi dy sau, chng trnh hot ng rt chm:
(1, 2, 3, 4, 5, ..., 9999, 10000)
Nu nh chn cht l kho gia on (Thay dng chn kho cht bng Key := k(L+H) div 2) th vi
dy sau, chng trnh cng rt chm:
(1, 2, ..., 4999, 5000, 5000, 4999, ..., 2, 1)
Trong trng hp chn cht l trung v dy con hay chn cht ngu nhin, tht kh c th tm ra
mt b d liu khin cho Quick Sort hot ng chm. Nhng ta cng cn hiu rng vi mi
chin lc chn cht, trong 10000! dy hon v ca dy (1, 2, ... 10000) th no cng c mt
dy lm Quick Sort b suy bin, tuy nhin trong trng hp chn cht ngu nhin, xc sut xy
ra dy ny qu nh ti mc ta khng cn phi tnh n, nh vy khi chn cht ngu nhin th
ta khng cn phi quan tm ti ngn xp quy, khng cn quan tm ti k thut kh quy v
vn suy bin ca Quick Sort.
VII. THUT TON SP XP KIU VUN NG (HEAP SORT)
1. ng (heap)
ng l mt dng cy nh phn hon chnh c bit m gi tr lu ti mi nt nhnh u ln hn
hay bng gi tr lu trong hai nt con ca n.
L Minh Hong
Cu trc d liu v gii thut \ 50 [
10
9 6
7 8 4 1
3 2 5
10 9 8 9
7 8 6 1 7 4 6 1
3 5 2 3 5 2
L Minh Hong
Cu trc d liu v gii thut \ 51 [
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
Cu trc d liu v gii thut \ 52 [
V phc tp ca thut ton, ta bit rng cy nh phn hon chnh c n nt th chiu cao ca n
khng qu [log2(n + 1)] + 1. C cho l trong trng hp xu nht th tc Adjust phi thc hin tm
ng i t nt gc ti nt l xa nht th ng i tm c cng ch di bng chiu cao ca cy
v phc tp ca mt ln gi Adjust l O(log2n). T c th suy ra, trong trng hp xu nht,
phc tp ca Heap Sort cng ch l O(nlog2n). Vic nh gi thi gian thc hin trung bnh
phc tp hn, ta ch ghi nhn mt kt qu chng minh c l phc tp trung bnh ca Heap
Sort cng l O(nlog2n).
C th nhn xt thm l Quick Sort quy cn thm khng gian nh cho Stack, cn Heap Sort
ngoi mt nt nh ph thc hin vic i ch, n khng cn dng thm g khc. Heap Sort tt
hn Quick Sort v phng din l thuyt bi khng c trng hp ti t no Heap Sort c th mc
phi. Cng nh c Heap Sort m gi y khi gii mi bi ton c cha m-un sp xp, ta c th
ni rng phc tp ca th tc sp xp khng qu O(nlog2n).
VIII. SP XP BNG PHP M PHN PHI (DISTRIBUTION COUNTING)
C mt thut ton sp xp n gin cho trng hp c bit: Dy kho k1, k2, ..., kn l cc s
nguyn nm trong khong t 0 ti M (TKey = 0..M).
Ta dng dy c0, c1, ..., cM cc bin m, y cV l s ln xut hin gi tr V trong dy kho:
for V := 0 to M do cV := 0; {Khi to dy bin m}
for i := 1 to n do cki := cki + 1;
V d vi dy kho: 1, 2, 2, 3, 0, 0, 1, 1, 3, 3 (n = 10, M = 3), sau bc m ta c:
c0 = 2; c1 = 3; c2 = 2; c3 = 3.
Da vo dy bin m, ta hon ton c th bit c: sau khi sp xp th gi tr V phi nm t v tr
no ti v tr no. Nh v d trn th gi tr 0 phi nm t v tr 1 ti v tr 2; gi tr 1 phi ng lin
tip t v tr 3 ti v tr 5; gi tr 2 ng v tr 6 v 7 cn gi tr 3 nm ba v tr cui 8, 9, 10:
0 0 1 1 1 2 2 3 3 3
Tc l sau khi sp xp:
Gi tr 0 ng trong on t v tr 1 ti v tr c0.
Gi tr 1 ng trong on t v tr c0 + 1 ti v tr c0 + c1.
Gi tr 2 ng trong on t v tr c0 + c1 + 1 ti v tr c0 + c1 + c2.
...
Gi tr v trong on ng t v tr c0 + c1 + ... + cv-1 + 1 ti v tr c0 + c1 + c2 + ... + cv.
...
v tr cui ca mi on, nu ta tnh li dy c nh sau:
for V := 1 to M do cV := cV-1 + cV
Th cV l v tr cui ca on cha gi tr V trong dy kho sp xp.
Mun dng li dy kho sp xp, ta thm mt dy kho ph x1, x2, ..., xn. Sau duyt li dy kho
k, mi khi gp kho mang gi tr V ta a gi tr vo kho xcv v gim cv i 1.
for i := n downto 1 do
begin
V := ki;
XcV := ki; cV := cV - 1;
end;
Khi dy kho x chnh l dy kho c sp xp, cng vic cui cng l gn gi tr dy kho x
cho dy kho k.
procedure DistributionCounting; {TKey = 0..M}
var
c: array[0..M] of Integer; {Dy bin m s ln xut hin mi gi tr}
L Minh Hong
Cu trc d liu v gii thut \ 53 [
L Minh Hong
Cu trc d liu v gii thut \ 54 [
L Minh Hong
Cu trc d liu v gii thut \ 55 [
begin
<Da vo gi tr ln nht ca dy kho,
xc nh z l di dy bt biu din mi kho>
Partition(1, n, z - 1);
end;
Vi Radix 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 bt th thi
gian s l C.n chia tt c cc on cn chia bng bt (C l hng s). Vy tng thi gian phn
on bng z bt s l C.n.z. Trong trng hp xu nht, phc tp ca Radix Sort l O(n.z).
V phc tp trung bnh ca Radix Sort l O(n.min(z, log2n)).
Ni chung, Radix Sort ci t nh trn ch th hin tc ti a trn cc h thng cho php x l
trc tip trn cc bt: H thng phi cho php ly mt bt ra d dng v thao tc vi thi gian nhanh
hn hn so vi thao tc trn Byte v Word. Khi Radix Sort s tt hn nhiu Quick Sort. (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 bt ra khi Byte
x l li rt chm v lm nh hng khng nh ti tc ca Radix 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 Quick Sort c.
2. Sp xp c s trc tip (Straight Radix Sort)
Ta s trnh by phng php sp xp c s trc tip bng mt v d: Sp xp dy kho:
925, 817, 821, 638, 639, 744, 742, 563, 570, 166.
Trc ht, ta sp xp dy kho ny theo th t tng dn ca ch s hng n v bng mt thut ton
sp xp khc, c dy kho:
570 821 742 563 744 925 166 817 638 639
Sau , ta sp xp dy kho mi to thnh theo th t tng dn ca ch s hng chc bng mt
thut ton sp xp n nh, c dy kho:
817 821 925 638 639 742 744 563 166 570
V thut ton sp xp ta s dng l n nh, nn nu hai kho c ch s hng chc ging nhau th
kho no c ch s hng n v nh hn s ng trc. Ni nh vy c ngha l dy kho thu c
s c th t tng dn v gi tr to thnh t hai ch s cui.
Cui cng, ta sp xp li dy kho theo th t tng dn ca ch s hng trm cng bng mt thut
ton sp xp n nh, thu c dy kho:
166 563 570 638 639 742 744 817 821 925
Lp lun tng t nh trn da vo tnh n nh ca php sp xp, dy kho thu c s c th t
tng dn v gi tr to thnh bi c ba ch s, l dy kho sp.
Nhn xt:
Ta hon ton c th coi s ch s ca mi kho l bng nhau, nh v d trn nu c s 15 trong
dy kho th ta c th coi n l 015.
L Minh Hong
Cu trc d liu v gii thut \ 56 [
L Minh Hong
Cu trc d liu v gii thut \ 57 [
if not Flag then k := t; {Nu kt qu cui cng ang trong t th sao chp gi tr t t sang k}
end;
Xt php m phn phi, ta bit phc tp ca n l O(max(radix, n)). M radix l mt hng s
t ta chn t trc, nn khi n ln, phc tp ca php m phn phi l O(n). Thut ton s dng
nDigit ln php m phn phi nn c th thy phc tp ca thut ton l O(n.nDigit) bt k
d liu u vo.
Ta c th coi sp xp c s trc tip l mt m rng ca php m phn phi, khi dy s ch ton
cc s c 1 ch s (trong h radix) th chnh l php m phn phi. S khc bit y l: Sp
xp c s trc tip c th thc hin vi cc kho mang gi tr ln; cn php m phn phi ch c
th lm trong trng hp cc kho mang gi tr nh, bi n cn mt lng b nh rng ging
ra dy bin m s ln xut hin cho tng gi tr.
XI. THUT TON SP XP TRN (MERGE SORT)
1. Php trn 2 ng
Php trn 2 ng l php hp nht hai dy kho sp xp ghp li thnh mt dy kho c
kch thc bng tng kch thc ca hai dy kho ban u v dy kho to thnh cng c th t sp
xp. Nguyn tc thc hin ca n kh n gin: so snh hai kho ng u hai dy, chn ra kho
nh nht v a n vo min sp xp (mt dy kho ph c kch thc bng tng kch thc hai
dy kho ban u) v tr thch hp. Sau , kho ny b loi ra khi dy kho cha n. Qu trnh
tip tc cho ti khi mt trong hai dy kho cn, khi ch cn chuyn ton b dy kho cn li
ra min sp xp l xong.
V d: Vi hai dy kho: (1, 3, 10, 11) v (2, 4, 9)
Dy 1 Dy 2 Kho nh nht trong 2 dy Min sp xp
(1, 3, 10, 11) (2, 4, 9) 1 (1)
(3, 10, 11) (2, 4, 9) 2 (1, 2)
(3, 10, 11) (4, 9) 3 (1, 2, 3)
(10, 11) (4, 9) 4 (1, 2, 3, 4)
(10, 11) (9) 9 (1, 2, 3, 4, 9)
(10, 11) Dy 2 l , a nt dy 1 (1, 2, 3, 4, 9, 10, 11)
vo min sp xp
2. Sp xp bng trn 2 ng trc tip
Ta c th coi mi kho trong dy kho k1, k2, ..., kn l mt mch vi di 1, cc mch trong dy
c sp xp ri:
3 6 5 4 9 8 1 0 2 7
Trn hai mch lin tip li thnh mt mch c di 2, ta li c dy gm cc mch c sp:
3 6 4 5 8 9 0 1 2 7
C trn hai mch lin tip, ta c mt mch di ln hn, s mch trong dy s gim dn xung:
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:
Th tc Merge(var x, y: TArray; a, b, c: Integer); th tc ny trn mch xa, xa+1, ..., xb vi mch
xb+1, xb+2 ..., xc c mch ya, ya+1, ..., yc.
Th tc MergeByLength(var x, y: TArray; len: Integer); th tc ny trn ln lt cc cp mch
theo th t:
Trn mch x1...xlen v xlen+1...x2len thnh mch y1...y2len.
L Minh Hong
Cu trc d liu v gii thut \ 58 [
L Minh Hong
Cu trc d liu v gii thut \ 59 [
L Minh Hong
Cu trc d liu v gii thut \ 60 [
L Minh Hong
Cu trc d liu v gii thut \ 61 [
ch: Char;
begin
{Trc ht in ra thi gian thc thi}
WriteLn('During Time = ', (Time - StTime) / Interval:1:10, ' (s)');
Assign(f, 'SORT.OUT'); 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;
L Minh Hong
Cu trc d liu v gii thut \ 62 [
k[j + 1] := k[j];
Dec(j);
end;
k[j + 1] := tmp;
end;
PrintResult;
end;
L Minh Hong
Cu trc d liu v gii thut \ 63 [
i := L; j := H;
repeat
while k[i] < key do Inc(i);
while k[j] > key do Dec(j);
if i <= j then
begin
if i < j then Swap(k[i], k[j]);
Inc(i); Dec(j);
end;
until i > j;
Partition(L, j); Partition(i, H);
end;
begin
Enter;
Partition(1, n);
PrintResult;
end;
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;
L Minh Hong
Cu trc d liu v gii thut \ 64 [
x[c[V]] := k[i];
Dec(c[V]);
end;
k := x;
PrintResult;
end;
begin
Enter;
for i := 0 to MaxBit do MaskBit[i] := 1 shl i;
maxValue := k[1];
for i := 2 to n do
if k[i] > MaxValue then maxValue := k[i];
i := 0;
while (i < MaxBit) and (MaskBit[i + 1] <= MaxValue) do Inc(i);
Partition(1, n, i);
PrintResult;
end;
L Minh Hong
Cu trc d liu v gii thut \ 65 [
i, d: Integer;
begin
FillChar(c, SizeOf(c), 0);
for i := 1 to n do
begin
d := GetDigit(x[i], p); Inc(c[d]);
end;
for d := 1 to Radix - 1 do c[d] := c[d - 1] + c[d];
for i := n downto 1 do
begin
d := GetDigit(x[i], p);
y[c[d]] := x[i];
Dec(c[d]);
end;
end;
begin
Enter;
Flag := True;
for p := 0 to nDigit - 1 do
begin
if Flag then DCount(k, t, p)
else DCount(t, k, p);
Flag := not Flag;
end;
if not Flag then k := t;
PrintResult;
end;
L Minh Hong
Cu trc d liu v gii thut \ 66 [
while c <= n do
begin
Merge(Source, Dest, a, b, c);
a := a + len shl 1; b := b + len shl 1; c := c + len shl 1;
end;
if b < n then Merge(Source, Dest, a, b, n)
else
Move(Source[a], Dest[a], (n - a + 1) * SizeOf(Source[1]));
end;
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;
(*******************************************************************)
begin
repeat
selected := MenuSelect;
WriteLn(SMenu[selected]);
case selected of
0: PrintInput;
1: SelectionSort;
2: BubbleSort;
3: InsertionSort;
4: AdvancedInsertionSort;
5: ShellSort;
6: QuickSort;
7: HeapSort;
8: DistributionCounting;
9: RadixSort;
10: StraightRadixSort;
11: MergeSort;
12: Halt;
end;
until False;
end.
Vic o thi gian thc thi ca tng thut ton sp xp l cn thit bi cc tnh ton l thuyt i khi
b lch so vi thc t v nhiu l do khc nhau. Trong Borland Pascal, c l nn t tt tt c ch
kim tra trn (phm vi, s hc) th cng bng hn, vi l l rng nu ta lp trnh khng phi vi
L Minh Hong
Cu trc d liu v gii thut \ 67 [
Borland Pascal m vi Assembler chng hn, th vic c kim tra trn hay khng l do mun ca
ta ch khng ai c th bt p c. Nhng him ai cha tng bit m li c th ci t trn tru
nhng thut ton trn, nn phi bt tt c cc ch kim tra t ti an ton cao nht khi
kim th.
Mt vn khc xy ra l nu tt tt c ch bin dch kim tra trn, th ngoi nhng thut ton
sp xp chn, ni bt, chn, rt kh c th o c tc trung bnh ca nhng thut ton sp xp
cn li khi m chng u chy khng ti mt nhp ng h thi gian thc (khng kp o thi gian).
Mt cch gii quyt l cho mi thut ton Quick Sort, Radix Sort, ... thc hin khong 1000 ln trn
cc b d liu ngu nhin ri ly thi gian tng chia cho 1000. Hay mt cch khc l tng kch
thc d liu, iu ny c th dn n vic phi sa li mt vi ch trong chng trnh.
Di y ta thc hin o tc vi d liu u vo l 15000 s t nhin ly ngu nhin trong on
[0, 15000]. Thi gian v tc thc thi ca cc thut ton o c c th nh sau (ta gi s rng
tc ca Bubble Sort l 1):
ch {$R-,Q-,S-}:
STT Thut ton Thi gian (giy) Tc
1 Distribution Counting 0.0033 7000.00
2 Straight Radix Sort 0.0165 1400.00
3 Heap Sort 0.0280 823.53
4 Shell Sort 0.0308 750.00
5 Radix Sort 0.0341 677.42
6 Quick Sort 0.0352 656.25
7 Merge Sort 0.0483 477.27
8 Insertion Sort with binary searching 0.7690 30.00
9 Insertion Sort 2.2519 10.24
10 Selection Sort 2.6364 8.75
11 Bubble Sort 23.0687 1.00
ch {$R+,Q+,S+}:
STT Thut ton Thi gian (giy) Tc
1 Distribution Counting 0.0319 2994.83
2 Straight Radix Sort 0.0643 1484.62
3 Quick Sort 0.1313 726.78
4 Radix Sort 0.1346 708.98
5 Merge Sort 0.2098 454.71
6 Heap Sort 0.2296 415.55
7 Shell Sort 0.2796 341.26
8 Insertion Sort with binary searching 0.8239 115.80
9 Insertion Sort 35.7016 2.67
10 Selection Sort 52.7834 1.81
11 Bubble Sort 95.4056 1.00
Nhng con s v thi gian v tc ny c o trn mt b d liu c th, vi mt my tnh c
th v mt cng c lp trnh c th, vi b d liu khc, my tnh v cng c lp trnh khc, kt qu
c th khc. Ti vit li chng trnh ny trn Borland Delphi 6 v th vi d liu 5000000 kho
s nguyn sinh ngu nhin [0, 5000000] c kt qu nh sau:
L Minh Hong
Cu trc d liu v gii thut \ 68 [
Hnh 16: Ci t cc thut ton sp xp vi d liu ln, cho php chy cc thut ton theo kiu song song
(Synchronous) hoc tun t (Asynchronous), Straight Radix Sort t ra nhanh nht
L Minh Hong
Cu trc d liu v gii thut \ 69 [
Quick Sort gp nhc im trong trng hp suy bin nhng xc sut xy ra trng hp ny rt
nh. Heap Sort th m lnh hi phc tp v kh nh, nhng nu cn chn ra m phn t ln nht
trong dy kho th dng Heap Sort s khng phi sp xp li ton b dy. Merge Sort phi i hi
thm mt khng gian nh ph, nn p dng n trong trng hp sp xp trn file. Cn Shell Sort th
hi kh trong vic nh gi v thi gian thc thi, n l sa i ca thut ton sp xp chn nhng
li c tc tt, m lnh n gin v lng b nh cn huy ng rt t. Tuy nhin, nhng nhc
im ca bn phng php ny qu nh so vi u im chung ca chng l nhanh. Hn na,
chng c nh gi cao khng ch v tnh tng qut v tc nhanh, m cn l kt qu ca nhng
cch tip cn khoa hc i vi bi ton sp xp.
Nhng thut ton trn khng ch n thun l cho ta hiu thm v mt cch sp xp mi, m k
thut ci t chng (vi m lnh ti u) cng dy cho chng ta nhiu iu: K thut s dng s
ngu nhin, k thut "chia tr", k thut dng cc bin vi vai tr lun phin v.v...Vy nn nm
vng ni dung ca nhng thut ton , m cch thuc tt nht chnh l ci t chng vi ln vi
cc rng buc d liu khc nhau (nu c th th c trn hai ngn ng lp trnh th rt tt) v cng
ng qun k thut sp xp bng ch s.
Bi tp
1. Vit thut ton Quick Sort khng quy
2. Hy vit nhng thut ton sp xp nu trn vi danh sch nhng xu k t gm 3 ch ci thng,
sp xp chng theo th t t in.
3. Hy vit li tt c nhng thut ton nu trn vi phng php sp xp bng ch s trn mt dy
s cn sp khng tng (gim dn).
4. Vit chng trnh tm trung v ca mt dy s
5. Cho mt danh sch th sinh gm n ngi, mi ngi cho bit tn v im thi, hy chn ra m
ngi im cao nht.
6. Thut ton sp xp bng c s trc tip c n nh khng ? Ti sao ?
7. Ci t thut ton sp xp trn hai ng t nhin
8. Tm hiu php trn k ng v cc phng php sp xp ngoi (trn tp truy nhp tun t v tp
truy nhp ngu nhin)
L Minh Hong
Cu trc d liu v gii thut \ 70 [
8. TM KIM (SEARCHING)
I. BI TON TM KIM
Cng vi sp xp, tm kim l mt i hi rt thng xuyn trong cc ng dng tin hc. Bi ton
tm kim c th pht biu nh sau:
Cho mt dy gm n bn ghi r1, r2, ..., rn. Mi bn ghi ri (1 i n) tng ng vi mt kho ki. Hy
tm bn ghi c gi tr kho bng X cho trc.
X c gi l kho tm kim hay i tr tm kim (argument).
Cng vic tm kim s hon thnh nu nh c mt trong hai tnh hung sau xy ra:
Tm c bn ghi c kho tng ng bng X, lc php tm kim thnh cng (successful).
Khng tm c bn ghi no c kho tm kim bng X c, php tm kim tht bi
(unsuccessful).
Tng t nh sp xp, ta coi kho ca mt bn ghi l i din cho bn ghi . V trong mt s
thut ton s trnh by di y, ta coi kiu d liu cho mi kho cng c tn gi l TKey.
const
n = ...; {S kho trong dy kho, c th khai 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}
L Minh Hong
Cu trc d liu v gii thut \ 71 [
Ngi ta chng minh c phc tp tnh ton ca thut ton tm kim nh phn trong trng
hp tt nht l O(1), trong trng hp xu nht l O(log2n) v trong trng hp trung bnh cng l
O(log2n). Tuy nhin, ta khng nn qun rng trc khi s dng tm kim nh phn, dy kho phi
c sp xp ri, tc l thi gian chi ph cho vic sp xp cng phi tnh n. Nu dy kho lun
lun bin ng bi php b sung hay loi bt i th lc chi ph cho sp xp li ni ln rt r lm
bc l nhc im ca phng php ny.
IV. CY NH PHN TM KIM (BINARY SEARCH TREE - BST)
Cho n kho k1, k2, ..., kn, trn cc kho c quan h th t ton phn. Cy nh phn tm kim ng vi
dy kho l mt cy nh phn m mi nt cha gi tr mt kho trong n kho cho, hai gi tr
cha trong hai nt bt k l khc nhau. i vi mi nt trn cy, tnh cht sau lun c tho mn:
Mi kho nm trong cy con tri ca nt u nh hn kho ng vi nt .
Mi kho nm trong cy con phi ca nt u ln hn kho ng vi nt
4
2 6
1 3 5 7
L Minh Hong
Cu trc d liu v gii thut \ 72 [
L Minh Hong
Cu trc d liu v gii thut \ 73 [
2 6 2 6
7
1 3 5 7 1 3
9 9
2 5 2 7
1 3 7 1 3 6 9
6 9
2 5 2 5
1 3 7 1 7
6 9 9
6
Hoc tm nt cha kho nh nht trong cy con phi, a gi tr cha trong sang nt D, ri
xo nt ny. Do tnh cht ca cy BST, nt cha kho nh nht trong cy con phi chnh l
nt cc tri ca cy con phi nn n khng th c hai con c, vic xo a v hai trng
hp trn.
4 5
2 5 2 7
1 3 7 1 3 6 9
6 9
L Minh Hong
Cu trc d liu v gii thut \ 74 [
var
p, q, Node, Child: PNode;
begin
p := Root; q := nil; {V sau, khi p tr sang nt khc, ta c gng gi cho q^ lun l cha ca p^}
while p nil do {Tm xem trong cy c kho X khng?}
begin
if p^.Info = X then Break; {Tm thy}
q := p;
if X < p^.Info then p := p^.Left
else p := p^.Right;
end;
if p = nil then Exit; {X khng tn ti trong BST nn khng xo c}
if (p^.Left nil) and (p^.Right nil) then {p^ c c con tri v con phi}
begin
Node := p; {Gi li nt cha kho X}
q := p; p := p^.Left; {Chuyn sang nhnh con tri tm nt cc phi}
while p^.Right nil do
begin
q := p; p := p^.Right;
end;
Node^.Info := p^.Info; {Chuyn gi tr t nt cc phi trong nhnh con tri ln Node^}
end;
{Nt b xo gi y l nt p^, n ch c nhiu nht mt con}
{Nu p^ c mt nt con th em Child tr ti nt con , nu khng c th Child = nil }
if p^.Left nil then Child := p^.Left
else Child := p^.Right;
if p = Root then Root := Child; {Nt p^ b xo l gc cy}
else {Nt b xo p^ khng phi gc cy th ly mi ni t cha ca n l q^ ni thng ti Child}
if q^.Left = p then q^.Left := Child
else q^.Right := Child;
Dispose(p);
end;
Trng hp trung bnh, th cc thao tc tm kim, chn, xo trn BST c phc tp l O(log2n).
Cn trong trng hp xu nht, cy nh phn tm kim b suy bin th cc thao tc u c
phc tp l O(n), vi n l s nt trn cy BST.
Nu ta m rng hn khi nim cy nh phn tm kim nh sau: Gi tr lu trong mt nt ln hn
hoc bng cc gi tr lu trong cy con tri v nh hn cc gi tr lu trong cy con phi. Th ch
cn sa i th tc BSTInsert mt cht, khi chn ln lt vo cy n gi tr, cy BST s c n nt (c
th c hai nt cha cng mt gi tr). Khi nu ta duyt cc nt ca cy theo kiu trung th t
(inorder traversal), ta s lit k c cc gi tr lu trong cy theo th t tng dn. Phng php sp
xp ny ngi ta gi l Tree Sort. phc tp tnh ton trung bnh ca Tree Sort l O(nlog2n).
Php tm kim trn cy BST s km hiu qu nu nh cy b suy bin, ngi ta c nhiu cch xoay
x trnh trng hp ny. l php quay cy dng cy nh phn cn i AVL, hay k thut
dng cy nh phn tm kim ti u. Nhng k thut ny ta c th tham kho trong cc ti liu khc
v cu trc d liu v gii thut.
V. PHP BM (HASH)
T tng ca php bm l da vo gi tr cc kho k1, k2, ..., kn, chia cc kho ra thnh cc
nhm. Nhng kho thuc cng mt nhm c mt c im chung v c im ny khng c
trong cc nhm khc. Khi c mt kho tm kim X, trc ht ta xc nh xem nu X thuc vo dy
kho cho th n phi thuc nhm no v tin hnh tm kim trn nhm .
L Minh Hong
Cu trc d liu v gii thut \ 75 [
L Minh Hong
Cu trc d liu v gii thut \ 76 [
V d:
11 = 1 0 1 1
Bit 3 2 1 0 (z = 4)
Cy tm kim s hc cha cc gi tr kho ny c th m t nh sau: Trc ht, n l mt cy nh
phn m mi nt cha mt gi tr kho. Nt gc c ti a hai cy con, ngoi gi tr kho cha nt
gc, tt c nhng gi tr kho c bt cao nht l 0 nm trong cy con tri, cn tt c nhng gi tr
kho c bt cao nht l 1 nm cy con phi. i vi hai nt con ca nt gc, vn tng t i
vi bt z - 2 (bt ng th nh t tri sang).
So snh cy tm kim s hc vi cy nh phn tm kim, chng ch khc nhau v cch chia hai cy
con tri/phi. i vi cy nh phn tm kim, vic chia ny c thc hin bng cch so snh vi
kho nm nt gc, cn i vi cy tm kim s hc, nu nt gc c mc l d th vic chia cy con
c thc hin theo bt th d tnh t tri sang (bt z - d) ca mi kho.
Ta nhn thy rng nhng kho bt u bng bt 0 chc chn nh hn nhng kho bt u bng bt 1,
l im tng ng gia cy nh phn tm kim v cy tm kim s hc: Vi mi nt nhnh: Mi
gi tr cha trong cy con tri u nh hn gi tr cha trong cy con phi.
6 1
0 6=0110
5=0101
5 8
0 1 0 1 2=0010
7=0111
8=1000
2 7 10 12
0 1 10=1010
12=1100
11=1011
4 11
4=0100
Hnh 18: Cy tm kim s hc
Gi s cu trc mt nt ca cy c m t nh sau:
type
PNode = ^TNode; {Con tr cha lin kt ti mt nt}
TNode = record {Cu trc nt}
Info: TKey; {Trng cha kho}
Left, Right: PNode; {con tr ti nt con tri v phi, tr ti nil nu khng c nt con tri (phi)}
end;
Gc ca cy c lu trong con tr Root. Ban u nt Root = nil (cy rng)
Vi kho tm kim X, vic tm kim trn cy tm kim s hc c th m t nh sau: Ban u ng
nt gc, xt ln lt cc bt ca X t tri sang phi (t bt z - 1 ti bt 0), h gp bt bng 0 th r
sang nt con tri, nu gp bt 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 bt 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
L Minh Hong
Cu trc d liu v gii thut \ 77 [
b := b - 1; {Xt bt b ca X}
if <Bt 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 k1, k2, ..., kn 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
{Th tc chn kho X vo cy tm kim s hc}
procedure DSTInsert(X: TKey);
var
b: Integer;
p, q: PNode;
begin
b := z;
p := Root;
while (p nil) and (p^.Info X) do
begin
b := b - 1; {Xt bt b ca X}
q := p; {Khi p chy xung nt con th q^ lun gi vai tr l nt cha ca p^}
if <Bt b ca X l 0> then p := p^.Left {Gp 0 r tri}
else p := p^.Right; {Gp 1 r phi}
end;
if p = nil then {Gi tr X cha c trong cy}
begin
New(p); {To ra mt nt mi p^}
p^.Info := X; {Nt mi to ra s cha kho X}
p^.Left := nil; p^.Right := nil; {Nt mi s tr thnh mt l ca cy}
if Root = nil then Root := p {Cy ang l rng th nt mi thm tr thnh gc}
else {Khng th mc p^ vo mi ni va r sang t q^}
if <Bt b ca X l 0> then q^.Left := p
else q^.Right := p;
end;
end;
Mun xo b mt gi tr khi cy tm kim s hc, trc ht ta xc nh nt cha gi tr cn xo l
nt D no, sau tm trong nhnh cy gc D ra mt nt l bt k, chuyn gi tr cha trong nt l
sang nt D ri xo nt l.
{Th tc xo kho X khi cy tm kim s hc}
procedure DSTDelete(X: TKey);
var
b: Integer;
p, q, Node: PNode;
begin
{Trc ht, tm kim gi tr X xem n nm nt no}
b := z;
p := Root;
while (p nil) and (p^.Info X) do
begin
b := b - 1;
q := p; {Mi ln p chuyn sang nt con, ta lun m bo cho q^ l nt cha ca p^}
if <Bt b ca X l 0> then p := p^.Left
else p := p^.Right;
end;
if p = nil then Exit; {X khng tn ti trong cy th khng xo c}
Node := p; {Gi li nt cha kho cn xo}
while (p^.Left nil) or (p^.Right nil) do {chng no p^ cha phi l l}
begin
L Minh Hong
Cu trc d liu v gii thut \ 78 [
0 1
5=0101
2=0010
0 1 0 1
7=0111
8=1000
1
1 0 0 1 0
10=1010
12=1100
0 0 1 1 0 1
0 0 11=1011
2 4 5 7 8 10 11 4=0100
12
L Minh Hong
Cu trc d liu v gii thut \ 79 [
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 bt 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, n tr v nt l cha kho tm kim X nu tm thy, tr v nil nu khng tm thy. z l di
dy bt 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 bt b ca X}
if <Bt 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
bt ca X t tri qua phi (t bt z - 1 v bt 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 bt 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:
2=010 2=010
0 1 5=101 0 1
5=101
4=100 4=100
1 7=111
1 0 1 0
0 0 1 0 0 1 1
2 4 5 2 4 5 7
L Minh Hong
Cu trc d liu v gii thut \ 80 [
until b = 0;
p^.Info := X; {p^ l nt l t X vo}
end;
Vi cy tm kim c s, vic xo mt gi tr kho khng phi ch l xo ring mt nt l m cn
phi xo ton b nhnh c o i ti nt trnh lng ph b nh.
2=010 2=010
5=101 0 1 5=101
0 1
4=100 4=100
1 7=111 1 0
1 0
0 1 0 0 1
0 1
2 5 2 4 5
4 7
L Minh Hong
Cu trc d liu v gii thut \ 81 [
i vi cy tm kim c s, phc tp tnh ton cho cc thao tc tm kim, chn, xo trong trng
hp xu nht cng nh trung bnh u l O(z). Do khng phi so snh gi tr kho dc ng i, n
nhanh hn cy tm kim s hc nu nh gp cc kho cu trc ln. Tc nh vy c th ni l tt,
nhng vn b nh khin ta phi xem xt: Gi tr cha trong cc nt nhnh ca cy tm kim c
s l v ngha dn ti s lng ph b nh.
Mt gii php cho vn ny l: Duy tr hai dng nt trn cy tm kim c s: Dng nt nhnh ch
cha cc lin kt tri, phi v dng nt l ch cha gi tr kho. Ci t cy ny trn mt s ngn
ng nh kiu qu mnh i khi rt kh.
Gii php th hai l c t mt cy tng t nh RST, nhng sa i mt cht: nu c nt l cha
gi tr X c ni vi cy bng mt nhnh c o th ct b nhnh c o , v thay vo ch
nhnh ny ch mt nt cha gi tr X. Nh vy cc gi tr kho vn ch cha trong cc nt l nhng
cc nt l gi y khng ch nm trn mc z + 1 m cn nm trn nhng mc khc na. Phng
php ny khng nhng tit kim b nh hn m cn lm cho qu trnh tm kim nhanh hn. Gi
phi tr cho phng php ny l thao tc chn, xo kh phc tp. Tn ca cu trc d liu ny l
Trie (Trie ch khng phi Tree) tm kim c s.
0 1
5=0101
2=0010
0 1 0 1
7=0111
8=1000
1
1 0 0 1 0
10=1010
12=1100
0 0 1 1 0 1
0 0 11=1011
2 4 5 7 8 10 11 4=0100
12
a)
0 1
5=0101
2=0010
0 1 0 1
7=0111
2 12
8=1000
1
0 0 1
10=1010
7
8 12=1100
0 1 0 1 11=1011
4 5 10 11 4=0100
b)
Hnh 22: 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 bt ca kho
tm kim khng phi t tri qua phi m theo th t ca cc bt kim sot lu ti mi nt i qua.
Phng php c tn gi l Practical Algorithm To Retrieve Information Coded In Alphanumeric
L Minh Hong
Cu trc d liu v gii thut \ 82 [
(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.
IX. NHNG NHN XT CUI CNG
Tm kim thng l cng vic nhanh hn sp xp, nhng khng phi v th m coi thng hiu qu
ca nhng thao tc tm kim. Nu mi bc tm kim li c km theo mt thao tc mt nhiu thi
gian th qu trnh tm kim rt ngn c bc no hay bc y.
Trn y, ta trnh by php tm kim trong mt tp hp tm ra bn ghi mang kho ng bng
kho tm kim. Tuy nhin, ngi ta c th yu cu tm bn ghi mang kho ln hn hay nh hn
kho tm kim, tm bn ghi mang kho nh nht m ln hn kho tm kim, tm bn ghi mang kho
ln nht m nh hn kho tm kim v.v... ci t nhng thut ton nu trn cho nhng trng
hp ny cn c mt s mm do nht nh.
Cng tng t nh sp xp, ta khng nn nh gi gii thut tm kim ny tt hn gii thut tm
kim khc. S dng thut ton tm kim ph hp vi tng yu cu c th l k nng ca ngi lp
trnh, vic ci t cy nh phn tm kim hay cy tm kim c s ch tm kim trn vi chc bn
ghi ch khng nh c mt iu r rng: khng bit th no l gii thut v lp trnh.
Bi tp
1. Khng c cch g hiu nhanh mt thut ton v cu trc d liu bng cch ci t chng, tng
t nh bi ton sp xp, hy th vit mt chng trnh SearchDemo tng t nh vy
2. Vit thm vo chng trnh SortDemo bi trc th tc TreeSort v nh gi tc thc ca
n.
3. Tm hiu cc phng php tm kim ngoi, cu trc ca cc B_cy
4. Tm hiu cc phng php tm kim chui, thut ton BRUTE-FORCE, thut ton KNUTH-
MORRIS-PRATT, thut ton BOYER-MOORE v thut ton RABIN-KARP
Tuy gi l chuyn v "Cu trc d liu v gii thut" nhng thc ra, ta mi ch tm hiu qua v
hai dng cu trc d liu hay gp l danh sch v cy, cng vi mt s thut ton m "u cng
phi c" l tm kim v sp xp. 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.
L Minh Hong
Quy hoch ng \1[
MC LC
L Minh Hong
Quy hoch ng \2[
L Minh Hong
Quy hoch ng \3[
V d F[5, 5] s c tnh bng F[4, 5] + F[5, 0], hay F[3, 5] s c tnh bng F[2, 5] + F[3, 2].
Chnh v vy tnh F[m, v] th F[m - 1, v] v F[m, v - m] phi c tnh trc. Suy ra th t hp
l tnh cc phn t trong bng F s phi l theo th t t trn xung v trn mi hng th tnh
theo th t t tri qua phi.
iu c ngha l ban u ta phi tnh hng 0 ca bng: F[0, v] = s dy c cc phn t 0 m
tng bng v, theo quy c bi th F[0, 0] = 1 cn F[0, v] vi mi v > 0 u l 0.
Vy gii thut dng rt n gin: Khi to dng 0 ca bng F: F[0, 0] = 1 cn F[0, v] vi mi v > 0
u bng 0, sau dng cng thc truy hi tnh ra tt c cc phn t ca bng F. Cui cng F[n, n]
l s cch phn tch cn tm
PROG01_1.PAS * m s cch phn tch s n
program Analyse1; {Bi ton phn tch s}
const
max = 100;
var
F: array[0..max, 0..max] of LongInt;
n, m, v: Integer;
begin
Write('n = '); ReadLn(n);
FillChar(F[0], SizeOf(F[0]), 0); {Khi to dng 0 ca bng F ton s 0}
F[0, 0] := 1; {Duy ch c F[0, 0] = 1}
for m := 1 to n do {Dng cng thc tnh cc dng theo th t t trn xung di}
for v := 0 to n do {Cc phn t trn mt dng th tnh theo th t t tri qua phi}
if v < m then F[m, v] := F[m - 1, v]
else F[m, v] := F[m - 1, v] + F[m, v - m];
WriteLn(F[n, n], ' Analyses'); {Cui cng F[n, n] l s cch phn tch}
end.
L Minh Hong
Quy hoch ng \4[
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:
PROG01_3.PAS * m s cch phn tch s n
program Analyse3;
const
max = 100;
var
B: array[1..2, 0..max] of LongInt;{Bng B ch gm 2 dng thay cho 2 dng lin tip ca bng phng n}
n, m, v, x, y: Integer;
begin
Write('n = '); ReadLn(n);
{Trc ht, dng 1 ca bng B tng ng vi dng 0 ca bng phng n F, c in c s quy hoch ng}
FillChar(B[1], SizeOf(B[1]), 0);
B[1][0] := 1;
x := 1; {Dng B[x] ng vai tr l dng hin thi trong bng phng n}
y := 2; {Dng B[y] ng vai tr l dng k tip trong bng phng n}
for m := 1 to n do
begin
{Dng dng x tnh dng y Dng dng hin thi trong bng phng n tnh dng k tip}
for v := 0 to n do
if v < m then B[y][v] := B[x][v]
else B[y][v] := B[x][v] + B[y][v - m];
x := 3 - x; y := 3 - y; {o gi tr x v y, tnh xoay li}
end;
WriteLn(B[x][n], ' Analyses');
end.
Bi tp:
1. Kt hp vi chng trnh phn tch s dng thut ton quay lui, kim tra tnh ng n ca cng
thc truy hi trn vi n 30.
2. Hy cho bit c bao nhiu cch phn tch s nguyn dng n 1000 thnh tng ca nhng s
nguyn dng khc nhau i mt, cc cch phn tch l hon v ca nhau ch tnh l mt cch.
3. Cng thc truy hi trn c th tnh bng hm quy nh trong chng trnh sau:
L Minh Hong
Quy hoch ng \5[
program Analyse5;
var
n: Integer;
begin
Write('n = '); ReadLn(n);
WriteLn(F(n, n), ' Analyses');
end.
L Minh Hong
Quy hoch ng \6[
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.
II. PHNG PHP QUY HOCH NG
Phng php quy hoch ng dng gii bi ton ti u c bn cht quy, tc l vic tm
phng n ti u cho bi ton c th a v tm phng n ti u ca mt s hu hn cc bi
ton con. i vi nhiu thut ton quy chng ta tm hiu, nguyn l chia tr (divide and
conquer) thng ng vai tr ch o trong vic thit k thut ton. gii quyt 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:
L Minh Hong
Quy hoch ng \7[
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:
V d: Dy Fibonacci l dy s nguyn dng c nh ngha nh sau:
F1 = F2 = 1;
i: 3 i: Fi = Fi-1 + Fi-2
Hy tnh F6
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.
Trong cch 1, ta vit mt hm quy F(i) tnh s Fibonacci th i. Chng trnh chnh gi F(6),
n s gi tip F(5) v F(4) tnh ... Qu trnh tnh ton c th v nh cy di y. Ta nhn thy
tnh F(6) n phi tnh 1 ln F(5), hai ln F(4), ba ln F(3), nm ln F(2), ba ln F(1).
F(6)
F(5) F(4)
F(3) F(2)
F(4) F(3)
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.
L Minh Hong
Quy hoch ng \8[
Cui cng, trc khi kho st mt s bi ton quy hoch ng, ta nhc li: Phng php tt nht
gii quyt mi bi ton trong tin hc l bit s dng v phi hp uyn chuyn nhiu thut ton,
khng c lm dng hay coi thng bt c mt phng php no.
L Minh Hong
Quy hoch ng \9[
Cch gii:
B sung vo A hai phn t: a0 = - v an+1 = +. Khi dy con n iu tng di nht chc
chn s bt u t a0 v kt thc an+1.
Vi i: 0 i n + 1. Ta s tnh L[i] = di dy con n iu tng di nht bt u ti ai.
1. C s quy hoch ng (bi ton nh nht):
L[n + 1] = di dy con n iu tng di nht bt u ti an+1 = +. Dy con ny ch gm mi
mt phn t (+) nn L[n + 1] = 1.
2. Cng thc truy hi:
Gi s vi i t n n 0, ta cn tnh L[i]: di dy con tng di nht bt u ti ai. L[i] c tnh
trong iu kin L[i + 1], L[i + 2], ..., L[n + 1] bit:
Dy con n iu tng di nht bt u t ai s c thnh lp bng cch ly ai ghp vo u mt
trong s nhng dy con n iu tng di nht bt u ti v tr aj ng sau ai. Ta s chn dy no
ghp ai vo u? Tt nhin l ch c ghp ai vo u nhng dy con bt u ti aj no ln
hn ai ( m bo tnh tng) v d nhin ta s chn dy di nht ghp ai vo u ( m bo
tnh di nht). Vy L[i] c tnh nh sau: Xt tt c cc ch s j trong khong t i + 1 n n + 1
m aj > ai, chn ra ch s jmax c L[jmax] ln nht. t L[i] := L[jmax] + 1.
3. Truy vt
Ti bc xy dng dy L, mi khi tnh L[i] := L[jmax] + 1, ta t T[i] = jmax. lu li rng: Dy
con di nht bt u ti ai s c phn t th hai k tip l ajmax.
Sau khi tnh xong hay dy L v T, ta bt u t 0. T[0] l phn t u tin c chn,
L Minh Hong
Quy hoch ng \ 10 [
i 0 1 2 3 4 5 6 7 8 9 10 11
ai - 5 2 3 4 9 10 5 6 7 8 +
L[i] 9 5 8 7 6 3 2 5 4 3 2 1
T[i] 2 8 3 4 7 6 11 8 9 10 11
Tracing
procedure Enter; {Nhp d liu t thit b nhp chun theo ng khun dng Input}
var
i: Word;
begin
ReadLn(n);
for i := 1 to n do Read(a[i]);
end;
begin
{nh ngha li thit b nhp/xut chun}
L Minh Hong
Quy hoch ng \ 11 [
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].
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]
L Minh Hong
Quy hoch ng \ 12 [
0 1 ... M
0 0 0 0 0
1
2
... ...
n
4. Truy vt:
Tnh xong bng phng n th ta quan tm n F[n, M] chnh l gi tr ln nht thu c khi
chn trong c n gi vi gii hn trng lng M. Nu F[n, M] = F[n - 1, M] th tc l khng chn
gi th n, ta truy tip F[n - 1, M]. Cn nu F[n, M] F[n - 1, M] th ta thng bo rng php chn ti
u c chn gi th n v truy tip F[n - 1, M - Wn]. C tip tc cho ti khi truy ln ti hng 0 ca
bng phng n.
PROG03_2.PAS * Bi ton ci ti
program The_Bag;
const
max = 100;
var
W, V: Array[1..max] of Integer;
F: array[0..max, 0..max] of Integer;
n, M: Integer;
procedure Optimize; {Tnh bng phng n bng cng thc truy hi}
var
i, j: Integer;
begin
FillChar(F[0], SizeOf(F[0]), 0); {in c s quy hoch ng}
for i := 1 to n do
for j := 0 to M do
begin {Tnh F[i, j]}
L Minh Hong
Quy hoch ng \ 13 [
begin
{nh ngha li thit b nhp/xut chun}
Assign(Input, 'BAG.INP'); Reset(Input);
Assign(Output, 'BAG.OUT'); Rewrite(Output);
Enter;
Optimize;
Trace;
Close(Input); Close(Output);
end.
III. BIN I XU
Cho xu k t X, xt 3 php bin i:
a) Insert(i, C): i l s, C l k t: Php Insert chn k t C vo sau v tr i ca xu X.
b) Replace(i, C): i l s, C l k t: Php Replace thay k t ti v tr i ca xu X bi k t C.
c) Delete(i): i l s, Php Delete xo k t ti v tr i ca xu X.
Yu cu: Cho trc xu Y, hy tm mt s t nht cc php bin i trn bin xu X thnh xu Y.
Input: file vn bn STR.INP
Dng 1: Cha xu X ( di 100)
Dng 2: Cha xu Y ( di 100)
Output: file vn bn STR.OUT ghi cc php bin i cn thc hin v xu X ti mi php bin i.
STR.INP STR.OUT
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, ...
L Minh Hong
Quy hoch ng \ 14 [
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.
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: X1X2 ... Xi thnh xu gm j k t u ca xu Y: Y1Y2...Yj.
Ta nhn thy rng X = X1X2...Xm v Y = Y1Y2...Yn nn:
Nu Xm = Yn th ta ch cn bin on X1X2...Xm-1 thnh Y1Y2...Yn-1 tc l trong trng hp ny
F[m, n] = F[m - 1, n - 1].
Nu Xm Yn th ti v tr Xm ta c th s dng mt trong 3 php bin i:
a) Hoc chn vo sau v tr m ca X, mt k t ng bng Yn:
X = X1X2... Xm-1 Xm Yn
Y = Y1Y2... Yn-1 Yn
Th khi F[m, n] s bng 1 php chn va ri cng vi s php bin i bin dy X1...Xm
thnh dy Y1...Yn-1: F[m, n] = 1 + F[m, n - 1]
b) Hoc thay v tr m ca X bng mt k t ng bng Yn
X = X1X2... Xm-1 Xm := Yn
Y = Y1Y2... Yn-1 Yn
Th khi F[m, n] s bng 1 php thay va ri cng vi s php bin i bin dy X1...Xm-1
thnh dy Y1...Yn-1: F[m, n] = 1 + F[m-1, n - 1]
c) Hoc xo v tr th m ca X
X = X1X2... Xm-1 Xm
Y = Y1Y2... Yn-1 Yn
Th khi F[m, n] s bng 1 php xo va ri cng vi s php bin i bin dy X1...Xm-1
thnh dy Y1...Yn: F[m, n] = 1 + F[m-1, n]
V F[m, n] phi l nh nht c th, nn trong trng hp Xm Yn th
F[m, n] = min(F[m, n - 1], F[m - 1, n - 1], F[m - 1, n]) + 1.
Ta xy dng xong cng thc truy hi.
2. C s quy hoch ng
F[0, j] l s php bin i bin xu rng thnh xu gm j k t u ca F. N cn ti thiu j
php chn: F[0, j] = j
F[i, 0] l s php bin i bin xu gm i k t u ca S thnh xu rng, n cn ti thiu i php
xo: F[i, 0] = i
Vy u tin bng phng n F (c[0..m, 0..n]) c khi to hng 0 v ct 0 l c s quy hoch
ng. T dng cng thc truy hi tnh ra tt c cc phn t bng B.
Sau khi tnh xong th F[m, n] cho ta bit s php bin i ti thiu.
Truy vt:
Nu Xm = Yn th ch vic xt tip F[m - 1, n - 1].
Nu khng, xt 3 trng hp:
Nu F[m, n] = F[m, n - 1] + 1 th php bin i u tin c s dng l: Insert(m, Yn)
L Minh Hong
Quy hoch ng \ 15 [
Lu : khi truy vt, trnh truy nhp ra ngoi bng, nn to vin cho bng.
PROG03_3.PAS * Bin i xu
program StrOpt;
const
max = 100;
var
X, Y: String[2 * max];
F: array[-1..max, -1..max] of Integer;
m, n: Integer;
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
Quy hoch ng \ 16 [
begin
Dec(m); Dec(n); {Ch vic truy cho ln trn bng phng n}
end
else {Ti y cn mt php bin i}
begin
Write(X, ' -> '); {In ra xu X trc khi bin i}
if F[m, n] = F[m, n - 1] + 1 then {Nu y l php chn}
begin
Write('Insert(', m, ', ', Y[n], ')');
Insert(Y[n], X, m + 1);
Dec(n); {Truy sang phi}
end
else
if F[m, n] = F[m - 1, n - 1] + 1 then {Nu y l php thay}
begin
Write('Replace(', m, ', ', Y[n], ')');
X[m] := Y[n];
Dec(m); Dec(n); {Truy cho ln trn}
end
else {Nu y l php xo}
begin
Write('Delete(', m, ')');
Delete(X, m, 1);
Dec(m); {Truy ln trn}
end;
WriteLn(' -> ', X); {In ra xu X sau php bin i}
end;
end;
begin
Assign(Input, 'STR.INP'); Reset(Input);
Assign(Output, 'STR.OUT'); Rewrite(Output);
Enter;
Optimize;
Trace;
Close(Input); Close(Output);
end.
Bi ny gii vi cc xu 100 k t, nu lu bng phng n di dng mng cp pht ng th c
th lm vi cc xu 255 k t. (Tt hn nn lu mi dng ca bng phng n l mt mng cp
pht ng 1 chiu). Hy t gii thch ti sao khi gii hn di d liu l 100, li phi khai bo X
v Y l String[200] ch khng phi l String[100] ?.
IV. DY CON C TNG CHIA HT CHO K
Cho mt dy gm n ( n 1000) s nguyn dng A1, A2, ..., An v s nguyn dng k (k 50).
Hy tm dy con gm nhiu phn t nht ca dy cho sao cho tng cc phn t ca dy con ny
chia ht cho k.
Cch gii:
bi yu cu chn ra mt s ti a cc phn t trong dy A c mt dy c tng chia ht cho
k, ta c th gii bi ton bng phng php duyt t hp bng quay lui c nh gi nhnh cn nhm
gim bt chi ph trong k thut vt cn. Di y ta trnh by phng php quy hoch ng:
Nhn xt 1: Khng nh hng n kt qu cui cng, ta c th t:
Ai := Ai mod k vi i: 1 i n
Nhn xt 2: Gi S l tng cc phn t trong mng A, ta c th thay i cch tip cn bi ton: thay
v tm xem phi chn ra mt s ti a nhng phn t c tng chia ht cho k, ta s chn ra mt s
L Minh Hong
Quy hoch ng \ 17 [
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 2 3 4 1 0 2 4 0 14 6 9 36 9
5 6 7 8 * 0 1 0 5 1 = 34 14 25 100 21
9 10 11 12 3 0 1 6 1 54 22 41 164 33
1 1 1 1 1
thc hin php nhn hai ma trn A(mxn) v B(nxp) ta c th lm nh on chng trnh sau:
for i := 1 to p do
for j := 1 to r do
L Minh Hong
Quy hoch ng \ 18 [
begin
cij := 0;
for k := 1 to q do cij := cij + aik * bkj;
end;
Ph tn thc hin php nhn ny c th nh gi qua s php nhn, nhn hai ma trn A(pxq)
v B(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, ta thc hin (A * B) trc, c ma trn X kch thc 3x10 sau 3.4.10 =
120 php nhn s. Sau ta thc hin X * 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), ta thc hin (B * C) trc, c ma trn Y kch thc 4x15 sau 4.10.15 =
600 php nhn s. Sau ta thc hin A * Y 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 khi
thc hin php nhn mt dy cc ma trn:
M1 * M2 * ... * Mn
Vi :
M1 l ma trn kch thc a1 x a2
M2 l ma trn kch thc a2 x a3
...
Mn l ma trn kch thc an x an+1
Input: file vn bn MATRIXES.INP
Dng 1: Cha s nguyn dng n 100
Dng 2: Cha n + 1 s nguyn dng a1, a2, ..., an+1 (i: 1 ai 100) cch nhau t nht mt du
cch
Output: file vn bn MATRIXES.OUT
Dng 1: Ghi s php nhn s hc ti thiu cn thc hin
Dng 2: Ghi biu thc kt hp ti u ca php nhn dy ma trn
MATRIXES.INP MATRIXES.OUT
6 31
3 2 3 1 2 2 3 ((M[1] * (M[2] * M[3])) * ((M[4] * M[5]) * M[6]))
Trc ht, nu dy ch c mt ma trn th chi ph bng 0, tip theo ta nhn thy nhn mt cp ma
trn th khng c chuyn kt hp g y c, chi ph cho php nhn l tnh c ngay. Vy th
ph tn cho php nhn hai ma trn lin tip trong dy l hon ton c th ghi nhn li c. S dng
nhng thng tin ghi nhn ti u ho ph tn nhn nhng b ba ma trn lin tip ... C tip tc
nh vy cho ti khi ta tnh c ph tn nhn n ma trn lin tip.
1. Cng thc truy hi:
Gi F[i, j] l s php nhn ti thiu cn thc hin nhn on ma trn lin tip: Mi*Mi+1*...*Mj.
Th khi F[i, i] = 0 vi i.
tnh Mi * Mi+1 * ... * Mj, ta c th c nhiu cch kt hp:
Mi * Mi+1 * ... * Mj = (Mi * Mi+1 * ... * Mk) * (Mk+1 * Mk+2 * ... * Mj) (Vi i k < j)
L Minh Hong
Quy hoch ng \ 19 [
Vi mt cch kt hp (ph thuc vo cch chn v tr k), chi ph ti thiu phi thc hin bng:
Chi ph thc hin php nhn Mi * Mi+1 * ... * Mk = F[i, k]
Cng vi chi ph thc hin php nhn Mk+1 * Mk+2 * ... * Mj = F[k + 1, j]
Cng vi chi ph thc hin php nhn hai ma trn cui cng: ma trn to thnh t php nhn (Mi
* Mi+1 * ... * Mk) c kch thc ai x ak+1 v ma trn to thnh t php nhn (Mk+1 * Mk+2 * ... *
Mj) c kch thc ak+1 x aj+1, vy chi ph ny l ai * ak+1 * aj+1.
T suy ra: do c nhiu cch kt hp, m ta cn chn cch kt hp c chi ph t nht nn ta s
cc tiu ho F[i, j] theo cng thc:
F[i, j] = min(F[i, k] + F[k + 1, j] + ai * a k + 1 * aj+ 1)
i k <j
procedure Optimize;
var
i, j, k, len: Integer;
x, p, q, r: LongInt;
begin
for i := 1 to n do
for j := i to n do
if i = j then F[i, j] := 0
else F[i, j] := MaxLong; {Khi to bng phng n: ng cho chnh = 0, cc khc = +}
for len := 2 to n do {Tm cch kt hp ti u nhn on gm len ma trn lin tip}
L Minh Hong
Quy hoch ng \ 20 [
for i := 1 to n - len + 1 do
begin
j := i + len - 1; {Tnh F[i, j]}
for k := i to j - 1 do {Xt mi v tr phn hoch k}
begin
{Gi s ta tnh Mi * ... * Mj = (Mi * ... * Mk) * (Mk+1 * ... * Mj)}
p := a[i]; q := a[k + 1]; r := a[j + 1]; {Kch thc 2 ma trn s nhn cui cng}
x := F[i, k] + F[k + 1, j] + p * q * r; {Chi ph nu phn hoch theo k}
if x < F[i, j] then {Nu php phn hoch tt hn F[i, j] th ghi nhn li}
begin
F[i, j] := x;
T[i, j] := k;
end;
end;
end;
end;
begin
Assign(Input, 'MATRIXES.INP'); Reset(Input);
Assign(Output, 'MATRIXES.OUT'); Rewrite(Output);
Enter;
Optimize;
WriteLn(F[1, n]); {S php nhn cn thc hin}
Trace(1, n); {Truy vt bng quy}
WriteLn;
Close(Input); Close(Output);
end.
VI. BI TP LUYN TP
Nhn xt: Nhiu v k, d, kh, di, ngn, to, nh c ht!
A. Bi tp c gi li gii
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 ?
Gi :
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 dng x1 x2 ...xn ; x1, x2, ...xn y l cc
L Minh Hong
Quy hoch ng \ 21 [
L Minh Hong
Quy hoch ng \ 22 [
TM
Tn ti mt cch chn ra mt s gi ko c tng s ko l T (b[T] +)
T ln nht c th
Sau chn ra mt s gi ko c T vin ko, cc gi ko c a vo mt nhm, s cn
li vo nhm th hai.
4. Cho mt bng A kch thc m x n, trn ghi cc s nguyn. Mt ngi xut pht ti no
ca ct 1, cn sang ct n (ti no cng c). Quy tc: T A[i, j] ch c quyn sang mt
trong 3 A[i, j + 1]; A[i - 1, j + 1]; A[i + 1, j + 1]. Hy tm v tr xut pht v hnh trnh i t
ct 1 sang ct n sao cho tng cc s ghi trn ng i l ln nht.
1 2 6 7 9
7 6 5 6 7
1 2 3 4 2
4 7 8 7 6
Gi :
Gi B[i, j] l s im ln nht c th c c khi ti A[i, j]. R rng i vi nhng ct 1 th
B[i, 1] = A[i, 1]:
A B
1 2 6 7 9 1
7 6 5 6 7 7
1 2 3 4 2 1
4 7 8 7 6 4
Vi nhng (i, j) cc ct khc. V ch nhng (i, j - 1), (i - 1, j - 1), (i + 1, j - 1) l c th sang
c (i, j), v khi sang (i, j) th s im c cng thm A[i, j] na. Chng ta cn B[i, j] l s
im ln nht c th nn B[i, j] = max(B[i, j - 1], B[i - 1, j - 1], B[i + 1, j - 1]) + A[i, j]. Ta dng
cng thc truy hi ny tnh tt c cc B[i, j]. Cui cng chn ra B[i, n] l phn t ln nht trn ct n
ca bng B v t truy vt tm ra ng i nhiu im nht.
B. Bi tp t lm
1. Bi ton ci ti vi kch thc nh nu trn l khng thc t, chng c siu th no c 100 gi
hng c. Hy lp chng trnh gii bi ton ci ti vi n 10000; M 1000.
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 S1, S2. Tm xu S3 c di ln nht l xu con ca
c S1 v S2. V d: S1 = 'abcdefghi123'; S2 = 'abc1def2ghi3' th S3 l 'abcdefghi3'.
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:
1. i xng
2. Cha xu S
3. 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
L Minh Hong
Quy hoch ng \ 23 [
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
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.
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 2 3 4 5 6
1 1 4 4 0 6
6 3 1 1 6 1
Bit rng 1 n 100 v 0 ai, bi 6 vi i: 1 i n. Cho php lt ngc cc qun -mi-n. Khi
mt qun -mi-n th i b lt, n s c s ghi trn l b[i] v s ghi di l a[i].
Vn t ra l hy tm cch lt cc qun -mi-n sao cho chnh lch gia tng cc s ghi
hng trn v tng cc s ghi hng dii l ti thiu. Nu c nhiu phng n lt tt nh nhau,
th ch ra phng n phi lt t qun nht.
Nh v d trn th s lt hai qun -mi-n th 5 v th 6. Khi :
Tng cc s hng trn = 1 + 1 + 4 + 4 + 6 + 1 = 17
Tng cc s hng di = 6 + 3 + 1 + 1 + 0 + 6 = 17
6. Xt bng H kch thc 4x4, cc hng v cc ct c nh ch s A, B, C, D. Trn 16 ca
bng, mi ghi 1 k t A hoc B hoc C hoc D.
A B C D
A A A B B
B C D A B
C B C B A
D B D D D
Cho xu S gm n k t ch gm cc ch A, B, C, D.
Xt php co R(i): thay k t Si v Si+1 bi k t nm trn hng Si, ct Si+1 ca bng H.
V d: S = ABCD; p dng lin tip 3 ln R(1) s c
ABCD ACD BD B.
Yu cu: Cho trc mt k t X{A, B, C, D}, hy ch ra th t thc hin n - 1 php co k t
cn li cui cng trong S l X.
7. Cho N s t nhin A1, A2, ..., AN. Bit rng 1 N 200 v 0 Ai 200. Ban u cc s c t
lin tip theo ng th t cch nhau bi du "?": A1 ? A2 ? ... ? AN. Yu cu: Cho trc s nguyn
K, hy tm cch thay cc du "?" bng du cng hay du tr c mt biu thc s hc cho gi
tr l K. Bit rng 1 N 200 v 0 Ai 100.
V d: Ban u 1 ? 2 ? 3 ? 4 v K = 0 s cho kt qu 1 - 2 - 3 + 4.
8. Dy Catalant l mt dy s t nhin bt u l 0, kt thc l 0, hai phn t lin tip hn km nhau
1 n v. Hy lp chng trnh nhp vo s nguyn dng n l v mt s nguyn dng p. Cho bit
rng nu nh ta em tt c cc dy Catalant di n xp theo th t t in th dy th p l dy
no.
i vi phng php quy hoch ng, lng b nh dng lu bng phng n c th rt ln
nn ta tit kim c cng nhiu cng tt. Nu bng phng n c tnh di dng dng dng i
tnh dng i + 1 th r rng vic lu tr cc dng i - 1, i - 2... by gi l khng cn thit, ta c th
L Minh Hong
Quy hoch ng \ 24 [
ci tin bng cch dng 2 mng trc, sau tng ng vi 2 dng i, i + 1 ca bng v c dng
chng tnh li ln nhau, thm ch ch cn dng 1 mng tng ng vi 1 dng v tnh li chnh n
nh v d u tin lm, nh vy c th tit kim c b nh chy cc d liu ln.
Mt bi ton quy hoch ng c th c nhiu cch tip cn khc nhau, chn cch no l tu theo
yu cu bi ton sao cho d dng ci t nht. Phng php ny thng khng kh khn trong vic
tnh bng phng n, khng kh khn trong vic tm c s quy hoch ng, m kh khn chnh l
nhn nhn ra bi ton quy hoch ng v tm ra cng thc truy hi gii n, cng vic ny i
hi s nhanh nhy, khn kho, m ch t kinh nghim v s rn luyn mi c ch chng c l
thuyt no cho ta mt phng php chung tht c th gii mi bi ton quy hoch ng c.
L Minh Hong
L thuyt th \1[
MC LC
0. M U .......................................................................................................................................... 3
1. CC KHI NIM C BN.............................................................................................................. 4
I. NH NGHA TH (GRAPH) ..................................................................................................................4
II. CC KHI NIM..........................................................................................................................................5
2. BIU DIN TH TRN MY TNH............................................................................................ 6
I. MA TRN LIN K (MA TRN K) ..........................................................................................................6
II. DANH SCH CNH.....................................................................................................................................7
III. DANH SCH K .........................................................................................................................................7
IV. NHN XT...................................................................................................................................................8
3. CC THUT TON TM KIM TRN TH ............................................................................. 10
I. BI TON.....................................................................................................................................................10
II. THUT TON TM KIM THEO CHIU SU (DEPTH FIRST SEARCH)..........................................11
III. THUT TON TM KIM THEO CHIU RNG (BREADTH FIRST SEARCH)...............................16
IV. PHC TP TNH TON CA BFS V DFS...................................................................................21
4. TNH LIN THNG CA TH ................................................................................................. 22
I. NH NGHA................................................................................................................................................22
II. TNH LIN THNG TRONG TH V HNG................................................................................23
III. TH Y V THUT TON WARSHALL ..............................................................................23
IV. CC THNH PHN LIN THNG MNH...........................................................................................26
5. VI NG DNG CA CC THUT TON TM KIM TRN TH ........................................ 36
I. XY DNG CY KHUNG CA TH .................................................................................................36
II. TP CC CHU TRNH C BN CA TH.......................................................................................38
III. NH CHIU TH V BI TON LIT K CU...........................................................................39
IV. LIT K KHP..........................................................................................................................................44
I. BI TON 7 CI CU ................................................................................................................................47
II. NH NGHA...............................................................................................................................................47
III. NH L.....................................................................................................................................................47
IV. THUT TON FLEURY TM CHU TRNH EULER .............................................................................48
V. CI T......................................................................................................................................................48
VI. THUT TON TT HN.........................................................................................................................50
7. CHU TRNH HAMILTON, NG I HAMILTON, TH HAMILTON.................................... 53
I. NH NGHA................................................................................................................................................53
II. NH L ......................................................................................................................................................53
III. CI T.....................................................................................................................................................53
8. BI TON NG I NGN NHT........................................................................................... 57
I. TH C TRNG S...............................................................................................................................57
II. BI TON NG I NGN NHT......................................................................................................57
III. TRNG HP TH KHNG C CHU TRNH M - THUT TON FORD BELLMAN...........58
IV. TRNG HP TRNG S TRN CC CUNG KHNG M - THUT TON DIJKSTRA.............60
V. THUT TON DIJKSTRA V CU TRC HEAP.................................................................................63
VI. TRNG HP TH KHNG C CHU TRNH - TH T T P ................................................65
L Minh Hong
L thuyt th \2[
L Minh Hong
L thuyt th \3[
0. M U
Trn thc t c nhiu bi ton lin quan ti mt tp cc i tng v nhng mi
lin h gia chng, i hi ton hc phi t ra mt m hnh biu din mt cch
cht ch v tng qut bng ngn ng k hiu, l th. Nhng tng c bn
ca n c a ra t th k th XVIII bi nh ton hc Thu S Leonhard Euler,
ng dng m hnh th gii bi ton v nhng cy cu Konigsberg ni
ting.
Trc khi tm hiu cc vn v l thuyt th, bn phi c k thut lp trnh kh tt, ngoi ra
nu c tm hiu trc v cc k thut vt cn, quay lui, mt s phng php ti u ho, cc bi
ton quy hoch ng th s gip ch nhiu cho vic c hiu cc bi ging ny.
L Minh Hong
L thuyt th \4[
1. CC KHI NIM C BN
I. NH NGHA TH (GRAPH)
L mt cu trc ri rc gm cc nh v cc cnh ni cc nh . c m t hnh thc:
G = (V, E)
V gi l tp cc nh (Vertices) v E gi l tp cc cnh (Edges). C th coi E l tp cc cp (u, v)
vi u v v l hai nh ca V.
Mt s hnh nh ca th:
L Minh Hong
L thuyt th \5[
L Minh Hong
L thuyt th \6[
1 2 3 4 5 1
1 0 0 1 0 0
2 0 0 0 1 0 5 2
3 0 0 0 0 1
4 1 0 0 0 0
4 3
5 0 1 0 0 0
L Minh Hong
L thuyt th \7[
5 2
4 3
Ci t trn mng:
1 2 3 4 5
(1, 3) (2, 4) (3, 5) (4, 1) (5, 2)
L Minh Hong
L thuyt th \8[
1 2
4 3
Cch 1: (Forward Star) Dng mt mng cc nh, mng chia lm n on, on th i trong mng
lu danh sch cc nh k vi nh i: V d vi th sau, danh sch k s l mt mng A 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
on 1 on 2 on 3 on 4 on 5
bit mt on nm t ch s no n ch s no, ta c mt mng lu v tr ring. Ta gi mng lu
v tr l mng Head. Head[i] s bng ch s ng lin trc on th i. Quy c Head[n + 1] s
bng m. Vi th bn th mng VT[1..6] s l: (0, 3, 5, 8, 10, 12)
Nh vy on t v tr Head[i] + 1 n Head[i + 1] trong mng A s cha cc nh k vi nh i.
Lu rng vi th c hng gm m cung th cu trc Forward Star cn phi cha m phn t,
vi th v hng m cnh th cu trc Forward Star cn phi cha 2m phn t
Cch 2: Dng cc danh sch mc ni: Vi mi nh i ca th, ta cho tng ng vi n mt danh
sch mc ni cc nh k vi i, c ngha l tng ng vi mt nh i, ta phi lu li List[i] l cht
ca mt danh sch mc ni. V d vi th trn, danh sch mc ni s l:
List[1] 2 3 5 Nil
List[2] 1 3 Nil
List[3] 1 2 4 Nil
List[4] 3 5 Nil
List[5] 1 4 Nil
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
V l thuyt, so vi hai phng php biu din trn, danh sch k tt hn hn. 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.
IV. NHN XT
Trn y l nu cc cch biu din th trong b nh ca my tnh, cn nhp d liu cho th th
c nhiu cch khc nhau, dng cch no th tu. Chng hn nu biu din bng ma trn k m cho
nhp d liu c ma trn cp n x n (n l s nh) th khi nhp t bn phm s rt mt thi gian, ta cho
nhp kiu danh sch cnh cho nhanh. Chng hn mng A (nxn) l ma trn k ca mt th v
hng th ta c th khi to ban u mng A gm ton s 0, sau cho ngi s dng nhp cc
cnh bng cch nhp cc cp (i, j); chng trnh s tng A[i, j] v A[j, i] ln 1. Vic nhp c th cho
kt thc khi ngi s dng nhp gi tr i = 0. V d:
program Nhap_Do_Thi;
L Minh Hong
L thuyt th \9[
var
A: array[1..100, 1..100] of Integer; {Ma trn k ca th}
n, i, j: Integer;
begin
Write('Number of vertices'); ReadLn(n);
FillChar(A, SizeOf(A), 0);
repeat
Write('Enter edge (i, j) (i = 0 to exit) ');
ReadLn(i, j); {Nhp mt cp (i, j) tng nh l nhp danh sch cnh}
if i <> 0 then
begin {nhng lu tr trong b nh li theo kiu ma trn k}
Inc(A[i, j]);
Inc(A[j, i]);
end;
until i = 0; {Nu ngi s dng nhp gi tr i = 0 th dng qu trnh nhp, nu khng th tip tc}
end.
Trong nhiu trng hp khng gian lu tr, vic chuyn i t cch biu din no sang cch
biu din khc khng c g kh khn. Nhng i vi thut ton ny th lm trn ma trn k ngn
gn hn, i vi thut ton kia c th lm trn danh sch cnh d dng hn v.v... Do , vi mc
ch d hiu, cc chng trnh sau ny s la chn phng php biu din sao cho vic ci t n
gin nht nhm nu bt c bn cht thut ton. Cn trong trng hp c th bt buc phi dng
mt cch biu din no khc, th vic sa i chng trnh cng khng tn qu nhiu thi gian.
L Minh Hong
L thuyt th \ 10 [
1 1
4 4
6 5 6 5
L Minh Hong
L thuyt th \ 11 [
GRAPH.INP GRAPH.OUT
2 4 8 7 1 5 1, 2, 3, 5, 4, 6,
6 1 2 5<-3<-2<-1
1 3
1 7 2 3
8 2 4
3 5
3 5 4 6
7 8
1. Ci t quy
T tng ca thut ton c th trnh by nh sau: Trc ht, mi nh x k vi S tt nhin s n
c t S. Vi mi nh x k vi S th tt nhin nhng nh y k vi x cng n c t S...
iu gi cho ta vit mt th tc quy DFS(u) m t vic duyt t nh u bng cch thng
bo thm nh u v tip tc qu trnh duyt DFS(v) vi v l mt nh cha thm k vi u.
khng mt nh no b lit k ti hai ln, ta s dng k thut nh du, mi ln thm mt
nh, ta nh du nh li cc bc duyt quy k tip khng duyt li nh na
lu li ng i t nh xut pht S, trong th tc DFS(u), trc khi gi quy DFS(v)
vi v l mt nh k vi u m cha nh du, ta lu li vt ng i t u ti v bng cch t
TRACE[v] := u, tc l TRACE[v] lu li nh lin trc v trong ng i t S ti v. Khi qu
trnh tm kim theo chiu su kt thc, ng i t S ti F s l:
F p1 = Trace[F] p2 = Trace[p1] ... S.
procedure DFS(uV);
begin
< 1. Thng bo ti c u >;
< 2. nh du u l thm (c th ti c t S)>;
< 3. Xt mi nh v k vi u m cha thm, vi mi nh v >;
begin
Trace[v] := u; {Lu vt ng i, nh m t ti v l u}
DFS(v); {Gi quy duyt tng t i vi v}
end;
end;
L Minh Hong
L thuyt th \ 12 [
begin
{nh ngha li thit b nhp/xut chun thnh Input/Output file}
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
FillChar(Free, n, True);
DFS(S);
Result;
{ng Input/Output file, thc ra khng cn v BP t ng ng thit b nhp xut chun trc khi kt thc chng trnh}
Close(Input);
Close(Output);
end.
Ch :
a) V c k thut nh du, nn th tc DFS s c gi n ln (n l s nh)
b) ng i t S ti F c th c nhiu, trn ch l mt trong s cc ng i. C th l ng
i c th t t in nh nht.
L Minh Hong
L thuyt th \ 13 [
3 5 3 5
3rd 4th
Hnh 3: Cy DFS
Hi: nh 2 v 3 u k vi nh 1, nhng ti sao DFS(1) ch gi quy ti DFS(2) m khng gi DFS(3) ?.
Tr li: ng l c 2 v 3 u k vi 1, nhng DFS(1) s tm thy 2 trc v gi DFS(2). Trong DFS(2) s xt tt c cc nh k vi 2
m cha nh du th d nhin trc ht n tm thy 3 v gi DFS(3), khi 3 b nh du nn khi kt thc qu trnh quy gi
DFS(2), li v DFS(1) th nh 3 c thm ( b nh du) nn DFS(1) s khng gi DFS(3) na.
Hi: Nu F = 5 th ng i t 1 ti 5 trong chng trnh trn s in ra th no ?.
Tr li: DFS(5) do DFS(3) gi nn Trace[5] = 3. DFS(3) do DFS(2) gi nn Trace[3] = 2. DFS(2) do DFS(1) gi nn Trace[2] = 1. Vy
ng i l: 5 3 2 1.
Vi cy th hin qu trnh quy DFS trn, ta thy nu dy chuyn quy l: DFS(S) DFS
(u1) DFS(u2) ... Th th tc DFS no gi cui dy chuyn s c thot ra u tin, th tc
DFS(S) gi u dy chuyn s c thot cui cng. Vy nn chng, ta c th m t dy chuyn
quy bng mt ngn xp (Stack).
2. Ci t khng quy
Khi m t qu trnh quy bng mt ngn xp, ta lun lun cho ngn xp lu li dy chuyn
duyt su t nt gc (nh xut pht S).
<Thm S, nh du S thm>;
<y S vo ngn xp>; {Dy chuyn quy ban u ch c mt nh S}
repeat
<Ly u khi ngn xp>; {ang ng nh u}
if <u c nh k cha thm> then
begin
<Ch chn ly 1 nh v, l nh u tin k u m cha c thm>;
<Thng bo thm v>;
<y u tr li ngn xp>; {Gi li a ch quay lui}
<y tip v vo ngn xp>; {Dy chuyn duyt su c "ni" thm v na}
end;
{Cn nu u khng c nh k cha thm th ngn xp s ngn li, tng ng vi qu trnh li v ca dy chuyn DFS}
until <Ngn xp rng>;
L Minh Hong
L thuyt th \ 14 [
procedure DFS;
var
u, v: Integer;
begin
Write(S, ', '); Free[S] := False; {Thm S, nh du S thm}
Push(S); {Khi ng dy chuyn duyt su}
repeat
{Dy chuyn duyt su ang l S ... u}
u := Pop; {u l im cui ca dy chuyn duyt su hin ti}
for v := 1 to n do
if Free[v] and a[u, v] then {Chn v l nh u tin cha thm k vi u, nu c:}
begin
Write(v, ', '); Free[v] := False; {Thm v, nh du v thm}
Trace[v] := u; {Lu vt ng i}
Push(u); Push(v); {Dy chuyn duyt su by gi l S ... u v}
Break;
end;
until Last = 0; {Ngn xp rng}
end;
L Minh Hong
L thuyt th \ 15 [
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
Init;
DFS;
Result;
Close(Input);
Close(Output);
end.
V d: Vi th di y (S = 1), Ta th theo di qu trnh thc hin th tc tm kim theo chiu
su dng ngn xp v i snh th t cc nh c thm vi th t t 1st n 6th trong cy tm
kim ca th tc DFS dng quy.
4 6
2
1 7
8
3 5
L Minh Hong
L thuyt th \ 16 [
III. THUT TON TM KIM THEO CHIU RNG (BREADTH FIRST SEARCH)
1. Ci t bng hng i
C s ca phng php ci t ny l "lp lch" duyt cc nh. Vic thm mt nh s ln lch
duyt cc nh k n sao cho th t duyt l u tin chiu rng (nh no gn S hn s c duyt
trc). V d: Bt u ta thm nh S. Vic thm nh S s pht sinh th t duyt nhng nh (x1,
x2, ..., xp) k vi S (nhng nh gn S nht). Khi thm nh x1 s li pht sinh yu cu duyt nhng
nh (u1, u2 ..., uq) k vi x1. Nhng r rng cc nh u ny "xa" S hn nhng nh x nn chng ch
c duyt khi tt c nhng nh x duyt xong. Tc l th t duyt nh sau khi thm x1 s l:
(x2, x3..., xp, u1, u2, ..., uq).
S
x1 x2 ... xp
Hnh 4: Cy BFS
Gi s ta c mt danh sch cha nhng nh ang "ch" thm. Ti mi bc, ta thm mt nh u
danh sch v cho nhng nh cha "xp hng" k vi n xp hng thm vo cui danh sch. Chnh
v nguyn tc nn danh sch cha nhng nh ang ch s c t chc di dng hng i
(Queue)
Ta s dng gii thut nh sau:
Bc 1: Khi to:
L Minh Hong
L thuyt th \ 17 [
L Minh Hong
L thuyt th \ 18 [
u, v: Integer;
begin
repeat
u := Pop; {Ly mt nh u khi hng i}
Write(u, ', '); {Thng bo thm u}
for v := 1 to n do
if Free[v] and a[u, v] then {Xt nhng nh v cha nh du k u}
begin
Push(v); {a v vo hng i ch thm}
Free[v] := False; {nh du v}
Trace[v] := u; {Lu vt ng i: nh lin trc v trong ng i t S l u}
end;
until First > Last; {Cho ti khi hng i rng}
end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
Init;
BFS;
Result;
Close(Input);
Close(Output);
end.
V d: Xt th di y, nh xut pht S = 1.
4 6
2
1 7
8
3 5
L Minh Hong
L thuyt th \ 19 [
4 6
2 4 6 4 6
2 2
1
1 1
3 5
3 5 3 5
L Minh Hong
L thuyt th \ 20 [
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
end;
procedure Init;
begin
FillChar(Free, n, True);
Free[S] := False; {Cc nh u cha nh du, ngoi tr nh S nh du}
Old := [S]; {Tp "c" khi to ban u ch c mi S}
end;
procedure Result;
begin
WriteLn;
if Free[F] then
WriteLn('Path from ', S, ' to ', F, ' not found')
else
begin
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
Init;
BFS;
Result;
Close(Input);
Close(Output);
end.
L Minh Hong
L thuyt th \ 21 [
L Minh Hong
L thuyt th \ 22 [
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).
G2
G1
G3
Hnh 7: Khp v cu
2. i vi th c hng G = (V, E)
C hai khi nim v tnh lin thng ca th c hng tu theo chng ta c quan tm ti hng
ca cc cung khng.
G gi l lin thng mnh (Strongly connected) nu lun tn ti ng i (theo cc cung nh
hng) gia hai nh bt k ca th, g gi l lin thng yu (weakly connected) nu th v
hng nn ca n l lin thng
*
th G = (V, E) l con ca th G' = (V', E') nu G l th c VV' v E E'
L Minh Hong
L thuyt th \ 23 [
1. nh ngha:
th y vi n nh, k hiu Kn, l mt n th v hng m gia hai nh bt k ca n
u c cnh ni.
2 n.(n 1)
th y Kn c ng: C n = cnh v bc ca mi nh u bng n - 1.
2
K3 K4 K5
Hnh 9: th y
2. Bao ng th:
Vi th G = (V, E), ngi ta xy dng th G' = (V, E') cng gm nhng nh ca G cn cc
cnh xy dng nh sau: ( y quy c gia u v u lun c ng i)
Gia nh u v v ca G' c cnh ni Gia nh u v v ca G c ng i
th G' xy dng nh vy c gi l bao ng ca th G.
L Minh Hong
L thuyt th \ 24 [
L Minh Hong
L thuyt th \ 25 [
10 11
8
L Minh Hong
L thuyt th \ 26 [
end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
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];
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('Connected Component ', Count, ': ');
for v := 1 to n do
if a[u, v] then {Xt nhng nh k u (trn bao ng)}
begin
Write(v, ', '); {Lit k nh vo thnh phn lin thng cha u}
Free[v] := False; {Lit k nh no nh du nh }
end;
WriteLn;
end;
Close(Input);
Close(Output);
end.
begin
<Thm vo th nh x v cc cung nh hng (x, v) vi mi v>;
<Khi to cy tm kim DFS := >;
Visit(x);
end.
th tc thm nh quy Visit(u). Th tc ny xt tt c nhng nh v ni t u, nu v cha
c thm th i theo cung thm v, tc l b sung cung (u, v) vo cy tm kim DFS. Nu v
thm th c ba kh nng xy ra i vi v tr ca u v v trong cy tm kim DFS:
L Minh Hong
L thuyt th \ 27 [
u
6th v 6th
6th 3rd 3rd
3rd
7th 7th
7th
v
u
4th 4th
4th
L Minh Hong
L thuyt th \ 28 [
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 = x0, x1, ..., xk = v)
T nh l 1, tt c cc nh x1, x2, ..., xk u thuc C nn chng s phi thm sau nh r. Khi th
tc Visit(r) c gi th tt c cc nh x1, x2..., xk=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
x1, x2, ..., xk = 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 DFS gc b. Vy v nm
trong c nhnh DFS gc a v nhnh DFS gc b. Gi s phn chng rng ab th s c hai kh nng
xy ra:
a b
... ...
...
b a
...
... ...
Kh nng 1: a b v Kh nng 1: b a v
Kh nng 1: Nhnh DFS gc a cha nhnh DFS gc b, c ngha l th tc Visit(b) s do th
tc Visit(a) gi ti, iu ny mu thun vi gi thit rng a l cht m qu trnh tm kim theo
chiu su bt u t a khng thm mt cht no khc.
Kh nng 2: Nhnh DFS gc a nm trong nhnh DFS gc b, c ngha l a nm trn mt
ng i t b ti v. Do b v v thuc cng mt thnh phn lin thng mnh nn theo nh l 1,
a cng phi thuc thnh phn lin thng mnh . Vy th thnh phn lin thng mnh ny c
hai cht a v b. iu ny v l.
L Minh Hong
L thuyt th \ 29 [
Theo nh l 2, ta c thnh phn lin thng mnh cha a nm trong nhnh DFS gc a, theo
chng minh trn ta li c: Mi nh trong nhnh DFS gc a nm trong thnh phn lin thng
mnh cha a. Kt hp li c: Nhnh DFS gc a chnh l thnh phn lin thng mnh cha a.
3. Thut ton Tarjan (R.E.Tarjan - 1972)
Chn u l cht m t qu trnh tm kim theo chiu su khng thm thm bt k mt cht no
khc, chn ly thnh phn lin thng mnh th nht l nhnh DFS gc u. Sau loi b nhnh DFS
gc u ra khi cy DFS, li tm thy mt nh cht v khc m nhnh DFS gc v khng cha cht no
khc, li chn ly thnh phn lin thng mnh th hai l nhnh DFS gc v. Tng t nh vy cho
thnh phn lin thng mnh th ba, th t, v.v... C th hnh dung thut ton Tarjan "b" cy DFS
ti v tr cc cht c cc nhnh ri rc, mi nhnh l mt thnh phn lin thng mnh.
1 1
2 2
8 8
3 3
4 4
9 9
5 10 5 10
6 6
11 11
7 7
L Minh Hong
L thuyt th \ 30 [
b ri. Hn na cn c th chng minh c rng, khi thut ton tin hnh nh trn th nu nh t
mt nh v ca mt nhnh DFS gc r c mt cung cho i ti mt nhnh khc th r khng l
cht.
chng t iu ny, ta da vo tnh cht ca cy DFS: cung cho s ni t mt nhnh ti nhnh
thm trc , ch khng bao gi c cung cho i ti nhnh thm sau. Gi s c cung cho (v, v')
i t v nhnh DFS gc r ti v' nhnh DFS gc r, gi r' l cht ca thnh phn lin thng cha
v'. Theo tnh cht trn, v' phi thm trc r, suy ra r' cng phi thm trc r. C hai kh nng xy
ra:
Nu r' thuc nhnh DFS duyt trc r th r' s c duyt xong trc khi thm r, tc l khi
thm r v c sau ny khi thm v th nhnh DFS gc r' b hu, cung cho (v, v') s khng
c tnh n na.
Nu r' l tin bi ca r th ta c r' n c r, v nm trong nhnh DFS gc r nn r n c
v, v n c v' v (v, v') l cung, v' li n c r' bi r' l cht ca thnh phn lin thng
mnh cha v'. Ta thit lp c chu trnh (r'rvv'r'), suy ra r' v r thuc cng mt
thnh phn lin thng mnh, r' l cht nn r khng th l cht na.
T ba nhn xt v cch ci t chng trnh nh trong nhn xt 3, Ta c: nh r l cht nu v ch
nu khng tn ti cung ngc hoc cung cho ni mt nh thuc nhnh DFS gc r vi mt nh
ngoi nhnh , hay ni cch khc: r l cht nu v ch nu khng tn ti cung ni t mt nh
thuc nhnh DFS gc r ti mt nh thm trc r.
Di y l mt ci t ht sc thng minh, ch cn sa i mt cht th tc Visit trn l ta c
ngay phng php ny. Ni dung ca n l nh s th t cc nh t nh c thm u tin n
nh thm sau cng. nh ngha Numbering[u] l s th t ca nh u theo cch nh s . Ta tnh
thm Low[u] l gi tr Numbering nh nht trong cc nh c th n c t mt nh v no
ca nhnh DFS gc u bng mt cung (vi gi thit rng u c mt cung gi ni vi chnh u).
C th cch cc tiu ho Low[u] nh sau:
Trong th tc Visit(u), trc ht ta nh s th t thm cho nh u v khi gn
Low[u] := Numbering[u] (u c cung ti chnh u)
Xt tt c nhng nh v ni t u:
Nu v thm th ta cc tiu ho Low[u] theo cng thc:
Low[u]mi := min(Low[u]c, Numbering[v]).
Nu v cha thm th ta gi quy i thm v, sau cc tiu ho Low[u] theo cng thc:
Low[u]mi := min(Low[u]c, Low[v])
D dng chng minh c tnh ng n ca cng thc tnh.
Khi duyt xong mt nh u (chun b thot khi th tc Visit(u). Ta so snh Low[u] v
Numbering[u]. Nu nh Low[u] = Numbering[u] th u l cht, bi khng c cung ni t mt nh
thuc nhnh DFS gc u ti mt nh thm trc u. Khi ch vic lit k cc nh thuc thnh phn
lin thng mnh cha u l nhnh DFS gc u.
cng vic d dng hn na, ta nh ngha mt danh sch L c t chc di dng ngn xp v
dng ngn xp ny ly ra cc nh thuc mt nhnh no . Khi thm ti mt nh u, ta y ngay
nh u vo ngn xp, th khi duyt xong nh u, mi nh thuc nhnh DFS gc u s c y
vo ngn xp L ngay sau u. Nu u l cht, ta ch vic ly cc nh ra khi ngn xp L cho ti khi ly
ti nh u l s c nhnh DFS gc u cng chnh l thnh phn lin thng mnh cha u.
procedure Visit(uV);
begin
L Minh Hong
L thuyt th \ 31 [
begin
<Thm vo th mt nh x v cc cung (x, v) vi mi v>;
<Khi to mt bin m Count := 0>;
<Khi to mt ngn xp L := >;
<Khi to cy tm kim DFS := >;
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 Numbering v Low vi cng dng nh trn, quy c Numbering[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 GRAPH.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 GRAPH.OUT
Lit k cc thnh phn lin thng mnh
L Minh Hong
L thuyt th \ 32 [
1
GRAPH.INP GRAPH.OUT
11 15 Component 1:
1 2 7, 6, 5,
1 8 Component 2:
2 2 3 4, 3, 2,
3 4 Component 3:
8 4 2 11, 10, 9, 8,
4 5 Component 4:
3
5 6 1,
4
6 7
7 5
9 8 9
5 10
9 4
9 10
10 8
6 10 11
11 11 8
7
PROG04_2.PAS * Thut ton Tarjan lit k cc thnh phn lin thng mnh
program Strong_connectivity;
const
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Free: array[1..max] of Boolean;
Numbering, Low, Stack: array[1..max] of Integer;
n, Count, ComponentCount, Last: Integer;
L Minh Hong
L thuyt th \ 33 [
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}
{sau ny phi hu b thnh phn lin thng gm mi mt nh gi }
for u := 1 to n do
if Numbering[u] = 0 then Visit(u);
end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
Init;
Solve;
Close(Input);
Close(Output);
end.
Bi tp:
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
tnh hiu qu c km 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
L Minh Hong
L thuyt th \ 34 [
1 11
2 6
4 5
3
10
5 4
8 3
6
7 9
8
9 2
10 1
11
7
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)
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
3. M cung hnh ch nht kch thc m x n gm cc vung n v. Trn mi k t:
O: Nu an ton
X: Nu c cm by
E: Nu l c mt nh thm him ang ng.
Duy nht ch c 1 ghi ch E. Nh thm him c th t mt i sang mt trong s cc chung
cnh vi ang ng. Mt cch i thot khi m cung l mt hnh trnh i qua cc an ton ra mt
bin. Hy ch gip cho nh thm him mt hnh trnh thot ra khi m cung
L Minh Hong
L thuyt th \ 35 [
L Minh Hong
L thuyt th \ 36 [
L Minh Hong
L thuyt th \ 37 [
G T1 T2 T3
Hnh 13: th G v mt s v d cy khung T1, T2, T3 ca n
iu kin cn v mt th v hng c cy khung l th phi lin thng
S cy khung ca th y Kn l nn-2.
3. Thut ton xy dng cy khung
Xt th v hng lin thng G = (V, E) c n nh, c nhiu thut ton xy dng cy khung ca G
a) Xy dng cy khung bng thut ton hp nht
Trc ht, t T = (V, ); T khng cha cnh no th c th coi T gm n cy ri rc, mi cy ch c
1 nh. Sau xt ln lt cc cnh ca G, nu cnh ang xt ni hai cy khc nhau trong T th
thm cnh vo T, ng thi hp nht hai cy li thnh mt cy. C lm nh vy cho ti khi
kt np n - 1 cnh vo T th ta c T l cy khung ca th. Cc phng php kim tra cnh
L Minh Hong
L thuyt th \ 38 [
c ni hai cy khc nhau hay khng cng nh k thut hp nht hai cy s c bn k hn trong
thut ton Kruskal 9.
b) Xy dng cy khung bng cc thut ton tm kim trn th.
p dng thut ton BFS hay DFS bt u t nh S, ti mi bc t nh u ti thm nh v, ta thm
vo thao tc ghi nhn lun cnh (u, v) vo cy khung. Do th lin thng nn thut ton s xut
pht t S v ti thm tt c cc nh cn li, mi nh ng mt ln, tc l qu trnh duyt s ghi
nhn c ng n - 1 cnh. Tt c nhng cnh khng to thnh chu trnh n bi thut ton
khng thm li nhng nh thm. Theo mnh tng ng th hai, ta c nhng cnh ghi nhn
c to thnh mt cy khung ca th.
1 S 1 S
2 3 2 3
4 5 6 7 4 5 6 7
8 9 10 11 8 9 10 11
Hnh 14: Cy khung DFS v cy khung BFS (Mi tn ch chiu i thm cc nh)
L Minh Hong
L thuyt th \ 39 [
begin
<nh du mi nh u cha thm>;
Visit(1);
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
L thuyt th \ 40 [
1 1
2 2
3 3
4 4
5 5
7 7
6 6
8 8
9 10 9 10
L Minh Hong
L thuyt th \ 41 [
c s 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.
Nu u v v l 2 nh bt k ca G th do G lin thng, tn ti mt ng i (u=x0, x1, ..., xn=v).
V (xi, xi + 1) l cnh ca G nn trong G', t xi c th n c xi+1. Suy ra t u cng c th n
c v bng cc cnh nh hng ca G'.
2. Ci t
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.
Ta s ci t mt thut ton vi mt th v hng: lit k cc cu v nh chiu cc cnh
c mt th mi c t thnh phn lin thng mnh nht:
nh s cc nh theo th t thm DFS, gi Numbering[u] l s th t ca nh u theo cch nh
s . Trong qu trnh tm kim DFS, duyt qua cnh no nh chiu lun cnh . nh ngha
thm Low[u] l gi tr Numbering 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 trn pha gc cy 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 (Numbering[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 v cc tiu ho Low[u] theo cng thc:
Low[u] := min(Low[u]c, Low[v])
v thm th ta cc tiu ho Low[u] theo cng thc:
Low[u] := min(Low[u]c, Numbering[v])
D thy cch tnh nh vy l ng n bi nu v cha thm th nhnh DFS gc v nm trong
nhnh DFS gc u v nhng cung ngc trong nhnh DFS gc v cng l cung ngc trong nhnh
DFS gc u. Cn nu v thm th (u, v) s l cung ngc.
1 1
1
1 2
2
1 3
3
4 4
3 8
4
5
3 9
4 5
7 10 3
6
8
6 7 5
9 10 4
L Minh Hong
L thuyt th \ 42 [
begin
for (uV) do
if <u cha thm> then Visit(u);
<In ra cch nh chiu>;
end.
L Minh Hong
L thuyt th \ 43 [
const
max = 100;
var
a: array[1..max, 1..max] of Boolean; {Ma trn k ca th}
Numbering, Low: array[1..max] of Integer;
n, Count: Integer;
procedure Enter;
var
f: Text;
i, m, u, v: Integer;
begin
FillChar(a, SizeOf(a), False);
Assign(f, 'GRAPH.INP'); Reset(f);
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;
procedure Init;
begin
FillChar(Numbering, SizeOf(Numbering), 0); {Numbering[u] = 0 u cha thm}
Count := 0;
end;
procedure Solve;
var
u, v: Integer;
begin
WriteLn('Bridges: '); {Dng DFS nh chiu th v lit k cu}
for u := 1 to n do
if Numbering[u] = 0 then Visit(u);
WriteLn('Directed Edges: '); {Qut li ma trn k in ra cc cnh nh hng}
for u := 1 to n do
for v := 1 to n do
if a[u, v] then WriteLn(u, ' -> ', v);
L Minh Hong
L thuyt th \ 44 [
end;
begin
Enter;
Init;
Solve;
end.
{ th G = (V, E)}
procedure Visit(u V): V;
begin
<Thng bo thm u v nh du u thm>;
for (v: (u, v) E) do
if <v cha thm> then Visit(v);
end;
begin
<nh du mi nh u cha thm>;
for (uV) do
if <u cha thm> then Visit(u);
end;
Qu trnh duyt cho mt rng cc cy DFS. Cc cung duyt qua c ba loi: cung DFS, cung ngc
v cung xui, khng b ri hnh, ta ch u tin v cung DFS hoc cung ngc:
1 11
12
13
4
5
7 17
6 14
8
10 15 16
9
L Minh Hong
L thuyt th \ 45 [
L Minh Hong
L thuyt th \ 46 [
ReadLn(n, m);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True; a[v, u] := True;
end;
end;
procedure Solve;
var
u: Integer;
begin
FillChar(Numbering, SizeOf(Numbering), 0); {nh s = 0 nh cha thm}
FillChar(Mark, SizeOf(Mark), False); {Mng nh du khp cha c g}
Count := 0;
for u := 1 to n do
if Numbering[u] = 0 then {Xt mi nh u cha thm}
begin
Visit(u); {Thm u, xy dng cy DFS gc u}
if nC[u] < 2 then {Nu u c t hn 2 con}
Mark[u] := False; {Th u khng phi l khp}
end;
end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
LoadGraph;
Solve;
Result;
Close(Input);
Close(Output);
end.
L Minh Hong
L thuyt th \ 47 [
I. 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 ?.
C
C
A D
A D
II. NH NGHA
1. Chu trnh n cha tt c cc cnh ca th c gi l chu trnh Euler
2. ng i n cha tt c cc cnh ca th c gi l ng i Euler
3. Mt th c chu trnh Euler c gi l th Euler
4. Mt th c ng i Euler c gi l th na Euler.
R rng mt th Euler th phi l na Euler nhng iu ngc li th khng phi lun ng
III. NH L
1. 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)
2. 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
3. Mt thi c hng lin thng yu G = (V, E) c chu trnh Euler th mi nh ca n c bn
bc ra bng bn bc vo: deg+(v) = deg-(v) (vV); Ngc li, nu G lin thng yu v mi
nh ca n c bn bc ra bng bn bc vo th G c chu trnh Euler, hay G s l lin thng
mnh.
4. Mt th c hng lin thng yu G = (V, E) c ng i Euler nhng khng c chu trnh
Euler nu tn ti ng hai nh u, v V sao cho deg+(u) - deg-(u) = deg-(v) - deg+(v) = 1, cn
tt c nhng nh khc u v v u c bn bc ra bng bn bc vo.
L Minh Hong
L thuyt th \ 48 [
1 4 1 4
8 8
3 6 3 6
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 trn bng nt lin,
cc cnh b xo c v bng nt t.
By gi ang ng nh 4 th ta c 3 cch i tip: sang 3, sang 5 hoc sang 6. V (4, 3) l cu nn
ta s khng i theo cnh (4, 3) m s i (4, 5) hoc (4, 6). Nu i theo (4, 5) v c tip tc i nh
vy, ta s c chu trnh Euler l (1, 2, 4, 5, 7, 8, 6, 4, 3, 1). Cn i theo (4, 6) s tm c chu trnh
Euler l: (1, 2, 4, 6, 8, 7, 5, 4, 3, 1).
2. i vi th c hng lin thng yu, mi nh u c bn bc ra bng bn bc vo.
Bng cch "lm dng thut ng", ta c th m t c thut ton tm chu trnh Euler cho c th
c hng cng nh v hng:
Th nht, di y nu ta ni cnh (u, v) th hiu l cnh ni nh u v nh v trn th v
hng, hiu l cung ni t nh u ti nh v trn th c hng.
Th hai, ta gi cnh (u, v) l "mt i khng tr li" nu nh t u ta i ti v theo cnh , sau
xo cnh i th khng c cch no t v quay li u.
Vy th thut ton Fleury tm chu trnh Euler c th m t nh sau:
Xut pht t mt nh, ta i mt cch tu theo cc cnh tun theo hai nguyn tc: Xo b cnh
va i qua v ch chn cnh "mt i khng tr li" nu nh khng cn cnh no khc chn.
V. 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
L Minh Hong
L thuyt th \ 49 [
EULER.INP EULER.OUT
4 1 2 3 1 3 4 1
1 2
1 2 1
1 3 2
1 4 1
2 3 1
4 3 3 4 1
L Minh Hong
L thuyt th \ 50 [
begin
Current := 1;
Write(1:5); {Bt u t nh Current = 1}
count := 1;
repeat
Next := 0;
for v := 1 to n do
if a[Current, v] > 0 then
begin
Next := v;
if CanGoBack(Current, Next) then Break;
end;
if Next <> 0 then
begin
Dec(a[Current, Next]);
Dec(a[Next, Current]); {Xo b cnh va i qua}
Write(Next:5); {In kt qu i ti Next}
Inc(count);
if count mod 16 = 0 then WriteLn; {In ra ti a 16 nh trn mt dng}
Current := Next; {Li tip tc vi nh ang ng l Next}
end;
until Next = 0; {Cho ti khi khng i tip c na}
WriteLn;
end;
begin
Assign(Input, 'EULER.INP'); Reset(Input);
Assign(Output, 'EULER.OUT'); Rewrite(Output);
Enter;
FindEulerCircuit;
Close(Input);
Close(Output);
end.
L Minh Hong
L thuyt th \ 51 [
procedure FindEulerCircuit;
var
L Minh Hong
L thuyt th \ 52 [
u, v, count: Integer;
begin
Stack[1] := 1; {Khi to ngn xp ban u ch gm nh 1}
last := 1;
count := 0;
while last <> 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
Inc(count);
Write(Pop:5, ' '); {In ra phn t nh ngn xp}
if count mod 16 = 0 then WriteLn; {Output khng qu 16 s trn mt dng}
end;
end;
end;
begin
Assign(Input, 'EULER.INP'); Reset(Input);
Assign(Output, 'EULER.OUT'); Rewrite(Output);
Enter;
FindEulerCircuit;
Close(Input);
Close(Output);
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
L thuyt th \ 53 [
I. NH NGHA
Cho th G = (V, E) c n nh
1. Chu trnh (x1, x2, ..., xn, x1) c gi l chu trnh Hamilton nu xi xj vi 1 i < j n
2. ng i (x1, x2, ..., xn) c gi l ng i Hamilton nu xi xj vi 1 i < j n
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 sau:
b a b a b g
c
e d d c d c e f
G1 G2 G3
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
II. NH L
1. 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
2. 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.
3. th c hng G lin thng mnh v c n nh. Nu deg+(v) n / 2 v deg-(v) n / 2 vi
mi nh v th G c chu trnh Hamilton
III. CI T
Di y ta s ci t mt chng trnh lit k tt c cc chu trnh Hamilton xut pht t nh 1, cc
chu trnh Hamilton khc c th c c bng cch hon v vng quanh. Lu rng cho ti nay,
ngi ta vn cha tm ra mt phng php no thc s hiu qu hn phng php quay lui tm
d ch mt chu trnh Hamilton cng nh ng i Hamilton trong trng hp th tng qut.
Input: file vn bn HAMILTON.INP
Dng 1 ghi s nh n ( 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
L Minh Hong
L thuyt th \ 54 [
1
HAMILTON.INP HAMILTON.OUT
5 6 1 3 5 2 4 1
5 1 2 1 4 2 5 3 1
2
1 3
2 4
4 3 5
3
4 1
5 2
L Minh Hong
L thuyt th \ 55 [
begin
{nh hng thit b nhp/xut chun}
Assign(Input, 'HAMILTON.INP'); Reset(Input);
Assign(Output, 'HAMILTON.OUT'); Rewrite(Output);
Enter;
FillChar(Free, n, True); {Khi to: Cc nh u cha i qua}
x[1] := 1; Free[1] := False; {Bt u t nh 1}
Try(2); {Th cc cch chn nh k tip}
Close(Input);
Close(Output);
end.
Bi tp:
1. Lp chng trnh nhp vo mt th v ch ra ng mt chu trnh Hamilton nu c.
2. Lp chng trnh nhp vo mt th v ch ra ng mt ng i Hamilton nu c.
3. Trong m ci ca Pc-xy v An-r-nt c 2n hip s. Mi hip s c khng qu n - 1 k
th. Hy gip Ca-xi--b, m ca An-r-nt 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.
4. Gray code: Mt hnh trn c chia thnh 2n hnh qut ng tm. Hy xp 100 000
qut sao cho bt c hai xu no hai hnh qut cnh nhau u ch khc 111 011
L Minh Hong
L thuyt th \ 56 [
L Minh Hong
L thuyt th \ 57 [
L Minh Hong
L thuyt th \ 58 [
C tip tc nh vy, sau mt s hu hn bc, ta suy ra rng dy F, F1, F2, ... khng cha nh lp
li v kt thc S. Lt ngc th t dy cho ta ng i ngn nht t S ti F.
... F1
F
S F2
Tuy nhin, trong a s trng hp, ngi ta khng s dng phng php ny m s kt hp lu vt
ng i ngay trong qu trnh tm kim.
Di y ta s xt mt s thut ton tm ng i ngn nht t nh S ti nh F trn n th c
hng G = (V, E) c n nh v m cung. Trong trng hp n th v hng vi trng s khng
m, bi ton tm ng i ngn nht c th dn v bi ton trn th c hng bng cch thay mi
cnh ca n bng hai cung c hng ngc chiu nhau. Lu rng cc thut ton di y s lun
lun tm c ng i ngn nht l ng i c bn.
Input: file vn bn MINPATH.INP
Dng 1: Cha s nh n ( 100), s cung m ca th, nh xut pht S, nh ch F cch nhau
t nht 1 du cch
m dng tip theo, mi dng c dng ba s u, v, c[u, v] cch nhau t nht 1 du cch, th hin (u,
v) l mt cung E v trng s ca cung l c[u,v] (c[u, v] l s nguyn c gi tr tuyt i
100)
Output: file vn bn MINPATH.OUT ghi ng i ngn nht t S ti F v di ng i
2 MINPATH.INP MINPATH.OUT
2 3
1 20 6 7 1 4 Distance from 1 to 4: 15
1 2 1 4<-5<-6<-3<-2<-1
3
1 4 1 6 20
2 3 2
20 5 3 4 20
6 5 3 6 3
4
5 4 5
6 5 4
L Minh Hong
L thuyt th \ 59 [
procedure LoadGraph; {Nhp th t thit b nhp chun (Input), th khng c c chu trnh m}
var
i, m: Integer;
u, v: Integer;
begin
ReadLn(n, m, S, F);
{Nhng cnh khng c trong th c gn trng s +}
for u := 1 to n do
for v := 1 to n do
if u = v then c[u, v] := 0 else c[u, v] := maxC;
for i := 1 to m do ReadLn(u, v, c[u, v]);
end;
L Minh Hong
L thuyt th \ 60 [
var
Stop: Boolean;
u, v, CountLoop: Integer;
begin
CountLoop := 0; {Bin m s ln lp}
repeat
Stop := True;
for u := 1 to n do
for v := 1 to n do
if d[v] > d[u] + c[u, v] then {Nu u, v tho mn d[v] > d[u] + c[u, v] th ti u li d[v]}
begin
d[v] := d[u] + c[u, v];
Trace[v] := u; {Lu vt ng i}
Stop := False;
end;
Inc(CountLoop);
until Stop or (CountLoop >= n - 2);
{Thut ton kt thc khi khng sa nhn cc d[v] c na hoc lp n-2 ln }
end;
begin
Assign(Input, 'MINPATH.INP'); Reset(Input);
Assign(Output, 'MINPATH.OUT'); Rewrite(Output);
LoadGraph;
Init;
Ford_Bellman;
PrintResult;
Close(Input);
Close(Output);
end.
L Minh Hong
L thuyt th \ 61 [
L Minh Hong
L thuyt th \ 62 [
for i := 1 to n do
begin
d[i] := c[S, i];
Trace[i] := S;
end;
FillChar(Free, SizeOf(Free), True);
end;
begin
Assign(Input, 'MINPATH.INP'); Reset(Input);
Assign(Output, 'MINPATH.OUT'); Rewrite(Output);
LoadGraph;
Init;
Dijkstra;
PrintResult;
Close(Input);
Close(Output);
end.
L Minh Hong
L thuyt th \ 63 [
L Minh Hong
L thuyt th \ 64 [
Close(inp);
{n y, ta xc nh c head[u] l v tr cui ca danh sch k nh u trong adj^}
Reset(inp); {c file ln 2, vo cu trc Forward Start}
ReadLn(inp); {B qua dng u tin Input file}
for i := 1 to m do
begin
ReadLn(inp, u, v, c);
adj^[head^[u]] := v; {in v v c vo v tr ng trong danh sch k ca u}
adjCost^[head^[u]] := c;
Dec(head^[u]);
end;
head^[n + 1] := m;
Close(inp);
end;
procedure Init; {Khi to d[i] = di ng i ngn nht t S ti i qua 0 cnh, Heap rng}
var
i: Integer;
begin
for i := 1 to n do d[i] := maxC;
d[S] := 0;
FillChar(Free, SizeOf(Free), True);
FillChar(Pos, SizeOf(Pos), 0);
nHeap := 0;
end;
L Minh Hong
L thuyt th \ 65 [
procedure Dijkstra;
var
i, u, iv, v: Integer;
min: Integer;
begin
Update(1);
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 := head^[u] + 1 to head^[u + 1] do {Xt danh sch k}
begin
v := adj^[iv];
if Free[v] and (d[v] > d[u] + adjCost^[iv]) then
begin
d[v] := d[u] + adjCost^[iv]; {Ti u ho nhn ca cc nh t do k vi u}
Trace[v] := u; {Lu vt ng i}
Update(v); {T chc li Heap}
end;
end;
until nHeap = 0; {Khng cn nh no mang nhn t do}
end;
procedure PrintResult;
var
out: Text;
begin
Assign(out, 'MINPATH.OUT'); Rewrite(out);
if d[F] = maxC then
WriteLn(out, 'Path from ', S, ' to ', F, ' not found')
else
begin
WriteLn(out, 'Distance from ', S, ' to ', F, ': ', d[F]);
while F <> S do
begin
Write(out, F, '<-');
F := Trace[F];
end;
WriteLn(out, S);
end;
Close(out);
end;
begin
LoadGraph;
Init;
Dijkstra;
PrintResult;
end.
L Minh Hong
L thuyt th \ 66 [
1 2 1 2
4 5
3 7
7 4
5 6
6 3
L Minh Hong
L thuyt th \ 67 [
procedure Init;
var
i: Integer;
begin
for i := 1 to n do
begin
d[i] := c[S, i];
Trace[i] := S;
end;
end;
procedure FindPath; {Thut ton quy hoch ng tm ng i ngn nht trn th khng chu trnh}
var
i, j, u, v: Integer;
begin
for i := 1 to n - 1 do
for j := i + 1 to n do
begin
u := List[i]; v := List[j]; {Dng List[i] ti u nhn List[j] vi i < j}
if d[v] > d[u] + c[u, v] then
begin
d[v] := d[u] + c[u, v];
Trace[v] := u;
end
end;
end;
L Minh Hong
L thuyt th \ 68 [
begin
Assign(Input, 'MINPATH.INP'); Reset(Input);
Assign(Output, 'MINPATH.OUT'); Rewrite(Output);
LoadGraph;
Number;
if Count < n then
WriteLn('Error: Circuit Exist')
else
begin
Init;
FindPath;
PrintResult;
end;
Close(Input);
Close(Output);
end.
L Minh Hong
L thuyt th \ 69 [
ck[u, v] = ck-1[u, v]
C i qua nh k th ng i s l ni ca mt ng i t u ti k v mt ng i t k ti
v, hai ng i ny ch i qua cc nh trung gian thuc tp {1, 2, ..., k - 1}.
ck[u, v] = ck-1[u, k] + ck-1[k, v].
V ta mun ck[u, v] l cc tiu nn suy ra: ck[u, v] = min(ck-1[u, v], ck-1[u, k] + ck-1[k, v]).
V cui cng, ta quan tm ti cn[u, v]: di ng i ngn nht t u ti v m ch i qua cc nh
trung gian thuc tp {1, 2, ..., n}.
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. V nu ci t di dng ba vng lp for lng nh trn, do c s ti u bc cu
ti mi bc, tc ti u c[u, v] ch tng ln ch khng th gim i c.
PROG08_5.PAS * Thut ton Floyd
program Shortest_Path_by_Floyd;
const
max = 100;
maxC = 10000;
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
L thuyt th \ 70 [
Write(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(F);
end;
end;
begin
Assign(Input, 'MINPATH.INP'); Reset(Input);
Assign(Output, 'MINPATH.OUT'); Rewrite(Output);
LoadGraph;
Floyd;
PrintResult;
Close(Input);
Close(Output);
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.
VIII. NHN XT
Bi ton ng i di nht trn th trong mt s trng hp c th gii quyt bng cch i du
trng s tt c cc cung ri tm ng i ngn nht, nhng hy cn thn, c th xy ra trng hp
c chu trnh m.
Trong tt c cc ci t trn, v s dng ma trn trng s ch khng s dng danh sch cnh hay
danh sch k c trng s, nn ta u a v th y v em trng s + gn cho nhng
cnh khng c trong th ban u. Trn my tnh th khng c khi nim tru tng + nn ta
s phi chn mt s dng ln thay. Nh th no l ln? s phi ln hn tt c
trng s ca cc ng i c bn cho d ng i tht c ti t n u vn tt hn ng i
trc tip theo cnh tng tng ra . Vy nn nu th cho s nh cng nh trng s cc cnh
vo c 300 chng hn th gi tr khng th chn trong phm vi Integer hay Word. Ma trn c
s phi khai bo l ma trn LongInt v gi tr hng s maxC trong cc chng trnh trn phi i
li l 300 * 299 + 1 - iu c th gy ra nhiu phin toi, chng hn nh vn lng ph b nh.
khc phc, ngi ta c th ci t bng danh sch k km trng s hoc s dng nhng k thut
nh du kho lo trong tng trng hp c th. Tuy nhin c mt iu chc chn: khi th cho s
nh cng nh trng s cc cnh vo khong 300 th cc trng s c[u, v] trong thut ton Floyd
v cc nhn d[v] trong ba thut ton cn li chc chn khng th khai bo l Integer c.
Xt v phc tp tnh ton, nu ci t nh trn, thut ton Ford-Bellman c phc tp l O(n3),
thut ton Dijkstra l O(n2), thut ton ti u nhn theo th t tp l O(n2) cn thut ton Floyd l
O(n3). Tuy nhin nu s dng danh sch k, thut ton ti u nhn theo th t tp s c phc
tp tnh ton l O(m). Thut ton Dijkstra kt hp vi cu trc d liu Heap c phc tp
O(max(n, m).logn).
Khc vi mt bi ton i s hay hnh hc c nhiu cch gii th ch cn nm vng mt cch cng
c th coi l t yu cu, nhng thut ton tm ng i ngn nht bc l rt r u, nhc im
trong tng trng hp c th (V d nh s nh ca th qu ln lm cho khng th biu din
bng ma trn trng s th thut ton Floyd s gp kh khn, hay thut ton Ford-Bellman lm vic
kh chm). V vy yu cu trc tin l phi hiu bn cht v thnh tho trong vic ci t tt c cc
thut ton trn c th s dng chng mt cch uyn chuyn trong tng trng hp c th. Nhng
bi tp sau y cho ta thy r iu .
Bi tp
L Minh Hong
L thuyt th \ 71 [
1 4
4
L Minh Hong
L thuyt th \ 72 [
L Minh Hong
L thuyt th \ 73 [
Th hai, lm th no kim tra xem vic thm mt cnh c to thnh chu trnh n trong T hay
khng. rng cc cnh trong T cc bc s to thnh mt rng ( th khng c chu trnh
n). Mun thm mt cnh (u, v) vo T m khng to thnh chu trnh n th (u, v) phi ni hai cy
khc nhau ca rng T, bi nu u, v thuc cng mt cy th s to thnh chu trnh n trong cy .
Ban u, ta khi to rng T gm n cy, mi cy ch gm ng mt nh, sau , mi khi xt n
cnh ni hai cy khc nhau ca rng T th ta kt np cnh vo T, ng thi hp nht hai cy
li thnh mt cy.
Nu cho mi nh v trn cy mt nhn Lab[v] l s hiu nh cha ca nh v trong cy, trong trng
hp v l gc ca mt cy th Lab[v] c gn mt gi tr m. Khi ta hon ton c th xc nh
c gc ca cy cha nh v bng hm GetRoot nh sau:
function GetRoot(vV): V;
begin
while Lab[v] > 0 do v := Lab[v];
GetRoot := v;
end;
Vy kim tra mt cnh (u, v) c ni hai cy khc nhau ca rng T hay khng? ta c th kim tra
GetRoot(u) c khc GetRoot(v) hay khng, bi mi cy ch c duy nht mt gc.
hp nht cy gc r1 v cy gc r2 thnh mt cy, ta lu rng mi cy y ch dng ghi
nhn mt tp hp nh thuc cy ch cu trc cnh trn cy th no th khng quan trng. Vy
hp nht cy gc r1 v cy gc r2, ta ch vic coi r1 l nt cha ca r2 trong cy bng cch t:
Lab[r2] := r1.
r1 r1
r2 r2
u u
v v
L Minh Hong
L thuyt th \ 74 [
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;
L Minh Hong
L thuyt th \ 75 [
procedure AdjustHeap(root, last: Integer); {Vun thnh ng, dng cho HeapSort}
var
Key: TEdge;
child: Integer;
begin
Key := e[root];
while root * 2 <= Last do
begin
child := root * 2;
if (child < Last) and (e[child + 1].c < e[child].c)
then Inc(child);
if Key.c <= e[child].c then Break;
e[root] := e[child];
root := child;
end;
e[root] := Key;
end;
procedure Kruskal;
var
i, r1, r2, Count, a: Integer;
tmp: TEdge;
begin
Count := 0;
Connected := False;
for i := m div 2 downto 1 do AdjustHeap(i, m);
for i := m - 1 downto 1 do
begin
tmp := e[1]; e[1] := e[i + 1]; e[i + 1] := tmp;
AdjustHeap(1, i);
r1 := GetRoot(e[i + 1].u); r2 := GetRoot(e[i + 1].v);
if r1 <> r2 then {Cnh e[i + 1] ni hai cy khc nhau}
begin
e[i + 1].Mark := True; {Kt np cnh vo cy}
Inc(Count); {m s cnh}
if Count = n - 1 then {Nu s th thnh cng}
begin
Connected := True;
Exit;
end;
L Minh Hong
L thuyt th \ 76 [
procedure PrintResult;
var
i, Count, W: Integer;
begin
if not Connected then
WriteLn('Error: Graph is not connected')
else
begin
WriteLn('Minimal spanning tree: ');
Count := 0;
W := 0;
for i := 1 to m do {Duyt danh sch cnh}
with e[i] do
begin
if Mark then {Lc ra nhng cnh kt np vo cy khung}
begin
WriteLn('(', u, ', ', v, ') = ', c);
Inc(Count);
W := W + c;
end;
if Count = n - 1 then Break; {Cho ti khi n - 1 cnh}
end;
WriteLn('Weight = ', W);
end;
end;
begin
Assign(Input, 'MINTREE.INP'); Reset(Input);
Assign(Output, 'MINTREE.OUT'); Rewrite(Output);
LoadGraph;
Init;
Kruskal;
PrintResult;
Close(Input);
Close(Output);
end.
Xt v phc tp tnh ton, ta c th chng minh c rng thao tc GetRoot c phc tp l
O(log2n), 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(mlog2n), 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(mlog2m). Vy
phc tp tnh ton ca thut ton l O(mlog2m) 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.
III. THUT TON PRIM (ROBERT PRIM - 1957)
Thut ton Kruskal hot ng chm trong trng hp th dy (c nhiu cnh). Trong trng hp
ngi ta thng s dng phng php ln cn gn nht ca Prim. Thut ton c th pht biu
hnh thc nh sau:
n th v hng G = (V, E) c n nh c cho bi ma trn trong s C. Qui c c[u, v] = +
nu (u, v) khng l cnh. Xt cy T trong G v mt nh v, gi khong cch t v ti T l trng s
nh nht trong s cc cnh ni v vi mt nh no trong T:
L Minh Hong
L thuyt th \ 77 [
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
L Minh Hong
L thuyt th \ 78 [
procedure PrintResult;
var
v, W: Integer;
begin
if not Connected then {Nu th khng lin thng th tht bi}
WriteLn('Error: Graph is not connected')
else
begin
WriteLn('Minimal spanning tree: ');
W := 0;
for v := 2 to n do {Cy khung nh nht gm nhng cnh (v, Trace[v])}
begin
WriteLn('(', Trace[v], ', ', v, ') = ', c[Trace[v], v]);
W := W + c[Trace[v], v];
end;
WriteLn('Weight = ', W);
end;
end;
begin
Assign(Input, 'MINTREE.INP'); Reset(Input);
Assign(Output, 'MINTREE.OUT'); Rewrite(Output);
LoadGraph;
Init;
Prim;
PrintResult;
Close(Input);
Close(Output);
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)logn).
Bi tp
1. Vit chng trnh to th vi s nh 100, trng s cc cnh l cc s c sinh ngu nhin.
Ghi vo file d liu MINTREE.INP ng theo khun dng quy nh. So snh kt qu lm vic ca
thut ton Kruskal v thut ton Prim v tnh ng n v v tc .
2. Trn mt nn phng vi h to Decattes vung gc t n my tnh, my tnh th i c t
to (Xi, Yi). Cho php ni thm cc dy cp mng ni gia tng cp my tnh. Chi ph ni mt
L Minh Hong
L thuyt th \ 79 [
L Minh Hong
L thuyt th \ 80 [
-(v) = {uV(u, v) E}
+(v) = {wV(v, w) E}
Gi tr ca mt lung l tng lung trn cc cung i ra khi nh pht = tng lung trn cc cung
i vo nh thu.
6 5
4 2 4
2 6
6 5
5 1
3
6 6
1 1
3 0
6 2 1
5
3 5 3 5
1
1
I. BI TON
Cho mng G = (V, E). Hy tm lung f* trong mng vi gi tr lung ln nht. Lung nh vy gi
l lung cc i trong mng v bi ton ny gi l bi ton tm lung cc i trn mng.
II. LT CT, NG TNG LUNG, NH L FORD - FULKERSON
1. nh ngha:
Ta gi lt ct (X, Y) l mt cch phn hoch tp nh V ca mng thnh hai tp ri nhau X v Y,
trong X cha nh pht v Y cha nh thu. Kh nng thng qua ca lt ct (X, Y) l tng tt c
cc kh nng thng qua ca cc cung (u, v) c u X v v Y. Lt ct vi kh nng thng qua nh
nht gi l lt ct hp nht.
2. nh l Ford-Fulkerson:
Gi tr lung cc i trn mng ng bng kh nng thng qua ca lt ct hp nht. Vic chng
minh nh l Ford- Fulkerson xy dng c mt thut ton tm lung cc i trn mng:
Gi s f l mt lung trong mng G = (V, E). T mng G = (V, E) ta xy dng th c trng s Gf
= (V, Ef) nh sau:
Xt nhng cnh e = (u, v) E (c[u, v] > 0):
L Minh Hong
L thuyt th \ 81 [
Nu f[u, v] < c[u, v] th ta thm cung (u, v) vo Ef vi trng s c[u, v] - f[u, v], cung gi l
cung thun. V ngha, trng s cung ny cho bit cn c th tng lung f trn cung (u, v)
mt lng khng qu trng s .
Xt tip nu nh f[u, v] > 0 th ta thm cung (v, u) vo Ef vi trng s f[u, v], cung gi l
cung nghch. V ngha, trng s cung ny cho bit cn c th gim lung f trn cung (u, v)
mt lng khng qu trng s .
th Gf c gi l th tng lung.
5
6;5 1
2 4 2 4
6;6 6
5;5 5
3;1 2
3;0 3
6 6
1 1
6;1 1 5
5,2 3
3 5 3 5 1
1;1 2
1
Hnh 21: Mng v lung trn cc cung (1 pht, 6 thu) v th tng lung tng ng
Gi s P l mt ng i c bn t nh pht A ti nh thu B. Gi l gi tr nh nht ca cc
trng s ca cc cung trn ng i P. Ta s tng gi tr ca lung f bng cch t:
f[u, v] := f[u, v] + , nu (u, v) l cung trong ng P v l cung thun
f[v, u] := f[v, u] - , nu (u, v) l cung trong ng P v l cung nghch
Cn lung trn nhng cung khc gi nguyn
C th kim tra lung f mi xy dng vn l lung trong mng v gi tr ca lung f mi c tng
thm so vi gi tr lung f c. Ta gi thao tc bin i lung nh vy l tng lung dc ng P,
ng i c bn P t A ti B c gi l ng tng lung.
V d: vi th tng lung Gf nh trn, gi s chn ng i (1, 3, 4, 2, 5, 6). Gi tr nh nht ca
trng s trn cc cung l 2, vy th ta s tng cc gi tr f[1, 3]), f[3, 4], f[2, 5], f[5, 6] ln 2, (do cc
cung l cung thun) v gim gi tr f[2, 4] i 2 (do cung (4, 2) l cung nghch). c lung mi
mang gi tr 9.
6;3
6;5 2 4
2 4 6;6
6;6
5;5
5;5 3;3
3;1 3;2
3;0
6
6 1
1
6;3
6;1 5,4
5,2
3 5
3 5 1;1
1;1
Hnh 22: Mng G trc v sau khi tng lung
n y ta c th hnh dung ra c thut ton tm lung cc i trn mng: khi to mt lung bt
k, sau c tng lung dc theo ng tng lung, cho ti khi khng tm c ng tng
lung na
Vy cc bc ca thut ton tm lung cc i trn mng c th m t nh sau:
Bc 1: Khi to:
Mt lung bt k trn mng, chng hn nh lung 0 (lung trn cc cung u bng 0), sau :
L Minh Hong
L thuyt th \ 82 [
Bc 2: Lp hai bc sau:
Tm ng tng lung P i vi lung hin c Tm ng i c bn t A ti B trn th
tng lung, nu khng tm c ng tng lung th bc lp kt thc.
Tng lung dc theo ng P
Bc 3: Thng bo gi tr lung cc i tm c.
III. CI T
Input: file vn bn MAXFLOW.INP. Trong :
Dng 1: Cha s nh n ( 100), s cnh m ca th, nh pht A, nh thu B 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 100)
Output: file vn bn MAXFLOW.OUT ghi lung trn cc cung v gi tr lung cc i tm c
6 MAXFLOW.INP MAXFLOW.OUT
2 4 6 8 1 6 f(1, 2) = 5
6
5 1 2 5 f(1, 3) = 4
3 3
1 3 5 f(2, 4) = 3
6 2 4 6 f(2, 5) = 2
1
2 5 3 f(3, 4) = 3
6 3 4 3 f(3, 5) = 1
5
3 5 3 5 1 f(4, 6) = 6
1 4 6 6 f(5, 6) = 3
5 6 6 Max Flow: 9
Ch rng ti mi bc c nhiu phng n chn ng tng lung, hai cch chn khc nhau c
th cho hai lung cc i khc nhau, tuy nhin v mt gi tr th tt c cc lung xy dng c
theo cch trn s c cng gi tr cc i.
Ci t chng trnh tm lung cc i di y rt chn phng, t ma trn nhng kh nng thng
qua c v lung f hin c (khi to f l lung 0), n xy dng th tng lung Gf bng cch xy
dng ma trn cf nh sau:
cf[u, v] = trng s cung (u, v) trn th Gf nu nh (u, v) l cung thun
cf[u, v] = - trng s cung (u, v) trn th Gf nu nh (u, v) l cung nghch
cf[u, v] = + nu nh (u, v) khng phi cung ca Gf
cf gn ging nh ma trn trng s ca Gf, ch c iu ta i du trng s nu nh gp cung nghch.
Cu hi t ra l nu nh mng cho c nhng ng hai chiu (c c cung (u, v) v cung (v, u) -
iu ny xy ra rt nhiu trong mng li giao thng) th th tng lung rt c th l a th
(gia u, v c th c nhiu cung t u ti v). Ma trn cf cng gp nhc im nh ma trn trng s:
khng th biu din c a th, tc l nu nh c nhiu cung ni t u ti v trong th tng
lung th ta nh chp nhn b bt m ch gi li mt cung. Rt may cho chng ta l iu
khng lm sai lch i mc ch xy dng th tng lung: ch l tm mt ng i t nh pht A
ti nh thu B m thi, cn ng no th khng quan trng.
Sau chng trnh tm ng i t nh pht A ti nh thu B trn th tng lung bng thut
ton tm kim theo chiu rng, nu tm c ng i th s tng lung dc theo ng tng
lung...
L Minh Hong
L thuyt th \ 83 [
L Minh Hong
L thuyt th \ 84 [
begin
Assign(Input, 'MAXFLOW.INP'); Reset(Input);
Assign(Output, 'MAXFLOW.OUT'); Rewrite(Output);
Enter; {Nhp d liu}
FillChar(f, SizeOf(f), 0); {Khi to lung 0}
repeat {Bc lp}
CreateGf; {Dng th tng lung}
if not FindPath then Break; {Nu khng tm c ng tng lung th thot ngay}
IncFlow; {Tng lung dc ng tng lung}
until False;
PrintResult;
Close(Input);
Close(Output);
end.
By gi ta th xem cch lm trn c ch no v cha hay ch no ?
Trc ht, thut ton tm ng bng Breadth First Search l kh tt, ngi ta chng minh rng
nu nh ng tng lung c tm bng BFS s lm gim ng k s bc lp tng lung so vi
DFS.
Nhng c th thy rng vic xy dng tng minh c th Gf thng qua vic xy dng ma trn
cf ch lm mi mt vic tm ng l lng ph, ch cn da vo ma trn kh nng thng qua c v
lung f hin c l ta c th bit c (u, v) c phi l cung trn th tng lung Gf hay khng.
L Minh Hong
L thuyt th \ 85 [
L Minh Hong
L thuyt th \ 86 [
begin
L Minh Hong
L thuyt th \ 87 [
L Minh Hong
L thuyt th \ 88 [
L Minh Hong
L thuyt th \ 89 [
L Minh Hong
L thuyt th \ 90 [
L Minh Hong
L thuyt th \ 91 [
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 j Y ghp,
da vo s kin: t 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 j, thm lun c matchY[j], v y vo Queue
phn t matchY[j] X (Thm lin 2 bc).
Input: file vn bn MATCH.INP
Dng 1: cha hai s m, n (m, n 100) theo th t l s X_nh v s Y_nh cch nhau t nht
mt du cch
Cc dng tip theo, mi dng ghi hai s i, j cch nhau t nht mt du cch th hin c cnh ni
hai nh (X[i], Y[j]) .
Output: file vn bn MATCH.OUT cha b ghp cc i tm c
MATCH.INP MATCH.OUT
4 5 Match:
1 1 1 1 1) X[1] - Y[1]
1 4 2) X[2] - Y[4]
2 1 3) X[3] - Y[3]
2 2 2 2 4) X[4] - Y[2]
2 4
5 3 2
3 3 3 3
4 2
4 3
4 4
X Y
L Minh Hong
L thuyt th \ 92 [
L Minh Hong
L thuyt th \ 93 [
finish: Integer;
begin
repeat
finish := FindAugmentingPath; {u tin th tm mt ng m}
if finish <> 0 then Enlarge(finish); {Nu thy th tng cp v lp li}
until finish = 0; {Nu khng thy th dng}
end;
begin
Assign(Input, 'MATCH.INP'); Reset(Input);
Assign(Output, 'MATCH.OUT'); Rewrite(Output);
Enter;
Init;
Solve;
PrintResult;
Close(Input);
Close(Output);
end.
Kho st tnh ng n ca thut ton cho ta mt kt qu kh th v:
Nu ta thm mt nh A v cho thm m cung
t A ti tt c nhng nh ca tp X, thm
mt nh B v ni thm n cung t tt c cc
nh ca Y ti B. Ta c mt mng vi nh A B
pht A v nh thu B. Nu t kh nng thng
qua ca cc cung u l 1 sau tm lung
cc i trn mng bng thut ton Ford-
X Y
Fulkerson th theo nh l v tnh nguyn,
lung tm c trn cc cung u phi l s nguyn (tc l bng 1 hoc 0). Khi d thy rng
nhng cung c lung 1 t tp X ti tp Y s cho ta mt b ghp ln nht. chng minh thut ton
ng m tm c b ghp ln nht sau hu hn bc, ta s chng minh rng s b ghp tm c
bng thut ton ng m s bng gi tr lung cc i ni trn, iu cng rt d bi v nu
k mt cht th ng m chng qua l ng tng lung trn th tng lung m thi, ngay ci
tn augmenting path cho ta bit iu ny. V vy thut ton ng m trng hp ny l mt
cch ci t hiu qu trn mt dng th c bit, n lm cho chng trnh sng sa hn nhiu
so vi phng php tm b ghp da trn bi ton lung v thut ton Ford-Fulkerson thun ty.
Ngi ta chng minh c chi ph thi gian thc hin gii thut ny trong trng hp xu nht
s l O(n3) i vi th dy v O(n(n + m)logn) i vi th tha. Tuy nhin, cng ging nh
thut ton Ford-Fulkerson, trn thc t phng php ny hot ng rt nhanh.
Bi tp
L Minh Hong
L thuyt th \ 94 [
L Minh Hong
L thuyt th \ 95 [
L Minh Hong
L thuyt th \ 96 [
0 0 0 1 0 0 X[1] - Y[3]
-1
0 1 7 0 0 6 X[2] - Y[2]
-1 0 8 9 0 7 8 X[3] - Y[1]
+1
1. Cc khi nim:
cho gn, ta gi nhng cnh trng s 0 ca G l nhng 0_cnh.
Xt mt b ghp M ch gm nhng 0_cnh.
Nhng nh M gi l nhng nh ghp, nhng nh cn li gi l nhng nh cha ghp.
Nhng 0_cnh M gi l nhng 0_cnh ghp, nhng 0_cnh cn li l nhng 0_cnh
cha ghp.
Nu ta nh hng li cc 0_cnh nh sau: Nhng 0_cnh cha ghp cho hng t tp X sang tp
Y, nhng 0_cnh ghp cho hng t tp Y v tp X. Khi :
ng pha (Alternating Path) l mt ng i c bn xut pht t mt X_nh cha ghp i
theo cc 0_cnh nh hng trn. Nh vy dc trn ng pha, cc 0_cnh cha ghp v
nhng 0_cnh ghp xen k nhau. V ng pha ch l ng i c bn trn th nh
hng nn vic xc nh nhng nh no c th n c t x X bng mt ng pha c
th s dng cc thut ton tm kim trn th (BFS hoc DFS). Nhng nh v nhng cnh
c duyt qua to thnh mt cy pha gc x
Mt ng m (Augmenting Path) l mt ng pha i t mt X_nh cha ghp ti mt
Y_nh cha ghp. Nh vy:
ng i trc tip t mt X_nh cha ghp ti mt Y_nh cha ghp qua mt 0_cnh
cha ghp cng l mt ng m.
Dc trn ng m, s 0_cnh cha ghp nhiu hn s 0_cnh ghp ng 1 cnh.
2. Thut ton Hungari
Bc 1: Khi to:
Mt b ghp M :=
Bc 2: Vi mi nh x*X, ta tm cch ghp x* nh sau.
L Minh Hong
L thuyt th \ 97 [
L Minh Hong
L thuyt th \ 98 [
X1 Y1 X1 Y1
x* = X1
Tm c ng m:
X2 Y2 X2 Y2
2 X1 Y1 2
1 1
Tng cp
X3 Y3 X3 Y3
X4 Y4 X4 Y4
9 9
X1 Y1 X1 Y1
x* = X2
Tm c ng m:
X2 Y2 X2 Y2
2 X2 Y1 X1 Y2 2
1 1
Tng cp
X3 Y3 X3 Y3
X4 Y4 X4 Y4
9 9
X1 Y1 X1 Y1
x* = X3
Tm c ng m:
X2 Y2 X2 Y2
2 X3 Y3 2
1 1
Tng cp
X3 Y3 X3 Y3
X4 Y4 X4 Y4
9 9
X1 Y1 X1 Y1
x* = X4
Khng tm c ng m:
Tp nhng X_nh n c t X4
X2 Y2 bng mt ng pha: {X3, X4} X2 Y2
2 Tp nhng Y_nh n c t X4 2
1= bng mt ng pha: {Y3} 0
Gi tr xoay = 1 (Cnh X3-Y2)
X3 Y3 X3 Y3
Tr tt c trng s nhng cnh lin
thuc vi {X3, X4} i 1
Cng tt c trng s nhng cnh lin
X4 Y4 thuc vi Y3 ln 1 X4 Y4
9 8
L Minh Hong
L thuyt th \ 99 [
X1 Y1 X1 Y1
x* = X4
Vn khng tm c ng m:
Tp nhng X_nh n c t X4
X2 Y2 bng mt ng pha: X2 Y2
2= {X1, X2, X3, X4} 0
Tp nhng Y_nh n c t X4
bng mt ng pha:
X3 Y3 X3 Y3
{Y1, Y2, Y3}
Gi tr xoay = 2 (Cnh X2-Y4)
Tr tt c trng s nhng cnh lin
X4 Y4 thuc vi {X1, X2, X3, X4} i 2 X4 Y4
8 6
Cng tt c trng s nhng cnh lin
thuc vi {Y1, Y2, Y3} ln 2
X1 Y1 X1 Y1
x* = X4
Tm c ng m:
X2 Y2 X2 Y2
0 X4 Y3 X3 Y2 X1 Y1
X2 Y4
X3 Y3 X3 Y3
Tng cp
Xong
X4 Y4 X4 Y4
6 6
L Minh Hong
L thuyt th \ 100 [
L Minh Hong
L thuyt th \ 101 [
L Minh Hong
L thuyt th \ 102 [
ASSIGN.INP ASSIGN.OUT
1 1 5 6 Optimal assignment:
1 1 0 1) X[1] - Y[1] 0
1 2 0 2) X[2] - Y[4] 2
2
2 1 0 3) X[3] - Y[2] 1
2
X 2 1 Y 2 4 2 4) X[4] - Y[3] 0
3 2 1 Cost: 3
3 3 0
3 3 6
4 3 0
4 4 9
9 5 4 9
4 4
19
5 5
L Minh Hong
L thuyt th \ 103 [
end;
{Hm cho bit trng s cnh (X[i], Y[j]) }
function GetC(i, j: Integer): Integer;
begin
GetC := c[i, j] - Fx[i] - Fy[j];
end;
L Minh Hong
L thuyt th \ 104 [
end;
{Ni rng b ghp bi ng m tm c}
procedure Enlarge;
x finish x finish
var
x, next: Integer;
begin next next
repeat
x := Trace[finish]; ... ... ... ...
next := matchX[x];
matchX[x] := finish;
matchY[finish] := x;
finish := Next; start start
until finish = 0;
end;
procedure Result;
var
x, y, Count, W: Integer;
begin
WriteLn('Optimal assignment:');
W := 0; Count := 0;
for x := 1 to m do {In ra php phn cng th ch cn xt n m, khng cn xt n k}
begin
y := matchX[x];
{Nhng cnh c trng s maxC tng ng vi mt th khng c giao vic v mt vic khng c phn cng}
if c[x, y] < maxC then
begin
Inc(Count);
WriteLn(Count:5, ') X[', x, '] - Y[', y, '] ', c[x, y]);
W := W + c[x, y];
end;
end;
WriteLn('Cost: ', W);
end;
begin
Assign(Input, 'ASSIGN.INP'); Reset(Input);
Assign(Output, 'ASSIGN.OUT'); Rewrite(Output);
Enter;
Init;
Solve;
Result;
Close(Input);
Close(Output);
end.
Nhn xt:
1. Nu ci t nh trn th cho d th c cnh mang trng s m, chng trnh vn tm c
b ghp cc i vi trng s cc tiu. L do: Ban u, ta tr tt c cc phn t trn mi hng
L Minh Hong
L thuyt th \ 105 [
L Minh Hong
L thuyt th \ 106 [
x* x*
-
y1 + + y2 y1 y2
x1 - - x2 x1 x2
y3 + y4 + y5 + y7 y3 y4 y5 y7
x3 - X4 - X5 - X7 x3 X4 X5 X7
y6 y6
Augmenting path found
Hnh 23: Cy pha "mc" ln hn sau mi ln xoay trng s cnh v tm ng
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 yY, gi d[y] := khong cch t y n cy pha gc x*. Ban u d[y] c khi to bng
trng s cnh (x*, y) = c[x*, y] - Fx[x*] - Fy[y] (cy pha ban u ch c ng mt nh x*).
Trong bc tm ng bng BFS, mi ln rt mt nh x ra khi Queue, ta xt nhng nh yY
cha thm v t li d[y]mi := min(d[y]c, trng s cnh (x, y)) sau mi kim tra xem (x, y) 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[y] 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[y] dng v thc hin php cng, tr trn hai dy i ngu Fx v Fy, n c phc tp
tnh ton O(k), ti a c k ln xoay tm ng m nn tng chi ph thi gian thc hin cc ln
xoay cho ti khi tm ra ng m c O(k2). Lu rng th ang xt l th hai pha y nn
sau khi xoay cc trng s cnh bng gi tr xoay , tt c cc cnh ni t X_nh trong cy pha ti
L Minh Hong
L thuyt th \ 107 [
L Minh Hong
L thuyt th \ 108 [
end;
for j := 1 to k do
begin
Fy[j] := maxC;
for i := 1 to k do
if c[i, j] - Fx[i] < Fy[j] then Fy[j] := c[i, j] - Fx[i];
end;
end;
L Minh Hong
L thuyt th \ 109 [
d[j] := w;
arg[j] := i;
end;
end;
until first > last;
end;
procedure Solve;
var
x, y: Integer;
begin
for x := 1 to k do {Vi mi X_nh: }
begin
start := x; {t ni khi u ng m}
InitBFS; {Khi to cy pha}
repeat
L Minh Hong
L thuyt th \ 110 [
FindAugmentingPath; {Tm ng m}
if finish = 0 then SubX_AddY; {Nu khng thy th xoay cc trng s cnh ...}
until finish <> 0; {Cho ti khi tm ra ng m}
Enlarge; {Ni rng b ghp bi ng m tm c}
end;
end;
procedure Result;
var
x, y, Count, W: Integer;
begin
WriteLn('Optimal assignment:');
W := 0; Count := 0;
for x := 1 to m do {Vi mi X_nh, xt cp ghp tng ng}
begin
y := matchX[x];
if c[x, y] < maxC then {Ch quan tm n nhng cp ghp c trng s < maxC}
begin
Inc(Count);
WriteLn(Count:5, ') X[', x, '] - Y[', y, '] ', c[x, y]);
W := W + c[x, y];
end;
end;
WriteLn('Cost: ', W);
end;
begin
Assign(Input, 'ASSIGN.INP'); Reset(Input);
Assign(Output, 'ASSIGN.OUT'); Rewrite(Output);
Enter;
Init;
Solve;
Result;
Close(Input);
Close(Output);
end.
L Minh Hong
L thuyt th \ 111 [
8 1 2
matched edge
5 6
9
unmatched edge
L Minh Hong
L thuyt th \ 112 [
Shrink Shrink
blossom
blossom
L Minh Hong
L thuyt th \ 113 [
expand expand
blossom
blossom
L Minh Hong
L thuyt th \ 114 [
x 1 2 x 1 2
T:1 T:1
Tm thy ng m
Trng hp 2: v cha thm v ghp
L Minh Hong
L thuyt th \ 115 [
x 1 2 x 1 2
T:1 T:1
Thm c v ln match[v], gn nhn T[v] v S[match[v]]
Trng hp 3: v thm, l nh m thuc cng blossom vi u
T:3 T:7
S:5 S:4
u=4 5
x 1 2 3
T:1 S:2
6 v=7
T:3 T:5
S:7 S:6
b=3
Khng xt, b qua
Trng hp 4: v thm, l nh m v b[u] b[v]
T:3 T:7
T:3 S:4 S:5 S:4
4 u=5 4 u=5
a
x x 1 2 3
1 2 3
T:1 S:2 T:1 S:2
6 v=7 6 v=7
T:3 T:5
T:3 S:6 S:7 S:6
8 8
b=3
Tm nh c s a = 3, gn li nhn S v T dc chu trnh pha, chp Blossom.
y hai nh m mi 4, 6 vo hng i, Ti nhng bc sau,
khi duyt ti nh 6, s tm thy ng m kt thc 8,
truy vt theo nhn S v T tm c ng (1, 2, 3, 4, 5, 7, 6, 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.
IV. CI T
Ta s ci t phng php Lawler vi khun dng Input/Output nh sau:
Input: file vn bn GMATCH.INP
Dng 1: Cha hai s n, m ln lt l s cnh v s nh ca th cch nhau t nht mt du
cch (n 100)
m dng tip theo, mi dng cha hai s u, v tng trng cho mt cnh (u, v) ca th
L Minh Hong
L thuyt th \ 116 [
L Minh Hong
L thuyt th \ 117 [
begin
FillChar(match, SizeOf(match), 0);
end;
{Kh nht ca phng php Lawler l th tc ny: Th tc x l khi gp cnh nht nt hai nh m p, q}
procedure BlossomShrink(p, q: Integer);
var
i, NewBase: Integer;
Mark: array[1..max] of Boolean;
L Minh Hong
L thuyt th \ 118 [
begin {BlossomShrink}
FillChar(Mark, SizeOf(Mark), False); {Tt c cc nhn b[v] u cha b nh du}
NewBase := FindCommonAncestor(p, q); {xc nh nt c s}
{Gn li nhn}
ResetTrace(p); ResetTrace(q);
if b[p] <> NewBase then T[p] := q;
if b[q] <> NewBase then T[q] := p;
{Chp blossom gn li cc nhn b[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 tip ti cc bc 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;
{Xt nhng nh v cha duyt, k vi u, khng nm cng Blossom vi u, d nhin T[v] = 0 th (u, v) l cnh nht ri}
for v := 1 to n do
if (T[v] = 0) and (a[u, v]) and (b[u] <> b[v]) then
begin
if match[v] = 0 then {Nu v cha ghp th ghi nhn nh kt thc ng m v thot ngay}
begin
T[v] := u;
finish := v;
Exit;
end;
{Nu v l nh m th gn li vt, chp Blossom ...}
if (v = start) or (T[match[v]] <> 0) then
BlossomShrink(u, v)
else {Nu khng th ghi vt ng i, thm v, thm lun c match[v] v y tip match[v] vo Queue}
begin
T[v] := u;
Push(match[v]);
end;
end;
until first > last;
end;
L Minh Hong
L thuyt th \ 119 [
match[finish] := v;
finish := next;
until finish = 0;
end;
begin
Assign(Input, 'GMATCH.INP'); Reset(Input);
Assign(Output, 'GMATCH.OUT'); Rewrite(Output);
Enter;
Init;
Solve;
Result;
Close(Input);
Close(Output);
end.
L Minh Hong