Thu t toán quay lui.
Trang 1TOÁN R I R C
Lecturer: PhD Ngo Huu Phuc
Tel: 0438 326 077 Mob: 098 5696 580
BÀI TOÁN LI T KÊ
Trang 2N 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 ng 5
Trang 35.1 Gi i thi u bài toán (1/3)
C n có gi i thu t đ l n l t xây d ng đ c t t c các
c u hình đang quan tâm 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 ”!
Trang 45.1 Gi i thi u bài toán (2/3)
Trang 55.1 Gi i thi u bài toán (3/3)
Trang 6 Các gi i thu t đ qui th ng đ c xây d ng qua hai b c:
b c phân tích
Trang 95.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 * là t p các xâu trên
b ch cái Khi đó * đ c đ nh ngh a b ng đ quy nh sau:
*, trong đó là xâu r ng
wx * n u w * và x *
Trang 155.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)
a. Xây d ng m t c u hình t h p ban đ u tho mãn các đi u
ki n đã cho
b. a ra c u hình đã có
c. T 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:
n u sinh đ c c u hình m i ta ti p t c l p l i b c b,
đ c thì d ng l i
Trang 165.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;
< a ra c u hình đang có> ; Sinh_K _Ti p;
}
}
Trang 175.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
Trang 185.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 đ c mô t trong th t c sau:
void Next_Bit_String( int *B, int n ){
Trang 195.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 ng ng
Ph ng pháp li t kê các hoán v c a t p A đ c s d ng: ph ng
Trang 205.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 t t đi n :
Hoán v a1a2…an đ c g i là đi tr c (nh h n) hoán v b1b2…bn
Trang 215.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 c hoán v 23514,
vì nh ng hoán v này trùng nhau hai v trí đ u tiên, nh ng s 1 v trí th ba c a hoán v đ u nh h n s 5 c ng v trí th ba c a hoán
v sau
Hoán v 41532 là đi tr c 52143
Trang 225.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 t t đi n c a hoán v cho tr c a 1 a 2 …a n
Phân tích bài toán:
1. Gi s a n-1 < a n, n u đ i ch a n-1 và a n s nh n đ c hoán v m i đi
ngay sau hoán v đã cho
2. N u a n-1 > a n 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
Trang 235.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 a n-2 < a n-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 a n-1 và
a n 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 a n - 2 vào hai v trí cu i cùng theo th t t ng d n
5. N u a n-2 > a n-1 (và a n-1 > a n), thì không th nh n đ c hoán v l n h n
Trang 245.3 Sinh hoán v - Sinh t h p (10/20)
5.3.2 Sinh các hoán v (6/9)
1 Tìm c p s nguyên li n k đ u tiên tính t ph i sang bên trái
c a hoán v mà s đ u nh h n s 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 a , a , …, a vào
Trang 255.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:
Trang 265.3 Sinh hoán v - Sinh t h p (12/20)
Trang 275.3 Sinh hoán v - Sinh t h p (13/20)
Ti p theo, vì 3 > 2 và 1 < 3 nên ph i xét c 3 s trong nhóm hoán v này
t s nh nh t trong hai s 3 và 2 (s 2) vào v trí th nh t, sau đó là hai s còn l i (1 và 3) vào v trí th 2 và th 3 theo th t t ng d n, t c là ta có 213
i ch 1 và 3 cho nhau vì 1 < 3 đ c 231 Vì 2 < 3 nên đ c đ t 3 vào v trí đ u tiên và sau đó là 1 và 2, t c là 312
Trang 285.3 Sinh hoán v - Sinh t h p (14/20)
M t xâu nh phân ng v i m t t p con, t i ví trí k , s có s 1 ho c
s 0 tu theo ph n t ak thu c vào t p con đó hay không
N u có th li t kê t t c các xâu nh phân đ dài n thì ta s nh n
đ c t t c các t p con c a t p n ph n t (và c ng chính là các t
Trang 295.3 Sinh hoán v - Sinh t h p (15/20)
5.3.3 Sinh các t h p (2/9)
Gi i thi u chung v sinh các t h p (ti p):
M t khác, m t xâu nh phân đ dài n c ng là khai tri n nh phân c a m t
Trang 305.3 Sinh hoán v - Sinh t h p (16/20)
5.3.3 Sinh các t h p (3/9)
Thu t toán t o t h p ch p k t n ph n t {1, 2,…, n}:
M i t h p ch p k có th bi u di n b ng m t xâu t ng, do v y có th li t kê các t h p theo th t t đi n
Theo th t t đi n:
T h p đ u tiên là (1, 2, , k) và
T h p cu i cùng là (n-k+1, n-k+2, ,n)
Gi s (a1a2…ak) là t h p đang có ch a ph i là t h p cu i cùng theo th t
t đi n, có th xây d ng b ng cách th c hi n các quy t c bi n đ i sau đ i v i
t h p đang có:
Trang 315.3 Sinh hoán v - Sinh t h p (17/20)
5.3.3 Sinh các t h p (4/9)
Thu t toán li t kê t p con k ti p m ph n t c a t p n ph n t :
void Next_Combination( int *A, int n){
Trang 325.3 Sinh hoán v - Sinh t h p (18/20)
5.3.3 Sinh các t h p (7/9)
Ví d 5.3.5:
Tìm xâu nh phân li n sau c a 1 0001 1111
L i gi i:
Bit đ u tiên t bên ph i sang b ng 0 là bit th 6,
Thay nó b ng s 1 và 5 bit 1 bên ph i nó đ c thay b ng s 0,
T đó ta đ c xâu nh phân li n sau c a xâu đã cho là:
1 0010 0000
Trang 335.3 Sinh hoán v - Sinh t h p (19/20)
Trang 345.3 Sinh hoán v - Sinh t h p (20/20)
Trang 355.4 Gi i thu t quay lui Bài toán s p h u (1/15)
5.4.1 Gi i thu t quay lui (1/9)
Trang 365.4 Gi i thu t quay lui Bài toán s p h u (2/15)
5.4.1 Gi i thu t quay lui (2/9)
Chú ý:
i m quan tr ng c a thu t toán là ph i ghi nh t i m i
b c đã đi qua, nh ng kh n ng nào đã th đ tránh trùng
l p
Nh ng thông tin này c n đ c l u tr theo c c u ng n
x p (stack)
Trang 375.4 Gi i thu t quay lui Bài toán s p h u (3/15)
5.4.1 Gi i thu t quay lui (3/9)
Gi mã c a gi i thu t quay lui, xác đ nh ph n t th i:
void Try( int i ) {
int j;
for ( j = 1; j < n i ; j ++) {
if ( <Ch p nh n j >) { <Xác đ nh x i theo j>
if (i==n)
else Try(i+1);
Trang 385.4 Gi i thu t quay lui Bài toán s p h u (4/15)
5.4.1 Gi i thu t quay lui (4/9)
Trang 395.4 Gi i thu t quay lui Bài toán s p h u (5/15)
5.4.1 Gi i thu t quay lui (5/9)
Ví d 5.4.1 (ti p): Li t kê các dãy nh phân đ dài n
Gi i thích b ng đ th :
Trang 405.4 Gi i thu t quay lui Bài toán s p h u (6/15)
5.4.1 Gi i thu t quay lui (6/9)
Ví d 5.4.1 (ti p): Li t kê các dãy nh phân đ dài n
Mã ch ng trình:
#include <conio.h>
#include <iostream>
void Result( int *B, int n){
for ( int i=0;i<n;i++)
cout<< " " <<B[i]<< " " ;
cout<<endl;
}
void Init( int *B, int n){
void Try( int i, int *B, int n){
void main( void ){
Trang 415.4 Gi i thu t quay lui Bài toán s p h u (7/15)
5.4.1 Gi i thu t quay lui (7/9)
Sau khi gán j cho pi c n đ c ghi nh n false cho bj và ph i gán l i
true khi th c hi n xong vi c in giá tr ho c khi th ti p ph ng án m i
Trang 425.4 Gi i thu t quay lui Bài toán s p h u (8/15)
5.4.1 Gi i thu t quay lui (8/9)
B[j]=FALSE;
if (i==n) In_K t_Qu ; else Try(i+1);
B[j]=TRUE;
Trang 435.4 Gi i thu t quay lui Bài toán s p h u (9/15)
5.4.1 Gi i thu t quay lui (8/9)
Ví d 5.4.2:
Li t kê các hoán v c a {1,2, ,n}
Minh h a b ng đ th :
Trang 445.4 Gi i thu t quay lui Bài toán s p h u (10/15)
5.4.1 Gi i thu t quay lui (9/9)
Các giá tr đ c cho ci : { ci-1+1 , n-k+i }
đi u này đúng cho c tr ng h p i = 1, c n thêm vào c0 v i
c0 = 0
Các giá tr đ c này m c nhiên đ c ch p nh n
Trang 455.4 Gi i thu t quay lui Bài toán s p h u (11/15)
5.4.1 Gi i thu t quay lui (9/9)
Trang 465.4 Gi i thu t quay lui Bài toán s p h u (12/15)
5.4.2 Bài toán s p h u (1/4)
Bài toán: Li t kê t t c các cách x p 8 quân H u trên bàn c 8x8
sao cho chúng không n đ c l n nhau
Trang 475.4 Gi i thu t quay lui Bài toán s p h u (13/15)
5.4.2 Bài toán s p h u (2/4)
M t vài cách đ t 8 con h u lên bàn c (trong s 92 l i gi i)
Trang 485.4 Gi i thu t quay lui Bài toán s p h u (14/15)
Trang 495.4 Gi i thu t quay lui Bài toán s p h u (15/15)
Trang 505.5 Bài t p ch ng 5
Bài 1 Li t kê t t c các t p con c a t p 1, 2, ,n
Bài 2 Li t kê t t c các xâu nh phân đ dài n có t ng các bít 1 đúng b ng