TOÁN R I R C
CH
NG 5
BÀI TOÁN LI T KÊ
Lecturer: PhD. Ngo Huu Phuc
Tel:
0438 326 077
Mob: 098 5696 580
Email:
1
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
N I DUNG CH
NG 5
5.1. Gi i thi u bài toán.
5.2. Nh c l i ki n th c đ quy.
5.3. Sinh hoán v - Sinh t h p.
5.4. Thu t toán quay lui. Bài toán x p h u.
5.5. Bài t p ch
2
ng 5.
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
5.1. Gi i thi u bài toán (1/3)
C n có gi i thu t đ
l nl
c u hình đang quan tâm
t xây d ng đ
BÀI TOÁN LI T KÊ.
i v i bài toán li t kê, c n đ m b o 2 nguyên t c:
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.
Khó kh n chính c a ph
ng pháp này là s
“bùng n t h p”!
3
c t t c các
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
5.1. Gi i thi u bài toán (2/3)
Ví d 5.1:
Cho t p h p các s
a1, a2,.., an và s M. Hãy tìm t t c các
c a dãy s {an} sao cho t ng s các ph n
t p con k ph n t
t trong t p con đó đúng b ng M.
Gi i ví d 5.1.
S các t p con k ph n t
C n duy t trong s
c a t p g m n ph n t là C(n,k).
C(n,k) t p k ph n t
đ l y ra nh ng t p
có t ng các ph n t đúng b ng M.
4
th c hi n đ
c bài toán
c n li t kê các c u hình.
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
5.1. Gi i thi u bài toán (3/3)
Ví d 5.2:
M t ng
i bán hàng t i 8 thành ph . Ng i này có th b t
đ u hành trình c a mình t i m t thành ph nào đó nh ng
ph i qua 7 thành ph kia theo b t k th t nào mà ng i đó
mu n. Hãy ch ra l trình ng n nh t mà ng i đó có th đi.
Gi i ví d 5.2.
Có t t c 7! = 5040 cách đi c a ng
i bán hàng.
Tuy nhiên trong 5040 cách chúng ta ph i duy t toàn b đ ch
ra m t hành trình là ng n nh t.
5
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
5.2. Nh c l i ki n th c đ quy (1/9)
5.2.1.
nh ngh a b ng đ quy (1/4)
Trong th c t , nhi u đ i t
m t cách t
t
K
ng mà khó có th đ nh ngh a nó
ng minh, nh ng l i d
dàng đ nh ngh a đ i
ng qua chính nó.
thu t đ nh ngh a đ i t
ng qua chính nó đ
c g i là k
thu t đ qui (recursion).
Các gi i thu t đ qui th
6
b
c phân tích
b
c thay th ng
ng đ
c xây d ng qua hai b
cl i
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
c:
5.2. Nh c l i ki n th c đ quy (2/9)
5.2.1.
nh ngh a b ng đ quy (2/4)
Ví d 5.2.3:
tính t ng S(n) = 1 + 2 +...+ n.
Gi i quy t bài toán:
B
c phân tích:
tính toán đ
c S(n), c n tính S(n-1), sau đó tính S(n) = S(n-1) +n.
......................................................
Và cu i cùng S(1) chúng ta có ngay k t qu là 1.
B
c thay th ng
Xu t phát t
c l i:
S(1) thay th ng
c l i chúng ta xác đ nh S(n):
S(1) = 1
S(2) = S(1) + 2
............
S(n) = S(n - 1) + n
7
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
5.2. Nh c l i ki n th c đ quy (3/9)
5.2.1.
nh ngh a b ng đ quy (3/4)
Ví d 5.2.4:
nh ngh a hàm b ng đ quy:
f(n) = n!
Phân tích và th c hi n:
Ta có f(0) = 1.
Vì (n+1) ! = 1. 2.3... n(n+1) = n! (n+1), nên ta có:
f(n+1) = ( n+1). f(n) v i
8
n nguyên d
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
ng.
5.2. Nh c l i ki n th c đ quy (4/9)
5.2.1.
nh ngh a b ng đ quy (4/4)
Ví d 5.2.5: T p h p đ nh ngh a b ng đ quy:
nh ngh a đ quy t p các xâu: Gi s
b ch
cái
. Khi đó
* đ
* là t p các xâu trên
c đ nh ngh a b ng đ quy nh
sau:
*, trong đó
wx
9
*n uw
là xâu r ng
* và x
*.
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
5.2. Nh c l i ki n th c đ quy (5/9)
5.2.2. Gi i thu t đ quy (1/5)
Khái ni m:
M t thu t toán đ
c g i là đ quy n u nó gi i bài toán b ng
cách rút g n bài toán ban đ u thành bài toán t
ng t
nh
v y sau m t s h u h n l n th c hi n.
Trong m i l n th c hi n, d
li u đ u vào ti m c n t i t p d
li u d ng.
10
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
5.2. Nh c l i ki n th c đ quy (6/9)
5.2.2. Gi i thu t đ quy (2/5)
Ví d 5.2.6: Tính an b ng gi i thu t đ quy, v i m i s th c a và
s t nhiên n.
o n mã c a gi i thu t:
double power( float a, int n ){
if ( n==0 )
return 1;
else
return a *power(a,n-1);
}
11
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
5.2. Nh c l i ki n th c đ quy (7/9)
5.2.2. Gi i thu t đ quy (3/5)
Ví d 5.2.7: Thu t toán đ quy tính
hai s nguyên d ng a và b.
c s chung l n nh t c a
o n mã c a gi i thu t:
int USCLN( int a, int b ){
if (a == 0)
return b;
else
return USCLN( b % a, a);
}
12
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
5.2. Nh c l i ki n th c đ quy (8/9)
5.2.2. Gi i thu t đ quy (4/5)
Ví d 5.2.8: Thu t toán đ quy tính n!
o n mã c a gi i thu t:
long factorial( int n){
if (n ==1)
return 1;
else
return n * factorial(n-1);
}
13
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
5.2. Nh c l i ki n th c đ quy (9/9)
5.2.2. Gi i thu t đ quy (5/5)
Ví d 5.2.9: Thu t toán đ quy tính s fibonacci th n.
o n mã c a gi i thu t:
int fibonacci( int n) {
if (n==0) return 0;
else if (n==1) return 1;
return fibonacci(n-1)+fibonacci(n-2);
}
14
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
5.3. Sinh hoán v - Sinh t h p (1/20)
5.3.1. Gi i thi u thu t toán sinh (1/4)
Ýt
ng c a ph
ng pháp sinh:
Xây d ng m t c u hình t h p ban đ u tho mãn các đi u
a.
ki n đã cho.
a ra c u hình đã có.
b.
T
c.
các thông tin c a c u hình đã có, xây d ng c u hình
m i c ng tho mãn các đi u ki n đã cho:
15
n u sinh đ
n u không sinh đ
c c u hình m i ta ti p t c l p l i b
c thì d ng l i.
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
c b,
5.3. Sinh hoán v - Sinh t h p (2/20)
5.3.1. Gi i thi u thu t toán sinh (2/4)
Gi mã c a ph ng pháp sinh:
void Generate(void) {
<Xây d ng c u hình ban đ u>;
stop = false;
while (not stop) {
< a ra c u hình đang có>;
Sinh_K _Ti p;
}
}
Trong đó, Sinh_K _Ti p th t c sinh c u hình k ti p t c u hình ban
đ u.
16
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
5.3. Sinh hoán v - Sinh t h p (3/20)
5.3.1. Gi i thi u thu t toán sinh (3/4)
Ví d 5.3.1: Li t kê các dãy nh phân có đ dài 3.
C u hình ban đ u 000.
a ra c u hình đã có.
T
c u hình đang có, duy t t ph i
a.
N u g p ph n t
trái:
"0" đ u tiên thì đ i thành "1" và đ i các ph n t
bên ph i c a nó thành "0" quay l i b
b.
c b.
N u không g p ph n t "0" thì d ng l i.
Dãy k t qu c a bài toán:
'000' '001' '010' '011' '100' '101' '110' '111'
17
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
5.3. Sinh hoán v - Sinh t h p (4/20)
5.3.1. Gi i thi u thu t toán sinh (4/4)
Trong ví d 5.3.1, gi mã thu t toán sinh k ti p đ
trong th t c sau:
void Next_Bit_String( int *B, int n ){
i = n;
while (bi == 1 ) {
bi = 0
i = i-1;
}
bi = 1;
}
18
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
c mô t
5.3. Sinh hoán v - Sinh t h p (5/20)
5.3.2. Sinh các hoán v (1/9)
M i ph n t
c a t p n ph n t b t k đ u có th t
ng ng m t-
m t v i t p các s nguyên
A = 1, 2, …, n.
li t kê các hoán v c a t p ta có th sinh ra các hoán v c a
t p A, sau đó thay th các s nguyên b ng các ph n t c a có
ch s t
Ph
ng ng.
ng pháp li t kê các hoán v c a t p A đ
pháp sinh hoán v theo th
19
t
c s d ng: ph
t đi n.
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
ng
5.3. Sinh hoán v - Sinh t h p (6/20)
5.3.2. Sinh các hoán v (2/9)
Khái ni m v ph
ng pháp sinh hoán v theo th
Hoán v a1a2…an đ
c g i là đi tr
t t
đi n:
c (nh h n) hoán v b1b2…bn
n u v i k nào đó (1 k n) ta có:
a1 = b1, a2 = b2, …, ak-1 = bk-1, và ak < bk.
Gi i thích:
M t hoán v c a t p n s
nguyên d
ng đ u tiên đ
c g i là đi tr
c
(theo th t t đi n) m t hoán v khác n u t i v trí đ u tiên mà hai hoán
v khác nhau, con s c a hoán v đ u nh h n con s thu c hoán v
th
20
hai.
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
5.3. Sinh hoán v - Sinh t h p (7/20)
5.3.2. Sinh các hoán v (3/9)
Ví d 5.3.2:
Xét t p A = 1, 2, 3, 4, 5, khi đó:
Hoán v 23145 c a t p là đi tr
vì nh ng hoán v này trùng nhau
c hoán v 23514,
hai v trí đ u tiên, nh ng s 1
trí th ba c a hoán v đ u nh h n s 5 c ng
v sau.
Hoán v 41532 là đi tr
21
c 52143.
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
v
v trí th ba c a hoán
5.3. Sinh hoán v - Sinh t h p (8/20)
5.3.2. Sinh các hoán v (4/9)
Thu t toán sinh ra các hoán v :
Ph
ng pháp d a trên vi c xây d ng hoán v k ti p theo th
hoán v cho tr
t
t
đi n c a
c a1a2…an.
Phân tích bài toán:
1.
Gi s
an-1 < an, n u đ i ch an-1 và an s nh n đ
c hoán v m i đi
ngay sau hoán v đã cho.
2.
N u an-1 > an thì không th nh n đ
c hoán v l n h n b ng cách đ i
ch hai s h ng này trong hoán v đã cho.
3.
V i tr
ng h p c a ý 2: xem xét ba s h ng cu i cùng trong hoán
v a1a2…an.
22
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
5.3. Sinh hoán v - Sinh t h p (9/20)
5.3.2. Sinh các hoán v (5/9)
Phân tích bài toán (ti p):
4.
N u an-2 < an-1 thì có th s p x p l i ba s cu i cùng đ có th nh n
đ
c m t hoán v m i li n sau hoán v xu t phát. Trong hai s an-1 và
an ta ch n s nh h n đ t vào vào v trí n - 2, sau đó đ t s nguyên
còn l i và s an - 2 vào hai v trí cu i cùng theo th t t ng d n.
5.
N u an-2 > an-1 (và an-1 > an), thì không th nh n đ
c hoán v l n h n
b ng cách đ i ch 3 s h ng cu i cùng c a hoán v . Khi đó, xét 4 s
h ng.
23
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
5.3. Sinh hoán v - Sinh t h p (10/20)
5.3.2. Sinh các hoán v (6/9)
Ph
1.
ng pháp t ng quát t o hoán v li n sau:
Tìm c p s nguyên li n k đ u tiên tính t
c a hoán v mà s
đ u nh
h n s
ph i sang bên trái
sau, t c là tìm các s
nguyên aj và aj+1 sao cho aj < aj+1 và aj+1 > aj+2 > …>an.
2.
nh n đ
c hoán v li n sau, ta đ t vào v trí th j s nguyên
nh nh t trong các s > aj c a t p aj+1, aj+2, …, an, r i li t kê
theo th t t ng d n c a các s còn l i c a aj+1, aj+2, …, an vào
các v trí j + 1, …, n.
24
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University
5.3. Sinh hoán v - Sinh t h p (11/20)
5.3.2. Sinh các hoán v (7/9)
Thu t toán sinh hoán v k ti p:
ak = temp;
void Next_Permutation( int
*A, int n){
r = j + 1;
int j, k, r, s, temp;
s = n;
j = n-1;
while ( r < s) {
while (aj > aj+1 )
temp = ar;
j = j -1;
ar = as;
k = n;
as = temp;
while (aj > ak )
r = r +1;
k= k - 1;
s = s - 1;
temp =aj;
aj = ak;
25
}
}
@Copyrights by Dr. Ngo Huu Phuc, Le Quy Don Technical University