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

một số vấn đề cơ sở của tin học

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 (210.72 KB, 52 trang )

Buổi 3:
Cấu trúc dữ liệu vàthuật giải
Giáo viên: Tạ Thúc Nhu
Khoa CNTT trường ĐH Lạc Hồng
Một số vấn đề cơ sở
của Tin học
Mã hó
a
2
ĐỆ QUI
RECURVE
Mã hó
a
3
Khái niệm Đệ Qui
Khái niệm Đệ Qui
Một đối tượng được gọi là đệ qui nếu nóhoặc 1 phần của nó
được định nghiã thông qua khái niệm về chính nó.
Vídụ: Định nghiã phép toán giai thừa, ký hiệu: N!
• (a) Nếu N = 0, thìN! = 1
• (b) nếu N > 0 thìN! = N*(N-1)!
Vídụ: Định nghiã UCLN của 2 số x vày, ký hiệu: UCLN(x, y)
• (a)UCLN(x,y) = x nếu y = 0
• (b)UCLN(x,y) = UCLN(y, phần dư của x/y) nếu y<>0
Mã hó
a
4
Chương trình đệ qui
Chương trình đệ qui
• Một chương trình là đệ qui nếu trong chương trình cólời
gọi đến chính nó.


Vídụ: Định nghĩa hàm tính N! theo đệ qui.
int GiaiThua(int N)
{
if (N == 0) return 1;
return N * GiaiThua(N -1);
}
Mã hó
a
5
Một định nghiã đệ qui phải có2 thành phần:
Một định nghiã đệ qui phải có2 thành phần:
• Thành phần dừng: Không chứa khái niệm đang định nghiã
Vídụ: N! = 1
• Thành phần đệ qui: cóchứa khái niệm đang định nghiã
Mã hó
a
6
Vídụ: Tính UCLN(x,y) theo thuật toán Euclide
• (a)UCLN(x,y) = x nếu y = 0
• (b)UCLN(x,y) = UCLN(y, phần dư của x/y) nếu y<>0
int UCLN(int x, int y)
{
if (y == 0) return x;
return UCLN(y, x % y);
}
Mã hó
a
7
THUẬT GIẢI QUAY LUI
BACK TRACKING

Mã hó
a
8
Tổng quan thuật giải Quay lui (Back Tracking)
Tổng quan thuật giải Quay lui (Back Tracking)
• 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ác định bằng cách xây dựng tuần tự từng thành
phần trong cấu hình.
• Mỗi thành phần được xác định bằng cách chọn lựa dữ liệu trong tập khả
năng được đề xuất.
Xn…X3X2X1
Km……K2K1Tập khả năng
Cấu hình một lời giải
Mã hó
a
9
Mô hình thuật giải quay lui:
Xác định phần tử X
i
bằng đệ quy
Mô hình thuật giải quay lui:
Xác định phần tử X
i
bằng đệ quy
void Try( int i )
{
If (X
i
làphần tử cuối cùng trong cấu hình)
< Thông báo cấu hình tìm được>;

else
for ( mọi Kj thuộc tập khả năng đề cử cho X
i
)
[ if ( Chấp nhận Kj ) ]
{
Thử chọn Kj cho Xi;
Try( i+1); //Gọi đệ quy để xác định phần tử X
i+1
Bỏ ghi nhận Kj đã chọn cho Xi để chọn khả năng khác;
}
}
Mã hó
a
10
Hai điểm mấu chốt quyết định độ phức tạp của bài toán là:
1. Xác định tập khả năng đề cử: Phụ thuộc vào việc phân tích
nhu cầu dữ liệu của từng thành phần trong cấu hình
2. Kiểm tra khả năng đề cử phải phùhợp với thành phần cần
xác định.
Mã hó
a
11
Bài toán: Liệt kê các dãy nhị phân có độ dài n
Bài toán: Liệt kê các dãy nhị phân có độ dài n
Phân tích:
• Biểu diến cấu hình dãy nhị phân dưới dạng: X[1 n]
• Tập khả năng đề cử cho mỗi phần tử Xi là{0, 1}
• Thuật giải xác định phần tử Xi của dãy nhị phân như sau:
void Try(int i)

{
if ( i > n ) <Thông báo cấu hình tìm được>;
else
for (int j =0; j<= 1; j++)
{
X[ i ] = j;
Try( i + 1 );
}
}
Mã hó
a
12

đi tu

n: ch

ra h
à
nh tr
ì
nh c

a quân Mã xu

t ph
á
t
từ một ô trên bàn cờ đi qua tất cả các ô còn lại của
bàn cờ, mỗi ô đúng 1 lần.


đi tu

n: ch

ra h
à
nh tr
ì
nh c

a quân Mã xu

t ph
á
t
từ một ô trên bàn cờ đi qua tất cả các ô còn lại của
bàn cờ, mỗi ô đúng 1 lần.
Phân tích:
• Cấu hình lời giải làBC[1 n][1 n]
chứa số thứ tự hành trình của
quân Mã.
• Tập khả năng chứa các giátrị
dùng tính tọa độ các ô kế tiếp
dx[1 8] = {-2,-1, 1, 2, 2, 1, -1, -2}
dy[1 8] = { 1, 2, 2, 1, -1, -2, -2, -1}
• Điều kiện chọn khả năng cho
bước đi thứ i là Ô được chọn
phải :
–Thuộc bàn cờ

–Và chưa đi qua
1
2
(x, y)
(u, v)
Mã hó
a
13
Thuật giải xác định bước đi thứ i của quân Mã
Thuật giải xác định bước đi thứ i của quân Mã
void Try(int i)
{ int j,u,v;
if (i > n*n) <Thông báo cấu hình tìm được>;
else
for ( j =1; j <= 8 ; j++)
{
u =x+dx[j]; v = y+dy[j];
if (u >= 1 && u <= n && v >= 1 && v<=n && BC[u,v] = 0)
{
x = u; y = v;
BC[u,v] = i;
Try(i+1);
x = u-dx[j]; y = v-dy[j];
BC[u,v] = 0;
}
}
}
Mã hó
a
14

Bài toán:
Liệt kê các hoán vị của dãy số {1, 2, , n}
Bài toán:
Liệt kê các hoán vị của dãy số {1, 2, , n}
• Biểu diễn cấu hình một hoán vị: X[1 n]
• Tập khả năng đề cử: { 1, 2, , n }
• Nhưng do Xi <> Xj với i <> j. Nên phải kiểm tra giátrị đề cử
cho Xi phải khác với các giátrị đã chọn cho các thành phần
trước đó.
Hướng giải quyết chung làtổchức các biến trạng thái lưu
trữ thông tin phục vụ cho việc kiểm tra:
Dùng mảng F[1 n] để ghi nhớ tình trạng sử dụng của từng
khả năng trong tập S={1, 2, , n}, với qui ước:
F[ j ] = 0 nếu j chưa sử dụng
F[ j ] = 1 nếu j đã sử dụng
Mã hó
a
15
Thuật giải xác định phần tử Xi của một hoán vị
Thuật giải xác định phần tử Xi của một hoán vị
void Try(int i)
{if ( i > n ) <Thông báo cấu hình tìm được>;
else
for (int j = 1; j<= n; j++)
if (F[j] = 0)
{
X[i] = j;
F[j] = 1;
Try( i + 1 );
F[j] = 0;

}
}
Mã hó
a
16
Vídụ: Liệt kê các tập con k phần tử
của tập S = {1, 2, , n}. Trong đó(k <= n)
Vídụ: Liệt kê các tập con k phần tử
của tập S = {1, 2, , n}. Trong đó(k <= n)
• Biểu diễn cấu hình một tập con K phần tử: X[1 K]
• Tập khả năng đề cử: { 1, 2, , n }
• Nhưng do Xi <> Xj với i <> j. Nên các giátrị đề cử cho Xi
phải khác với các giátrị đề cử cho các thành phần trước đó
Hướng giải quyết:
Dùng mảng F[1 N] để ghi nhớ tình trạng sử dụng của từng
khả năng trong tập S={1, 2, , N}, với qui ước:
F[ j ] = 0 nếu j chưa sử dụng
F[ j ] = 1 nếu j đã sử dụng
Mã hó
a
17
Thuật giải xác định phần tử Xi của một tập con
Thuật giải xác định phần tử Xi của một tập con
void Try(int i)
{if ( i > K ) <Thông báo cấu hình tìm được>;
else
for (int j = 1; j<= N; j++)
if (F[j] = 0)
{
X[i] = j;

F[j] = 1;
Try( i + 1 );
F[j] = 0;
}
}
Mã hó
a
18
Một cách giải khác của bài toán tập con
Một cách giải khác của bài toán tập con
Đưa ra điều kiện cho mỗi tập con là:
1 <= X[1] < X[2] < < X[ i ] < < X[K-1] < X[K] <= N
• Nhận xét:
X[K] <= N
X[K-1] <= X[K] -1 <= N -1

X[ i ] = X[K-(K-i)] <= N -(K -i)
• Do đó, ta cóthể giới hạn giátrị đề cử cho thành phần X[i]
trong khoảng từ : X[i-1]+1 đến (N – K + i)
• Để điều này cũng đúng cho cả trường hợp i = 1, ta thêm vào
X[0] = 0.
Mã hó
a
19
Thuật giải xác định phần tử Xi của một tập con
Thuật giải xác định phần tử Xi của một tập con
void Try(int i)
{
if ( i > K ) <Thông báo cấu hình tìm được>;
else

for (int j = X[i-1]+1; j<= N-K+i; j++)
{
X[i] = j;
Try( i + 1 );
}
}
Mã hó
a
20
KỸ THUẬT NHÁNH CẬN
Mã hó
a
21
Công dụng
Công dụng
• Dùng giải quyết bài toán tìm cấu hình tốt nhất trong các cấu
hình liệt kê bằng thuật toán quay lui.
• Giảm thời gian thực hiện của thuật toán quay lui.
Kỹ thuật nhánh cận thêm vào cho thuật toán quay lui khả năng đánh
giácấu hình ở từng bước.
Nếu tại bước thứ i đánh giá được cấu hình không tối ưu thìquay lui
ngay không cần phải gọi đệ quy tìm tiếp các thành phần khác của cấu
hình.
Mã hó
a
22
Mô hình đánh giánhánh cận
trong thuật toán quay lui:
Mô hình đánh giánhánh cận
trong thuật toán quay lui:

// Khởi tạo cấu hình BESTCONFIG xấu nhất
void Init()
{
<Khởi tạo một cấu hình BESTCONFIG xấu nhất>
}
//Mô hình thuật toán quay lui xác định X[i] có đánh giánhánh cận
void Try( int i )
{
If (X
i
làphần tử cuối cùng trong cấu hình)
<Cập nhật BESTCONFIG>;
else
for ( mọi Kj thuộc tập khả năng đề cử cho X
i
)
[ if ( Chấp nhận Kj ) ]
{
Thử chọn Kj cho Xi;
if (còn hy vọng tìm ra cấu hình tốt hơn BESTCONFIG) Try( i+1);
Bỏ ghi nhận Kj đã chọn cho Xi để chọn khả năng khác;
}
}
Mã hó
a
23
Bài toán người du lịch
Bài toán người du lịch
Cón thành phố (được đánh số từ 1 đến n). Một người đi du lịch xuất phát từ
một thành phố muốn đi thăm các thành phố khác, mỗi thành phố đúng một lần

rồi quay về nơi xuất phát. Giả thiết biết được chi phí đi từ thành phố i đến thành
phố j làC[i,j], 1≤ i, j < n.
Hãy tìm 1 hành trình cho người du lịch để tổng chi phítheo hành trình này làít
nhất.
4
1
3
2
1
3
2
1
2
4
0421
4012
2103
1230
Ma trận chi phíC
Mã hó
a
24
Phân tích:
Phân tích:
• Cấu hình lời giải : X[1 n]
–X[1] = 1 được xem làthành phố xuất phát.
–Một hành trình làmột hoán vị của các thành phố 2, ,n.
• Tập khả năng đề cử : {2, 3, , n}
• Cấu hình BESTCONFIG:
–Smin làtổng chi phíthấp nhất đã chọn trong các hành trình tìm

được. Khởi tạo ban đầu cho Smin = Cmax * (n + 1), trong đóCmax
làchi phílớn nhất trong các chi phí C[i, j] đã cho
–BestWay[1 n] : chứa hành trình cóchi phíthấp nhất.
Mã hó
a
25
• Các vấn đề cần thực hiện khi xác định thành phần X[i]:
1.Kiểm tra khả năng đề cử cho thành phần X[i] hợp lệ: khả năng đó
chưa được chọn cho các thành phần trước X[i].
2.Ghi nhận tổng chi phícho hành trình từ X[1] đến X[i].
3.Dự đoán cấu hình lời giải tốt hơn hay xấu hơn BESTCONFIG

×