Bài giảng Phân tích và thiết kế giải thuật - Chương 3: Chiến lược giảm-để-trị (Decrease-and-conquer) - Dương Tuấn Anh

Chương 3  
Chiến lược giảm-để-trị  
(Decrease-and-conquer)  
1
Nội dung  
1. Chiến lược giảm-để-trị  
2. Sắp thứ tự bằng phương pháp chèn  
3. Các giải thuật duyệt đồ thị  
4. Sắp xếp tôpô  
5. Giải thuật sinh các hoán vị từ một tập  
2
1. Chiến lược thiết kế giải thuật giảm-để-trị  
(Decrease-and-conquer)  
Kỹ thuật thiết kế giải thuật giảm-để-trị lợi dụng  
mối liên hệ giữa lời giải cho một thể hiện của  
một bài toán và lời giải cho một thể hiện nhỏ  
hơn của cùng một bài toán.  
Có ba biến thể của chiến lược này.  
Giảm bởi một hằng số (decrease by a constant)  
Giảm bởi một hệ số (decrease by a factor)  
Giảm kích thước của biến (variable size decrease)  
Sắp thứ tự bằng phương pháp chèn (insertion  
sort) là một thí dụ điển hình của chiến lược  
giảm-để-trị.  
3
Chiến lược thiết kế giải thuật giảm-để-trị (tt.)  
Giải thuật tìm ước số chung lớn nhất của 2 số theo công  
thức gcd(m,n) = gcd(n, m mod n) cũng là thí dụ của chiến  
lược giảm-để-trị theo lối giảm kích thước của biến.  
Algorithm Euclid(m,n)  
/* m,n : two nonnegative  
integers m and n */  
while n<>0 do  
r := m mod n;  
m:= n;  
Thí dụ: m = 60 và n = 24  
2) m = 60 và n = 24  
3) m = 24 và n = 12  
4) m = 12 và n = 0  
n:= r  
Vậy 12 là ước số chung lớn nhất  
endwhile  
return m;  
4
Chiến lược thiết kế giải thuật giảm-để-trị (tt.)  
Tại mỗi bước của giải thuật duyệt đồ thị theo  
chiều sâu trước (DFS) hay duyệt theo bề rộng  
trước (BFS), giải thuật đánh dấu đỉnh đã được  
viếng và tiến sang xét các đỉnh kế cận của đỉnh  
đó.  
Hai giải thuật duyệt đồ thị này đã áp dụng kỹ  
thuật giảm-bớt-một (decrease-by-one), một  
trong 3 dạng chính của chiến lược Giảm-để-trị.  
5
2. Sắp thứ tự bằng phương pháp chèn  
Ý tưởng :  
•
Xét một ứng dụng của kỹ thuật “giảm để trị” vào việc sắp  
thứ tự một mảng a[0..n-1]. Theo tinh thần của kỹ thuật, ta  
giả sử rằng bài toán nhỏ hơn: sắp thứ tự một mảng a[0..n-2]  
đã được thực hiện. Vấn đề là phải chèn phần tử a[n-1] vào  
mảng con đã có thứ tự a[0..n-2].  
•
Có hai cách để thực hiện điều này.  
- Một là ta duyệt mảng con đã có thứ tự từ trái sang phải cho  
đến khi tìm thấy phần tử đầu tiên lớn hơn hay bằng với phần  
tử a[n-1] và chèn phần tử a[n-1] vào bên trái phần tử này.  
- Hai là ta duyệt mảng con đã có thứ tự từ phải sang trái cho  
đến khi tìm thấy phần tử đầu tiên nhỏ hơn hay bằng với phần  
tử a[n-1] và chèn phần tử a[n-1] vào bên phải phần tử này.  
6
2. Sắp thứ tự bằng phương pháp chèn (tt.)  
Cách thứ hai thường được chọn:  
a[0] ≤ … ≤ a[j] < a[j+1] ≤ … ≤ a[i-1] | a[i] … a[n-1]  
390 → 205  
→ 182  
→ 45  
45  
205  
182  
45  
390  
182  
45  
205  
390  
45  
182  
205  
390  
235  
182  
→ 205  
235  
235  
235  
235  
390  
7
Giải thuật sắp thứ tự bằng phương pháp chèn  
procedure insertion;  
var i; j; v:integer;  
begin  
for i:=2 to N do  
begin  
v:=a[i]; j:= i;  
while a[j-1]> v do  
begin  
a[j] := a[j-1]; // pull down  
j:= j-1 end;  
a[j]:=v;  
end;  
end;  
8
Những lưư ý về giải thuật insertion sort  
•
Chúng ta dùng một trị khóa “cầm canh” (sentinel) tại  
a[0], làm cho nó nhỏ hơn phần tử nhỏ nhất trong mảng.  
2. Vòng lặp ngoài của giải thuật được thực thi N-1 lần.  
Trường hợp xấu nhất xảy ra khi mảng đã có thứ tự đảo  
ngược. Khi đó, vòng lặp trong được thực thi với tổng số  
lần sau đây:  
(N-1) + (N-2) + ... + 1 =N(N-1)/2  
=O(N2)  
Số bước chuyển = N(N-1)/2 Số so sánh = N(N-1)/2  
3. Trung bình có khoảng chừng (i-1)/2 so sánh được thực  
thi trong vòng lặp trong. Do đó, trong trường hợp trung  
bình, tổng số lần so sánh là:  
(N-1)/2 + (N-2)/2 + ... + 1/2 =N(N-1)/4  
=O(N2)  
9
Độ phức tạp của sắp thứ tự bằng phương pháp  
chèn  
Tính chất 1.2: Sắp thứ tự bằng phương pháp chèn  
thực thi khoảng N2/2 so sánh và N2/4 hoán vị trong  
trường hợp xấu nhất.  
Tính chất 1.3: Sắp thứ tự bằng phương pháp chèn  
thực thi khoảng N2/4 so sánh và N2/8 hoán vị trong  
trường hợp trung bình.  
Tính chất 1.4: Sắp thứ tự bằng phương pháp chèn có  
độ phức tạp tuyến tính đối với một mảng đã gần có  
thứ tự.  
10  
3. Các giải thuật duyệt đồ thị  
Có nhiều bài toán được định nghĩa theo đối tượng và các kết nối  
giữa các đối tượng ấy.  
Một đồ thị là một đối tượng toán học mà mô tả những bài toán  
như vậy.  
Các ứng dụng trong các lãnh vực:  
Giao thông  
Viễn thông  
Điện lực  
Mạng máy tính  
Cơ sở dữ liệu  
Trình biên dịch  
Các hệ điều hành  
Lý thuyết đồ thị  
11  
Một thí dụ  
A
H
I
B
C
G
D
E
J
L
K
F
M
Hình 3.1a Một đồ thị thí dụ  
12  
Cách biểu diễn đồ thị  
Ta phải ánh xạ các tên đỉnh thành những số nguyên trong  
tầm trị giữa 1 và V.  
Giả sử có tồn tại hai hàm:  
- hàm index: chuyển đổi từ tên đỉnh thành số nguyên  
- hàm name: chuyển đổi số nguyên thành tên đỉnh.  
Có hai cách biểu diễn đồ thị:  
- dùng ma trận kế cận  
- dùng tập danh sách kế cận  
13  
Cách biểu diễn ma trận kế cận  
A B C D E F G H I J K L M  
A 1 1 1 0 0 1 1 0 0 0 0 0 0  
B 1 1 0 0 0 0 0 0 0 0 0 0 0  
C 1 0 1 0 0 0 0 0 0 0 0 0 0  
D 0 0 0 1 1 1 0 0 0 0 0 0 0  
E 0 0 0 1 1 1 1 0 0 0 0 0 0  
F 1 0 0 1 1 1 0 0 0 0 0 0 0  
G 1 0 0 0 1 0 1 0 0 0 0 0 0  
H 0 0 0 0 0 0 0 1 1 0 0 0 0  
I 0 0 0 0 0 0 0 1 1 0 0 0 0  
J 0 0 0 0 0 0 0 0 0 1 1 1 1  
K 0 0 0 0 0 0 0 0 0 1 1 0 0  
L 0 0 0 0 0 0 0 0 0 1 0 1 1  
M 0 0 0 0 0 0 0 0 0 1 0 1 1  
Một ma trận V  
hàng V cột chứa  
các giá trị Boolean  
mà a[x, y] là true if  
nếu tồn tại một  
cạnh từ đỉnh x đến  
đỉnh y và false nếu  
ngược lại.  
Hình 3.1b: Ma trận kế  
cận của đồ thị ở hình  
3.1a  
14  
Giải thuật  
program adjmatrix (input, output);  
const maxV = 50;  
var j, x, y, V, E: integer;  
a: array[1..maxV, 1..maxV] of boolean;  
begin  
Lưu ý: Mỗi cạnh tương  
ứng với 2 bit trong ma  
trận: mỗi cạnh nối giữa  
x và y được biểu diễn  
bằng giá trị true tại cả  
a[x, y] và a[y, x].  
readln (V, E);  
for x: = 1 to V do /*initialize the matrix */  
for y: = 1 to V do a[x, y]: = false;  
for x: = 1 to V do a[x, x]: = true;  
for j: = 1 to E do  
Để tiện lợi giả định rằng  
có tồn tại một cạnh nối  
mỗi đỉnh về chính nó.  
begin  
readln (v1, v2);  
x := index(v1); y := index(v2);  
a[x, y] := true; a[y, x] := true  
end;  
end.  
15  
Cách biểu diễn bằng tập danh sách kế cận  
Trong cách biểu diễn này, mọi đỉnh mà nối tới một  
đỉnh được kết thành một danh sách kế cận  
(adjacency-list ) cho đỉnh đó.  
program adjlist (input, output);  
const maxV = 100;  
type link = ↑node  
node = record v: integer; next: link end;  
var j, x, y, V, E: integer;  
t, x: link;  
adj: array[1..maxV] of link;  
16  
begin  
readln(V, E);  
Lưu ý: Mỗi cạnh trong đồ  
thị tương ứng với hai nút  
trong tập danh sách kế cận.  
new(z); z↑.next: = z;  
for j: = 1 to V do adj[j]: = z;  
for j: 1 to E do  
Số nút trong tập danh sách  
kế cận bằng 2|E|.  
begin  
readln(v1, v2);  
x: = index(v1); y: = index(v2);  
new(t); t↑.v: = x; t↑.next: = adj[y];  
adj[y]: = t; /* insert x to the first element of  
y’s adjacency list */  
new(t); t↑.v = y; t↑.next: = adj[x];  
adj[x]:= t; /* insert y to the first element of  
x’s adjacency list */  
end;  
end.  
17  
a b c d e f g h i j k l m  
f
a
a
f
g
a
e
d
e
i
h
k
j
j
j
c
e
f
a
l
m
l
b
g
d
m
Hình 3.1c: Biểu diễn bằng tập danh  
sách kế cận của đồ thị ở hình 3.1  
18  
So sánh hai cách biểu diễn đồ thị  
Nếu biểu diễn đồ thị bằng tập danh sách kế cận, việc  
kiểm tra xem có tồn tại một cạnh giữa hai đỉnh u và v sẽ  
có độ phức tạp thời gian O(V) vì có thể có O(V) đỉnh tại  
danh sách kế cận của đỉnh u.  
Nếu biểu diễn đồ thị bằng ma trận kế cận, việc kiểm tra  
xem có tồn tại một cạnh giữa hai đỉnh u và v sẽ có độ  
phức tạp thời gian O(1) vì chỉ cần xem xét phần tử tại vị  
trí (u,v) của ma trận.  
Biểu diễn đồ thị bằng ma trận kế cận gây lãng phí chỗ  
bộ nhớ khi đồ thị là một đồ thị thưa (không có nhiều  
cạnh trong đồ thị, do đó số vị trí mang giá trị 1 là rất ít)  
19  
Các phương pháp duyệt đồ thị  
Duyệt hay tìm kiếm trên đồ thị: viếng mỗi đỉnh/nút  
trong đồ thị một cách có hệ thống.  
Có hai cách chính để duyệt đồ thị:  
- duyệt theo chiều sâu trước (depth-first-search )  
- duyệt theo chiều rộng trước (breadth-first-search).  
20  
Tải về để xem bản đầy đủ
pdf 47 trang myanh 22700 Free
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Phân tích và thiết kế giải thuật - Chương 3: Chiến lược giảm-để-trị (Decrease-and-conquer) - Dương Tuấn Anh", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_phan_tich_va_thiet_ke_giai_thuat_chuong_3_chien_lu.pdf