PH NG PHÁP SINH GENERATE ..... AssignInput, 'ANALYSE.INP'; ResetInput; AssignOutput, 'ANALYSE.OUT'; RewriteOutput; Xét bàn c t ng quát kích th c nxn.
Trang 3M C L C
§0 GI I THI U 2
§1 NH C L I M T S KI N TH C I S T H P 3
I CH NH H P L P 3
II CH NH H P KHÔNG L P 3
III HOÁN V 3
IV T H P 3
§2 PH NG PHÁP SINH (GENERATE) 5
I SINH CÁC DÃY NH PHÂN DÀI N 6
II LI T KÊ CÁC T P CON K PH N T 7
III LI T KÊ CÁC HOÁN V 9
§3 THU T TOÁN QUAY LUI 12
I LI T KÊ CÁC DÃY NH PHÂN DÀI N 13
II LI T KÊ CÁC T P CON K PH N T 14
III LI T KÊ CÁC CH NH H P KHÔNG L P CH P K 15
IV BÀI TOÁN PHÂN TÍCH S 16
V BÀI TOÁN X P H U 18
§4 K THU T NHÁNH C N 22
I BÀI TOÁN T I U 22
II S BÙNG N T H P 22
III MÔ HÌNH K THU T NHÁNH C N 22
IV BÀI TOÁN NG I DU L CH 23
V DÃY ABC 25
Trang 4có g i là bài toán li t kê t h p.
gi i bài toán li t kê, c n ph i xác đ nh đ c m t thu t toán đ có th theo đó l n l t xây d ng
đ c t t c các c u hình đang quan tâm Có nhi u ph ng pháp li t kê, nh ng chúng c n ph i đáp
ng đ c hai yêu c u d i đây:
• Không đ c l p l i m t c u hình
• Không đ c b sót m t c u hình
Có th nói r ng, ph ng pháp li t kê là ph ng k cu i cùng đ gi i đ c m t s bài toán t h p
hi n nay Khó kh n chính c a ph ng pháp này chính là s bùng n t h p xây d ng 1 t c uhình (con s này không ph i là l n đ i v i các bài toán t h p - Ví d li t kê các cách x p n≥13
ng i quanh m t bàn tròn) và gi thi t r ng m i thao tác xây d ng m t kho ng 1 giây, ta ph i m tquãng 31 n m m i gi i xong Tuy nhiên cùng v i s phát tri n c a máy tính đi n t , b ng ph ngpháp li t kê, nhi u bài toán t h p đã tìm th y l i gi i Qua đó, ta c ng nên bi t r ng ch nên dùng
ph ng pháp li t kê khi không còn m t ph ng pháp nào khác tìm ra l i gi i Chính nh ng n
l c gi i quy t các bài toán th c t không dùng ph ng pháp li t kê đã thúc đ y s phát tri n c anhi u ngành toán h c
Cu i cùng, nh ng tên g i sau đây, tuy v ngh a không ph i đ ng nh t, nh ng trong m t s tr ng
h p ng i ta có th dùng l n ngh a c a nhau đ c ó là:
• Ph ng pháp li t kê
• Ph ng pháp vét c n trên t p ph ng án
• Ph ng pháp duy t toàn b
Trang 5A =
II CH NH H P KHÔNG L P
Khi f là đ n ánh có ngh a là v i ∀i, j ∈ X ta có f(i) = f(j) ⇔ i = j Nói m t cách d hi u, khi dãy giá
tr f(1), f(2), , f(k) g m các ph n t thu c S khác nhau đôi m t thì f đ c g i là m t ch nh h p
không l p ch p k c a S Ví d m t ch nh h p không l p (C, A, E):
!n)1kn) (
2n)(
1n(n
Akn
−
=+
Khi k = n M t ch nh h p không l p ch p n c a S đ c g i là m t hoán v các ph n t c a S.
Ví d : m t hoán v : (A, D, C, E, B, F) c a S = {A, B, C, D, E, F}
ý r ng khi k = n thì s ph n t c a t p X = {1, 2, , n} đúng b ng s ph n t c a S Do tính ch tđôi m t khác nhau nên dãy f(1), f(2), , f(n) s li t kê đ c h t các ph n t trong S Nh v y f làtoàn ánh M t khác do gi thi t f là ch nh h p không l p nên f là đ n ánh Ta có t ng ng 1-1 gi acác ph n t c a X và S, do đó f là song ánh V y nên ta có th đ nh ngh a m t hoán v c a S là m tsong ánh gi a {1, 2, , n} và S
S hoán v c a t p g m n ph n t = s ch nh h p không l p ch p n:
!n
Pn =
IV T H P
M t t p con g m k ph n t c a S đ c g i là m t t h p ch p k c a S.
Trang 6L y m t t p con k ph n t c a S, xét t t c k! hoán v c a t p con này D th y r ng các hoán v đó
là các ch nh h p không l p ch p k c a S Ví d l y t p {A, B, C} là t p con c a t p S trong ví dtrên thì: (A, B, C), (C, A, B), (B, C, A), là các ch nh h p không l p ch p 3 c a S i u đó t c làkhi li t kê t t c các ch nh h p không l p ch p k thì m i t h p ch p k s đ c tính k! l n V y:
S t h p ch p k c a t p g m n ph n t :
)!
kn(k
!n
!k
AC
k n k n
n 1
n 0
Trang 7Th t đó g i là th t t đi n trên các dãy đ dài n.
Khi đ dài hai dãy a và b không b ng nhau, ng i ta c ng xác đ nh đ c th t t đi n B ng cáchthêm vào cu i dãy a ho c dãy b nh ng ph n t đ c bi t g i là ph n t ∅ đ đ dài c a a và b b ng
Trang 8nhau, và coi nh ng ph n t ∅ này nh h n t t c các ph n t khác, ta l i đ a v xác đ nh th t t
đi n c a hai dãy cùng đ dài Ví d :
• (1, 2, 3, 4) < (5, 6)
• (a, b, c) < (a, b, c, d)
• 'calculator' < 'computer'
I SINH CÁC DÃY NH PHÂN Đ DÀI N
M t dãy nh phân đ dài n là m t dãy x = x1x2 xn trong đó xi ∈ {0, 1} (∀i : 1 ≤ i ≤ n)
D th y: m t dãy nh phân x đ dài n là bi u di n nh phân c a m t giá tr nguyên p(x) nào đó n mtrong đo n [0, 2n
- 1] S các dãy nh phân đ dài n = s các s nguyên ∈ [0, 2n
Nh v y dãy đ u tiên s là 00 0 và dãy cu i cùng s là 11 1 Nh n xét r ng n u dãy x = (x1, x2, ,
xn) là dãy đang có và không ph i dãy cu i cùng thì dãy k ti p s nh n đ c b ng cách c ng thêm 1( theo c s 2 có nh ) vào dãy hi n t i
D li u vào (Input): nh p t file v n b n BSTR.INP ch a s nguyên d ng n ≤ 30
K t qu ra(Output): ghi ra file v n b n BSTR.OUT các dãy nh phân đ dài n
BSTR.INP BSTR.OUT
001 010 011 100 101 110 111
PROG02_1.PAS * Thu t toán sinh li t kê các dãy nh phân đ dài n
program Binary_Strings;
const
max = 30;
Trang 9x: array[1 max] of Integer;
n, i: Integer;
begin
{ nh ngh a l i thi t b nh p/xu t chu n}
Assign(Input, 'BSTR.INP'); Reset(Input);
Assign(Output, 'BSTR.OUT'); Rewrite(Output);
ReadLn(n);
FillChar(x, SizeOf(x), 0); {C u hình ban đ u x 1 = x 2 = = x n := 0}
for i := 1 to n do Write(x[i]); {In ra c u hình hi n t i}
WriteLn;
i := n; {x i là ph n t cu i dãy, lùi d n i cho t i khi g p s 0 ho c khi i = 0 thì d ng}
while (i > 0) and (x[i] = 1) do Dec(i);
II LI T KÊ CÁC T P CON K PH N T
Ta s l p ch ng trình li t kê các t p con k ph n t c a t p {1, 2, , n} theo th t t đi n
Còn t t nhiên, gi i h n d i c a x i (giá tr nh nh t x i có th nh n) là x i-1 + 1.
Nh v y n u ta đang có m t dãy x đ i di n cho m t t p con, n u x là c u hình k t thúc có ngh a là
t t c các ph n t trong x đ u đã đ t t i gi i h n trên thì quá trình sinh k t thúc, n u không thì ta
ph i sinh ra m t dãy x m i t ng d n tho mãn v a đ l n h n dãy c theo ngh a không có m t t p
con k ph n t nào chen gi a chúng khi s p th t t đi n
Ví d : n = 9, k = 6 C u hình đang có x = {1, 2, 6, 7, 8, 9} Các ph n t x 3 đ n x 6 đã đ t t i gi i
h n trên nên đ sinh c u hình m i ta không th sinh b ng cách t ng m t ph n t trong s các x 6 , x 5 ,
x 4 , x 3 lên đ c, ta ph i t ng x 2 = 2 lên thành x 2 = 3 c c u hình m i là x = {1, 3, 6, 7, 8, 9} C u hình này đã tho mãn l n h n c u hình tr c nh ng ch a tho mãn tính ch t v a đ l n mu n v y
Trang 10• Tìm t cu i dãy lên đ u cho t i khi g p m t ph n t xi ch a đ t gi i h n trên n - k + i.
{ nh ngh a l i thi t b nh p/xu t chu n}
Assign(Input, 'SUBSET.INP'); Reset(Input);
Assign(Output, 'SUBSET.OUT'); Rewrite(Output);
i := k; {x i là ph n t cu i dãy, lùi d n i cho t i khi g p m t x i ch a đ t gi i h n trên n - k + i}
while (i > 0) and (x[i] = n - k + i) do Dec(i);
Trang 11III LI T KÊ CÁC HOÁN V
Ta s l p ch ng trình li t kê các hoán v c a {1, 2, , n} theo th t t đi n
Nh v y hoán v đ u tiên s là (1, 2, , n) Hoán v cu i cùng là (n, n-1, , 1)
Hoán v s sinh ra ph i l n h n hoán v hi n t i, h n th n a ph i là hoán v v a đ l n h n hoán v
hi n t i theo ngh a không th có m t hoán v nào khác chen gi a chúng khi s p th t
Gi s hoán v hi n t i là x = (3, 2, 6, 5, 4, 1), xét 4 ph n t cu i cùng, ta th y chúng đ c x p gi m
d n, đi u đó có ngh a là cho dù ta có hoán v 4 ph n t này th nào, ta c ng đ c m t hoán v bé
h n hoán v hi n t i! Nh v y ta ph i xét đ n x2 = 2, thay nó b ng m t giá tr khác Ta s thay b nggiá tr nào?, không th là 1 b i n u v y s đ c hoán v nh h n, không th là 3 vì đã có x1 = 3 r i(ph n t sau không đ c ch n vào nh ng giá tr mà ph n t tr c đã ch n) Còn l i các giá tr 4, 5,
6 Vì c n m t hoán v v a đ l n h n hi n t i nên ta ch n x2 = 4 Còn các giá tr (x3, x4, x5, x6) s
l y trong t p {2, 6, 5, 1} C ng vì tính v a đ l n nên ta s tìm bi u di n nh nh t c a 4 s này gáncho x3, x4, x5, x6 t c là (1, 2, 5, 6) V y hoán v m i s là (3, 4, 1, 2, 5, 6)
(3, 2, 6, 5, 4, 1) → (3, 4, 1, 2, 5, 6).
Ta có nh n xét gì qua ví d này: o n cu i c a hoán v đ c x p gi m d n, s x5 = 4 là s nh nh ttrong đo n cu i gi m d n tho mãn đi u ki n l n h n x2 = 2 N u đ i ch x5 cho x2 thì ta s đ c x2
= 4 và đo n cu i v n đ c s p x p gi m d n Khi đó mu n bi u di n nh nh t cho các giá tr
trong đo n cu i thì ta ch c n đ o ng c đo n cu i
Trong tr ng h p hoán v hi n t i là (2, 1, 3, 4) thì hoán v k ti p s là (2, 1, 4, 3) Ta c ng có thcoi hoán v (2, 1, 3, 4) có đo n cu i gi m d n, đo n cu i này ch g m 1 ph n t (4)
V y k thu t sinh hoán v k ti p t hoán v hi n t i có th xây d ng nh sau:
• Xác đ nh đo n cu i gi m d n dài nh t, tìm ch s i c a ph n t x i đ ng li n tr c đo n cu i đó.
i u này đ ng ngh a v i vi c tìm t v trí sát cu i dãy lên đ u, g p ch s i đ u tiên th a mãn x i
< x i+1 N u toàn dãy đã là gi m d n, thì đó là c u hình cu i.
i := n - 1;
while (i > 0) and (x i > x i+1 ) do i := i - 1;
• Trong đo n cu i gi m d n, tìm ph n t x k nh nh t tho mãn đi u ki n x k > x i Do đo n cu i
gi m d n, đi u này th c hi n b ng cách tìm t cu i dãy lên đ u g p ch s k đ u tiên tho mãn
x k > x i (có th dùng tìm ki m nh phân).
k := n;
while x k < x i do k := k - 1;
• i ch x k và x i , l t ng c th t đo n cu i gi m d n (t x i+1 đ n x k ) tr thành t ng d n.
Input: file v n b n PERMUTE.INP ch a s nguyên d ng n ≤ 12
Output: file v n b n PERMUTE.OUT các hoán v c a dãy (1, 2, , n)
Trang 12PROG02_3.PAS * Thu t toán sinh li t kê hoán v program Permute;
Assign(Input, 'PERMUTE.INP'); Reset(Input);
Assign(Output, 'PERMUTE.OUT'); Rewrite(Output);
1 Các ch ng trình trên x lý không t t trong tr ng h p t m th ng, đó là tr ng h p n = 0 đ i
v i ch ng trình li t kê dãy nh phân c ng nh trong ch ng trình li t kê hoán v , tr ng h p k = 0
đ i v i ch ng trình li t kê t h p, hãy kh c ph c đi u đó
2 Li t kê các dãy nh phân đ dài n có th coi là li t kê các ch nh h p l p ch p n c a t p 2 ph n t{0, 1} Hãy l p ch ng trình:
Nh p vào hai s n và k, li t kê các ch nh h p l p ch p k c a {0, 1, , n -1}
Trang 13c a t p {1, 2, , n} Ch có đi u khi in t p con, ta không in giá tr s {1, 3, 5} mà thay vào đó s in
ra {Tên[1], Tên [3], Tên[5]} T c là in ra nh c a các giá tr tìm đ c qua ánh x
5 Li t kê t t c các t p con c a t p {1, 2, , n} Có th dùng ph ng pháp li t kê t p con nh trên
ho c dùng ph ng pháp li t kê t t c các dãy nh phân M i s 1 trong dãy nh phân t ng ng v i
m t ph n t đ c ch n trong t p Ví d v i t p {1, 2, 3, 4} thì dãy nh phân 1010 s t ng ng v i
t p con {1, 3} Hãy l p ch ng trình in ra t t c các t p con c a {1, 2, , n} theo hai ph ng pháp
5 Nh p vào danh sách tên n ng i, in ra t t c các cách x p n ng i đó vào m t bàn
6 Nh p vào danh sách n ng i nam và n ng i n , in ra t t c các cách x p 2n ng i đó vào m tbàn tròn, m i ng i nam ti p đ n m t ng i n
7 Ng i ta có th dùng ph ng pháp sinh đ li t kê các ch nh h p không l p ch p k Tuy nhiên có
m t cách là li t kê t t c các t p con k ph n t c a t p h p, sau đó in ra đ k! hoán v c a nó Hãy
vi t ch ng trình li t kê các ch nh h p không l p ch p k c a {1, 2, , n}
8 Li t kê t t c các hoán v ch cái trong t MISSISSIPPI theo th t t đi n
9 Li t kê t t c các cách phân tích s nguyên d ng n thành t ng các s nguyên d ng, hai cáchphân tích là hoán v c a nhau ch tính là m t cách
Cu i cùng, ta có nh n xét, m i ph ng pháp li t kê đ u có u, nh c đi m riêng và ph ng phápsinh c ng không n m ngoài nh n xét đó Ph ng pháp sinh không th sinh ra đ c c u hình th
p n u nh ch a có c u hình th p - 1, ch ng t r ng ph ng pháp sinh t ra u đi m trong tr ng
h p li t kê toàn b m t s l ng nh c u hình trong m t b d li u l n thì l i có nh c đi m và
ít tính ph d ng trong nh ng thu t toán duy t h n ch H n th n a, không ph i c u hình ban đ ulúc nào c ng d tìm đ c, không ph i k thu t sinh c u hình k ti p cho m i bài toán đ u đ n gi n
nh trên (Sinh các ch nh h p không l p ch p k theo th t t đi n ch ng h n) Ta sang m t chuyên
m c sau nói đ n m t ph ng pháp li t kê có tính ph d ng cao h n, đ gi i các bài toán li t kê
ph c t p h n đó là: Thu t toán quay lui (Back tracking)
Trang 14§3 THU T TOÁN QUAY LUI
Thu t toán quay lui dùng đ gi i bài toán li t kê các c u hình M i c u hình đ c xây d ng
Mô hình c a thu t toán quay lui có th mô t nh sau:
{Th t c này th cho x i nh n l n l t các giá tr mà nó có th nh n}
procedure Try(i: Integer);
<Ghi nh n vi c cho x i nh n giá tr V (N u c n)>;
Try(i + 1); {G i đ quy đ ch n ti p x i+1 }
―― <N u c n, b ghi nh n vi c th x i := V, đ th giá tr khác>;
end;
end;
end;
Thu t toán quay lui s b t đ u b ng l i g i Try(1)
Ta có th trình bày quá trình tìm ki m l i gi i c a thu t toán quay lui b ng cây sau:
Try(2)
Try(2) Try(1)
Hình 1: Cây tìm ki m quay lui
Trang 15I LI T KÊ CÁC DÃY NH PHÂN Đ DÀI N
Input/Output v i khuôn d ng nh trong PROG2_1.PAS
Bi u di n dãy nh phân đ dài N d i d ng (x1, x2, , xn) Ta s li t kê các dãy này b ng cách thdùng các giá tr {0, 1} gán cho xi V i m i giá tr th gán cho xi l i th các giá tr có th gán cho
xi+1.Ch ng trình li t kê b ng thu t toán quay lui có th vi t:
PROG03_1.PAS * Thu t toán quay lui li t kê các dãy nh phân đ dài n
Assign(Input, 'BSTR.INP'); Reset(Input);
Assign(Output, 'BSTR.OUT'); Rewrite(Output);
Trang 16II LI T KÊ CÁC T P CON K PH N T
Input/Output có khuôn d ng nh trong PROG02_2.PAS
li t kê các t p con k ph n t c a t p S = {1, 2, , n} ta có th đ a v li t kê các c u hình (x1, x2, , xk) đây các xi ∈ S và x1 < x2 < < xk Ta có nh n xét:
PROG03_2.PAS * Thu t toán quay lui li t kê các t p con k ph n t
Assign(Input, 'SUBSET.INP'); Reset(Input);
Assign(Output, 'SUBSET.OUT'); Rewrite(Output);
Trang 17N u đ ý ch ng trình trên và ch ng trình li t kê dãy nh phân đ dài n, ta th y v c b n chúng
ch khác nhau th t c Try(i) - ch n th các giá tr cho x i , ch ng trình li t kê dãy nh phân ta
th ch n các giá tr 0 ho c 1 còn ch ng trình li t kê các t p con k ph n t ta th ch n x i là m t trong các giá tr nguyên t x i-1 + 1 đ n n - k + i Qua đó ta có th th y tính ph d ng c a thu t toán quay lui: mô hình cài đ t có th thích h p cho nhi u bài toán, khác v i ph ng pháp sinh tu n t ,
v i m i bài toán l i ph i có m t thu t toán sinh k ti p riêng làm cho vi c cài đ t m i bài m t khác, bên c nh đó, không ph i thu t toán sinh k ti p nào c ng d cài đ t.
III LI T KÊ CÁC CH NH H P KHÔNG L P CH P K
li t kê các ch nh h p không l p ch p k c a t p S = {1, 2, , n} ta có th đ a v li t kê các c uhình (x1, x2, , xk) đây các xi ∈ S và khác nhau đôi m t
Nh v y th t c Try(i) - xét t t c các kh n ng ch n xi - s th h t các giá tr t 1 đ n n, mà các giá
tr này ch a b các ph n t đ ng tr c ch n Mu n xem các giá tr nào ch a đ c ch n ta s d ng
Trang 18Assign(Input, 'ARRANGES.INP'); Reset(Input);
Assign(Output, 'ARRANGES.OUT'); Rewrite(Output);
Nh n xét: khi k = n thì đây là ch ng trình li t kê hoán v
IV BÀI TOÁN PHÂN TÍCH S
4 Th t c đ quy Try(i) s th các giá tr có th nh n c a xi (xi ≥ xi - 1)
5 Khi nào thì in k t qu và khi nào thì g i đ quy tìm ti p ?
L u ý r ng ti - 1 là t ng c a t t c các ph n t t x1đ n xi-1 do đó
• Khi ti = n t c là (xi = n - ti - 1) thì in k t qu
• Khi tìm ti p, xi+1 s ph i l n h n ho c b ng xi M t khác ti+1 là t ng c a các s t x1 t i xi+1không đ c v t quá n V y ta có ti+1 ≤ n ⇔ ti-1 + xi + xi+1 ≤ n ⇔ xi + xi + 1 ≤ n - ti - 1 t c là xi
Trang 19≤ (n - ti - 1)/2 Ví d đ n gi n khi n = 10 thì ch n x1 = 6, 7, 8, 9 là vi c làm vô ngh a vì nh
v y c ng không ra nghi m mà c ng không ch n ti p x2đ c n a
M t cách d hi u ta g i đ quy tìm ti p khi giá tr x i đ c ch n còn cho phép ch n thêm m t
ph n t khác l n h n ho c b ng nó mà không làm t ng v t quá n Còn ta in k t qu ch khi
x i mang giá tr đúng b ng s thi u h t c a t ng i-1 ph n t đ u so v i n.
6 V y th t c Try(i) th các giá tr cho xi có th mô t nh sau: (đ t ng quát cho i = 1, ta đ t x0 =
1 và t0 = 0)
• Xét các giá tr c a xi t xi - 1đ n (n - ti-1) div 2, c p nh t ti := ti - 1 + xi và g i đ quy tìm ti p
• Cu i cùng xét giá tr xi = n - ti-1 và in k t qu t x1đ n xi
Input: file v n b n ANALYSE.INP ch a s nguyên d ng n ≤ 30
Output: file v n b n ANALYSE.OUT ghi các cách phân tích s n.
Trang 20Assign(Input, 'ANALYSE.INP'); Reset(Input);
Assign(Output, 'ANALYSE.OUT'); Rewrite(Output);
Xét bàn c t ng quát kích th c nxn M t quân h u trên bàn c có th n đ c các quân khác n m
t i các ô cùng hàng, cùng c t ho c cùng đ ng chéo Hãy tìm các x p n quân h u trên bàn c saocho không quân nào n quân nào
V y m t nghi m c a bài toán s đ c bi t khi ta tìm ra đ c v trí c t c a nh ng quân h u.
• N u ta đ nh h ng ông (Ph i), Tây (Trái), Nam (D i), B c (Trên) thì ta nh n th y r ng:
♦ M t đ ng chéo theo h ng ông B c - Tây Nam ( B-TN) b t k s đi qua m t s ô, các ô
Trang 21• Ban đ u c 3 m ng đánh d u đ u mang giá tr TRUE (Các c t và đ ng chéo đ u t do)
2 Thu t toán quay lui: Xét t t c các c t, th đ t quân h u 1 vào m t c t, v i m i cách đ t nh v y,xét t t c các cách đ t quân h u 2 không b quân h u 1 n, l i th 1 cách đ t và xét ti p các cách đ tquân h u 3 M i cách đ t đ c đ n quân h u n cho ta 1 nghi m
3 Khi ch n v trí c t j cho quân h u th i, thì ta ph i ch n ô(i, j) không b các quân h u đ t tr c đó
n, t c là ph i ch n c t j còn t do, đ ng chéo B-TN (i+j) còn t do, đ ng chéo N-TB(i-j)còn t do i u này có th ki m tra (aj = bi+j = ci-j = TRUE)
4 Khi th đ t đ c quân h u th i vào c t j, n u đó là quân h u cu i cùng (i = n) thì ta có m tnghi m N u không:
• Tr c khi g i đ quy tìm cách đ t quân h u th i + 1, ta đánh d u c t và 2 đ ng chéo b quân
h u v a đ t kh ng ch (aj = bi+j = ci-j := FALSE) đ các l n g i đ quy ti p sau ch n cách đ tcác quân h u k ti p s không ch n vào nh ng ô n m trên c t j và nh ng đ ng chéo này n a
• Sau khi g i đ quy tìm cách đ t quân h u th i + 1, có ngh a là s p t i ta l i th m t cách đ tkhác cho quân h u th i, ta b đánh d u c t và 2 đ ng chéo b quân h u v a th đ t kh ng ch(aj = bi+j = ci-j := TRUE) t c là c t và 2 đ ng chéo đó l i thành t do, b i khi đã đ t quân h u isang v trí khác r i thì c t và 2 đ ng chéo đó hoàn toàn có th gán cho m t quân h u khác
Hãy xem l i trong các ch ng trình li t kê ch nh h p không l p và hoán v v k thu t đánh d u đây ch khác v i li t kê hoán v là: li t kê hoán v ch c n m t m ng đánh d u xem giá tr có t do không, còn bài toán x p h u thì c n ph i đánh d u c 3 thành ph n: C t, đ ng chéo B-TN,
đ ng chéo N- TB Tr ng h p đ n gi n h n: Yêu c u li t kê các cách đ t n quân xe lên bàn c nxn sao cho không quân nào n quân nào chính là bài toán li t kê hoán v
Input: file v n b n QUEENS.INP ch a s nguyên d ng n ≤ 12
Output: file v n b n QUEENS.OUT, m i dòng ghi m t cách đ t n quân h u
Trang 22b: array[2 2 * max] of Boolean;
c: array[1 - max max - 1] of Boolean;
procedure Init;
begin
ReadLn(n);
FillChar(a, SizeOf(a), True); {M i c t đ u t do}
FillChar(b, SizeOf(b), True); {M i đ ng chéo ông B c - Tây Nam đ u t do}
――FillChar(c, SizeOf(c), True); {M i đ ng chéo ông Nam - Tây B c đ u t do}
x[i] := j; {Th đ t quân h u i vào c t j}
――――――――if i = n then PrintResult
Assign(Input, 'QUEENS.INP'); Reset(Input);
Assign(Output, 'QUEENS.OUT'); Rewrite(Output);
Init;
Trang 23th ch n xi nó s g i đ quy đ tìm ti p xi+1 có ngh a là quá trình s duy t ti n sâu xu ng phía d i
đ n t n nút lá, sau khi đã duy t h t các nhánh, ti n trình lùi l i th áp đ t m t giá tr khác cho xi, đóchính là ngu n g c c a tên g i "thu t toán quay lui"
5 Li t kê t t c các t p con c a t p S g m n s nguyên {S1, S2, , Sn} nh p vào t bàn phím
6 T ng t nh bài 5 nh ng ch li t kê các t p con có max - min ≤ T (T cho tr c)
7 M t dãy (x1, x2, , xn) g i là m t hoán v hoàn toàn c a t p {1, 2, , n} n u nó là m t hoán v vàtho mãn xi ≠ i v i ∀i: 1 ≤ i ≤ n Hãy vi t ch ng trình li t kê t t c các hoán v hoàn toàn c a t ptrên (n vào t bàn phím)
8 S a l i th t c in k t qu (PrintResult) trong bài x p h u đ có th v hình bàn c và các cách đ t
h u ra màn hình
9 Bài toán mã đi tu n: Cho bàn c t ng quát kích th c nxn và m t quân Mã, hãy ch ra m t hànhtrình c a quân Mã xu t phát t ô đang đ ng đi qua t t c các ô còn l i c a bàn c , m i ô đúng 1 l n
10 Chuy n t t c các bài t p trong bài tr c đang vi t b ng sinh tu n t sang quay lui
11 Xét s đ giao thông g m n nút giao thông đánh s t 1 t i n và m đo n đ ng n i chúng, m i
đo n đ ng n i 2 nút giao thông Hãy nh p d li u v m ng l i giao thông đó, nh p s hi u hainút giao thông s và d Hãy in ra t t c các cách đi t s t i d mà m i cách đi không đ c qua nút giaothông nào quá m t l n
Trang 24§4 K THU T NHÁNH C N
I BÀI TOÁN T I U
M t trong nh ng bài toán đ t ra trong th c t là vi c tìm ra m t nghi m tho mãn m t s đi u ki n
nào đó, và nghi m đó là t t nh t theo m t ch tiêu c th , nghiên c u l i gi i các l p bài toán t i u
thu c v l nh v c quy ho ch toán h c Tuy nhiên c ng c n ph i nói r ng trong nhi u tr ng h pchúng ta ch a th xây d ng m t thu t toán nào th c s h u hi u đ gi i bài toán, mà cho t i nay
vi c tìm nghi m c a chúng v n ph i d a trên mô hình li t kê toàn b các c u hình có th và đánhgiá, tìm ra c u hình t t nh t Vi c li t kê c u hình có th cài đ t b ng các ph ng pháp li t kê: Sinh
tu n t và tìm ki m quay lui D i đây ta s tìm hi u ph ng pháp li t kê b ng thu t toán quay lui
đ tìm nghi m c a bài toán t i u
II S BÙNG N T H P
Mô hình thu t toán quay lui là tìm ki m trên 1 cây phân c p N u gi thi t r ng ng v i m i nút
t ng ng v i m t giá tr đ c ch n cho xi s ng v i ch 2 nút t ng ng v i 2 giá tr mà xi+1 có
th nh n thì cây n c p s có t i 2n nút lá, con s này l n h n r t nhi u l n so v i d li u đ u vào n.Chính vì v y mà n u nh ta có thao tác th a trong vi c ch n xi thì s ph i tr giá r t l n v chi phí
th c thi thu t toán b i quá trình tìm ki m lòng vòng vô ngh a trong các b c ch n k ti p xi+1, xi+2, Khi đó, m t v n đ đ t ra là trong quá trình li t kê l i gi i ta c n t n d ng nh ng thông tin đã tìm
đ c đ lo i b s m nh ng ph ng án ch c ch n không ph i t i u K thu t đó g i là k thu tđánh giá nhánh c n trong ti n trình quay lui
III MÔ HÌNH K THU T NHÁNH C N
D a trên mô hình thu t toán quay lui, ta xây d ng mô hình sau:
procedure Init;
begin
<Kh i t o m t c u hình b t k BESTCONFIG>;
end;
{Th t c này th ch n cho x i t t c các giá tr nó có th nh n}
procedure Try(i: Integer);
Trang 25K thu t nhánh c n thêm vào cho thu t toán quay lui kh n ng đánh giá theo t ng b c, n u t i
b c th i, giá tr th gán cho xi không có hi v ng tìm th y c u hình t t h n c u hìnhBESTCONFIG thì th giá tr khác ngay mà không c n ph i g i đ quy tìm ti p hay ghi nh n k t
qu làm gì Nghi m c a bài toán s đ c làm t t d n, b i khi tìm ra m t c u hình m i (t t h nBESTCONFIG - t t nhiên), ta không in k t qu ngay mà s c p nh t BESTCONFIG b ng c u hình
M t ng i du l ch xu t phát t thành ph 1, mu n đi th m t t c các thành ph còn l i m i thành
ph đúng 1 l n và cu i cùng quay l i thành ph 1 Hãy ch ra cho ng i đó hành trình v i chi phí ít
nh t Bài toán đó g i là bài toán ng i du l ch hay bài toán hành trình c a m t th ng gia(Traveling Salesman)
Cách gi i
1) Hành trình c n tìm có d ng (x1 = 1, x2, , xn, xn+1 = 1) đây gi a xi và xi+1: hai thành ph liên
ti p trong hành trình ph i có đ ng đi tr c ti p (Cij ≠ +∞) và ngo i tr thành ph 1, không thành
ph nào đ c l p l i hai l n Có ngh a là dãy (x1, x2, , xn) l p thành 1 hoán v c a (1, 2, , n).2) Duy t quay lui: x2 có th ch n m t trong các thành ph mà x1 có đ ng đi t i (tr c ti p), v i
m i cách th ch n x2 nh v y thì x3 có th ch n m t trong các thành ph mà x2 có đ ng đi t i(ngoài x1) T ng quát: xi có th ch n 1 trong các thành ph ch a đi qua mà t x i-1 có đ ng đi
tr c ti p t i.(1 ≤ i ≤ n)
3) Nhánh c n: Kh i t o c u hình BestConfig có chi phí = +∞ V i m i b c th ch n xi xem chiphí đ ng đi cho t i lúc đó có < Chi phí c a c u hình BestConfig?, n u không nh h n thì thgiá tr khác ngay b i có đi ti p c ng ch t n thêm Khi th đ c m t giá tr xn ta ki m tra xem xn
có đ ng đi tr c ti p v 1 không ? N u có đánh giá chi phí đi t thành ph 1 đ n thành ph xn
c ng v i chi phí t xn đi tr c ti p v 1, n u nh h n chi phí c a đ ng đi BestConfig thì c p
Input: file v n b n TOURISM.INP
• Dòng 1: Ch a s thành ph n (1 ≤ n ≤ 20) và s tuy n đ ng m trong m ng l i giao thông
• m dòng ti p theo, m i dòng ghi s hi u hai thành ph có đ ng đi tr c ti p và chi phí đi trênquãng đ ng đó (chi phí này là s nguyên d ng ≤ 100)
Output: file v n b n TOURISM.OUT
Ghi hành trình tìm đ c
Trang 26PROG04_1.PAS * K thu t nhánh c n dùng cho bài toán ng i du l ch
C: array[1 max, 1 max] of Integer; {Ma tr n chi phí}
X, BestWay: array[1 max + 1] of Integer; {X đ th các kh n ng, BestWay đ ghi nh n nghi m}
T: array[1 max + 1] of Integer; {T i đ l u chi phí đi t X 1 đ n X i }
Free: array[1 max] of Boolean; {Free đ đánh d u, Free i = True n u ch a đi qua tp i}
T[i] := T[i - 1] + C[x[i - 1], j]; {Chi phí := Chi phí b c tr c + chi phí đ ng đi tr c ti p}
if T[i] < MinSpending then {Hi n nhiên n u có đi u này thì C[x[i - 1], j] < +∞ r i}
―――――― if i < n then― {N u ch a đ n đ c x n }
―― begin
Trang 27Assign(Input, 'TOURISM.INP'); Reset(Input);
Assign(Output, 'TOURISM.OUT'); Rewrite(Output);
Không trình bày, đ ngh t xem ch ng trình đ hi u, ch chú thích k thu t nhánh c n nh sau:
N u dãy X1X2 Xn tho mãn 2 đo n con b t k li n nhau đ u khác nhau, thì trong 4 ký t liên ti p
b t k bao gi c ng ph i có 1 ký t "C" Nh v y v i m t dãy con g m k ký t liên ti p c a dãy Xthì s ký t C trong dãy con đó b t bu c ph i ≥ k div 4
T i b c th ch n Xi, n u ta đã có Ti ký t "C" trong đo n đã ch n t X1 đ n Xi, thì cho dù các
b c đ quy ti p sau làm t t nh th nào ch ng n a, s ký t "C" s ph i ch n thêm bao gi c ng ≥(n - i) div 4 T c là n u theo ph ng án ch n Xi nh th này thì s ký t "C" trong dãy k t qu (khi
ch n đ n Xn) cho dù có làm t t đ n đâu c ng ≥ T i + (n - i) div 4 Ta dùng con s này đ đánh giánhánh c n, n u nó nhi u h n s ký t "C" trong BestConfig thì ch c ch n có làm ti p c ng ch đ c
m t c u hình t i t h n, ta b qua ngay cách ch n này và th ph ng án khác
Trang 28Input: file v n b n ABC.INP ch a s nguyên d ng n ≤ 100
Output: file v n b n ABC.OUT ghi xâu tìm đ c
X, Best: array[1 max] of 'A' 'C';
T: array[0 max] of Integer; {T i cho bi t s ký t "C" trong đo n t X 1 đ n X i }
{Hàm Same(i, l) cho bi t xâu g m l ký t k t thúc t i X i có trùng v i xâu l ký t li n tr c nó không ?}
function Same(i, l: Integer): Boolean;
{Hàm Check(i) cho bi t X i có làm h ng tính không l p c a dãy X 1 X 2 X i hay không}
function Check(i: Integer): Boolean;
var
l: Integer;
begin
for l := 1 to i div 2 do― {Th các đ dài l}
if Same(i, l) then― {N u có xâu đ dài l k t thúc b i X i b trùng v i xâu li n tr c}
{Thu t toán quay lui có nhánh c n}
procedure Try(i: Integer); {Th các giá tr có th c a X i }
if j = 'C' then T[i] := T[i - 1] + 1 {Tính T i qua T i - 1 }
―――――――― else T[i] := T[i - 1];
Trang 29if T[i] + (N - i) div 4 < MinC then { ánh giá nhánh c n}
Assign(Input, 'ABC.INP'); Reset(Input);
Assign(Output, 'ABC.OUT'); Rewrite(Output);
N u ta thay bài toán là tìm xâu ít ký t 'B' nh t mà v n vi t ch ng trình t ng t nh trên thì
ch ng trình s ch y ch m h n chút ít Lý do: th t c Try trên s th l n l t các giá tr 'A', 'B',
r i m i đ n 'C' Có ngh a ngay trong cách tìm, nó đã ti t ki m s d ng ký t 'C' nh t nên trong ph n
l n các b d li u nó nhanh chóng tìm ra l i gi i h n so v i bài toán t ng ng tìm xâu ít ký t 'B'
nh t Chính vì v y mà n u nh đ bài yêu c u ít ký t 'B' nh t ta c l p ch ng trình làm yêu c u ít
ký t 'C' nh t, ch có đi u khi in k t qu , ta đ i vai trò 'B', 'C' cho nhau ây là m t ví d cho th y
s c m nh c a thu t toán quay lui khi k t h p v i k thu t nhánh c n, n u vi t quay lui thu n tuý
ho c đánh giá nhánh c n không t t thì v i N = 100, tôi c ng không đ kiên nh n đ đ i ch ngtrình cho k t qu (ch bi t r ng > 3 gi ) Trong khi đó khi N = 100, v i ch ng trình trên ch ch y
h t h n 3 giây cho k t qu là xâu 27 ký t 'C'
Nói chung, ít khi ta g p bài toán mà ch c n s d ng m t thu t toán, m t mô hình k thu t cài đ t là
có th gi i đ c Thông th ng các bài toán th c t đòi h i ph i có s t ng h p, pha tr n nhi uthu t toán, nhi u k thu t m i có đ c m t l i gi i t t Không đ c l m d ng m t k thu t nào và
c ng không xem th ng m t ph ng pháp nào khi b t tay vào gi i m t bài toán tin h c Thu t toánquay lui c ng không ph i là ngo i l , ta ph i bi t ph i h p m t cách uy n chuy n v i các thu t toánkhác thì khi đó nó m i th c s là m t công c m nh
Bài t p:
1 M t dãy d u ngo c h p l là m t dãy các ký t "(" và ")" đ c đ nh ngh a nh sau:
i Dãy r ng là m t dãy d u ngo c h p l đ sâu 0
ii N u A là dãy d u ngo c h p l đ sâu k thì (A) là dãy d u ngo c h p l đ sâu k + 1
iii N u A và B là hay dãy d u ngo c h p l v i đ sâu l n l t là p và q thì AB là dãy d u ngo c
h p l đ sâu là max(p, q)
dài c a m t dãy ngo c là t ng s ký t "(" và ")"
Ví d : Có 5 dãy d u ngo c h p l đ dài 8 và đ sâu 3:
1 ((()()))
2 ((())())
Trang 30• Cách 2: dùng b n đ m t đ : s d ng m t l i ô vuông kích th c mxn, trên đó t i ô (i, j) ghi
m t s trong kho ng t 0 đ n 8 cho bi t t ng s mìn trong các ô lân c n v i ô (i, j) (ô lân c n
v i ô (i, j) là ô có chung v i ô (i, j) ít nh t 1 đ nh)
Gi thi t r ng hai b n đ đ c ghi chính xác theo tình tr ng mìn trên hi n tr ng
K t qu : Ghi ra file v n b n MINE.OUT, các s trên 1 dòng ghi cách nhau ít nh t 1 d u cách
• Dòng 1: Ghi t ng s l ng mìn trong bãi
• m dòng ti p theo, dòng th i ghi n s trên hàng i c a b n đ đánh d u theo đúng th t t tráiqua ph i
Trang 32VI CHI PHÍ TH C HI N THU T TOÁN 11
§2 QUY VÀ GI I THU T QUY 12
IV CHUY N T D NG TRUNG T SANG D NG H U T 38
V XÂY D NG CÂY NH PHÂN BI U DI N BI U TH C 41
Trang 33VI THU T TOÁN S P X P KI U PHÂN O N (QUICK SORT) 47VII THU T TOÁN S P X P KI U VUN NG (HEAP SORT) 49VIII S P X P B NG PHÉP M PHÂN PH I (DISTRIBUTION COUNTING) 52
IX TÍNH N NH C A THU T TOÁN S P X P (STABILITY) 53
X THU T TOÁN S P X P B NG C S (RADIX SORT) 53
XI THU T TOÁN S P X P TR N (MERGE SORT) 57XII CÀI T 59XIII NH NG NH N XÉT CU I CÙNG 68
IX NH NG NH N XÉT CU I CÙNG 82
Trang 34§0 CÁC B C C B N KHI TI N HÀNH GI I CÁC BÀI TOÁN TIN H C
Xác đ nh đúng yêu c u bài toán là r t quan tr ng b i nó nh h ng t i cách th c gi i quy t và ch t
l ng c a l i gi i M t bài toán th c t th ng cho b i nh ng thông tin khá m h và hình th c, ta
ph i phát bi u l i m t cách chính xác và ch t ch đ hi u đúng bài toán
Ví d :
• Bài toán: M t d án có n ng i tham gia th o lu n, h mu n chia thành các nhóm và m i nhóm
th o lu n riêng v m t ph n c a d án Nhóm có bao nhiêu ng i thì đ c trình lên b y nhiêu ý
ki n N u l y m i nhóm m t ý ki n đem ghép l i thì đ c m t b ý ki n tri n khai d án Hãy tìm cách chia đ s b ý ki n cu i cùng thu đ c là l n nh t.
• Phát bi u l i: Cho m t s nguyên d ng n, tìm các phân tích n thành t ng các s nguyên d ng sao cho tích c a các s đó là l n nh t.
Trên th c t , ta nên xét m t vài tr ng h p c th đ thông qua đó hi u đ c bài toán rõ h n và
th y đ c các thao tác c n ph i ti n hành i v i nh ng bài toán đ n gi n, đôi khi ch c n qua ví
d là ta đã có th đ a v m t bài toán quen thu c đ gi i
II TÌM C U TRÚC D LI U BI U DI N BÀI TOÁN
Khi gi i m t bài toán, ta c n ph i đ nh ngh a t p h p d li u đ bi u di n tình tr ng c th Vi c l a
ch n này tu thu c vào v n đ c n gi i quy t và nh ng thao tác s ti n hành trên d li u vào Có
nh ng thu t toán ch thích ng v i m t cách t ch c d li u nh t đ nh, đ i v i nh ng cách t ch c
d li u khác thì s kém hi u qu ho c không th th c hi n đ c Chính vì v y nên b c xây d ng
c u trúc d li u không th tách r i b c tìm ki m thu t toán gi i quy t v n đ
Các tiêu chu n khi l a ch n c u trúc d li u
• C u trúc d li u tr c h t ph i bi u di n đ c đ y đ các thông tin nh p và xu t c a bài toán
• C u trúc d li u ph i phù h p v i các thao tác c a thu t toán mà ta l a ch n đ gi i quy t bàitoán
• C u trúc d li u ph i cài đ t đ c trên máy tính v i ngôn ng l p trình đang s d ng
i v i m t s bài toán, tr c khi t ch c d li u ta ph i vi t m t đo n ch ng trình nh đ kh o
sát xem d li u c n l u tr l n t i m c đ nào
Trang 35III TÌM THU T TOÁN
Thu t toán là m t h th ng ch t ch và rõ ràng các quy t c nh m xác đ nh m t dãy thao tác trên c utrúc d li u sao cho: V i m t b d li u vào, sau m t s h u h n b c th c hi n các thao tác đã ch
ra, ta đ t đ c m c tiêu đã đ nh
Các đ c tr ng c a thu t toán
1 Tính đ n đ nh
m i b c c a thu t toán, các thao tác ph i h t s c rõ ràng, không gây nên s nh p nh ng, l n
x n, tu ti n, đa ngh a Th c hi n đúng các b c c a thu t toán thì v i m t d li u vào, ch cho duy
nó yêu c u v t quá kh n ng l u tr c a h th ng máy tính
b) Thu t toán ph i đ c máy tính th c hi n trong th i gian cho phép, đi u này khác v i l i gi i toán(Ch c n ch ng minh là k t thúc sau h u h n b c) Ví d nh x p th i khoá bi u cho m t h c kthì không th cho máy tính ch y t i h c k sau m i ra đ c
Trang 36Input: a, b
No Yes
Vi t s đ các thu t toán đ quy là m t ví d
• i v i nh ng thu t toán ph c t p và n ng v tính toán, các b c và các công th c nên mô t
m t cách t ng minh và chú thích rõ ràng đ khi l p trình ta có th nhanh chóng tra c u
• i v i nh ng thu t toán kinh đi n thì ph i thu c Khi gi i m t bài toán l n trong m t th i gian
gi i h n, ta ch ph i thi t k t ng th còn nh ng ch đã thu c thì c vi c l p ráp vào Tính đúng
đ n c a nh ng mô-đun đã thu c ta không c n ph i quan tâm n a mà t p trung gi i quy t các
ph n khác
IV L P TRÌNH
Sau khi đã có thu t toán, ta ph i ti n hành l p trình th hi n thu t toán đó Mu n l p trình đ t hi u
qu cao, c n ph i có k thu t l p trình t t K thu t l p trình t t th hi n k n ng vi t ch ngtrình, kh n ng g r i và thao tác nhanh L p trình t t không ph i ch c n n m v ng ngôn ng l ptrình là đ , ph i bi t cách vi t ch ng trình uy n chuy n, khôn khéo và phát tri n d n d n đchuy n các ý t ng ra thành ch ng trình hoàn ch nh Kinh nghi m cho th y m t thu t toán hay
nh ng do cài đ t v ng v nên khi ch y l i cho k t qu sai ho c t c đ ch m
Thông th ng, ta không nên c th hoá ngay toàn b ch ng trình mà nên ti n hành theo ph ngpháp tinh ch t ng b c (Stepwise refinement):
• Ban đ u, ch ng trình đ c th hi n b ng ngôn ng t nhiên, th hi n thu t toán v i các b c
t ng th , m i b c nêu lên m t công vi c ph i th c hi n
• M t công vi c đ n gi n ho c là m t đo n ch ng trình đã đ c h c thu c thì ta ti n hành vi t
Trang 37Ph ng pháp tinh ch t ng b c là m t th hi n c a t duy gi i quy t v n đ t trên xu ng, giúpcho ng i l p trình có đ c m t đ nh h ng th hi n trong phong cách vi t ch ng trình Tránh
vi c mò m m, xoá đi vi t l i nhi u l n, bi n ch ng trình thành t gi y nháp
V KI M TH
1 Ch y th và tìm l i
Ch ng trình là do con ng i vi t ra, mà đã là con ng i thì ai c ng có th nh m l n M t ch ngtrình vi t xong ch a ch c đã ch y đ c ngay trên máy tính đ cho ra k t qu mong mu n K n ngtìm l i, s a l i, đi u ch nh l i ch ng trình c ng là m t k n ng quan tr ng c a ng i l p trình K
n ng này ch có đ c b ng kinh nghi m tìm và s a ch a l i c a chính mình
Có ba lo i l i:
• L i cú pháp: L i này hay g p nh t nh ng l i d s a nh t, ch c n n m v ng ngôn ng l p trình
là đ M t ng i đ c coi là không bi t l p trình n u không bi t s a l i cú pháp
• L i cài đ t: Vi c cài đ t th hi n không đúng thu t toán đã đ nh, đ i v i l i này thì ph i xem l i
r t khó kh n Khi đó ta nên làm các b test đ th ch ng trình c a mình
Các b test nên đ t trong các file v n b n, b i vi c t o m t file v n b n r t nhanh và m i l n ch y
th ch c n thay tên file d li u vào là xong, không c n gõ l i b test t bàn phím Kinh nghi m làmcác b test là:
• B t đ u v i m t b test nh , đ n gi n, làm b ng tay c ng có đ c đáp s đ so sánh v i k t qu
ch ng trình ch y ra
• Ti p theo v n là các b test nh , nh ng ch a các giá tr đ c bi t ho c t m th ng Kinh nghi mcho th y đây là nh ng test d sai nh t
• Các b test ph i đa d ng, tránh s l p đi l p l i các b test t ng t
• Có m t vài test l n ch đ ki m tra tính ch u đ ng c a ch ng trình mà thôi K t qu có đúnghay không thì trong đa s tr ng h p, ta không th ki m ch ng đ c v i test này
L u ý r ng ch ng trình ch y qua đ c h t các test không có ngh a là ch ng trình đó đã đúng B i
có th ta ch a xây d ng đ c b test làm cho ch ng trình ch y sai Vì v y n u có th , ta nên tìmcách ch ng minh tính đúng đ n c a thu t toán và ch ng trình, đi u này th ng r t khó
Trang 381 Tính tin c y
Ch ng trình ph i ch y đúng nh d đ nh, mô t đúng m t gi i thu t đúng Thông th ng khi vi t
ch ng trình, ta luôn có thói quen ki m tra tính đúng đ n c a các b c m i khi có th
2 Tính uy n chuy n
Ch ng trình ph i d s a đ i B i ít có ch ng trình nào vi t ra đã hoàn h o ngay đ c mà v n c n
ph i s a đ i l i Ch ng trình vi t d s a đ i s làm gi m b t công s c c a l p trình viên khi pháttri n ch ng trình
Ch ng trình ph i ch y nhanh và ít t n b nh , t c là ti t ki m đ c c v không gian và th i gian
có m t ch ng trình h u hi u, c n ph i có gi i thu t t t và nh ng ti u x o khi l p trình Tuynhiên, vi c áp d ng quá nhi u ti u x o có th khi n ch ng trình tr nên r i r m, khó hi u khi s a
đ i Tiêu chu n h u hi u nên d ng l i m c ch p nh n đ c, không quan tr ng b ng ba tiêu chu ntrên B i ph n c ng phát tri n r t nhanh, yêu c u h u hi u không c n ph i đ t ra quá n ng
T nh ng phân tích trên, chúng ta nh n th y r ng vi c làm ra m t ch ng trình đòi h i r t nhi ucông đo n và tiêu t n khá nhi u công s c Ch m t công đo n không h p lý s làm t ng chi phí vi t
ch ng trình Ngh ra cách gi i quy t v n đ đã khó, bi n ý t ng đó thành hi n th c c ng không
d chút nào
Nh ng c u trúc d li u và gi i thu t đ c p t i trong chuyên đ này là nh ng ki n th c r t phthông, m t ng i h c l p trình không s m thì mu n c ng ph i bi t t i Ch hy v ng r ng khi h cxong chuyên đ này, qua nh ng c u trúc d li u và gi i thu t h t s c m u m c, chúng ta rút ra đ cbài h c kinh nghi m: ng bao gi vi t ch ng trình khi mà ch a suy xét k v gi i thu t và
nh ng d li u c n thao tác, b i nh v y ta d m c ph i hai sai l m tr m tr ng: ho c là sai v gi i
thu t, ho c là gi i thu t không th tri n khai n i trên m t c u trúc d li u không phù h p Ch c n
m c m t trong hai l i đó thôi thì nguy c s p đ toàn b ch ng trình là hoàn toàn có th , càng c
ch a càng b r i, kh n ng h u nh ch c ch n là ph i làm l i t đ u(*)
(*) T t nhiên, c n th n đ n đâu thì c ng có xác su t r i ro nh t đ nh, ta hi u đ c m c đ tai h i c a hai l i này đ h n
ch nó càng nhi u càng t t
Trang 39§1 PHÂN TÍCH TH I GIAN TH C HI N GI I THU T
I Đ PH C T P TÍNH TOÁN C A GI I THU T
V i m t bài toán không ch có m t gi i thu t Ch n m t gi i thu t đ a t i k t qu nhanh nh t là m tđòi h i th c t Nh v y c n có m t c n c nào đó đ nói r ng gi i thu t này nhanh h n gi i thu tkia ?
Th i gian th c hi n m t gi i thu t b ng ch ng trình máy tính ph thu c vào r t nhi u y u t M t
y u t c n chú ý nh t đó là kích th c c a d li u đ a vào D li u càng l n thì th i gian x lý càng
ch m, ch ng h n nh th i gian s p x p m t dãy s ph i ch u nh h ng c a s l ng các s thu cdãy s đó N u g i n là kích th c d li u đ a vào thì th i gian th c hi n c a m t gi i thu t có th
bi u di n m t cách t ng đ i nh m t hàm c a n: T(n)
Ph n c ng máy tính, ngôn ng vi t ch ng trình và ch ng trình d ch ngôn ng y đ u nh h ng
t i th i gian th c hi n Nh ng y u t này không gi ng nhau trên các lo i máy, vì v y không th d avào chúng khi xác đ nh T(n) T c là T(n) không th bi u di n b ng đ n v th i gian gi , phút, giây
đ c Tuy nhiên, không ph i vì th mà không th so sánh đ c các gi i thu t v m t t c đ N u
nh th i gian th c hi n m t gi i thu t là T1(n) = n2 và th i gian th c hi n c a m t gi i thu t khác là
T2(n) = 100n thì khi n đ l n, th i gian th c hi n c a gi i thu t T2 rõ ràng nhanh h n gi i thu t T1.Khi đó, n u nói r ng th i gian th c hi n gi i thu t t l thu n v i n hay t l thu n v i n2
c ng cho ta
m t cách đánh giá t ng đ i v t c đ th c hi n c a gi i thu t đó khi n khá l n Cách đánh giá th igian th c hi n gi i thu t đ c l p v i máy tính và các y u t liên quan t i máy tính nh v y s d n
t i khái ni m g i là đ ph c t p tính toán c a gi i thu t.
Cho f và g là hai hàm xác đ nh d ng v i m i n Hàm f(n) đ c g i là O(g(n)) n u t n t i m t h ng
s c > 0 và m t giá tr n0 sao cho:
f(n) ≤ c.g(n) v i ∀ n ≥ n0
Ngh a là n u xét nh ng giá tr n ≥ n0 thì hàm f(n) s b ch n trên b i m t h ng s nhân v i g(n) Khi
đó, n u f(n) là th i gian th c hi n c a m t gi i thu t thì ta nói gi i thu t đó có c p là g(n) (hay đ
ph c t p tính toán là O(g(n)))
II XÁC Đ NH Đ PH C T P TÍNH TOÁN C A GI I THU T
Vi c xác đ nh đ ph c t p tính toán c a m t gi i thu t b t k có th r t ph c t p Tuy nhiên, trong
th c t , đ i v i m t s gi i thu t ta có th phân tích b ng m t s quy t c đ n gi n:
Trang 402 Quy t c nhân
N u đo n ch ng trình P có th i gian th c hi n là T(n) = O(f(n)) Khi đó, n u th c hi n k(n) l n
đo n ch ng trình P v i k(n) = O(g(n)) thì đ ph c t p tính toán s là O(g(n).f(n))
hi u là O(logf(n)) mà không c n ghi c s c a logarit
c) N u m t thu t toán có đ ph c t p là h ng s , t c là th i gian th c hi n không ph thu c vàokích th c d li u vào thì ta ký hi u đ ph c t p tính toán c a thu t toán đó là O(1)
hi n là n3, thì v i n < 1000, rõ ràng gi i thu t O(n3) t t h n gi i thu t O(n2) Trên đây là xét trên
ph ng di n tính toán lý thuy t đ đ nh ngh a gi i thu t này "t t" h n gi i thu t kia, khi ch n m tthu t toán đ gi i m t bài toán th c t ph i có m t s m m d o nh t đ nh
f) C ng theo đ nh ngh a v đ ph c t p tính toán
• M t thu t toán có c p O(1) c ng có th vi t là O(logn)
• M t thu t toán có c p O(logn) c ng có th vi t là O(n)
• M t thu t toán có c p O(n) c ng có th vi t là O(n.logn)
• M t thu t toán có c p O(n.logn) c ng có th vi t là O(n2
D i đây là m t s hàm s hay dùng đ ký hi u đ ph c t p tính toán và b ng giá tr c a chúng đ
ti n theo dõi s t ng c a hàm theo đ i s n