Tải bản đầy đủ (.pdf) (50 trang)

Toán rời rạc chương 5 bài toán liệt kê

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.16 MB, 50 trang )

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


×