Professional Documents
Culture Documents
\
1[
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[
An n
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
k! k!(n k)!
S tp con ca tp n phn t:
0
Cn
C n 1 ... C nn (1 1)n 2n
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
I. SINH CC DY NH PHN DI N
Mt dy nh phn di n l mt dy x = x1x2...xn trong xi {0, 1} (i : 1 i n).
D thy: mt dy nh phn x di n l biu din nh phn ca mt gi tr nguyn p(x) no nm
n
10010000
+ 1
Dy ang c:
cng thm 1:
10010001
Dy mi:
10010111
+ 1
10011000
BSTR.OUT
000
001
010
011
100
101
110
111
var
x: array[1..max] of Integer;
n, i: Integer;
begin
{nh ngha li thit b nhp/xut chun}
Close(Input); Close(Output);
end.
2.{1, 2, 4}
7.{2, 3, 4}
3.{1, 2, 5}
8.{2, 3, 5}
4.{1, 3, 4} 5.{1, 3, 5}
9.{2, 4, 5} 10.{3, 4, 5}
(1, 2, 6, 7, 8, 9);
Nu tm thy:
if i > 0 then
Tng xi ln 1.
xi := xi + 1;
(1, 3, 6, 7, 8, 9)
t tt c cc phn t pha sau xi bng gii hn di:
for j := i + 1 to k do xj := xj-1 + 1;
(1, 3, 4, 5, 6, 7)
Input: file vn bn SUBSET.INP cha hai s nguyn dng n, k (1 k n 30) cch nhau t nht
mt du cch
Output: file vn bn SUBSET.OUT cc tp con k phn t ca tp {1, 2, ..., n}
SUBSET.INP
5 3
SUBSET.OUT
{1, 2, 3}
{1, 2, 4}
{1, 2, 5}
{1, 3, 4}
{1, 3, 5}
{1, 4, 5}
{2, 3, 4}
{2, 3, 5}
{2, 4, 5}
{3, 4, 5}
Write('{');
for i := 1 to k - 1 do Write(x[i], ', ');
WriteLn(x[k], '}');
{Sinh tip}
i := k;
{xi l phn t cui dy, li dn i cho ti khi gp mt xi cha t gii hn trn n - k + i}
while (i > 0) and (x[i] = n - k + i) do Dec(i);
if i > 0 then
{Nu cha li n 0 c ngha l cha phi cu hnh kt thc}
begin
Inc(x[i]);
{Tng xi ln 1, t cc phn t ng sau xi bng gii hn di ca n}
for j := i + 1 to k do x[j] := x[j - 1] + 1;
end;
until i = 0;
{Li n tn 0 c ngha l tt c cc phn t t gii hn trn - ht cu hnh}
Close(Input); Close(Output);
end.
2.1243
8.2143
14.3142
20.4132
3.1324
9.2314
15.3214
21.4213
4.1342
10.2341
16.3241
22.4231
5.1423
11.2413
17.3412
23.4312
6.1432
12.2431
18.3421
24.4321
Nh vy hon v u tin s l (1, 2, ..., n). Hon v cui cng l (n, n-1, ... , 1).
Hon v s sinh ra phi ln hn hon v hin ti, hn th na phi l hon v va ln hn hon v
hin ti theo ngha khng th c mt hon v no khc chen gia chng khi sp th t.
Gi s hon v hin ti l x = (3, 2, 6, 5, 4, 1), xt 4 phn t cui cng, ta thy chng c xp gim
dn, iu c ngha l cho d ta c hon v 4 phn t ny th no, ta cng c mt hon v b
hn hon v hin ti!. Nh vy ta phi xt n x2 = 2, thay n bng mt gi tr khc. Ta s thay bng
gi tr no?, khng th l 1 bi nu vy s c hon v nh hn, khng th l 3 v c x1 = 3 ri
(phn t sau khng c chn vo nhng gi tr m phn t trc chn). Cn li cc gi tr 4, 5,
6. V cn mt hon v va ln hn hin ti nn ta chn x2 = 4. Cn cc gi tr (x3, x4, x5, x6) s
ly trong tp {2, 6, 5, 1}. Cng v tnh va ln nn ta s tm biu din nh nht ca 4 s ny gn
cho x3, x4, x5, x6 tc l (1, 2, 5, 6). Vy hon v mi s l (3, 4, 1, 2, 5, 6).
(3, 2, 6, 5, 4, 1) (3, 4, 1, 2, 5, 6).
Ta c nhn xt g qua v d ny: on cui ca hon v c xp gim dn, s x5 = 4 l s nh nht
trong on cui gim dn tho mn iu kin ln hn x2 = 2. Nu i ch x5 cho x2 th ta s c x2
= 4 v on cui vn c sp xp gim dn. Khi mun biu din nh nht cho cc gi tr
trong on cui th ta ch cn o ngc on cui.
Trong trng hp hon v hin ti l (2, 1, 3, 4) th hon v k tip s l (2, 1, 4, 3). Ta cng c th
coi hon v (2, 1, 3, 4) c on cui gim dn, on cui ny ch gm 1 phn t (4)
Vy k thut sinh hon v k tip t hon v hin ti c th xy dng nh sau:
Xc nh on cui gim dn di nht, tm ch s i ca phn t xi ng lin trc on cui .
iu ny ng ngha vi vic tm t v tr st cui dy ln u, gp ch s i u tin tha mn xi
< xi+1. Nu ton dy l gim dn, th l cu hnh cui.
i := n - 1;
while (i > 0) and (xi > xi+1) do i := i - 1;
Trong on cui gim dn, tm phn t xk nh nht tho mn iu kin xk > xi. Do on cui
gim dn, iu ny thc hin bng cch tm t cui dy ln u gp ch s k u tin tho mn
xk > xi (c th dng tm kim nh phn).
k := n;
while xk < xi do k := k - 1;
PERMUTE.OUT
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
var
Temp: Integer;
begin
Temp := X; X := Y; Y := Temp;
end;
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}
Swap(x[k], x[i]);
a := i + 1; b := n;
{i ch xk v xi}
{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
Try(2)
Try(3)
Try(2)
Try(3)
Try(3)
Try(3)
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;
procedure PrintResult;
hnh}
var
i: Integer;
begin
for i := 1 to n do Write(x[i]);
WriteLn;
end;
procedure Try(i: Integer);
xi}
var
j: Integer;
begin
for j := 0 to 1 do
begin
x[i] := j;
if i = n then PrintResult
else Try(i + 1);
xi+1}
end;
end;
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.
x1 := 1
Try(2)
x2 := 0
Try(3)
x3 := 0
000
x3 := 1
001
Try(2)
x2 := 1
x2 := 0
Try(3)
x3 := 0
010
Try(3)
x3 := 1
011
x3 := 0
100
x2 := 1
Try(3)
x3 := 1
101
x3 := 0
110
x3 := 1
111
result
xi n - k + i
...
x1 n - k + 1.
T suy ra xi-1 + 1 xi n - k + i (1 i k) y ta gi thit c thm mt s x0 = 0 khi xt i = 1.
Nh vy ta s xt tt c cc cch chn x1 t 1 (=x0 + 1) n n - k + 1, vi mi gi tr , xt tip tt
c cc cch chn x2 t x1 + 1 n n - k + 2,... c nh vy khi chn c n xk th ta c mt cu
hnh cn lit k. Chng trnh lit k bng thut ton quay lui nh sau:
PROG03_2.PAS * Thut ton quay lui lit k cc tp con k phn t
program Combinations;
const
max = 30;
var
x: array[0..max] of Integer;
n, k: Integer;
procedure PrintResult; (*In ra tp con {x1, x2, ..., xk}*)
var
i: Integer;
begin
Write('{');
for i := 1 to k - 1 do Write(x[i], ', ');
WriteLn(x[k], '}');
end;
procedure Try(i: Integer); {Th cc cch chn gi tr cho x[i]}
var
j: Integer;
begin
for j := x[i - 1] + 1 to n - k + i do
begin
x[i] := j;
if i = k then PrintResult
else Try(i + 1);
end;
end;
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.
ARRANGES.OUT
1 2
1 3
2 1
2 3
3 1
3 2
{Th tc in cu hnh tm c}
var
i: Integer;
begin
for i := 1 to k do Write(x[i],' ');
WriteLn;
end;
procedure Try(i: Integer); {Th cc cch chn xi}
var
j: Integer;
begin
for j := 1 to n do
if c[j] then
{Ch xt nhng gi tr j cn t do}
begin
x[i] := j;
if i = k then PrintResult {Nu chn c n xk th ch vic in kt qu}
else
begin
c[j] := False; {nh du: j b chn}
c[j] := True;
{B
end;
end;
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.
ANALYSE.OUT
6 = 1+1+1+1+1+1
6 = 1+1+1+1+2
6 = 1+1+1+3
6 = 1+1+2+2
6 = 1+1+4
6 = 1+2+3
6 = 1+5
6 = 2+2+2
6 = 2+4
6 = 3+3
6 = 6
{Khi to}
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.
Phn tch
R rng n qun hu s c t mi con mt hng v hu n c ngang, ta gi qun hu s t
hng 1 l qun hu 1, qun hu hng 2 l qun hu 2... qun hu hng n l qun hu n.
Vy mt nghim ca bi ton s c bit khi ta tm ra c v tr ct ca nhng qun hu.
Nu ta nh hng ng (Phi), Ty (Tri), Nam (Di), Bc (Trn) th ta nhn thy rng:
Mt ng cho theo hng ng Bc - Ty Nam (B-TN) bt k s i qua mt s , cc
c tnh cht: Hng + Ct = C (Const). Vi mi ng cho B-TN ta c 1 hng s C v
vi mt hng s C: 2 C 2n xc nh duy nht 1 ng cho B-TN v vy ta c th nh
ch s cho cc ng cho B- TN t 2 n 2n
Mt ng cho theo hng ng Nam - Ty Bc (N-TB) bt k s i qua mt s , cc
c tnh cht: Hng - Ct = C (Const). Vi mi ng cho N-TB ta c 1 hng s C v
vi mt hng s C: 1 - n C n - 1 xc nh duy nht 1 ng cho N-TB v vy ta c th
nh ch s cho cc ng cho N- TB t 1 - n n n - 1.
1
2
3
W
4
5
6
7
8
Ci t:
1. Ta c 3 mng logic nh du:
Mng a[1..n]. ai = TRUE nu nh ct i cn t do, ai = FALSE nu nh ct i b mt qun hu
khng ch
Mng b[2..2n]. bi = TRUE nu nh ng cho B-TN th i cn t do, bi = FALSE nu nh
ng cho b mt qun hu khng ch.
Mng c[1 - n..n - 1]. ci = TRUE nu nh ng cho N-TB th i cn t do, ci = FALSE nu
nh ng cho b mt qun hu khng ch.
Ban u c 3 mng nh du u mang gi tr TRUE. (Cc ct v ng cho u t do)
2. Thut ton quay lui: Xt tt c cc ct, th t qun hu 1 vo mt ct, vi mi cch t nh vy,
xt tt c cc cch t qun hu 2 khng b qun hu 1 n, li th 1 cch t v xt tip cc cch t
qun hu 3...Mi cch t c n qun hu n cho ta 1 nghim
3. Khi chn v tr ct j cho qun hu th i, th ta phi chn (i, j) khng b cc qun hu t trc
n, tc l phi chn ct j cn t do, ng cho B-TN (i+j) cn t do, ng cho N-TB(i-j)
cn t do. iu ny c th kim tra (aj = bi+j = ci-j = TRUE)
4. Khi th t c qun hu th i vo ct j, nu l qun hu cui cng (i = n) th ta c mt
nghim. Nu khng:
Trc khi gi quy tm cch t qun hu th i + 1, ta nh du ct v 2 ng cho b qun
hu va t khng ch (aj = bi+j = ci-j := FALSE) cc ln gi quy tip sau chn cch t
cc qun hu k tip s khng chn vo nhng nm trn ct j v nhng ng cho ny na.
Sau khi gi quy tm cch t qun hu th i + 1, c ngha l sp ti ta li th mt cch t
khc cho qun hu th i, ta b nh du ct v 2 ng cho b qun hu va th t khng ch
(aj = bi+j = ci-j := TRUE) tc l ct v 2 ng cho li thnh t do, bi khi t qun hu i
sang v tr khc ri th ct v 2 ng cho hon ton c th gn cho mt qun hu khc
Hy xem li trong cc chng trnh lit k chnh hp khng lp v hon v v k thut nh du.
y ch khc vi lit k hon v l: lit k hon v ch cn mt mng nh du xem gi tr c t do
khng, cn bi ton xp hu th cn phi nh du c 3 thnh phn: Ct, ng cho B-TN,
ng cho N- TB. Trng hp n gin hn: Yu cu lit k cc cch t n qun xe ln bn c
nxn sao cho khng qun no n qun no chnh l bi ton lit k hon v
Input: file vn bn QUEENS.INP cha s nguyn dng n 12
Output: file vn bn QUEENS.OUT, mi dng ghi mt cch t n qun hu
QUEENS.INP
5
QUEENS.OUT
(1, 1); (2,
(1, 1); (2,
(1, 2); (2,
(1, 2); (2,
(1, 3); (2,
(1, 3); (2,
(1, 4); (2,
(1, 4); (2,
(1, 5); (2,
(1, 5); (2,
3);
4);
4);
5);
1);
5);
1);
2);
2);
3);
(3,
(3,
(3,
(3,
(3,
(3,
(3,
(3,
(3,
(3,
5);
2);
1);
3);
4);
2);
3);
5);
4);
1);
(4,
(4,
(4,
(4,
(4,
(4,
(4,
(4,
(4,
(4,
{Mi ct u t do}
{Mi ng cho ng Bc - Ty Nam u t do}
{Mi ng cho ng Nam - Ty Bc u t do}
procedure PrintResult;
var
i: Integer;
begin
for i := 1 to n do Write('(', i, ', ', x[i], '); ');
WriteLn;
end;
procedure Try(i: Integer); {Th cc cch t qun hu th i vo hng i}
var
j: Integer;
begin
for j := 1 to n do
if a[j] and b[i + j] and c[i - j] then {Ch xt nhng ct j m (i, j) cha b khng ch}
begin
x[i] := j;
{Th t qun hu i vo ct
j}
if i = n then PrintResult
else
begin
a[j] := False; b[i + j] := False; c[i - j] := False;
Try(i + 1);
{Tm cc cch t qun hu th i + 1}
end;
end;
end;
begin
Assign(Input, 'QUEENS.INP'); Reset(Input);
Assign(Output, 'QUEENS.OUT'); Rewrite(Output);
Init;
{nh du}
{B nh du}
Try(1);
Close(Input); Close(Output);
end.
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
n
K thut nhnh cn thm vo cho thut ton quay lui kh nng nh gi theo tng bc, nu ti
bc th i, gi tr th gn cho x i khng c hi vng tm thy cu hnh tt hn cu hnh
BESTCONFIG th th gi tr khc ngay m khng cn phi gi quy tm tip hay ghi nhn kt
qu lm g. Nghim ca bi ton s c lm tt dn, bi khi tm ra mt cu hnh mi (tt hn
BESTCONFIG - tt nhin), ta khng in kt qu ngay m s cp nht BESTCONFIG bng cu hnh
mi va tm c
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.
TOURISM.INP
4 6
1 2 3
1 3 2
1 4 1
2 3 1
2 4 2
3 4 4
TOURISM.OUT
1->3->2->4->1
Cost: 6
begin
X[i] := j;
{Th i}
T[i] := T[i - 1] + C[x[i - 1], j];
{Chi ph := Chi ph bc trc + chi ph ng i trc tip}
if T[i] < MinSpending then
{Hin nhin nu c iu ny th C[x[i - 1], j] < + ri}
begin
end;
end;
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.
ABC.OUT
ABACABCBAB
"C" Letter Count
: 2
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 Same(i, l) cho bit xu gm l k t kt thc ti Xi c trng vi xu l k t lin trc n khng ?}
{Hm Check(i) cho bit Xi c lm hng tnh khng lp ca dy X1X2 ... Xi hay khng}
trc}
begin
Check := False; Exit;
end;
Check := True;
end;
{Gi li kt qu va tm c vo BestConfig (MinC v mng Best)}
procedure KeepResult;
begin
MinC := T[N];
Best := X;
end;
{Thut ton quay lui c nhnh cn}
end;
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.
())
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
0
0
0
0
1
1
0
1
0
1
0
1
1
0
1
0
0
0
1
0
1
1
1
0
1
0
1
0
0
0
0
1
1
1
0
1
0
0
1
0
1
1
0
0
0
0
1
0
0
1
0
0
0
1
1
1
1
1
1
0
0
0
0
0
1
0
1
0
0
0
0
1
1
1
0
1
1
0
0
1
0
1
0
0
1
0
1
0
0
1
1
0
1
0
1
1
0
0
1
2
2
2
2
3
2
2
2
0
3
3
4
4
3
5
3
5
3
2
1
3
4
6
6
6
3
4
1
1
2
4
5
6
5
3
3
3
3
2
1
3
3
3
5
4
5
5
4
3
3
3
3
2
2
2
3
5
4
3
1
2
2
2
4
5
5
7
5
4
2
2
3
2
3
3
4
5
3
3
2
2
5
4
5
5
4
6
3
2
2
2
3
3
1
3
2
3
2
1
3
4
3
5
4
5
3
4
5
3
5
5
5
4
2
3
2
1
3
1
3
4
4
2
2
2
3
3
5
2
4
7
4
4
3
4
4
3
5
2
4
7
4
4
2
4
6
5
6
2
5
7
4
3
3
3
6
5
5
3
4
5
3
2
3
4
5
5
4
3
4
6
4
3
2
2
3
6
4
3
4
6
5
5
5
4
3
4
4
4
3
5
5
4
2
1
1
3
3
2
MINE.OUT
80
1 0 1 1 1
0 0 1 0 0
0 0 1 0 0
1 0 1 1 1
1 0 0 0 1
0 0 0 0 1
0 1 1 0 0
1 0 1 0 1
0 1 1 0 1
1 1 1 1 1
1
1
1
0
1
0
1
0
0
0
0
1
0
0
1
0
0
1
0
1
1
1
0
1
0
0
0
0
0
1
1
0
1
0
0
0
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
0
1
0
1
1
0
1
1
0
0
0
0
0
1
1
0
1
0
0
0
1
1
1
0
1
0
1
1
1
1
0
0
0
1
1
0
1
1
1
1
1
0
0
0
1
1
\ 1[
MC LC
0. CC BC C BN KHI TIN HNH GII CC BI TON TIN HC
..................................... 3
I. XC NH BI TON
..................................................................................................................................3
II. TM CU TRC D LIU BIU DIN BI
TON..................................................................................3
III. TM THUT TON.....................................................................................................................................4
IV. LP TRNH ..................................................................................................................................................5
V. KIM TH ....................................................................................................................................................6
VI. TI U CHNG TRNH..........................................................................................................................6
1. PHN TCH THI GIAN THC HIN GII THUT
...................................................................... 8
I. PHC TP TNH TON CA GII THUT
.......................................................................................8
II. XC NH PHC TP TNH TON CA GII THUT
.................................................................8
V. PHC TP TNH TON VI TNH TRNG D LIU
VO.........................................................10
VI. CHI PH THC HIN THUT
TON.....................................................................................................11
2. QUY V GII THUT QUY...............................................................................................
12
I. KHI NIM V QUY
............................................................................................................................12
II. GII THUT QUY ...............................................................................................................................12
III. V D V GII THUT
QUY............................................................................................................12
IV. HIU LC CA
QUY.........................................................................................................................15
3. CU TRC D LIU BIU DIN DANH SCH ..........................................................................
17
I. KHI NIM DANH SCH
..........................................................................................................................17
II. BIU DIN DANH SCH TRONG MY TNH
......................................................................................17
4. NGN XP V HNG I...........................................................................................................
21
I. NGN XP
(STACK)...................................................................................................................................21
II. HNG I
(QUEUE)..................................................................................................................................23
5. CY (TREE)................................................................................................................................... 27
I. NH
NGHA................................................................................................................................................27
II. CY NH PHN (BINARY
TREE)............................................................................................................28
III. BIU DIN CY NH
PHN....................................................................................................................29
\ 2[
IV. PHP DUYT CY NH PHN...............................................................................................................30
V. CY K_PHN .............................................................................................................................................32
VI. CY TNG QUT ....................................................................................................................................32
6. K PHP TIN T, TRUNG T V HU T..............................................................................
35
I. BIU THC DI DNG CY NH
PHN.............................................................................................35
II. CC K PHP CHO CNG MT BIU THC......................................................................................35
III. CCH TNH GI TR BIU THC.........................................................................................................35
IV. CHUYN T DNG TRUNG T SANG DNG HU T
...................................................................38
V. XY DNG CY NH PHN BIU DIN BIU
THC........................................................................41
7. SP XP (SORTING)....................................................................................................................
42
I. BI TON SP XP....................................................................................................................................42
II. THUT TON SP XP KIU CHN (SELECTION SORT)
................................................................44
III. THUT TON SP XP NI BT (BUBBLE SORT)
..........................................................................44
IV. THUT TON SP XP KIU
CHN....................................................................................................45
V. SHELL SORT...............................................................................................................................................46
\ 3[
\ 4[
begin
Input: a, b
b>0?
No
Output a;
Yes
r := a mod b;
a := b;
b := r;
end
Hnh 1: Lu thut gii
Khi m t thut ton bng ngn ng t nhin, ta khng cn phi qu chi tit cc bc v tin
trnh thc hin m ch cn m t mt cch hnh thc chuyn thnh ngn ng lp trnh.
Vit s cc thut ton quy l mt v d.
i vi nhng thut ton phc tp v nng v tnh ton, cc bc v cc cng thc nn m t
mt cch tng minh v ch thch r rng khi lp trnh ta c th nhanh chng tra cu.
i vi nhng thut ton kinh in th phi thuc. Khi gii mt bi ton ln trong mt thi gian
gii hn, ta ch phi thit k tng th cn nhng ch thuc th c vic lp rp vo. Tnh ng
n ca nhng m-un thuc ta khng cn phi quan tm na m tp trung gii quyt cc
phn khc.
IV. LP TRNH
Sau khi c thut ton, ta phi tin hnh lp trnh th hin thut ton . Mun lp trnh t hiu
qu cao, cn phi c k thut lp trnh tt. K thut lp trnh tt th hin k nng vit chng
trnh, kh nng g ri v thao tc nhanh. Lp trnh tt khng phi ch cn nm vng ngn ng lp
trnh l , phi bit cch vit chng trnh uyn chuyn, khn kho v pht trin dn dn
chuyn cc tng ra thnh chng trnh hon chnh. Kinh nghim cho thy mt thut ton hay
nhng do ci t vng v nn khi chy li cho kt qu sai hoc tc chm.
Thng thng, ta khng nn c th ho ngay ton b chng trnh m nn tin hnh theo phng
php tinh ch tng bc (Stepwise refinement):
Ban u, chng trnh c th hin bng ngn ng t nhin, th hin thut ton vi cc bc
tng th, mi bc nu ln mt cng vic phi thc hin.
Mt cng vic n gin hoc l mt on chng trnh c hc thuc th ta tin hnh vit
m lnh ngay bng ngn ng lp trnh.
Mt cng vic phc tp th ta li chia ra thnh nhng cng vic nh hn li tip tc vi
nhng cng vic nh hn .
Trong qu trnh tinh ch tng bc, ta phi a ra nhng biu din d liu. Nh vy cng vi s
tinh ch cc cng vic, d liu cng c tinh ch dn, c cu trc hn, th hin r hn mi lin h
gia cc d liu.
Phng php tinh ch tng bc l mt th hin ca t duy gii quyt vn t trn xung, gip
cho ngi lp trnh c c mt nh hng th hin trong phong cch vit chng trnh. Trnh
vic m mm, xo i vit li nhiu ln, bin chng trnh thnh t giy nhp.
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:
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 .
(*)
nh thi gian thc hin mt gii thut l T1(n) = n v thi gian thc hin ca mt gii thut khc l
T2(n) = 100n th khi n ln, thi gian thc hin ca gii thut T2 r rng nhanh hn gii thut T1.
2
Khi , nu ni rng thi gian thc hin gii thut t l thun vi n hay t l thun vi n cng cho ta
mt cch nh gi tng i v tc thc hin ca gii thut khi n kh ln. Cch nh gi thi
gian thc hin gii thut c lp vi my tnh v cc yu t lin quan ti my tnh nh vy s dn
ti khi nim gi l phc tp tnh ton ca gii thut.
Cho f v g l hai hm xc nh dng vi mi n. Hm f(n) c gi l O(g(n)) nu tn ti mt hng
s c > 0 v mt gi tr n0 sao cho:
f(n) c.g(n) vi n n0
Ngha l nu xt nhng gi tr n n0 th hm f(n) s b chn trn bi mt hng s nhn vi g(n). Khi
, nu f(n) l thi gian thc hin ca mt gii thut th ta ni gii thut c cp l g(n) (hay
phc tp tnh ton l O(g(n))).
II. XC NH PHC TP TNH TON CA GII THUT
Vic xc nh phc tp tnh ton ca mt gii thut bt k c th rt phc tp. Tuy nhin, trong
thc t, i vi mt s gii thut ta c th phn tch bng mt s quy tc n gin:
1. Quy tc tng
Nu on chng trnh P1 c thi gian thc hin T1(n) =O(f(n)) v on chng trnh P2 c thi
gian thc hin l T2(n) = O(g(n)) th thi gian thc hin P1 ri n P2 tip theo s l
T1(n) + T2(n) = O(max(f(n), g(n)))
Chng minh:
T1(n) = O(f(n)) nn n1 v c1 T1(n) c1.f(n) vi n n1.
T2(n) = O(g(n)) nn n2 v c2 T2(n) c2.g(n) vi n n2.
Chn n0 = max(n1, n2) v c = max(c1, c2) ta c:
Vi n n0:
T1(n) + T2(n) c1.f(n) + c2.g(n) c.f(n) + c.g(n) c.(f(n) + g(n)) 2c.(max(f(n), g(n))).
Vy T1(n) + T2(n) = O(max(f(n), g(n))).
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:
k
a) Vi P(n) l mt a thc bc k th O(P(n)) = O(n ). V th, mt thut ton c phc tp cp a
k
thc, ngi ta thng k hiu l O(n )
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).
n
n
d) Mt gii thut c cp l cc hm nh 2 , n!, n 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.
2
3
e) Khng phi lc no mt gii thut cp O(n ) cng tt hn gii thut cp O(n ). Bi nu nh gii
2
thut cp O(n ) c thi gian thc hin l 1000n , cn gii thut cp O(n ) li ch cn thi gian thc
3
hin l n , th vi n < 1000, r rng gii thut O(n ) tt hn gii thut O(n ). 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)
2
n
1
2
4
8
16
32
nlog2n
0
2
8
24
64
160
V d:
Thut ton tnh tng cc s t 1 ti n:
n2
1
4
16
64
256
1024
n3
1
8
64
512
4096
32768
2n
2
4
16
256
65536
2147483648
Th phc tp tnh ton ca thut ton trn l O(1), thi gian tnh ton khng ph thuc vo n.
4. Php ton tch cc
Da vo nhng nhn xt nu trn v cc quy tc khi nh gi thi gian thc hin gii thut, ta
ch cn ch n mt php ton m ta gi l php ton tch cc trong mt on chng trnh. l
mt php ton trong mt on chng trnh m s ln thc hin khng t hn cc php ton
khc.
x
Xt hai on chng trnh tnh e bng cng thc gn ng:
i
n
n
x 2
x
x
x
e 1 ...
vi x v n cho trc.
x
n! i 0 i!
1! 2!
{Chng trnh 1: Tnh ring tng hng t ri cng li}
program Exp1;
var
i, j, n: Integer;
x, p, S: Real;
begin
Write('x, n = '); ReadLn(x, n);
S := 0;
for i := 0 to n do
begin
p := 1;
for j := 1 to i do p := p * x / j;
S := S + p;
end;
WriteLn('exp(', x:1:4, ') = ', S:1:4);
end.
Ta c th coi php ton tch cc
y l p := p
* x / j;
S ln thc hin php ton ny l:
0 + 1 + 2 + ... + n = n(n - 1)/2 ln.
Vy phc tp tnh ton ca thut ton l
2
O(n )
program Exp2;
var
i, n: Integer;
x, p, S: Real;
begin
Write('x, n = '); ReadLn(x, n);
S := 1; p := 1;
for i := 1 to n do
begin
p := p * x / i;
S := S + p;
end;
WriteLn('exp(', x:1:4, ') = ', S:1:4);
end.
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))
k
cng c th coi cp l cp O(n )
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;
do c[i] := 0;
do
n do
c[i + j] + a[i] * b[j];
{Nhn vo s t nhin n v tr v
n!}
begin
if n = 0 then Factorial := 1
{Phn neo}
else Factorial := n * Factorial(n - 1); {Phn quy}
end;
3 * 2!
2!
2 *
1!
1!
1 * 0!
0!
2. Dy s Fibonacci
Dy s Fibonacci bt ngun t bi ton c v vic sinh sn ca cc cp th. Bi ton t ra nh sau:
1) Cc con th khng bao gi cht
2) Hai thng sau khi ra i, mi cp th mi s sinh ra mt cp th con (mt c, mt ci)
3) Khi sinh con ri th c mi thng tip theo chng li sinh c mt cp con mi
Gi s t u thng 1 c mt cp mi ra i th n gia thng th n s c bao nhiu cp.
V d, n = 5, ta thy:
Gia thng th 1: 1 cp (ab) (cp ban u)
Gia thng th 2: 1 cp (ab) (cp ban u vn cha )
Gia thng th 3: 2 cp (AB)(cd) (cp ban u ra thm 1 cp con)
Gia thng th 4: 3 cp (AB)(cd)(ef) (cp ban u tip tc )
Gia thng th 5: 5 cp (AB)(CD)(ef)(gh)(ik) (c cp (AB) v (CD) cng )
By gi, ta xt ti vic tnh s cp th thng th n: F(n)
Nu mi cp th thng th n - 1 u sinh ra mt cp th con th s cp th thng th n s l:
F(n) = 2 * F(n - 1)
Nhng vn khng phi nh vy, trong cc cp th thng th n - 1, ch c nhng cp th c
thng th n - 2 mi sinh con thng th n c thi. Do F(n) = F(n - 1) + F(n - 2) (= s c +
s sinh ra). Vy c th tnh c F(n) theo cng thc sau:
F(n) = 1 nu n 2
F(n) = F(n - 1) + F(n - 2) nu n > 2
function F(n: Integer): Integer;
{Tnh s cp th thng th
n}
begin
if n 2 then F := 1
else F := F(n - 1) + F(n - 2);
end;
{Phn neo}
{Phn quy}
3. Gi thuyt ca Collatz
Collatz a ra gi thuyt rng: vi mt s nguyn dng X, nu X chn th ta gn X := X div 2; nu
X l th ta gn X := X * 3 + 1. Th sau mt s hu hn bc, ta s c X = 1.
V du: X = 10, cc bc tin hnh nh sau:
1.
2.
3.
4.
5.
6.
X
X
X
X
X
X
=
=
=
=
=
=
10 (chn)
5 (l);
16 (chn)
8 (chn)
4 (chn)
2 (chn)
X
X
X
X
X
X
:=
:=
:=
:=
:=
:=
10 div 2;
5 * 3 + 1;
16 div 2;
8 div 2;
4 div 2;
2 div 2;
(X
(X
(X
(X
(X
(X
:=
:=
:=
:=
:=
:=
5)
16)
8)
4)
2)
1)
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);
begin
if X = 1 then Write(X)
else
if X mod 2 = 0 then
begin
Solve(X div 2);
Write(' * 2');
end
else
begin
Solve(X * 3 + 1);
2}
{X l}
{Tm cch biu din s X * 3 +
1}
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);
begin
Solve(X * 3 + 1);
Write(' div 3');
end;
Trong c hai cch vit, tm biu din s X theo yu cu ch cn gi Solve(X) l xong. Tuy nhin
trong cch vit quy trc tip, th tc Solve c li gi ti chnh n, cn trong cch vit quy
tng h, th tc Solve cha li gi ti th tc SolveOdd v SolveEven, hai th tc ny li cha
trong n li gi ngc v th tc Solve.
i vi nhng bi ton nu trn, vic thit k cc gii thut quy tng ng kh thun li v c
hai u thuc dng tnh gi tr hm m nh ngha quy np ca hm c xc nh d dng.
Nhng khng phi lc no php gii quy cng c th nhn nhn v thit k d dng nh vy. Th
th vn g cn lu tm trong php gii quy?. C th tm thy cu tr li qua vic gii p cc
cu hi sau:
1. C th nh ngha c bi ton di dng phi hp ca nhng bi ton cng loi nhng nh hn
hay khng ? Khi nim "nh hn" l th no ?
2. Trng hp c bit no ca bi ton s c coi l trng hp tm thng v c th gii ngay
c a vo phn neo ca php gii quy
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:
Hnh 2: Thp H Ni
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);
end;
{Chuyn n - 1 a t v tr cn li sang v tr y}
end;
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
n
Thp H Ni vi n a l 2 -1:
1
trng hp ny n cn (2 - 1) + 1 + (2
minh ng vi n
Vy th cng thc ny s ng vi mi n.
n-1
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.
k
C n Cn 1
k
k1
k
Vi 0 < k < n: C n C n1 Cn1
k
n!
.
k!(n k)!
B
2
...
...
G
p - 1
H
p
I
p + 1
...
Z
n
B
2
...
...
G
p - 1
...
...
G
p - 1
...
...
G
p - 1
...
...
G
p - 1
H
p + 1
I
p + 2
...
Z
n + 1
V
p
H
p + 1
I
p + 2
...
Z
n + 1
H
p
I
p + 1
...
Z
n
Sau t gi tr V vo v tr p:
A
1
B
2
Tng n ln 1
Xo phn t khi mng
Mng ban u:
A
1
B
2
A
1
B
2
I
p
...
Z
n - 1
Gim n i 1
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
Head
...
...
Head
...
...
q
...
...
Head
...
...
First
Value 1
Value 2
...
Value n-1
Value n
...
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
...
...
Head
...
...
q
Value 1
Value n
Value 2
Value n-1
...
...
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)
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;
procedure StackInit;
{Khi
to
Stack
rng}
begin
Last := 0;
end;
procedure Push(V: Integer);
{y mt gi tr V vo
Stack}
begin
if Last = max then WriteLn('Stack is full')
na}
else
begin
Inc(Last); Stack[Last] := V;
end;
end;
function Pop: Integer;
hm}
begin
if Last = 0 then WriteLn('Stack is empty')
else
begin
Pop := Stack[Last]; Dec(Last);
end;
end;
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
V2
...
Vn-1
Vn
...
Last
program StackByLinkedList;
type
PNode = ^TNode;
{Con tr ti mt nt ca danh
sch}
TNode = record
sch}
Value: Integer;
Link: PNode;
end;
var
Last: PNode;
{Con tr nh Stack}
{Khi to mt hng i
rng}
begin
First := 1; Last := 0;
end;
procedure Push(V: Integer);
{y V vo hng
i}
begin
if Last = max then WriteLn('Overflow')
else
begin
Inc(Last);
Queue[Last] := V;
end;
end;
function Pop: Integer;
hm}
begin
if First > Last then WriteLn('Queue is Empty')
else
begin
Pop := Queue[First];
Inc(First);
end;
end;
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
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;
procedure QueueInit;
{Khi to Queue rng}
begin
First := 1; Last := 0; n := 0;
end;
procedure Push(V: Integer);
{y gi tr V vo Queue}
begin
if n = max then WriteLn('Queue is Full')
else
begin
if Last = max then Last := 1 else Inc(Last);
Queue[Last] := V;
Inc(n);
end;
end;
QueueInit;
<Test>
end.
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}
procedure QueueInit;
begin
First := nil;
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:
1
C
...
A
A
A
A
B
B
C
B
B
C
C
C
...
2
A
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 n 1, 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
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
2 B
3 F
2 C
2 D
3 G
3 H
K 4
Hnh 4: Mc ca cc nt trn cy
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
1
2
2
3
3
4
b)
4
5
a)
c)
d)
10
e)
f)
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.
i-1
S lng ti a cc nt trn mc i ca cy nh phn l 2 , ti thiu l 1 (i 1).
h
B 2
E 3
D 5
C 4
G 7
B
C
D
E
C
3
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
B
L
C
R
D
L
E
R
H
L
F
R
G
R
I
R
J
R
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);
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;
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;
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;
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
7
5
D
6
G
8
M
L
10
12
11
10
11
12
A
1
7
5
D
6
M
8
L
10
11
Mng Info:
Info[i]
10
11
12
Mng Children:
Children[i] 3
10
11
12
on 1
10
11
12
on 2
on 4
on 9
(Cc on 3, 5, 6, 7, 8, 10, 11, 12 l rng)
Mng Head:
Head[i]
12
12
12
12
10
11
12
13
+
L
/
L
3
R
6
L
7
R
4
R
2
R
gc n}
begin
if <Nt n cha khng phi l mt ton t> then
Calculate := <Gi tr cha trong nt n>
else
{Nt n cha mt ton t R}
begin
x := Calculate(nt con tri ca n);
y := Calculate(nt con phi ca n);
Calculate := x R y;
end;
end.
(Trong trng hp lp trnh trn cc h thng song song, vic tnh gi tr biu thc cy con tri
v cy con phi c th tin hnh ng thi lm gim ng k thi gian tnh ton biu thc).
rng khi tnh ton biu thc, my s phi quan tm ti vic tnh biu thc hai nhnh con
trc, ri mi xt n ton t nt gc. iu lm ta ngh ti php duyt hu th t v k php
hu t. Trong nhng nm u 1950, nh l-gic hc ngi Balan Jan Lukasiewicz chng minh
rng biu thc hu t khng cn phi c du ngoc vn c th tnh c mt cch ng n bng
cch c ln lt biu thc t tri qua phi v dng mt Stack lu cc kt qu trung gian:
Bc 1: Khi ng mt Stack rng
Bc 2: c ln lt cc phn t ca biu thc RPN t tri qua phi (phn t ny c th l hng,
bin hay ton t) vi mi phn t , ta kim tra:
Nu phn t ny l mt ton hng th y gi tr ca n vo Stack.
Nu phn t ny l mt ton t, ta ly t Stack ra hai gi tr (y v x) sau p dng ton t (R)
vo hai gi tr va ly ra, y kt qu tm c (x R y) vo Stack (ra hai vo mt).
Bc 3: Sau khi kt thc bc 2 th ton b biu thc c c xong, trong Stack ch cn duy
nht mt phn t, phn t chnh l gi tr ca biu thc.
V d: Tnh biu thc 10 2 / 3 + 7 4 - * (tng ng vi biu thc (10 / 2 + 3) * (7 - 4)
c
10
2
/
3
+
7
4
*
X l
y vo Stack
y vo Stack
Ly 2 v 10 khi Stack, Tnh c 10
y vo Stack
Ly 3 v 5 khi Stack, tnh c 5 +
y vo Stack
y vo Stack
Ly 4 v 7 khi Stack, tnh c 7 Ly 3 v 8 khi Stack, tnh c 8 *
/ 2 = 5, y 5 vo Stack
3 = 8, y 8 vo Stack
4 = 3, y 3 vo Stack
3 = 24, y 24 vo Stack
Stack
10
10, 2
5
5, 3
8
8, 7
8, 7, 4
8, 3
24
Ta c kt qu l 24
Di y ta s vit mt chng trnh n gin tnh gi tr biu thc RPN. Chng trnh s nhn
Input l biu thc RPN gm cc s thc v cc ton t + - * / v cho Output l kt qu biu thc .
Quy nh khun dng bt buc l hai s lin nhau trong biu thc RPN phi vit cch nhau t nht
mt du cch. qu trnh c mt phn t trong biu thc RPN c d dng hn, sau bc nhp
liu, ta c th hiu chnh i cht biu thc RPN v khun dng d c nht. Chng hn nh thm
v bt mt s du cch trong Input mi phn t (ton hng, ton t) u cch nhau ng mt du
cch, thm mt du cch vo cui biu thc RPN. Khi qu trnh c ln lt cc phn t trong
biu thc RPN c th lm nh sau:
T := '';
for p := 1 to Length(RPN) do
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.
V d v Input / Output ca chng trnh:
Enter RPN Expression: 10 2/3
+
4 7 -*
10 2 / 3 + 4 7 - * = 24.0000
CALRPN.PAS * Tnh gi tr biu thc RPN
{$N+,E+}
program CalculateRPNExpression;
const
Opt = ['+', '-', '*', '/'];
var
T, RPN: String;
Stack: array[1..255] of Extended;
p, Last: Integer;
{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cc thao tc i vi Stack - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
procedure StackInit;
begin
Last := 0;
end;
procedure Push(V: Extended);
begin
Inc(Last); Stack[Last] := V;
end;
function Pop: Extended;
begin
Pop := Stack[Last]; Dec(Last);
end;
{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - -}
procedure Refine(var S: String); {Hiu chnh biu thc RPN v khun dng d c nht}
var
i: Integer;
begin
S := S + ' ';
for i := Length(S) - 1 downto 1
if (S[i] in Opt) or (S[i + 1]
Insert(' ', S, i + 1);
for i := Length(S) - 1 downto 1
if (S[i] = ' ') and (S[i + 1]
end;
procedure Process(T: String);
var
do
{Thm nhng du cch gia ton hng v ton t}
in Opt) then
do
{Xo nhng du cch tha}
= ' ') then Delete(S, i + 1, 1);
{X l phn t T c c t biu thc RPN}
x, y: Extended;
e: Integer;
begin
if not (T[1] in Opt) then
begin
Val(T, x, e); Push(x);
end
else
begin
y := Pop; x := Pop;
case T[1] of
'+': x := x + y;
'-': x := x - y;
'*': x := x * y;
'/': x := x / y;
end;
Push(x);
end;
end;
{T l ton hng}
{i T thnh s v y gi tr vo Stack}
{T l ton t}
{Ra hai}
{Vo mt}
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.
case T of
'(': Push(T);
')':
repeat
x := Pop;
7
/
8
)
*
(
5
1
)
Ht
X l
y vo Stack
Hin th
php "*" c u tin hn phn t nh
Stack l "(", y "*" vo Stack
Hin th
php "+" u tin khng cao hn phn t
nh Stack l "*", ly ra v hin th "*".
So snh tip, thy php "+" c u tin
cao hn phn t nh Stack l "(", y
"+" vo Stack
Hin th
php "/" c u tin hn phn t nh
Stack l "+", y "/" vo Stack
Hin th
Ly ra v hin th cc phn t trong Stack
ti khi ly phi du ngoc m
Stack ang l rng, y * vo Stack
y vo Stack
Hin th
php "-" c u tin hn phn t nh
Stack l "(", y "-" vo Stack
Hin th
Ly ra v hin th cc phn t nh Stack
cho ti khi ly phi du ngoc m
Ly ra v hin th ht cc phn t cn li
trong Stack
Stack
(
(
(*
Output
(*
(+
2 3
2 3 *
(+
(+/
2 3 * 7
(+/
2 3 * 7 8
2 3 * 7 8 / +
*
*(
*(
*(*(*
2 3 * 7 8 / + 5
2 3 * 7 8 / + 5 1
2 3 * 7 8 / + 5 1 2 3 * 7 8 / + 5 1 - *
Di y l chng trnh chuyn biu thc vit dng trung t sang dng RPN. Biu thc trung t
u vo s c hiu chnh sao cho mi thnh phn ca n c cch nhau ng mt du cch, v
thm mt du cch vo cui cho d tch cc phn t ra x l. V Stack ch dng cha cc ton
t v du ngoc m nn c th m t Stack di dng xu k t cho n gin.
V d v Input / Output ca chng trnh:
Infix:
(10*3 +
7 /8) * (5-1)
Refined: ( 10 * 3 + 7 / 8 ) * ( 5 - 1 )
RPN: 10 3 * 7 8 / + 5 1 - *
RPNCVT.PAS * Chuyn biu thc trung t sang dng RPN
program ConvertInfixToRPN;
const
Opt = ['(', ')', '+', '-', '*', '/'];
var
T, Infix, Stack: String; {Stack dng cha ton t v du ngoc m nn dng String cho tin}
p: Integer;
{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cc thao tc i vi Stack - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
procedure StackInit;
begin
Stack := '';
end;
procedure Push(V: Char);
begin
Stack := Stack + V;
end;
function Pop: Char;
begin
Pop := Stack[Length(Stack)];
Dec(Stack[0]);
end;
function Get: Char;
begin
Get := Stack[Length(Stack)];
end;
{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}
procedure Refine(var S: String);
{Hiu chnh biu thc trung t v khun dng d c nht}
var
i: Integer;
begin
S := S + ' ';
for i := Length(S) - 1 downto 1
if (S[i] in Opt) or (S[i + 1]
Insert(' ', S, i + 1);
for i := Length(S) - 1 downto 1
if (S[i] = ' ') and (S[i + 1]
end;
do
{Thm nhng du cch trc v sau mi ton t v du ngoc}
in Opt) then
do
{Xo nhng du cch tha}
= ' ') then Delete(S, i + 1, 1);
A * (B + C)
b)
A * (B + -C)
d)
A and B or C
f)
(A or B) and (C or (D and not E)) h)
(A < 9) and (A > 3) or not (A > 0)
((A > 0) or (A < 0)) and (B * B - 4 *
A + B / C + D
A - (B + C)d/e
A and (B or not C)
(A = B) or (C = D)
A * C < 0)
4. Vit chng trnh tnh biu thc logic dng RPN vi cc ton t and, or, not v cc ton hng l
TRUE hay FALSE
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.
V d: H s tuyn sinh ca mt trng i hc l mt danh sch th sinh, mi th sinh c tn, s
bo danh, im thi. Khi mun lit k danh sch nhng th sinh trng tuyn tc l phi sp xp cc
th sinh theo th t t im cao nht ti im thp nht. y kho sp xp chnh l im thi.
STT
1
2
3
4
SBD
A100
B200
X150
G180
H v tn
Nguyn Vn A
Trn Th B
Phm Vn C
Th D
im thi
20
25
18
21
STT
1
2
3
4
Sau khi sp xp theo trt t im cao nht ti im thp nht, bng kho s tr thnh:
im thi
25
21
20
18
STT
2
4
1
3
{Lm n - 1 lt}
jmin := i;
for j := i + 1 to n do
if kj < kjmin then jmin := j;
if jmin i then
<o gi tr ca kjmin cho ki>
end;
end;
i vi phng php kiu la chn, ta c th coi php so snh (kj < kjmin) l php ton tch cc
nh gi hiu sut thut ton v mt thi gian. lt th i, chn ra kho nh nht bao gi cng
cn n - i php so snh, s lng php so snh ny khng h ph thuc g vo tnh trng ban u ca
dy kho c. T suy ra tng s php so snh s phi thc hin l:
(n - 1) + (n - 2) + ... + 1 = n * (n - 1) / 2
2
Vy thut ton sp xp kiu chn c cp l O(n )
III. THUT TON SP XP NI BT (BUBBLE SORT)
Trong thut ton sp xp ni bt, dy cc kho s c duyt t cui dy ln u dy (t kn v k1),
nu gp hai kho k cn b ngc th t th i ch ca chng cho nhau. Sau ln duyt nh vy,
phn t nh nht trong dy kho s c chuyn v v tr u tin v vn tr thnh sp xp dy
kho t k2 ti kn:
procedure BubbleSort;
var
i, j: Integer;
begin
for i := 2 to n do
for j := n downto i do{Duyt t cui dy ln, lm ni kho nh nht trong s ki-1, ...,kn v v tr i-1}
if kj < kj-1 then
<o gi tr kj v kj-1>
end;
i vi thut ton sp xp ni bt, ta c th coi php ton tch cc l php so snh kj < kj-1. V s
ln thc hin php so snh ny l:
(n - 1) + (n - 2) + ... + 1 = n * (n - 1) / 2
begin
kj+1 := kj;
j := j - 1;
end;
kj+1 := tmp;
end;
end;
i vi thut ton sp xp kiu chn, th chi ph thi gian thc hin thut ton ph thuc vo tnh
trng dy kho ban u. Nu coi php ton tch cc y l php so snh tmp < kj th:
Trng hp tt nht ng vi dy kho sp xp ri, mi lt ch cn 1 php so snh, v nh
vy tng s php so snh c thc hin l n - 1.
Trng hp ti t nht ng vi dy kho c th t ngc vi th t cn sp th lt th i,
cn c i - 1 php so snh v tng s php so snh l:
(n - 1) + (n - 2) + ... + 1 = n * (n - 1) / 2.
Trng hp cc gi tr kho xut hin mt cch ngu nhin, ta c th coi xc sut xut hin mi
kho l ng kh nng, th c th coi lt th i, thut ton cn trung bnh i / 2 php so snh v
tng s php so snh l:
(1 / 2) + (2 / 2) + ... + (n / 2) = (n + 1) * n / 4.
Nhn v kt qu nh gi, ta c th thy rng thut ton sp xp kiu chn t ra tt hn so vi thut
ton sp xp chn v sp xp ni bt. Tuy nhin, chi ph thi gian thc hin ca thut ton sp xp
kiu chn vn cn kh ln. V xt trn phng din tnh ton l thuyt th cp ca thut ton sp
2
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, ...
V d nh dy (4, 6, 7, 2, 3, 5, 1, 9, 8); n = 9; h = 3. C 3 dy con.
D"ykhoch;nh:
D"ycon1:
D"ycon2:
D"ycon3:
4
4
2
2
3
7
1
1
9
5
j := j - h;
end;
kj+h := tmp;
end;
h := h div 2;
end;
end;
cht}
{n y ta tm c hai kho ki v kj m ki key kj}
if i j then
begin
if i < j then
{Nu ch s i ng trc ch s j th o gi tr hai kho ki v kj}
<o gi tr ki v kj> {Sau php o ny ta c: ki key kj }
i := i + 1; j := j - 1;
end;
until i > j;
Partition(L, j); Partition(i, H);
{Sp xp hai on con mi to ra}
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
ki
...
kj
...
kH
kho cht
...
kj
kho cht
ki
kho cht
...
kH
Theo nhng nhn xt trn, nu c mt kho nm gia kj v ki th kho phi ng bng kho cht
v n c t v tr ng ca n, nn c th b qua kho ny m ch xt hai on hai u.
Cng vic cn li l gi quy lm tip vi on t kL ti kj v on t ki ti kH. Hai on ny
ngn hn on ang xt bi v L j < i H. Vy thut ton khng bao gi b ri vo qu trnh v
hn m s dng v cho kt qu ng n.
Xt v phc tp tnh ton:
Trng hp ti t nht, l khi chn kho cht, ta chn phi kho nh nht hay ln nht trong
on, khi php phn on s chia thnh mt on gm n - 1 phn t v on cn li ch c 1
2
phn t. C th chng minh trong trng hp ny, thi gian thc hin gii thut T(n) = O(n )
Trng hp tt nht, php phn on ti mi bc s chia c thnh hai on bng nhau. Tc
l khi chn kho cht, ta chn ng trung v ca dy kho. C th chng minh trong trng hp
ny, thi gian thc hin gii thut T(n) = O(nlog2n)
Trng hp cc kho c phn b ngu nhin, th trung bnh thi gian thc hin gii thut
cng l T(n) = O(nlog2n).
Vic tnh ton chi tit, c bit l khi xc nh T(n) trung bnh, phi dng cc cng c ton phc
tp, ta ch cng nhn nhng kt qu trn.
2. Vi ci tin ca Quick Sort
Vic chn cht cho php phn on quyt nh hiu qu ca Quick Sort, nu chn cht khng tt,
rt c th vic phn on b suy bin thnh trng hp xu khin Quick Sort hot ng chm v
trn ngn xp chng trnh con khi gp phi dy chuyn qui qu di. Mt ci tin sau c th
khc phc c hin tng trn ngn xp nhng cng ht sc chm trong trng hp xu, k thut
ny khi phn c [L, H] c hai on con [L, j] v [i, H] th ch gi quy tip tc i vi
on ngn, v lp li qu trnh phn on i vi on di.
procedure QuickSort;
procedure Partition(L, H: Integer); {Sp xp on t kL, kL+1, ..., kH}
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;
10
9
2. Vun ng
Trong bi hc v cy, ta bit mt dy kho k1, k2, ..., kn l biu din ca mt cy nh phn hon
chnh m ki l gi tr lu trong nt th i, nt con ca nt th i l nt 2i v nt 2i + 1, nt cha ca nt
th j l nt j div 2. Vn t ra l sp li dy kho cho n biu din mt ng.
V cy nh phn ch gm c mt nt hin nhin l ng, nn vun mt nhnh cy gc r thnh
ng, ta c th coi hai nhnh con ca n (nhnh gc 2r v 2r + 1) l ng ri. V thut ton
vun ng s c tin hnh t di ln (bottom-up) i vi cy: Gi h l chiu cao ca cy, nt
mc h (nt l) l gc mt ng, ta vun ln nhng nt mc h - 1 cng l gc ca ng, ... c
nh vy cho ti nt mc 1 (nt gc) cng l gc ca ng.
Thut ton vun thnh ng i vi cy gc r, hai nhnh con ca r l ng ri:
Gi s nt r cha gi tr V. T r, ta c i ti nt con cha gi tr ln nht trong 2 nt con, cho ti
khi gp phi mt nt c m mi nt con ca c u cha gi tr V (nt l cng l trng hp ring
ca iu kin ny). Dc trn ng i t r ti c, ta y gi tr cha nt con ln nt cha v t gi
tr V vo nt c.
4
10
10
10
10
begin
{Bt u thut ton Heap Sort}
for r := n div 2 downto 1 do Adjust(r, n); {Vun cy t di ln to thnh ng}
for i := n downto 2 do
begin
<o gi tr k1 v ki>
{Kho ln nht c chuyn ra cui dy}
Adjust(1, i - 1);
{Vun phn cn li thnh ng}
end;
end;
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;
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;
var
c: array[0..M] of Integer;
{TKey = 0..M}
{Dy bin m s ln xut hin mi gi tr}
x: TArray;
{Dy kho ph}
i: Integer;
V: TKey;
begin
for V := 0 to M do cV := 0;
{Khi to dy bin m}
for i := 1 to n do cki := cki + 1;
{m s ln xut hin cc gi tr}
for V := 1 to M do cV := cV-1 + cV;
{Tnh v tr cui mi on}
for i := n downto 1 do
begin
V := ki;
xcV := ki; cV := cV - 1;
end;
k := x;
{Sao chp gi tr t dy kho x sang dy
kho k}
end;
R rng phc tp ca php m phn phi l O(max(M, n)). Nhc im ca php m phn
phi l khi M qu ln th cho d n nh cng khng th lm c.
C th c thc mc ti sao trong thao tc dng dy kho x, php duyt dy kho k theo th t no
th kt qu sp xp cng nh vy, vy ti sao ta li chn php duyt ngc t di ln?. tr li
cu hi ny, ta phi phn tch thm mt c trng ca cc thut ton sp xp:
IX. TNH N NH CA THUT TON SP XP (STABILITY)
Mt phng php sp xp c gi l n nh nu n bo ton th t ban u ca cc bn ghi
mang kho bng nhau trong danh sch. V d nh ban u danh sch sinh vin c xp theo th t
tn alphabet, th khi sp xp danh sch sinh vin theo th t gim dn ca im thi, nhng sinh vin
bng im nhau s c dn v mt on trong danh sch v vn c gi nguyn th t tn
alphabet.
Hy xem li nhng thut ton sp xp trc, trong nhng thut ton , thut ton sp xp ni
bt, thut ton sp xp chn v php m phn phi l nhng thut ton sp xp n nh, cn nhng
thut ton sp xp khc (v ni chung nhng thut ton sp xp i hi phi o gi tr 2 bn ghi
v tr bt k) l khng n nh.
Vi php m phn phi mc trc, ta nhn xt rng nu hai bn ghi c kho sp xp bng nhau
th khi a gi tr vo dy bn ghi ph, bn ghi no vo trc s nm pha sau. Vy nn ta s y
gi tr cc bn ghi vo dy ph theo th t ngc gi c th t tng i ban u.
Ni chung, mi phng php sp xp tng qut cho d khng n nh th u c th bin i n
tr thnh n nh, phng php chung nht c th hin qua v d sau:
Gi s ta cn sp xp cc sinh vin trong danh sch theo th t gim dn ca im bng mt thut
ton sp xp n nh. Ta thm cho mi sinh vin mt kho Index l th t ban u ca anh ta trong
danh sch. Trong thut ton sp xp c p dng, c ch no cn so snh hai sinh vin A v B
xem anh no phi ng trc, trc ht ta quan tm ti im s: Nu im ca A khc im ca B
th anh no im cao hn s ng trc, nu im s bng nhau th anh no c Index nh hn s
ng trc.
Trong mt s bi ton, tnh n nh ca thut ton sp xp quyt nh ti c tnh ng n ca ton
thut ton ln. Chnh tnh "nhanh" ca Quick Sort v tnh n nh ca php m phn phi l c s
nn tng cho hai thut ton sp xp cc nhanh trn cc dy kho s m ta s trnh by di y.
X. THUT TON SP XP BNG C S (RADIX SORT)
Bi ton t ra l: Cho dy kho l cc s t nhin k1, k2, ..., kn hy sp xp chng theo th t
khng gim. (Trong trng hp ta ang xt, TKey l kiu s t nhin)
011
111
110
101
010
011
100
100
101
110
111
111
100
100
101
110
111
100
100
111
110
110
111
101
110
110
111
111
011
011
010
101
110
011
011
010
101
101
010
011
011
100
100
101
{Phn on [L, H] da vo bt b}
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
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
end;
Dy
(2,
(2,
(4,
(4,
(9)
2
4, 9)
4, 9)
9)
9)
Min sp xp
(1)
(1, 2)
(1, 2, 3)
(1, 2, 3, 4)
(1, 2, 3, 4, 9)
(1, 2, 3, 4, 9, 10, 11)
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.
p := a; i := a; j := b + 1;
while (i b) and (j c) then {Chng no c hai mch u cha xt ht}
begin
if Xi Xj then {So snh hai phn t nh nht trong hai mch m cha b a vo min sp xp}
begin
Yp := Xi; i := i + 1;
{a xi vo min sp xp v cho i
end
else
begin
Yp := Xj; j := j + 1;
end;
p := p + 1;
end;
if i b then
(Yp, Yp+1, ...,
else
(Yp, Yp+1, ...,
end;
chy}
{a xj vo min sp xp v cho j
chy}
{Mch 2 ht trc}
{Mch 1 ht trc}
Yc) := (Xj, Xj+1, ..., Xc); {a phn cui ca mch 2 vo min sp xp}
a :=
end;
if b < n
else
if a
(Ya,
end;
begin
{Thut ton sp xp
trn}
Flag := True;
len := 1;
while len < n do
begin
if Flag then MergeByLength(k, t, len)
else MergeByLength(t, k, len);
len := len * 2;
Flag := not Flag;
{o c lun phin vai tr ca k v t}
end;
if not Flag then k := t; {Nu kt qu cui cng ang nm trong t th sao chp kt qu vo k}
end;
V phc tp ca thut ton, ta thy rng trong th tc Merge, php ton tch cc l thao tc a
mt kho vo min sp xp. Mi ln gi th tc MergeByLength, tt c cc phn t trong dy kho
c chuyn hon ton sang min sp xp, nn phc tp ca th tc MergeByLength l O(n).
Th tc MergeSort c vng lp thc hin khng qu log2n + 1 li gi MergeByLength bi bin len
s c tng theo cp s nhn cng bi 2. T suy ra phc tp ca MergeSort l O(nlog2n)
bt chp trng thi d liu vo.
Cng l nhng thut ton sp xp tng qut vi phc tp trung bnh nh nhau, nhng khng
ging nh QuickSort hay HeapSort, MergeSort c tnh n nh. Nhc im ca MergeSort l n
phi dng thm mt vng nh cha dy kho ph c kch thc bng dy kho ban u.
Ngi ta cn c th li dng c trng thi d liu vo khin MergeSort chy nhanh hn: ngay
t u, ta khng coi mi phn t ca dy kho l mt mch m coi nhng on c sp trong
dy kho l mt mch. Bi mt dy kho bt k c th coi l gm cc mch sp xp nm lin
tip nhau. Khi ngi ta gi phng php ny l phng php trn hai ng t nhin.
Tng qut hn na, thay v php trn hai mch, ngi ta c th s dng php trn k mch, khi ta
c thut ton sp xp trn k ng.
XII. CI T
Ta s ci t tt c cc thut ton sp xp nu trn, vi d liu vo c t trong file vn bn
SORT.INP cha khng nhiu hn 15000 kho v gi tr mi kho l s t nhin khng qu 15000.
Kt qu c ghi ra file vn bn SORT.OUT cha dy kho c sp, mi kho trn mt dng.
SORT.INP
1 4 3 2 5
7 9 8
10 6
SORT.OUT
1
2
3
4
5
6
7
8
9
10
Chng trnh c giao din di dng menu, mi chc nng tng ng vi mt thut ton sp xp.
Ti mi thut ton sp xp, ta thm mt vi lnh o thi gian thc t ca n (ch o thi gian thc
hin gii thut, khng tnh thi gian nhp liu v in kt qu).
thut ton sp xp bng c s theo cch hon v phn t, ta chn h nh phn. thut ton sp
xp bng c s trc tip, ta s dng h c s 256, khi mt gi tr s t nhin x 15000 s c
biu din bng hai ch s trong h 256:
8
Ch s hng n v l x mod 256 = x mod 2 = x and 255 = x and $FF;
8
Ch s cn li (= ch s hng cao nht) l x div 256 = x div 2 = x shr 8;
ch: Char;
begin
{Trc ht in ra thi gian thc thi}
k[j + 1] := k[j];
Dec(j);
end;
k[j + 1] := tmp;
end;
PrintResult;
end;
(** INSERTION SORT WITH BINARY SEARCHING ***************************)
procedure AdvancedInsertionSort;
var
i, inf, sup, median, tmp: Integer;
begin
Enter;
for i := 2 to n do
begin
tmp := k[i];
inf := 1; sup := i - 1;
repeat
median := (inf + sup) shr 1;
if tmp < k[median] then sup := median - 1
else inf := median + 1;
until inf > sup;
Move(k[inf], k[inf + 1], (i - inf) * SizeOf(k[1]));
k[inf] := tmp;
end;
PrintResult;
end;
(** SHELL SORT *****************************************************)
procedure ShellSort;
var
tmp: Integer;
i, j, h: Integer;
begin
Enter;
h := n shr 1;
while h <> 0 do
begin
for i := h + 1 to n do
begin
tmp := k[i]; j := i - h;
while (j > 0) and (k[j] > tmp) do
begin
k[j + h] := k[j];
j := j - h;
end;
k[j + h] := tmp;
end;
h := h shr 1;
end;
PrintResult;
end;
(** QUICK SORT *****************************************************)
procedure QuickSort;
procedure Partition(L, H: Integer);
var
i, j: Integer;
key: Integer;
begin
if L >= H then Exit;
key := k[L + Random(H - L + 1)];
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;
(** HEAP SORT ******************************************************)
procedure HeapSort;
var
r, i: Integer;
procedure Adjust(root, endnode: Integer);
var
key, c: Integer;
begin
key := k[root];
while root shl 1 <= endnode do
begin
c := root shl 1;
if (c < endnode) and (k[c] < k[c + 1]) then Inc(c);
if k[c] <= key then Break;
k[root] := k[c]; root := c;
end;
k[root] := key;
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;
(** DISTRIBUTION COUNTING ******************************************)
procedure DistributionCounting;
var
x: TArr;
c: TCount;
i, V: Integer;
begin
Enter;
FillChar(c, SizeOf(c), 0);
for i := 1 to n do Inc(c[k[i]]);
for V := 1 to MaxV do c[V] := c[V - 1] + c[V];
for i := n downto 1 do
begin
V := k[i];
x[c[V]] := k[i];
Dec(c[V]);
end;
k := x;
PrintResult;
end;
(** EXCHANGE RADIX SORT ********************************************)
procedure RadixSort;
const
MaxBit = 13;
var
MaskBit: array[0..MaxBit] of Integer;
MaxValue, i: Integer;
procedure Partition(L, H, BIndex: Integer);
var
i, j, Mask: Integer;
begin
if L >= H then Exit;
i := L; j := H; Mask := MaskBit[BIndex];
repeat
while (i < j) and (k[i] and Mask = 0) do Inc(i);
while (i < j) and (k[j] and Mask <> 0) do Dec(j);
Swap(k[i], k[j]);
until i = j;
if k[j] and Mask = 0 then Inc(j);
if BIndex > 0 then
begin
Partition(L, j - 1, BIndex - 1); Partition(j, H, BIndex - 1);
end;
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;
(** STRAIGHT RADIX SORT ********************************************)
procedure StraightRadixSort;
const
Radix = 256;
nDigit = 2;
var
t: TArr;
p: Integer;
Flag: Boolean;
function GetDigit(key, p: Integer): Integer;
begin
if p = 0 then GetDigit := key and $FF
else GetDigit := key shr 8;
end;
procedure DCount(var x, y: TArr; p: Integer);
var
c: array[0..Radix - 1] of Integer;
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;
(** MERGE SORT *****************************************************)
procedure MergeSort;
var
t: TArr;
Flag: Boolean;
len: Integer;
procedure Merge(var Source, Dest: TArr; a, b, c: Integer);
var
i, j, p: Integer;
begin
p := a; i := a; j := b + 1;
while (i <= b) and (j <= c) do
begin
if Source[i] <= Source[j] then
begin
Dest[p] := Source[i]; Inc(i);
end
else
begin
Dest[p] := Source[j]; Inc(j);
end;
Inc(p);
end;
if i <= b then
Move(Source[i], Dest[p], (b - i + 1) * SizeOf(Source[1]))
else
Move(Source[j], Dest[p], (c - j + 1) * SizeOf(Source[1]));
end;
procedure MergeByLength(var Source, Dest: TArr; len: Integer);
var
a, b, c: Integer;
begin
a := 1; b := len; c := len shl 1;
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;
(*******************************************************************)
function MenuSelect: Integer;
var
ch: Integer;
begin
Clrscr;
WriteLn('Sorting Algorithms Demos; Input: SORT.INP; Output: SORT.OUT');
for ch := 0 to nMenu do WriteLn(SMenu[ch]);
Write('Enter your choice: '); ReadLn(ch);
MenuSelect := ch;
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
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
1
2
3
4
5
6
7
8
9
10
11
Thut ton
Distribution Counting
Straight Radix Sort
Heap Sort
Shell Sort
Radix Sort
Quick Sort
Merge Sort
Insertion Sort with binary searching
Insertion Sort
Selection Sort
Bubble Sort
Tc
7000.00
1400.00
823.53
750.00
677.42
656.25
477.27
30.00
10.24
8.75
1.00
Tc
2994.83
1484.62
726.78
708.98
454.71
415.55
341.26
115.80
2.67
1.81
1.00
ch {$R+,Q+,S+}:
STT
1
2
3
4
5
6
7
8
9
10
11
Thut ton
Distribution Counting
Straight Radix Sort
Quick Sort
Radix Sort
Merge Sort
Heap Sort
Shell Sort
Insertion Sort with binary searching
Insertion Sort
Selection Sort
Bubble Sort
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
cng rt ng ch . Trong nhng thut ton c phc tp O(n ), Insertion Sort t ra nhanh hn
nhng phng php cn li v cng c tnh n nh, m lnh cng tng i n gin, d nh.
Selection Sort th khng n nh nhng vi n nh, vic chn ra m phn t nh nht c th thc hin
d dng ch khng cn phi sp xp li ton b nh sp xp chn.
Thut ton m phn phi v thut ton sp xp bng c s nn c tn dng trong trng hp cc
kho sp xp l s t nhin (hay l mt kiu d liu c th quy ra thnh cc s t nhin) bi nhng
thut ton ny c tc rt cao. Thut ton sp xp bng c s cng c th sp xp dy kho c s
thc hay s m nhng ta phi bit c cch thc lu tr cc kiu d liu trn my tnh th mi
c th lm c.
Quick Sort, Heap Sort, Merge Sort v Shell Sort l nhng thut ton sp xp tng qut, dy kho
thuc kiu d liu c th t no cng c th p dng c ch khng nht thit phi l cc s.
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)
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}
D thy rng phc tp ca thut ton tm kim tun t trong trng hp tt nht l O(1), trong
trng hp xu nht l O(n) v trong trng hp trung bnh cng l O(n).
III. TM KIM NH PHN (BINARY SEARCH)
Php tm kim nh phn c th p dng trn dy kho c th t: k1 k2 ... kn.
Gi s ta cn tm trong on kinf, kinf+1, ..., ksup vi kho tm kim l X, trc ht ta xt kho nm
gia dy kmedian vi median = (inf + sup) div 2;
Nu kmedian < X th c ngha l on t kinf ti kmedian ch cha ton kho < X, ta tin hnh tm
kim tip vi on t kmedian + 1 ti ksup.
Nu kmedian > X th c ngha l on t kmedian ti ksup ch cha ton kho > X, ta tin hnh tm
kim tip vi on t kinf ti kmedian - 1.
Nu kmedian = X th vic tm kim thnh cng (kt thc qu trnh tm kim).
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
Thut ton dng cy nh phn tm kim 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 nh phn tm kim.
{Th tc chn kho X vo BST}
procedure BSTInsert(X);
var
p, q: PNode;
begin
q := nil; p := Root;
{Bt u vi p = nt gc; q l con tr chy ui theo sau}
while p nil do
begin
q := p;
if X = p^.Info then Break;
else {X p^.Info th cho p chy sang nt con, q^ lun gi vai tr l cha ca p^}
if X < p^.Info then p := p^.Left
else p := p^.Right;
end;
if p = nil then {Kho X cha c trong BST}
begin
New(p);
{To nt mi}
p^.Info := X;
{a gi tr X vo nt mi to ra}
p^.Left := nil; p^.Right := nil;
{Nt mi khi chn vo BST s tr thnh nt
l} if Root = nil then Root := NewNode {BST ang rng, t Root l nt mi to}
else
{Mc NewNode^ vo nt cha q^}
if X < q^.Info then q^.Left := NewNode
else q^.Right := NewNode;
end;
end;
Php loi b trn cy nh phn tm kim khng n gin nh php b sung hay php tm kim.
Mun xo mt gi tr trong cy nh phn tm kim (Tc l dng li cy mi cha tt c nhng gi
tr cn li), trc ht ta tm xem gi tr cn xo nm nt D no, c ba kh nng xy ra:
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.
5
4
2
7
6
7
3
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 }
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 .
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.
0
5
0
4
1
8
0
7
10
12
1
11
6=0110
5=0101
2=0010
7=0111
8=1000
10=1010
12=1100
11=1011
4=0100
Gi s cu trc mt nt ca cy c m t nh sau:
type
PNode = ^TNode;
TNode = record
Info: TKey;
b := b - 1; {Xt bt b ca X}
if <Bt b ca X l 0> then p := p^.Left
else p := p^.Right;
end;
DSTSearch := p;
end;
{Gp 0 r tri}
{Gp 1 r phi}
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;
TKey); var
b: Integer;
p, q, Node: PNode;
begin
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
q := p;
{q chy ui theo p, cn p chuyn xung mt trong 2 nhnh con}
if p^.Left nil then p := p^.Left
else p := p^.Right;
end;
Node^.Info := p^.Info; {Chuyn gi tr t nt l p^ sang nt Node^}
if Root = p then Root := nil {Cy ch gm mt nt gc v by gi xo c gc}
else {Ct mi ni t q^ ti p^}
if q^.Left = p then q^.Left := nil
else q^.Right := nil;
Dispose(p);
end;
5 = 0101
0
4
2 = 0010
7 = 0111
8 = 1000
10 = 1010
12 = 1100
0
7
0
10
1
11
11 = 1011
12
4 = 0100
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}
2=010
5=101
5=101
4=100
0
0
2
4=100
0
4
0
5
0
4
7=111
1
5
TKey); var
b: Integer;
p, q: PNode;
begin
b := z; p := Root;
{Bt u t nt gc, i vi RST th gc lun nil}
repeat
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} if p = nil then
{Khng i c th t thm nt i
tip}
begin
New(p);
{To ra mt nt mi v em p tr ti nt }
p^.Left := nil; p^.Right := nil;
if <Bt b ca X l 0> then q^.Left := p
{Ni p^ vo bn tri q^}
else q^.Right := p;
{Ni p^ vo bn phi q^}
end;
until b = 0;
p^.Info := X;
end;
{p^ l nt l t X vo}
2=010
0
5=101
5=101
4=100
4=100
0
2
0
4
7=111
1
5
0
7
0
4
1
5
TKey); var
b: Integer;
p, q, TurnNode, Child: PNode;
begin
{Trc ht, tm kim gi tr X xem n nm nt no}
b := z; p := Root;
repeat
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;
if (b = z - 1) or (q^.Left nil) and (q^.Right nil) then
{q^ l nt ng ba}
begin
TurnNode := q; Child := p;
{Ghi nhn li q^ v hng r}
end;
until (p = nil) or (b = 0);
if p = nil then Exit;
{X khng tn ti trong cy th khng xo c}
{Trc ht, ct nhnh c o ra khi cy}
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
5 = 0101
7 = 0111
8 = 1000
1
0
10 = 1010
12 = 1100
2 = 0010
0
7
10
11
11 = 1011
12
4 = 0100
a)
1
5=0101
2=0010
12
2
1
0
7
0
4
8=1000
10=1010
12=1100
0
7=0111
10
11=1011
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
(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 KNUTHMORRIS-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.
Vic i su nghin cu nhng cu trc d liu v gii thut, d ch l mt phn nh hp cng ny
sinh rt nhiu vn hay v kh, nh cc vn l thuyt v phc tp tnh ton, vn NP_y
v.v... l cng vic ca nhng nh khoa hc my tnh. Nhng trc khi tr thnh mt nh
khoa hc my tnh th iu kin cn l phi bit lp trnh. Vy nn khi tm hiu bt c cu trc d
liu hay gii thut no, nht thit ta phi c gng ci t bng c. Mi tng hay s ch l b i
nu nh khng bin thnh hiu qu, thc t l nh vy.
Quy hoch ng
\ 1[
MC LC
1. CNG THC TRUY HI.................................................................................................................
2
I. V D...............................................................................................................................................................2
II. CI TIN TH
NHT..................................................................................................................................3
III. CI TIN TH HAI.....................................................................................................................................4
2. PHNG PHP QUY HOCH NG
.......................................................................................... 6
I. BI TON QUY HOCH..............................................................................................................................6
II. PHNG PHP QUY HOCH
NG.......................................................................................................6
3. MT S BI TON QUY HOCH NG
..................................................................................... 9
I. DY CON N IU TNG DI NHT...................................................................................................9
II. BI TON CI TI ....................................................................................................................................11
III. BIN I XU..........................................................................................................................................13
IV. DY CON C TNG CHIA HT CHO
K...............................................................................................16
V. PHP NHN T HP DY MA TRN
...................................................................................................17
VI. BI TP LUYN TP ..............................................................................................................................20
Quy hoch ng
\ 2[
5
5
5
5
5
5
5
=
=
=
=
=
=
=
1
1
1
1
1
2
5
+
+
+
+
+
+
1
1
1
2
4
3
+
+
+
+
1 + 1 + 1
1 + 2
3
2
(Lu : n = 0 vn coi l c 1 cch phn tch thnh tng cc s nguyn dng (0 l tng ca dy
rng))
gii bi ton ny, trong chuyn mc trc ta dng phng php lit k tt c cc cch phn
tch v m s cu hnh. By gi ta th ngh xem, c cch no tnh ngay ra s lng cc cch
phn tch m khng cn phi lit k hay khng ?. Bi v khi s cch phn tch tng i ln,
phng php lit k t ra kh chm. (n = 100 c 190569292 cch phn tch).
Nhn xt:
Nu gi F[m, v] l s cch phn tch s v thnh tng cc s nguyn dng m. Khi :
Cc cch phn tch s v thnh tng cc s nguyn dng m c th chia lm hai loi:
Loi 1: Khng cha s m trong php phn tch, khi s cch phn tch loi ny chnh l s
cch phn tch s v thnh tng cc s nguyn dng < m, tc l s cch phn tch s v thnh
tng cc s nguyn dng m - 1 v bng F[m - 1, v].
Loi 2: C cha t nht mt s m trong php phn tch. Khi nu trong cc cch phn tch loi
ny ta b i s m th ta s c cc cch phn tch s v - m thnh tng cc s nguyn dng
m (Lu : iu ny ch ng khi khng tnh lp li cc hon v ca mt cch). C ngha l v
mt s lng, s cc cch phn tch loi ny bng F[m, v - m]
Trong trng hp m > v th r rng ch c cc cch phn tch loi 1, cn trong trng hp m v th
s c c cc cch phn tch loi 1 v loi 2. V th:
F[m, v] = F[m - 1, v] nu m > v
F[m, v] = F[m - 1, v] + F[m, v - m] nu m v
Ta c cng thc xy dng F[m, v] t F[m - 1, v] v F[m, v - m]. Cng thc ny c tn gi l cng
thc truy hi a vic tnh F[m, v] v vic tnh cc F[m', v'] vi d liu nh hn. Tt nhin cui
cng ta s quan tm n F[n, n]: S cc cch phn tch n thnh tng cc s nguyn dng n.
V d vi n = 5, bng F s l:
F
0
1
2
3
4
5
0
1
1
1
1
1
1
1
0
1
1
1
1
1
2
0
1
2
2
2
2
3
0
1
2
3
3
3
4
0
1
3
4
5
5
5
0
1
3
5
6
7
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.
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}
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:
Quy hoch ng
\ 5[
program Analyse5;
var
n: Integer;
function
begin
if m =
if v
else
else
if m
else
end;
begin
Write('n = '); ReadLn(n);
WriteLn(F(n, n), ' Analyses');
end.
Quy hoch ng
\ 6[
1
2
1
2
x=y=
1
2
x+y=
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:
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
program Fibo1;
Cch 2
program Fibo2;
var
F: array[1..6] of Integer;
i: Integer;
begin
F[1] := 1; F[2] := 1;
for i := 3 to 6 do
F[i] := F[i - 1] + F[i - 2];
WriteLn(F[6]);
end.
begin
WriteLn(F(6));
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(4)
F(3)
F(2)
F(3)
F(3)
F(2)
F(2)
F(1)
F(2)
F(2)
F(1)
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.
INCSEQ.OUT
8
a[1] = 1
a[2] = 2
a[3] = 3
a[6] = 4
a[7] = 5
a[8] = 6
a[10] = 9
a[11] = 10
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,
10
11
ai
-
9
10
+
1
11
10
11
L[i]
T[i]
Tracing
jmax := n + 1;
for j := i + 1 to n + 1 do
if (a[j] > a[i]) and (L[j] > L[jmax]) then jmax := j;
L[i] := L[jmax] + 1; {Lu di dy con tng di nht bt u ti ai}
T[i] := jmax;
{Lu vt: phn t ng lin sau ai trong dy con tng di nht l ajmax}
end;
WriteLn(L[0] - 2); {Chiu di dy con tng di nht}
i := T[0];
{Bt u truy vt tm nghim}
while i <> n + 1 do
begin
WriteLn('a[', i, '] = ', a[i]);
i := T[i];
end;
end;
begin
{nh ngha li thit b nhp/xut chun}
Nhn xt:
1. Ta c th lm cch khc: Gi L[i] l di dy con di nht kt thc ti a[i], T[i] l ch s ng
lin trc ai trong dy con di nht . Cch ny khi truy vt s cho th t cc ch s c chn
gim dn.
2. Dng mng T lu vt c chng trnh ngn gn ch thc ra khng cn c n vn c th d
li c nghim, ch cn dng mng L m thi.
Bi tp
1. Trong cch gii trn, u l bng phng n:
a) Mng L? b) mng T?
c) c mng L v mng T?
2. Vn gi nguyn gi thit v kch c d liu nh trn hy lp chng trnh tr li cu hi:
a) C bao nhiu dy con n iu tng di nht ?
b) Cho bit tt c nhng dy con n iu tng di nht
II. BI TON CI TI
Trong siu th c n gi hng (n 100), gi hng th i c trng lng l Wi 100 v tr gi Vi 100.
Mt tn trm t nhp vo siu th, tn trm mang theo mt ci ti c th mang c ti a trng
lng M ( M 100). Hi tn trm s ly i nhng gi hng no c tng gi tr ln nht.
Input: file vn bn BAG.INP
Dng 1: Cha hai s n, M cch nhau t nht mt du cch
n dng tip theo, dng th i cha hai s nguyn dng Wi, Vi cch nhau t nht mt du cch
Output: file vn bn BAG.OUT
Dng 1: Ghi gi tr ln nht tn trm c th ly
Dng 2: Ghi ch s nhng gi b ly
BAG.INP
5 11
3 3
4 4
5 4
9 10
4 4
BAG.OUT
11
5 2 1
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]
0
1
2
...
n
0
0
1
0
...
0
M
0
...
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 Enter;
{Nhp d liu t thit b nhp chun (Input)}
var
i: Integer;
begin
ReadLn(n, M);
for i := 1 to n do ReadLn(W[i], V[i]);
end;
procedure Optimize;
{Tnh bng phng n bng cng thc truy hi}
var
i, j: Integer;
begin
FillChar(F[0], SizeOf(F[0]), 0);
{in c s quy hoch ng}
for i := 1 to n do
for j := 0 to M do
begin
{Tnh F[i, j]}
end;
procedure Trace;
{Truy vt tm nghim ti u}
begin
WriteLn(F[n, M]); {In ra gi tr ln nht c th kim c}
while n <> 0 do
{Truy vt trn bng phng n t hng n ln hng 0}
begin
if F[n, M] <> F[n - 1, M] then
{Nu c chn gi th n}
begin
Write(n, ' ');
M := M - W[n]; { chn gi th n ri th ch c th mang thm c trng lng M - Wn na thi}
end;
Dec(n);
end;
end;
begin
{nh ngha li thit b nhp/xut chun}
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
PBBCEFATZ
QABCDABEFA
STR.OUT
7
PBBCEFATZ -> Delete(9) -> PBBCEFAT
PBBCEFAT -> Delete(8) -> PBBCEFA PBBCEFA
-> Insert(4, B) -> PBBCBEFA PBBCBEFA ->
Insert(4, A) -> PBBCABEFA PBBCABEFA ->
Insert(4, D) -> PBBCDABEFA PBBCDABEFA ->
Replace(2, A) -> PABCDABEFA PABCDABEFA ->
Replace(1, Q) -> QABCDABEFA
Cch gii:
i vi xu k t th vic xo, chn s lm cho cc phn t pha sau v tr bin i b nh ch s
li, gy kh khn cho vic qun l v tr. khc phc iu ny, ta s tm mt th t bin i tho
mn: Php bin i ti v tr i bt buc phi thc hin sau cc php bin i ti v tr i + 1, i + 2, ...
V d: X = 'ABCD';
Insert(0, E) sau Delete(4) cho ra X = 'EABD'. Cch ny khng tun th nguyn tc
Delete(3) sau Insert(0, E) cho ra X = 'EABD'. Cch ny tun th nguyn tc ra.
Ni tm li ta s tm mt dy bin i c v tr thc hin gim dn.
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 =
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
Y =
Xm := Yn
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
2
3
2
3
2
3
1
2
2
2
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 Enter;
{Nhp d liu t thit b nhp chun}
begin
ReadLn(X); ReadLn(Y);
m := Length(X); n := Length(Y);
end;
function Min3(x, y, z: Integer): Integer; {Cho gi tr nh nht trong 3 gi tr x, y, z}
var
t: Integer;
begin
if x < y then t := x else t := y;
if z < t then t := z;
Min3 := t;
end;
procedure Optimize;
var
i, j: Integer;
begin
{Khi to vin cho bng phng n}
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;
procedure Trace;
{Truy vt}
begin
WriteLn(F[m, n]);
{F[m, n] chnh l s t nht cc php bin i cn thc hin}
while (m <> 0) or (n <> 0) do {Vng lp kt thc khi m = n = 0}
if X[m] = Y[n] then
{Hai k t cui ca 2 xu ging nhau}
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.
C ij
= A ik .B kj
(i, j: 1 i p; 1 j r)
k=1
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
5
9
2
6
10
3
7
11
4
8
12
1
0
3
1
0
1
0
1
2
0
1
1
4
5
6
1
0
1
1
1
14
34
54
6
14
22
9
25
41
36
100
164
9
21
33
thc hin php nhn hai ma trn A(mxn) v B(nxp) ta c th lm nh on chng trnh sau:
for i := 1 to p do
for j := 1 to r do
begin
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
6
3 2 3 1 2 2 3
MATRIXES.OUT
31
((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)
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,
F[ + 1, j] + ai * a k + * aj+ 1)
1
k
k] +
i k< j
2. Tnh bng phng n
Bng phng n F l bng hai chiu, nhn vo cng thc truy hi, ta thy F[i, j] ch c tnh khi
m F[i, k] cng nh F[k + 1, j] u bit. Tc l ban u ta in c s quy hoch ng vo ng
cho chnh ca bng(F[i, i] = 0), t tnh cc gi tr thuc ng cho nm pha trn (Tnh cc
F[i, i + 1]), ri li tnh cc gi tr thuc ng cho nm pha trn na (F[i, i + 2]) ... n khi tnh
c F[1, n] th dng li
3. Tm cch kt hp ti u
Ti mi bc tnh F[i, j], ta ghi nhn li im k m cch tnh (Mi * Mi+1 * ... * Mk) * (Mk+1 * Mk+2 *
... * Mj) cho s php nhn s hc nh nht, chng hn ta t T[i, j] = k.
Khi , mun in ra php kt hp ti u nhn on Mi * Mi+1 * ... * Mk * Mk+1 * Mk+2 * ... * Mj,
ta s in ra cch kt hp ti u nhn on Mi * Mi+1 * ... * Mk v cch kt hp ti u nhn on
Mk+1 * Mk+2 * ... * Mj (c km theo du ng m ngoc) ng thi vit thm du "*" vo gia hai
biu thc .
PROG03_4.PAS * Nhn ti u dy ma trn
program MatrixesMultiplier;
const
max = 100;
MaxLong = 1000000000;
var
a: array[1..max + 1] of Integer;
F: array[1..max, 1..max] of LongInt;
T: array[1..max, 1..max] of Byte;
n: Integer;
procedure Enter;
{Nhp d liu t thit b nhp chun}
var
i: Integer;
begin
ReadLn(n);
for i := 1 to n + 1 do Read(a[i]);
end;
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;
for len := 2 to n do
for i := 1 to n - len + 1 do
begin
j := i + len - 1;
for k := i to j - 1 do
begin
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;
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
T M
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
7
1
4
2
6
2
7
6
5
3
8
7
6
4
7
9
7
2
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
1
7
1
4
2
6
2
7
6
5
3
8
7
6
4
7
B
1
7
1
4
9
7
2
6
T
MADAM
edcbabcde
edbabcd
00_11_22_33_222_1_000
abcdefg_hh_gfe_1_d_2_c_3_ba
000_11_222_33_222_11_000
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 -min 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
C
B
B
B
A
D
C
D
C
B
A
B
D
D
B
B
A
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
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 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
L thuyt th
\
VI. THUT TON TT
HN.........................................................................................................................502 [
L thuyt th
\
3[
VII. NG I NGN NHT GIA MI CP NH - THUT TON FLOYD
...................................68
VIII. NHN XT..............................................................................................................................................70
9. BI TON CY KHUNG NH NHT .......................................................................................... 72
I. BI TON CY KHUNG NH NHT......................................................................................................72
II. THUT TON KRUSKAL (JOSEPH KRUSKAL - 1956)
.......................................................................72
III. THUT TON PRIM (ROBERT PRIM 1957).......................................................................................76
10. BI TON LUNG CC I TRN MNG..............................................................................
80
I. BI TON.....................................................................................................................................................80
II. LT CT, NG TNG LUNG, NH L FORD FULKERSON.................................................80
III. CI T.....................................................................................................................................................82
IV. THUT TON FORD - FULKERSON (L.R.FORD & D.R.FULKERSON - 1962)
...............................85
11. BI TON TM B GHP CC I TRN TH HAI PHA.................................................
89
I. TH HAI PHA (BIPARTITE GRAPH)
.................................................................................................89
II. BI TON GHP I KHNG TRNG V CC KHI
NIM...........................................................89
III. THUT TON NG M
....................................................................................................................90
IV. CI T.....................................................................................................................................................90
12. BI TON TM B GHP CC I VI TRNG S CC TIU TRN TH HAI
PHA - THUT TON
HUNGARI.................................................................................................................... 95
I. BI TON PH N CNG ............................................................................................................................95
II. PHN TCH .................................................................................................................................................95
III. THUT TON ...........................................................................................................................................96
IV. CI T...................................................................................................................................................100
V. BI TON TM B GHP CC I VI TRNG S CC I TRN TH HAI
PHA..........105
VI. PHC TP TNH
TON..................................................................................................................106
13. BI TON TM B GHP CC I TRN TH ................................................................
111
I. CC KHI NIM .......................................................................................................................................111
II. THUT TON EDMONDS (1965)
..........................................................................................................112
III. PHNG PHP LAWLER
(1973)..........................................................................................................113
IV. CI T...................................................................................................................................................115
V. PHC TP TNH TON
...................................................................................................................119
L thuyt th
\
4[
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.
Mc d L thuyt th c khoa hc pht trin t rt lu nhng li c nhiu ng dng hin
i. c bit trong khong vi mi nm tr li y, cng vi s ra i ca my tnh in t v s
pht trin nhanh chng ca Tin hc, L thuyt th cng c quan tm n nhiu hn. c bit
l cc thut ton trn th c nhiu ng dng trong nhiu lnh vc khc nhau nh: Mng my
tnh, L thuyt m, Ti u ho, Kinh t hc v.v... Chng hn nh tr li cu hi: Hai my tnh trong
mng c th lin h c vi nhau hay khng ?; hay vn phn bit hai hp cht ho hc c cng
cng thc phn t nhng li khc nhau v cng thc cu to cng c gii quyt nh m hnh
th. Hin nay, mn hc ny l mt trong nhng kin thc c s ca b mn khoa hc my tnh.
Trong phm vi mt chuyn , khng th ni k v ni ht nhng vn ca l thuyt th. Tp
bi ging ny s xem xt l thuyt th di gc ngi lp trnh, tc l kho st nhng thut
ton c bn nht c th d dng ci t trn my tnh mt s ng dng ca n. Cc khi nim
tru tng v cc php chng minh s c din gii mt cch hnh thc cho n gin v d hiu
ch khng phi l nhng chng minh cht ch dnh cho ngi lm ton. Cng vic ca ngi lp
trnh l c hiu c tng c bn ca thut ton v ci t c chng trnh trong bi ton
tng qut cng nh trong trng hp c th. Thng thng sau qu trnh rn luyn, hu ht nhng
ngi lp trnh gn nh phi thuc lng cc m hnh ci t, khi p dng c th ci t ng
ngay v hiu qu, khng b mt thi gi vo cc cng vic g ri. Bi vic g ri mt thut ton tc
l phi d li tng bc tin hnh v t tr li cu hi: "Ti bc nu ng th phi nh th no
?", thc ra l tiu ph thi gian v ch chng minh li tnh ng n ca thut ton trong
trng hp c th, vi mt b d liu c th.
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 thuyt th
\
5[
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:
S giao thng
Mng my tnh
Hnh 1: V d v m hnh th
V hng
C hng
V hng
n th
C hng
a th
L thuyt th
\
6[
deg
m
vV
vV
1
2
3
4
5
1
0
0
0
1
0
2
0
0
0
0
1
3
1
0
0
0
0
4
0
1
0
0
0
5
0
0
1
0
0
1
5
Ci t trn mng:
1
(1, 3)
2
(2, 4)
3
(3, 5)
4
(4, 1)
5
(5, 2)
2
nil
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
10
11
12
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]
List[2]
List[3]
List[4]
Nil
List[5]
Nil
Nil
Nil
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;
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.
4
6
7
8
3
GRAPH.INP
8 7 1 5
1 2
1 3
2 3
2 4
3 5
4 6
7 8
GRAPH.OUT
1, 2, 3, 5, 4, 6,
5<-3<-2<-1
procedure Enter;
{Nhp d liu t thit b nhp chun (Input)}
var
i, u, v, m: Integer;
begin
FillChar(a, SizeOf(a), False);
{Khi to th cha c cnh no}
ReadLn(n, m, S, F);
{c dng 1 ra 4 s n, m, S v F}
for i := 1 to m do
{c m dng tip ra danh sch
cnh}
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
end;
procedure DFS(u: Integer);
var
v: Integer;
begin
Write(u, ', ');
u} Free[u] := False;
thm} for v := 1 to n do
if Free[v] and a[u, v] then
begin
Trace[v] := u;
DFS(v);
end;
end;
{Thng bo ti c
{nh du u
{Vi mi nh v cha thm k vi u}
{Lu vt ng i: nh lin trc v trong ng i t S ti v l u}
{Tip tc tm kim theo chiu su bt u t v}
procedure Result;
{In ng i t S ti F}
begin
WriteLn;
{Vo dng th hai ca Output file}
if Free[F] then
{Nu F cha nh du thm tc l khng c ng}
WriteLn('Path from ', S, ' to ', F, ' not found')
else
{Truy vt ng i, bt u t F}
begin
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
{nh ngha li thit b nhp/xut chun thnh Input/Output file}
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.
c)
4
6
7
8
3
2nd
5th
4
6
1st
1
6th
7
8
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}
procedure DFS;
var
u, v: Integer;
begin
Write(S, ', '); Free[S] := False;
Push(S);
su} repeat
{Thm S, nh du S thm}
{Khi ng dy chuyn duyt
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...uv}
Break;
end;
until Last = 0; {Ngn xp rng}
end;
procedure Result;
{In ng i t S ti F}
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;
DFS; Result;
Close(Input);
Close(Output);
end.
2
1
Ngn xp
(1)
(1, 2)
(1, 2, 3)
(1, 2, 3, 5)
(1, 2, 3)
(1, 2)
(1, 2, 4)
(1, 2, 4, 6)
(1, 2, 4)
(1, 2)
(1)
1
2
3
5
3
2
4
6
4
2
1
2
3
5
Khng c
Khng c
4
6
Khng c
Khng c
Khng c
Khng c
Ngn xp sau mi bc
(1, 2)
(1, 2, 3)
(1, 2, 3, 5)
(1, 2, 3)
(1, 2)
(1, 2, 4)
(1, 2, 4, 6)
(1, 2, 4)
(1, 2)
(1)
Gii thch
Tin su xung thm 2
Tin su xung thm 3
Tin su xung thm 5
Li li
Li li
Tin su xung thm 4
Tin su xung thm 6
Li li
Li li
Li li
Li ht dy chuyn, Xong
thm}
begin
repeat
for (v K(u)) do
if <v cha thm> then
tip}
begin
Trace[v] := u; {Lu vt}
FindNext := v;
Exit;
end;
u := Trace[u]; {Nu khng, li v mt bc. Lu l Trace[S] c gn bng n + 1}
until u = n + 1;
FindNext := 0; { trn khng Exit c tc l mi nh ti c t S duyt xong}
end;
begin
su}
Trace[S] := n + 1;
u := S;
repeat
<Thng bo thm u, nh du u thm>;
u := FindNext(u);
until u = 0;
end;
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
u1
u2
x2
...
...
uq
xp
Hnh 4: Cy BFS
{Cc nh u cha nh
du}
Free[S] := False;
{Ngoi tr nh
S}
Queue[1] := S;
{Hng i ch gm c mt nh
S}
Last := 1;
First := 1;
end;
procedure Push(V: Integer); {y mt nh V vo hng i}
begin Inc(Last);
Queue[Last] := V;
end;
function Pop: Integer;
begin
Pop := Queue[First];
Inc(First);
end;
procedure BFS;
var
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;
procedure Result;
{In ng i t S ti F}
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.
V d: Xt th di y, nh xut pht S = 1.
4
2
1
Hng i
(1)
(2, 3)
(3, 4)
(4, 5)
(5, 6)
(6)
nh u
(ly ra t hng i)
1
2
3
4
5
6
Hng i
(sau khi ly u ra)
(3)
(4)
(5)
(6)
8
5
Cc nh v k u m
cha ln lch
2, 3
4
5
6
Khng c
Khng c
(2, 3)
(3, 4)
(4, 5)
(5, 6)
(6)
1
3
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 BFS; {Thut ton loang}
var
u, v: Byte;
begin
repeat {Lp: dng Old tnh New}
New := [];
for u := 1 to n do
if u in Old then {Xt nhng nh u trong tp Old, vi mi nh u :}
begin
Write(u, ', '); {Thng bo thm u}
for v := 1 to n do
if Free[v] and a[u, v] then {Qut tt c nhng nh v cha b nh du m k vi u}
begin
Free[v] := False; {nh du v v lu vt ng i}
Trace[v] := u;
New := New + [v]; {a v vo tp New}
end;
end;
Old := New;
{Gn tp "c" := tp "mi" v lp li}
until Old = []; {Cho ti khi khng loang c na}
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.
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
Vi thut ton lit k cc thnh phn lin thng nh th ny, th phc tp tnh ton ca n ng
bng phc tp tnh ton ca thut ton tm kim trn th trong th tc Duyt.
III. TH Y V THUT TON WARSHALL
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.
n.(n 1)
2
cnh v bc ca mi nh u bng n - 1.
th y Kn c ng: C n
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.
hoc
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];
1
3
2
5
4
12
10
11
GRAPH.INP
12 9
1 3
1 4
1 5
2 4
6 7
6 8
9 10
9 11
11 12
GRAPH.OUT
Connected Component 1:
1, 2, 3, 4, 5,
Connected Component 2:
6, 7, 8,
Connected Component 3:
9, 10, 11, 12,
k, u, v, n: Integer;
Count: Integer;
procedure Enter;
{Nhp th}
var
i, u, v, m: Integer;
begin
FillChar(a, SizeOf(a), False);
ReadLn(n, m);
for v := 1 to n do a[v, v] := True; {D nhin t v c ng i n chnh v}
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
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, ', ');
Free[v] := False;
end;
WriteLn;
end;
Close(Input);
Close(Output);
end.
1.
1st
5th
5th
2nd
1st
2nd
5th
2nd
6th
3rd
u
4th
TH1: v l tin bi ca u
(u, v) l cung ngc
6th
3rd
6th
3rd
7th
7th
v
4th
TH2: v l hu du ca u
(u, v) l cung xui
7th
4th
Ta nhn thy mt c im ca thut ton tm kim theo chiu su, thut ton khng ch duyt qua
cc nh, n cn duyt qua tt c nhng cung na. Ngoi nhng cung nm trn cy tm kim, nhng
cung cn li c th chia lm ba loi: cung ngc, cung xui, cung cho.
2. Cy tm kim DFS v cc thnh phn lin thng mnh
nh l 1:
Nu a, b l hai nh thuc thnh phn lin thng mnh C th vi mi ng i t a ti b cng
nh t b ti a. Tt c nh trung gian trn ng i u phi thuc C.
Chng minh
Nu a v b l hai nh thuc C th tc l c mt ng i t a ti b v mt ng i khc t b ti a.
Suy ra vi mt nh v nm trn ng i t a ti b th a ti c v, v ti c b, m b c ng ti
a nn v cng ti c a. Vy v nm trong thnh phn lin thng mnh cha a tc l vC. Tng
t vi mt nh nm trn ng i t b ti a.
nh l 2:
Vi mt thnh phn lin thng mnh C bt k, s tn ti mt nh r C sao cho mi nh ca
C u thuc nhnh DFS gc r.
Chng minh:
Trc ht, nhc li mt thnh phn lin thng mnh l mt th con lin thng mnh ca th
ban u tho mn tnh cht ti i tc l vic thm vo thnh phn mt tp hp nh khc s lm
mt i tnh lin thng mnh.
Trong s cc nh ca C, chn r l nh c thm u tin theo thut ton tm kim theo chiu
su. Ta s chng minh C nm trong nhnh DFS gc r. Tht vy: vi mt nh v bt k ca C, do C
lin thng mnh nn phi tn ti mt ng i t r ti v:
(r = 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:
b
a
...
...
...
a
b
...
...
...
Kh nng 1: a b v
...
v
...
...
...
...
v
...
Kh nng 1: b a v
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
2
8
3
4
4
9
10
10
6
11
7
11
7
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 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
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
2
thut ton Tarjan vn l O(n + m) trong trng hp biu din th bng danh sch k, l O(n )
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:
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.
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
2
8
3
4
9
10
6
11
7
GRAPH.INP
11 15
1 2
1 8
2 3
3 4
4 2
4 5
5 6
6 7
7 5
8 9
9 4
9 10
10 8
10 11
11 8
GRAPH.OUT
Component 1:
7, 6, 5,
Component 2:
4, 3, 2,
Component 3:
11, 10, 9, 8,
Component 4:
1,
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;
procedure Enter;
{Nhp d liu (t thit b nhp chun)}
var
i, u, v, m: Integer;
begin
FillChar(a, SizeOf(a), False);
ReadLn(n, m);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
end;
end;
procedure Init;
{Khi to}
begin
FillChar(Numbering, SizeOf(Numbering), 0);
thm} FillChar(Free, SizeOf(Free), True);
Last := 0;
Count := 0;
ComponentCount := 0;
end;
{Mi nh u cha
{Cha nh no b loi}
{Ngn xp rng}
{Bin nh s th t thm}
{Bin nh s cc thnh phn lin thng}
{y mt nh v vo ngn xp}
t u}
var
v: Integer;
begin
Inc(Count); Numbering[u] := Count; {Trc ht nh s cho u}
Low[u] := Numbering[u]; {Coi u c cung ti u, nn c th khi gn Low[u] th ny ri sau cc tiu ho dn}
Push(u);
{y u vo ngn xp}
for v := 1 to n do
if Free[v] and a[u, v] then {Xt nhng nh v k u}
if Numbering[v] <> 0 then {Nu v thm}
Low[u] := Min(Low[u], Numbering[v]) {Cc tiu ho Low[u] theo cng thc ny}
else
{Nu v cha thm}
begin
Visit(v);
{Tip tc tm kim theo chiu su bt u t v}
Low[u] := Min(Low[u], Low[v]);
{Ri cc tiu ho Low[u] theo cng thc
end;
ny}
Inc(ComponentCount);
WriteLn('Component ', ComponentCount, ': ');
repeat
v := Pop;
{Ly dn cc nh ra khi ngn xp}
Write(v, ', ');
{Lit k cc nh }
Free[v] := False; {Ri loi lun khi
th} until v = u;
{Cho ti khi ly ti nh
u} WriteLn;
end;
end;
procedure Solve;
var
u: Integer;
begin
{Thay v thm mt nh gi x v cc cung (x, v) vi mi nh v ri gi Visit(x), ta c th lm th ny cho nhanh}
{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
10
8
6
9
2
9
10
1
11
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
T1
T2
Hnh 13: th G v mt s v d cy khung T1, T2, T3 ca n
T3
S cy khung ca th y Kn l n .
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
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
10
11
10
11
Hnh 14: Cy khung DFS v cy khung BFS (Mi tn ch chiu i thm cc nh)
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.
2
3
10
10
Nhn xt 3:
Vi php nh chiu nh trn, th s ch cn cc cung trn cy DFS v cung ngc, khng cn li
cung xui. Bi trn th v hng ban u, nu ta coi mt cnh l hai cung c hng ngc chiu
nhau th vi mt cung xui ta c cung ngc chiu vi n l cung ngc. Do tnh cht DFS, cung
ngc c duyt trc cung xui tng ng, nn khi nh chiu cnh theo cung ngc th cung
xui s b hu v khng b xt ti na.
Nhn xt 4:
Trong th v hng ban u, cnh b nh hng thnh cung ngc chnh l cnh ngoi ca cy
khung DFS. Chnh v vy, mi chu trnh c s trong th v hng ban u vn s l chu
trnh trong th c hng to ra. (y l mt phng php hiu qu lit k cc chu trnh c s
ca cy khung DFS: Va duyt DFS va nh chiu, nu duyt phi cung ngc (u, v) th truy vt
ng i ca DFS tm ng t v n u, sau ni thm cung ngc (u, v) c mt chu
trnh c s).
nh l: iu kin cn v mt th v hng lin thng c th nh chiu c l mi
cnh ca th nm trn t nht mt chu trnh n (Hay ni cch khc mi cnh ca th u
khng phi l cu).
Chng minh:
Gi G = (V, E) l mt th v hng lin thng.
""
Nu G l nh chiu c th sau khi nh hng s c th lin thng mnh G'. Vi mt cnh
c nh chiu thnh cung (u, v) th s tn ti mt ng i n trong G' theo cc cnh nh
hng t v v u. ng i ni thm cung (u, v) s thnh mt chu trnh n c hng trong G'.
Tc l trn th ban u, cnh (u, v) nm trn mt chu trnh n.
""
Nu mi cnh ca G u nm trn mt chu trnh n, ta s chng minh rng: php nh chiu DFS
s to ra th G' lin thng mnh.
Trc ht ta chng minh rng nu (u, v) l cnh ca G th s c mt ng i t u ti v trong
G'. Tht vy, v (u, v) nm trong mt chu trnh n, m mi cnh ca mt chu trnh n u
phi thuc mt chu trnh c s no , nn s c mt chu trnh c s cha c u v v. Chu trnh
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
1
3
4
4
3 8
5
4
9
10 3
8
6
9
10
th v hng
7 5
1
3
2
4
10
11
GRAPH.INP
11 14
1 2
1 3
2 3
2 4
4 5
4 6
4 9
5 7
5 10
6 8
7 10
7 11
8 9
10 11
GRAPH.OUT
Bridges:
(4, 5)
(2, 4)
Directed Edges:
1 -> 2
2 -> 3
2 -> 4
3 -> 1
4 -> 5
4 -> 6
5 -> 7
6 -> 8
7 -> 10
8 -> 9
9 -> 4
10 -> 5
10 -> 11
11 -> 7
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 Visit(u: Integer);
var
v: Integer;
begin
Inc(Count);
Numbering[u] := Count; {nh s th t thm cho nh u, u tr thnh thm}
Low[u] := n + 1;
{Khi gn Low[u] bng mt gi tr ln hn tt c
Numbering} for v := 1 to n do
if a[u, v] then {Xt mi nh v k u}
begin
a[v, u] := False;
{nh chiu cnh (u, v) thnh cung (u, v)}
if Numbering[v] = 0 then
{Nu v cha thm}
begin
Visit(v);
{i thm v}
if Low[v] > Numbering[u] then {(u, v) l cu}
WriteLn('(', u, ', ', v, ')');
if Low[u] > Low[v] then Low[u] := Low[v];
{Cc tiu ho Low[u] }
end
else
if Low[u] > Numbering[v] then Low[u] := Numbering[v]; {Cc tiu ho Low[u] }
end;
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);
end;
begin
Enter;
Init;
Solve;
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:
11
2
3
12
4
13
10
17
14
15
16
Hy nhnh DFS gc nh r no
Nu mi nhnh con ca nhnh DFS gc r u c mt cung ngc ln ti mt tin bi ca r th r
khng l khp. Bi nu trong th ban u, ta b r i th t mi nh bt k ca nhnh con, ta
5
4
10
9
8
13
7
11
12
GRAPH.INP
13 15
1 3
2 4
2 5
3 6
3 7
4 8
4 11
5 9
5 10
6 7
8 11
8 12
9 10
9 13
11 12
GRAPH.OUT
Cut vertices:
2, 3, 4, 5, 9,
ReadLn(n, m);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True; a[v, u] := True;
end;
end;
procedure Visit(u: Integer);
{Tm kim theo chiu su bt u t u}
var
v: Integer;
begin
Inc(Count);
Numbering[u] := Count; Low[u] := n + 1; nC[u] := 0;
Mark[u] := False;
for v := 1 to n do
if a[u, v] then
{Xt mi v k u}
if Numbering[v] = 0 then
{Nu v cha thm}
begin
Inc(nc[u]);
{Tng bin m s con ca u ln 1}
Visit(v);
{Thm v}
end;
end
else
if Low[u] > Numbering[v] then Low[u] := Numbering[v]; {Cc tiu ho Low[u] }
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;
procedure Result;
{Da vo mng nh du lit k cc khp}
var
i: Integer;
begin
WriteLn('Cut vertices:');
for i := 1 to n do
if Mark[i] then Write(i, ', ');
end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
LoadGraph;
Solve;
Result;
Close(Input);
Close(Output);
end.
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
B
B
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.
2
7
7
1
8
3
8
3
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
EULER.INP
4
1 2 1
1 3 2
1 4 1
2 3 1
3 4 1
EULER.OUT
1
2
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.
Thut ton trn c th dng tm chu trnh Euler trong th c hng lin thng yu, mi nh
c bn bc ra bng bn bc vo. Tuy nhin th t cc nh in ra b ngc so vi cc cung nh
hng, ta c th o ngc hng cc cung trc khi thc hin thut ton c th t ng.
Thut ton hot ng vi hiu qu cao, d ci t, nhng trng hp xu nht th Stack s phi cha
ton b danh sch nh trn chu trnh Euler chnh v vy m khi a th c s cnh qu ln th s
khng khng gian nh m t Stack (Ta c th vi th ch gm 2 nh nhng gia hai nh
6
c ti 10 cnh ni s thy ngay). L do thut ton ch c th p dng trong trng hp s cnh c
gii hn bit trc nh l nh vy.
PROG06_2.PAS * Thut ton hiu qu tm chu trnh Euler
program Euler_Circuit;
const
max = 100;
maxE = 20000;
{S cnh ti a}
var
a: array[1..max, 1..max] of Integer;
stack: array[1..maxE] of Integer;
n, last: Integer;
procedure Enter;
{Nhp d liu}
var
u, v, k: Integer;
begin
FillChar(a, SizeOf(a), 0);
ReadLn(n);
while not SeekEof do
begin
ReadLn(u, v, k);
a[u, v] := k;
a[v, u] := k;
end;
end;
procedure Push(v: Integer); {y mt nh v vo ngn xp}
begin Inc(last);
Stack[last] := v;
end;
function Pop: Integer;
begin
Pop := Stack[last];
Dec(last);
end;
procedure FindEulerCircuit;
var
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.
C
M D A B C M F G N L I J K N H E M
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.
2.
3.
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
1
5
HAMILTON.INP
5 6
1 2
1 3
2 4
3 5
4 1
5 2
HAMILTON.OUT
1 3 5 2 4 1
1 4 2 5 3 1
procedure Enter;
{Nhp d liu t thit b nhp chun Input}
var
i, u, v, m: Integer;
begin
FillChar(a, SizeOf(a), False);
ReadLn(n, m);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
end;
procedure PrintResult; {In kt qu nu tm thy chu trnh Hamilton}
var
i: Integer;
begin
for i := 1 to n do Write(X[i], ' ');
WriteLn(X[1]);
end;
procedure Try(i: Integer); {Th cc cch chn nh th i trong hnh trnh}
var
j: Integer;
begin
for j := 1 to n do
{nh th i (X[i]) c th chn trong nhng nh}
if Free[j] and a[x[i - 1], j] then {k vi X[i - 1] v cha b i qua }
begin
x[i] := j;
{Th mt cch chn X[i]}
if i < n then
{Nu cha th chn n X[n]}
begin
Free[j] := False; {nh du nh j l i qua}
Try(i + 1);
{ cc bc th k tip khng chn phi nh j na}
Free[j] := True;
{S th phng n khc cho X[i] nn s b nh du nh va th}
end
else {Nu th chn n X[n]}
if a[j, X[1]] then PrintResult; {v nu X[n] li k vi X[1] th ta c chu trnh Hamilton}
end;
end;
begin
{nh hng thit b nhp/xut chun}
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.
n
100 000
4. Gray code: Mt hnh trn c chia thnh 2 hnh qut ng tm. Hy xp
001
tt c cc xu nh phn di n vo cc hnh qut, mi xu vo mt hnh 101
111
011
qut sao cho bt c hai xu no hai hnh qut cnh nhau u ch khc
nhau ng 1 bt. V d vi n = 3 hnh v bn
110 010
*
5. Thch : Bi ton m i tun: Trn bn c tng qut kch thc n x n
vung (n chn v 6 n 20). Trn mt no c t mt qun m. Qun m ang (X1,
Y1) c th di chuyn sang (X2, Y2) nu X1-X2 . Y1-Y2 = 2 (Xem hnh v).
Hy tm mt hnh trnh ca qun m t xut pht, i qua tt c cc ca bn c, mi
ng 1 ln.
V d:
45
2
43
16
47
30
61
14
18
97
72
41
16
79
36
39
14
11
Vi n = 8;
42
3
17
44
46
1
31
48
60
37
15
64
56
13
29
62
71
42
17
96
83
40
15
12
33
38
Vi n = 10;
100
43
19
70
98
95
73
84
80
93
35
82
78
75
37
34
10
59
13
32
8
21
6
51
10
23
26
53
22
87
26
47
62
51
28
3
54
7
25
46
23
50
27
48
53
6
29
4
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
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
1
20
20
6
MINPATH.INP
6 7 1 4
1 2 1
1 6 20
2 3 2
3 4 20
3 6 3
5 4 5
6 5 4
MINPATH.OUT
Distance from 1 to 4: 15
4<-5<-6<-3<-2<-1
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
for v :=
if u =
for i := 1
end;
to n do
1 to n do
v then c[u, v] := 0 else c[u, v] := maxC;
to m do ReadLn(u, v, c[u, v]);
procedure Init;
{Khi to}
var
i: Integer;
begin
for i := 1 to n do
begin
d[i] := c[S, i];
{ di ng i ngn nht t S ti i = c(S, i)}
Trace[i] := S;
end;
end;
procedure Ford_Bellman;
Bellman}
{Thut
ton
Ford-
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;
procedure PrintResult; {In ng i t S ti
F}
begin
if d[F] = maxC then
{Nu d[F] vn l + th tc l khng c ng}
WriteLn('Path from ', S, ' to ', F, ' not found')
else
{Truy vt tm ng i}
begin
WriteLn('Distance from ', S, ' to ', F, ': ', d[F]);
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
Assign(Input, 'MINPATH.INP'); Reset(Input);
Assign(Output, 'MINPATH.OUT'); Rewrite(Output);
LoadGraph;
Init;
Ford_Bellman;
PrintResult;
Close(Input);
Close(Output);
end.
m}
var
i, m: Integer;
u, v: Integer;
begin
ReadLn(n, m, S, F);
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;
procedure Init;
t do}
var
i: Integer;
begin
for i := 1 to n do
begin
d[i] := c[S, i];
Trace[i] := S;
end;
FillChar(Free, SizeOf(Free), True);
end;
procedure Dijkstra;
var
i, u, v: Integer;
min: Integer;
begin
repeat
u := 0; min := maxC;
for i := 1 to n do
if Free[i] and (d[i] < min) then
begin
min := d[i];
u := i;
end;
{Thut ton s kt thc khi cc nh t do u c nhn + hoc chn n nh F}
if (u = 0) or (u = F) then Break;
{C nh nhn nh u}
Free[u] := False;
{Dng nh u ti u nhn nhng nh t do k vi u}
for v := 1 to n do
if Free[v] and (d[v] > d[u] + c[u, v]) then
begin
d[v] := d[u] + c[u, v];
Trace[v] := u;
end;
until False;
end;
procedure PrintResult;
{In ng i t S ti F}
begin
if d[F] = maxC then
WriteLn('Path from ', S, ' to ', F, ' not found')
else
begin
WriteLn('Distance from ', S, ' to ', F, ': ', d[F]);
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
Assign(Input, 'MINPATH.INP'); Reset(Input);
Assign(Output, 'MINPATH.OUT'); Rewrite(Output);
LoadGraph;
Init;
Dijkstra;
PrintResult;
Close(Input);
Close(Output);
end.
LoadGraph;
{Nhp d
liu}
var
i, m: Integer;
u, v, c: Integer;
inp: Text;
begin
{c file ln 1, xc nh cc on}
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;
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;
procedure Update(v: Integer);
{nh v va c sa nhn, cn phi chnh li Heap}
var
parent, child: Integer;
begin
child := Pos[v];
{child l v tr ca v trong Heap}
if child = 0 then {Nu v cha c trong Heap th Heap phi b sung thm 1 phn t v coi child = nt l cui
Heap}
begin
Inc(nHeap); child := nHeap;
end;
parent := child div 2; {parent l nt cha ca child}
while (parent > 0) and (d[heap[parent]] > d[v]) do
begin
{Nu nh lu nt parent u tin km hn v th nh s b y xung nt
con child} heap[child] := heap[parent]; {y nh lu trong nt cha
xung nt con} Pos[heap[child]] := child;
{Ghi nhn li v tr mi ca
nh }
child := parent;
parent := child div 2;
end;
heap[child] := v;
Pos[v] := child;
end;
function Pop: Integer;
var
r, c, v: Integer;
begin
Pop := heap[1];
{Nt gc Heap cha nh c nhn t do nh nht}
v := heap[nHeap]; {v l nh nt l cui Heap, s c o ln u v vun ng}
Dec(nHeap);
r := 1;
{Bt u t nt gc}
while r * 2 <= nHeap do {Chng no r cha phi l l}
begin
{Chn c l nt cha nh u tin hn trong hai nt con}
c := r * 2;
if (c < nHeap) and (d[heap[c + 1]] < d[heap[c]]) then Inc(c);
{Nu v u tin hn c nh cha trong C, th thot ngay}
2
4
2
5
4
5
6
6
3
var
i, m: Integer;
u, v: Integer;
begin
ReadLn(n, m, S, F);
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;
procedure Number;
{Thut ton nh s cc nh}
var
deg: array[1..max] of Integer;
u, v: Integer;
front: Integer;
begin
-
count := 0;
for u := 1 to n do
if deg[u] = 0 then
begin
Inc(count); List[count] := u;
end;
{front: Ch s phn t ang xt, count: S phn t trong danh sch}
front := 1;
while front <= count do
begin
{Xt phn t th front trong danh sch, y con tr front sang phn t k tip}
u := List[front]; Inc(front);
for v := 1 to n do
if c[u, v] <> maxC then {Xt nhng cung (u, v) v "loi" khi th deg (v) gim 1}
begin
Dec(deg[v]);
if deg[v] = 0 then
{Nu v tr thnh nh khng c cung i vo}
begin
{a tip v vo danh sch List}
Inc(count);
List[count] := v;
end;
end;
end;
end;
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;
procedure PrintResult;
{In ng i t S ti
F}
begin
if d[F] = maxC then
WriteLn('Path from ', S, ' to ', F, ' not found')
else
begin
WriteLn('Distance from ', S, ' to ', F, ': ', d[F]);
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
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.
k-1
c [u, v] = c [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}.
k
k-1
k-1
c [u, v] = c [u, k] + c [k, v].
k
k
k-1
k-1
k-1
V ta mun c [u, v] l cc tiu nn suy ra: c [u, v] = min(c [u, v], c [u, k] + c [k, v]).
n
V cui cng, ta quan tm ti c [u, v]: di ng i ngn nht t u ti v m ch i qua cc nh
trung gian thuc tp {1, 2, ..., n}.
k
Khi ci t, th ta s khng c cc khi nim c [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 LoadGraph;
m}
var
i, m: Integer;
u, v: Integer;
begin
ReadLn(n, m, S, F);
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;
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}
end;
begin
c[u, v] := c[u, k] + c[k, v];
Trace[u, v] := Trace[u, k];
end;
Write(S, '->');
S := Trace[S, 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.
3
Xt v phc tp tnh ton, nu ci t nh trn, thut ton Ford-Bellman c phc tp l O(n ),
2
2
thut ton Dijkstra l O(n ), thut ton ti u nhn theo th t tp l O(n ) cn thut ton Floyd l
3
O(n ). 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
2
1
3
2
m dng tip theo, mi dng c dng 3 s u, v, c[u, v] cch nhau t nht 1 du cch th hin
th c cnh (u, v) v trng s cnh l c[u, v]. (c[u, v] l s nguyn c gi tr tuyt i khng
qu 100).
Output: file vn bn MINTREE.OUT ghi cc cnh thuc cy khung v trng s cy khung
6
1
2
5
1
2
1
MINTREE.INP
6 9
1 2 1
1 3 1
2 4 1
2 3 2
2 5 1
3 5 1
3 6 1
4 5 2
5 6 2
MINTREE.OUT
Minimal spanning tree:
(2, 4) = 1
(3, 6) = 1
(2, 5) = 1
(1, 3) = 1
(1, 2) = 1
Weight = 5
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
Tuy nhin, thut ton lm vic hiu qu, trnh trng hp cy to thnh b suy bin khin cho
hm GetRoot hot ng chm, ngi ta thng nh gi: hp hai cy li thnh mt, th gc cy
no t nt hn s b coi l con ca gc cy kia.
Thut ton hp nht cy gc r1 v cy gc r2 c th vit nh sau:
{Count[k] l s nh ca cy gc k}
{Hp nht cy gc r1 vi cy gc
r2 }
begin
x := Lab[r1] + Lab[r2];
{-x l tng s nt ca c hai cy}
if Lab[r1] > Lab[r2] then
{Cy gc r1 t nt hn cy gc r2, hp nht thnh cy gc r2}
begin
Lab[r1] := r2; {r2 l cha ca r1}
Lab[r2] := x; {r2 l gc cy mi, -Lab[r2] gi y l s nt trong cy mi}
end
else
{Hp nht thnh cy gc r1}
begin
Lab[r1] := x; {r1 l gc cy mi, -Lab[r1] gi y l s nt trong cy mi}
Lab[r2] := r1; {cha ca r2 s l r1}
end;
end;
cy}
end;
PROG09_1.PAS * Thut ton Kruskal
program Minimal_Spanning_Tree_by_Kruskal;
const
maxV = 100;
maxE = (maxV - 1) * maxV div 2;
type
TEdge = record
{Cu trc mt cnh}
u, v, c: Integer;
{Hai nh v trng s}
Mark: Boolean;
{nh du c c kt np vo cy khung hay khng}
end;
var
e: array[1..maxE] of TEdge;
{Danh sch cnh}
Lab: array[1..maxV] of Integer; {Lab[v] l nh cha ca v, nu v l gc th Lab[v] = - s con cy gc v}
n, m: Integer;
Connected: Boolean;
procedure LoadGraph;
{Nhp th t thit b nhp chun (Input)}
var
i: Integer;
begin
ReadLn(n, m);
for i := 1 to m do
with e[i] do
ReadLn(u, v, c);
end;
procedure Init;
var
i: Integer;
begin
for i := 1 to n do Lab[i] := -1;
{Rng ban u, mi nh l gc ca cy gm ng mt nt}
for i := 1 to m do e[i].Mark := False;
end;
{Ly gc ca cy cha v}
begin
Connected := True;
Exit;
end;
Union(r1, r2);
end;
end;
end;
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.
{Nhp
th}
var
i, u, v: Integer;
begin
ReadLn(n, m);
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; {Khi to ma trn trng s}
for i := 1 to m do
begin
ReadLn(u, v, c[u, v]);
c[v, u] := c[u, v];
end;
end;
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
end;
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(n ). 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
Lung trn mi cung khng vt qu kh nng thng qua ca n: 0 f[u, v] c[u, v] ( (u,
v)
E)
w ( v )
u ( v )
5
6
1
0
6
5
1
5
1
5
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):
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
6;6
5;5
3;0
3;1
3
6
6;1
5,2
3
1;1
Hnh 21: Mng v lung trn cc cung (1 pht, 6 thu) v th tng lung tng ng
6;3
4
2
6;6
5;5
3;2
3;1
6
1
6;1
5,2
5
6;6
3;3
6
1
6;3
5,4
3
1;1
5
1;1
Bc 2: Lp hai bc sau:
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
2
5
1
5
6
3
MAXFLOW.INP
6 8 1 6
1 2 5
1 3 5
2 4 6
2 5 3
3 4 3
3 5 1
4 6 6
5 6 6
MAXFLOW.OUT
f(1, 2) = 5
f(1, 3) = 4
f(2, 4) = 3
f(2, 5) = 2
f(3, 4) = 3
f(3, 5) = 1
f(4, 6) = 6
f(5, 6) = 3
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...
end;
begin
if f[u, v] < c[u, v] then cf[u, v] := c[u, v] - f[u, v]; {t cung thun}
if f[u, v] > 0 then cf[v, u] := -f[u, v]; {t cung nghch}
end;
procedure IncFlow;
var
u, v, IncValue: Integer;
begin
{Trc ht d ng theo vt tm trng s nh nht ca cc cung trn ng}
IncValue := maxC;
v := B;
while v <> A do
begin
u := Trace[v]; { rng cf[u, v] l trng s ca cung (u, v) trn th tng lung}
if Abs(cf[u, v]) < IncValue then IncValue := Abs(cf[u, v]);
v:= u;
end;
{D li ng ln th hai, ln ny tng lung}
v := B;
while v <> A do
begin
u := Trace[v];
if cf[u, v] > 0 then f[u, v] := f[u, v] + IncValue {Nu (u, v) l cung thun trn Gf}
else f[v, u] := f[v, u] - IncValue; {Nu (u, v) l cung nghch trn Gf}
v := u;
end;
end;
procedure PrintResult; {In lung cc i tm
c}
var
u, v, m: Integer;
begin
m := 0;
for u := 1 to n do
for v := 1 to n do
if c[u, v] > 0 then {Nu c cung (u, v) trn mng th in ra gi tr lung f gn cho cung }
begin
WriteLn('f(', u, ', ', v, ') = ', f[u, v]);
if u = A then m := m + f[A, v]; {Gi tr lung cc i = tng lung pht ra t A}
end;
WriteLn('Max Flow: ', m);
end;
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.
{Nhp
liu}
var
m, i, u, v: Integer;
begin
FillChar(c, SizeOf(c), 0);
ReadLn(n, m, A, B);
for i := 1 to m do
ReadLn(u, v, c[u, v]);
end;
function Min(X, Y: Integer): Integer;
begin
if X < Y then Min := X else Min := Y;
end;
function FindPath: Boolean;
var
u, v: Integer;
Queue: array[1..max] of Integer;
First, Last: Integer;
begin
FillChar(Trace, SizeOf(Trace), 0); {Trace[v] = 0 ng ngha vi v cha nh du}
First := 1; Last := 1; Queue[1] := A;
Trace[A] := n + 1;
{Ch cn n khc 0 nh du m thi, s dng no cng c c}
Delta[A] := maxC;
{Khi to nhn}
repeat
u := Queue[First]; Inc(First);
for v := 1 to n do
if Trace[v] = 0 then
thm}
begin
if f[u, v] < c[u, v] then
{Nu (u, v) l cung thun trn Gf v c trng s l c[u, v] - f[u, v]}
begin
Trace[v] := u;
{Lu vt, Trace[v] mang du dng}
Delta[v] := min(Delta[u], c[u, v] - f[u, v]);
end
else
if f[v, u] > 0 then
{Nu (u, v) l cung nghch trn Gf v c trng s l f[v, u]}
begin
Trace[v] := -u;
{Lu vt, Trace[v] mang du m}
Delta[v] := min(Delta[u], f[v, u]);
end;
if Trace[v] <> 0 then
{Trace[v] khc 0 tc l t u c th thm
v}
begin
if v = B then
{C ng tng lung t A ti B}
begin
FindPath := True; Exit;
end;
Inc(Last); Queue[Last] := v; {a v vo Queue}
end;
end;
until First > Last;
FindPath := False;
end;
th hai pha gp rt nhiu m hnh trong thc t. Chng hn quan h hn nhn gia tp nhng
ngi n ng v tp nhng ngi n b, vic sinh vin chn trng, thy gio chn tit dy trong
thi kho biu v.v...
II. BI TON GHP I KHNG TRNG V CC KHI NIM
Cho mt th hai pha G = (XY, E) y X l tp cc nh tri v Y l tp cc nh phi ca G
Mt b ghp (matching) ca G l mt tp hp cc cnh ca G i mt khng c nh chung.
Bi ton ghp i (matching problem) l tm mt b ghp ln nht (ngha l c s cnh ln nht)
ca G
Xt mt b ghp M ca G.
Cc nh trong M gi l cc nh ghp (matched vertices), cc nh khc l cha ghp.
Cc cnh trong M gi l cc cnh ghp, cc cnh khc l cha ghp
Nu nh hng li cc cnh ca th thnh cung, nhng cnh cha ghp c nh hng t X
sang Y, nhng cnh ghp nh hng t Y v X. Trn th nh hng : Mt ng i xut
pht t mt X_nh cha ghp gi l ng pha, mt ng i t mt X_nh cha ghp ti mt
Y_nh cha ghp gi l ng m.
Mt cch d hiu, c th quan nim nh sau:
Mt ng pha (alternating path) l mt ng i n trong G bt u bng mt X_nh cha
ghp, i theo mt cnh cha ghp sang Y, ri n mt cnh ghp v X, ri li n mt cnh
cha ghp sang Y... c xen k nhau nh vy.
Mt ng m (augmenting path) l mt ng pha. Bt u t mt X_nh cha ghp kt
thc bng mt Y_nh cha ghp.
X1
Y1
X2
Y2
X3
Y3
mt b ghp M>;
ng m xut pht t x ti mt nh y cha ghp Y> do
trn ng m, xo b khi M cc cnh ghp v thm vo M nhng cnh
ghp, nh x v y tr thnh ghp, s cnh ghp tng ln 1>;
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
2
5
MATCH.INP
4 5
1 1
1 4
2 1
2 2
2 4
3 2
3 3
4 2
4 3
MATCH.OUT
Match:
1) X[1] 2) X[2] 3) X[3] 4) X[4] -
Y[1]
Y[4]
Y[3]
Y[2]
first := 1;
while first <= last do
begin
i := Queue[first]; Inc(first);
for j := 1 to n do
ghp}
end;
FindAugmentingPath := 0;
end;
{Thut ton ng m}
next
... ...
next
... ...
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;
procedure PrintResult;
{In kt qu}
var
i, Count: Integer;
begin
WriteLn('Match: ');
Count := 0;
for i := 1 to m do
if matchX[i] <> 0 then
begin
Inc(Count);
WriteLn(Count, ') X[', i, '] - Y[', matchX[i], ']');
end;
end;
begin
Assign(Input, 'MATCH.INP'); Reset(Input);
Assign(Output, 'MATCH.OUT'); Rewrite(Output);
Enter;
Init; Solve;
PrintResult;
Close(Input);
Close(Output);
end.
y l mt dng bi ton pht biu nh sau: C m ngi (nh s 1, 2, ..., m) v n cng vic
(nh s 1, 2, ..., n), mi ngi c kh nng thc hin mt s cng vic no . giao cho
ngi i thc hin cng vic j cn mt chi ph l c[i, j] 0. Cn phn cho mi th mt vic v
mi vic ch do mt th thc hin sao cho s cng vic c th thc hin c l nhiu nht v
nu c 2 phng n u thc hin c nhiu cng vic nht th ch ra phng n chi ph t
nht.
Dng th hai pha G = (XY, E) vi X l tp m ngi, Y l tp n vic v (u, v) E vi
trng s c[u, v] nu nh ngi u lm c cng vic v. Bi ton a v tm b ghp nhiu
cnh nht ca G c trng s nh nht.
Gi k = max(m, n). B sung vo tp X v Y mt s nh gi X = Y = k.
-1
-1
1 0 0
0 0 6
0 7 8
X[1] - Y[3]
X[2] - Y[2]
X[3] - Y[1]
+1
Mt b ghp M :=
*
v nh x tr thnh ghp.
Hoc khng tm c ng m th do ta s dng thut ton tm kim trn th nn c th
xc nh c hai tp:
V d minh ho:
khng b ri hnh, ta hiu nhng cnh khng ghi trng s l nhng 0_cnh, nhng cnh khng
v mang trng s rt ln trong trng hp ny khng cn thit phi tnh n. Nhng cnh nt m
l nhng cnh ghp, nhng cnh nt thanh l nhng cnh cha ghp.
X1
Y1
X2
Y2
x = X1
X1
Y1
Tm c ng m:
2
1
X3
X4
X1
X1 Y1
X2
Y2
2
1
Tng cp
Y3
X3
Y4
X4
Y1
x = X2
Y3
X1
Y4
Y1
Tm c ng m:
X2
Y2
2
1
X3
X4
X1
X2 Y1 X1 Y2
X2
Y2
2
1
Tng cp
Y3
X3
Y4
X4
Y1
x = X3
Y3
X1
Y4
Y1
Tm c ng m:
X2
Y2
2
1
X3
X4
1
X3
Y4
X4
X2
Y2
2
1=
Y3
Y2
2
Y3
Y1
X4
X2
Tng cp
X1
X3
X3 Y3
Y4
x = X4
Khng tm c ng m:
Tp nhng X_nh n c t X4
bng mt ng pha: {X3, X4}
Tp nhng Y_nh n c t X4
bng mt ng pha: {Y3}
Gi tr xoay = 1 (Cnh X3-Y2)
Tr tt c trng s nhng cnh lin
thuc vi {X3, X4} i 1
Cng tt c trng s nhng cnh lin
thuc vi Y3 ln 1
Y3
X1
Y4
Y1
X2
Y2
2
0
X3
X4
Y3
Y4
X1
Y1
X2
Y2
2=
X3
Y3
X4
Y4
X1
Y1
x = X4
Vn khng tm c ng m:
Tp nhng X_nh n c t X4
bng mt ng pha:
{X1, X2, X3, X4}
Tp nhng Y_nh n c t X4
bng mt ng pha:
{Y1, Y2, Y3}
Gi tr xoay = 2 (Cnh X2-Y4)
Tr tt c trng s nhng cnh lin
thuc vi {X1, X2, X3, X4} i 2
Cng tt c trng s nhng cnh lin
thuc vi {Y1, Y2, Y3} ln 2
x = X4
X1
Y1
X2
Y2
0
X3
X4
Y3
Y4
X1
Y1
X2
Y2
X3
Y3
Tm c ng m:
X2
Y2
0
X3
Y3
X4 Y3 X3 Y2 X1 Y1
X2 Y4
Tng cp
Xong
X4
Y4
X4
Y4
Tp cc cnh (X[i], Y[j]) tho mn c[i, j] - Fx[i] - Fy[j] = 0 cha trn mt b ghp y k
cnh, y chnh l b ghp cn tm.
Chng minh:
Nu tm c hai dy s tho mn trn th ta ch vic thc hin hai thao tc:
Vi mi nh X[i], tr tt c trng s ca nhng cnh lin thuc vi X[i] i Fx[i]
Vi mi nh Y[j], tr tt c trng s ca nhng cnh lin thuc vi Y[j] i Fy[j]
(Hai thao tc ny tng ng vi vic tr tt c trng s ca cc cnh (X[i], Y[j]) i mt lng
Fx[i] + Fy[j] tc l c[i, j] := c[i, j] - Fx[i] - Fy[j])
Th d thy th mi to thnh s gm c cc cnh trng s khng m v nhng 0_cnh ca
th cha trn mt b ghp y .
1
2
3
4
0
0
M
M
1
Fx[1] = 2
0
M
M
2
2
Fx[2] = 2
M
1
0
M
3
Fx[3] = 3
M
M
0
9
4
Fx[4] = 3
Fy[1] = -2 Fy[2] = -2 Fy[3] = -3 Fy[4] = 0
(C nhiu phng n khc: Fx = (0, 0, 1, 1); Fy = (0, 0, -1, 2) cng ng)
1ik
Y
6
ASSIGN.INP
5 6
1 1 0
1 2 0
2 1 0
2 4 2
3 2 1
3 3 0
4 3 0
4 4 9
5 4 9
ASSIGN.OUT
Optimal assignment:
1) X[1] - Y[1]
2) X[2] - Y[4]
3) X[3] - Y[2]
4) X[4] - Y[3]
Cost: 3
0
2
1
0
19
5
{Khi to}
{B ghp rng}
for i := 1 to k do
begin
Fx[i] := maxC;
for j := 1 to k do
if c[i, j] < Fx[i] then Fx[i] := c[i, j];
end;
{Fy[j] := Trng s nh nht ca cc cnh lin thuc vi Y[j]}
for j := 1 to k do
begin
Fy[j] := maxC;
for i := 1 to k do {Lu l trng s cnh (x[i], y[j]) by gi l c[i, j] - Fx[i] ch khng cn l c[i, j] na}
if c[i, j] - Fx[i] < Fy[j] then Fy[j] := c[i, j] - Fx[i];
end;
{Vic khi to cc Fx v Fy nh th ny ch n gin l cho s 0_cnh tr nn cng nhiu cng tt m thi}
{Ta hon ton c th khi gn cc Fx v Fy bng gi tr 0}
end;
{Hm cho bit trng s cnh (X[i], Y[j]) }
Queue[1] := start;
{y start vo hng i}
first := 1; last := 1;
repeat
i := Queue[first]; Inc(first); {Ly mt nh X[i] khi hng i}
for j := 1 to k do
{Duyt nhng Y_nh cha thm k vi X[i] qua mt 0_cnh cha
ghp}
begin
finish := j;
Exit;
end;
Inc(last); Queue[last] := matchY[j]; {y lun matchY[j] vo Queue}
end;
until first > last;
{Hng i rng}
end;
procedure SubX_AddY;
{Xoay cc trng s cnh}
var
i, j, t, Delta: Integer;
VisitedX, VisitedY: set of Byte;
begin
(* rng:
VisitedY = {y | Trace[y] 0}
VisitedX = {start} match(VisitedY) = {start} {matchY[y] | Trace[y] 0}
*)
VisitedX := [start];
VisitedY := [];
for j := 1 to k do
if Trace[j] <> 0 then
begin
Include(VisitedX, matchY[j]);
Include(VisitedY, j);
end;
Delta := maxC;
for i := 1 to k do
if i in VisitedX then
for j := 1 to k do
if not (j in VisitedY) and (GetC(i, j) < Delta) then
Delta := GetC(i, j);
{Xoay trng s cnh}
for t := 1 to k do
begin
{Tr trng s nhng cnh lin thuc vi VisitedX i Delta}
end;
{Ni rng b ghp bi ng m tm
c}
procedure Enlarge;
var
x, next: Integer;
begin
repeat
x := Trace[finish];
next := matchX[x];
matchX[x] := finish;
matchY[finish] := x;
finish := Next;
until finish = 0;
end;
finish
finish
next
next
... ...
start
... ...
start
procedure Solve;
{Thut ton Hungari}
var
x, y: Integer;
begin
for x := 1 to k do
begin
start := x; finish := 0; {Khi gn ni xut pht ng m, finish = 0 ngha l cha tm thy ng
m}
repeat
FindAugmentingPath;
{Th tm ng m}
if finish = 0 then SubX_AddY; {Nu khng thy th xoay cc trng s cnh v lp li}
until finish <> 0;
{Cho ti khi tm thy ng m}
Enlarge;
{Tng cp da trn 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 {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}
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
2.
3.
M := ;
x*
y1 +
x1
y2
x2
y3
x3 -
y1
y2
x1
x2
y4 +
y5 +
y7
y3
y4
y5
y7
X4 -
X5 -
X7
x3
X4
X5
X7
y6
y6
Augmenting path found
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
2
{Nhp
liu}
var
i, j: Integer;
begin
ReadLn(m, n);
if m > n then k := m else k := n;
for i := 1 to k do
for j := 1 to k do c[i, j] := maxC;
while not SeekEof do ReadLn(i, j, c[i, j]);
end;
procedure Init;
Fy}
var
i, j: Integer;
begin
FillChar(matchX, SizeOf(matchX), 0);
FillChar(matchY, SizeOf(matchY), 0);
for i := 1 to k do
begin
Fx[i] := maxC;
for j := 1 to k do
if c[i, j] < Fx[i] then Fx[i] := c[i, j];
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;
function GetC(i, j: Integer): Integer;
begin
GetC := c[i, j] - Fx[i] - Fy[j];
end;
procedure InitBFS;
var
y: Integer;
begin
first := 1; last := 1;
Queue[1] := start;
for y := 1 to k do
begin
d[y] := GetC(start, y);
arg[y] := start;
end;
finish := 0;
end;
procedure Push(v: Integer);
begin
Inc(last); Queue[last] := v;
end;
{y mt nh vX vo hng i}
begin
d[j] := w;
arg[j] := i;
end;
end;
until first > last;
end;
{Xoay cc trng s cnh}
procedure SubX_AddY;
var
Delta: Integer;
x, y: Integer;
begin
{Trc ht tnh = gi tr nh nht trng s cc d[y], vi yY cha thm (y khng thuc cy pha)}
Delta := maxC;
for y := 1 to k do
if (Trace[y] = 0) and (d[y] < Delta) then Delta := d[y];
{Tr trng s nhng cnh lin thuc vi startX i }
for y := 1 to k do
if (Trace[y] = 0) and (d[y] = 0) then {Thm lun nhng nh yY to vi cy pha mt 0_cnh}
begin
Trace[y] := arg[y];
{Lu vt ng i}
if matchY[y] = 0 then
{Nu y cha ghp th ghi nhn nh kt thc ng m v thot ngay}
begin
finish := y;
Exit;
end;
Push(matchY[y]);
{Nu y ghp th y lun matchY[y] vo hng i ch loang tip}
end;
end;
procedure Enlarge;
{Ni rng b ghp bng ng m kt thc finish}
var
x
finish
x, next: Integer;
begin
next
repeat
x := Trace[finish];
... ...
next := matchX[x];
matchX[x] := finish;
matchY[finish] := x;
finish := Next;
until finish = 0;
end;
start
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
finish
next
... ...
start
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.
matched edge
unmatched edge
ng (8, 1, 2, 5, 6, 4) l mt ng pha
Chu trnh (2, 3, 4, 6, 5, 2) l mt Blossom
ng (8, 1, 2, 3, 4, 6, 5, 7) l mt ng m
ng (8, 1, 2, 3, 4, 6, 5, 2, 1, 9) tuy c cc cnh m/nht xen k nhng khng phi ng pha
(v tt nhin khng phi ng m) v y khng phi l ng i c bn.
Ta d dng suy ra c cc tnh cht sau
ng m cng nh Blossom u l ng i di l vi s cnh nht nhiu hn s cnh m
ng 1 cnh.
Trong mi Blossom, nhng nh khng phi nh c s u l nh ghp v nh ghp vi
nh cng phi thuc Blossom.
V Blossom l mt chu trnh nn trong mi Blossom, nhng nh khng phi nh c s u tn
ti hai ng pha t nh c s i n n, mt ng kt thc bng cnh m v mt ng kt
thc bng cnh nht, hai ng pha ny c hnh thnh bng cch i dc theo chu trnh theo
hai hng ngc nhau. Nh v d trn, nh 4 c hai ng pha i nh c s 2 i ti: (2, 3, 4)
l ng pha kt thc bng cnh m v (2, 5, 6, 4) l ng pha kt thc bng cnh nht
iu kh nht trong thut ton Edmonds l phi xy dng thut ton tm ng m xut pht t
mt nh cha ghp. Thut ton c xy dng bng cch kt hp mt thut ton tm kim trn
th vi php chp Blossom.
Xt nhng ng pha xut pht t mt nh x cha ghp. Nhng nh c th n c t x bng
mt ng pha kt thc l cnh nht c gn nhn "nht", nhng nh c th n c t x bng
mt ng pha kt thc l cnh m c gn nhn "m".
Vi mt Blossom, ta nh ngha php chp (shrink) l php thay th cc nh trong Blossom bng
mt nh duy nht. Nhng cnh ni gia mt nh thuc Blossom ti mt nh v no khng
thuc Blossom c thay th bng cnh ni gia nh chp ny vi v v gi nguyn tnh m/nht.
D thy rng sau mi php chp, cc cnh m vn c m bo l b ghp trn th mi:
*
Shrink
Shrink
blossom
blossom
expand
expand
blossom
blossom
Lu rng khng phi Blossom no cng b chp, ch nhng Blossom nh hng ti qu trnh tm
ng m mi phi chp m bo rng ng m tm c l ng i c bn. Tuy nhin vic
ci t trc tip cc php chp Blossom v n nh kh rc ri, i hi mt chng trnh vi
4
phc tp O(n ).
3
Di y ta s trnh by mt phng php ci t hiu qu hn vi phc tp O(n ), phng php
ny ci t khng phc tp, nhng yu cu phi hiu rt r bn cht thut ton.
III. PHNG PHP LAWLER (1973)
Trong phng php Edmonds, sau khi chp mi Blossom thnh mt nh th nh hon ton li
c th nm trn mt Blossom mi v b chp tip. Phng php Lawler ch quan tm n nh chp
cui cng, i din cho Blossom ngoi nht (Outermost Blossom), nh chp cui cng ny c
nh danh (nh s) bng nh c s ca Blossom ngoi nht.
Cng chnh v thao tc chp/n ni trn m ta cn m rng khi nim Blossom, c th coi mt
Blossom l mt tp nh n ra t mt nh chp ch khng n thun ch l mt chu trnh pha
c bn na.
Xt mt Blossom B c nh c s l nh r. Vi vB, v r, ta lu li hai ng pha t r ti v,
mt ng kt thc bng cnh m v mt ng kt thc bng cnh nht, nh vy c hai loi vt
gn cho mi nh v:
S[v] l nh lin trc v trn ng pha kt thc bng cnh m, nu khng tn ti ng pha
loi ny th S[v] = 0.
T[v] l nh lin trc v trn ng pha kt thc bng cnh nht, nu khng tn ti ng pha
loi ny th T[v] = 0.
Bn cnh hai nhn S v T, mi nh v cn c thm
Nhn b[v] l nh c s ca Blossom cha v. Hai nh u v v thuc cng mt Blossom b[u]
= b[v].
Nhn match[v] l nh ghp vi nh v. Nu v cha ghp th match[v] = 0.
v=4
T:1
T:3
u=3
v=4
2
T:1
Tm thy ng m
S:2
S:2
u=3
v=4
S:2
T:3
S:4
u=3
v=4
T:1
2
T:1
T:1
S:2
T:3
S:5
T:7
S:4
u=4
v=7
T:3
S:7
T:5
S:6
b=3
S:4
T:3
S:5
T:7
S:4
u=5
u=5
v=7
T:3
S:7
T:5
S:6
a
x
T:1
S:2
v=7
T:3
S:6
T:1
S:2
b=3
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
10
GMATCH.INP
10 11
1 2
1 6
2 4
2 8
3 4
3 6
5 6
5 9
5 10
7 8
7 9
GMATCH.OUT
1 6
2 8
3 4
5 10
7 9
Number of matched edges: 5
(Input)}
var
i, m, u, v: Integer;
begin
FillChar(a, SizeOf(a), 0);
ReadLn(n, m);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
end;
procedure Init;
rng}
{Khi to b ghp
begin
FillChar(match, SizeOf(match), 0);
end;
procedure InitBFS; {Th tc ny c gi khi to trc khi tm ng m xut pht t start}
var
i: Integer;
begin
{Hng i ch gm mt nh m start}
first := 1; last := 1;
Queue[1] := start;
FillChar(InQueue, SizeOf(InQueue), False);
InQueue[start] := True;
{Cc nhn T c khi gn = 0}
for i := 1 to n do b[i] := i;
finish := 0; {finish = 0 ngha l cha tm thy ng m}
end;
procedure Push(v: Integer);
begin Inc(last);
Queue[last] := v;
InQueue[v] := True;
end;
{y mt nh m v vo hng i}
{Kh nht ca phng php Lawler l th tc ny: Th tc x l khi gp cnh nht nt hai nh m p, q}
Inpath[p] := True;
{nh du nt }
if p = start then Break; {Nu truy v n ni xut pht th dng}
p := T[match[p]];
{Nu cha v n start th truy li tip hai bc, theo cnh m ri theo cnh
nht}
until False;
repeat
{Truy vt t q, tng t nh i vi p}
q := b[q];
if InPath[q] then Break; {Tuy nhin nu chm vo ng pha ca p th dng ngay}
q := T[match[q]];
until False;
FindCommonAncestor := q;
{Ghi nhn nh c s mi}
end;
procedure ResetTrace(x: Integer); {Gn li nhn vt dc trn ng pha t start ti x}
var
u, v: Integer;
begin
v := x;
{Gn li nhn}
ResetTrace(p); ResetTrace(q);
if b[p] <> NewBase then T[p] := q;
if b[q] <> NewBase then T[q] := p;
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 ...}
begin
T[v] := u;
Push(match[v]);
end;
end;
until first > last;
end;
procedure Enlarge;
{Ni rng b ghp bi ng m bt u t start, kt thc finish}
var
v, next: Integer;
begin
repeat
v := T[finish];
next := match[v];
match[v] := finish;
match[finish] := v;
finish := next;
until finish = 0;
end;
procedure Solve;
{Thut ton Edmonds}
var
u: Integer;
begin
for u := 1 to n do
if match[u] = 0 then
begin
start := u;
{Vi mi nh cha ghp start}
FindAugmentingPath; {Tm ng m bt u t start}
if finish <> 0 then Enlarge; {Nu thy th ni rng b ghp theo ng m ny}
end;
end;
procedure Result;
{In b ghp tm c}
var
u, count: Integer;
begin
count := 0;
for u := 1 to n do
if match[u] > u then {Va trnh s trng lp (u, v) v (v, u), va loi nhng nh khng ghp c
(match=0)}
begin
Inc(count);
WriteLn(u, ' ', match[u]);
end;
WriteLn('Number of matched edges: ', count);
end;
begin
Assign(Input, 'GMATCH.INP'); Reset(Input);
Assign(Output, 'GMATCH.OUT'); Rewrite(Output);
Enter;
Init;
Solve;
Result;
Close(Input);
Close(Output);
end.