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

Bài giảng chuyên đề phân tích và thiết kế thuật toán chia để trị

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 (171.01 KB, 27 trang )

Chia để trị
Bài giảng chuyên đề "Phân tích thiết kế thuật toán"

Ngày 4 tháng 5 năm 2020

Chia để trị

1 / 20


Nôi dung

1

Ý tưởng chia để trị

2

Lược đồ giải thuật

3

Một số bài tốn điển hình

Chia để trị

2 / 20


Ý tưởng chia để trị


Nội dung

1

Ý tưởng chia để trị

2

Lược đồ giải thuật

3

Một số bài tốn điển hình

Chia để trị

2 / 20


Ý tưởng chia để trị

Ý tưởng

Phương pháp thiết kế dựa trên hai thao tác chính:
Chia (Divide): phân rã bài tốn ban đầu thành các bài tốn con
có kích thước nhỏ hơn, có cùng cách giải.
Trị (Conquer ): giải từng bài toán con (theo cách tương tự bài
toán đầu - đệ qui) rồi tổng hợp các lời giải để nhận kết quả của
bài toán ban đầu.
Việc “phân rã” được thực hiện trên miền dữ liệu (chia miền dữ liệu

thành các miền nhỏ hơn tương đương với một bài toán con)

Chia để trị

3 / 20


Lược đồ giải thuật

Mơ hình - Lược đồ giải thuật
Mơ hình
Xét bài tốn trên miền dữ liệu R
D&C(R) là hàm thể hiện cách giải bài toán trên miền dữ liệu R
theo phương pháp chia để trị.
Nếu R có thể phân rã thành n miền con: R = R1 ∪ R2 ∪ ... ∪ Rn
Lược đồ giải thuật
D&C(R)
if (R = R0 )
Giải D&C(R0 )
else {
Chia miền R thành R1 , R2 , ..., Rn
for ( i = 1; i<=n;i++)
Giải D&C(Ri );
Tổng hợp kết quả;
}
Chia để trị

4 / 20



Một số bài tốn điển hình

Nội dung

1

Ý tưởng chia để trị

2

Lược đồ giải thuật

3

Một số bài tốn điển hình

Chia để trị

4 / 20


Một số bài tốn điển hình

Bài tốn tìm kiếm nhị phân trên mảng được sắp

Bài tốn 1
Cho mảng a có n phần tử được sắp theo thứ tự tăng dần và một giá
trị x bất kỳ. Kiểm tra xem phần tử x có trong mảng hay khơng?

Chia để trị


5 / 20


Một số bài tốn điển hình

Bài tốn tìm kiếm nhị phân trên mảng được sắp

Bài tốn 1
Cho mảng a có n phần tử được sắp theo thứ tự tăng dần và một giá
trị x bất kỳ. Kiểm tra xem phần tử x có trong mảng hay khơng?
Ý tưởng: Chia đơi mảng, mỗi lần so sánh phần tử giữa với x, nếu
phần tử x nhỏ hơn thì xét nửa trái, ngược lại xét nửa phải

Chia để trị

5 / 20


Một số bài tốn điển hình

Bài tốn tìm kiếm nhị phân trên mảng được sắp
Lược đồ thuật toán
BinarySearch(a, x, l, r)
if (l == r)
(x == al ) ? l: -1;
else
m = (m+l)/2;
if (x = am )
return m;

else
if (x < am )
BinarySearch (a,x,l,m-1);
else
BinarySearch (a, x, m+1,r)

Chia để trị

6 / 20


Một số bài tốn điển hình

Bài tốn sắp xếp mảng

Bài tốn 2
Cho mảng a có n phần tử. Hãy sắp xếp mảng theo thứ tự tăng dần
(giảm dần).

Chia để trị

7 / 20


Một số bài tốn điển hình

Bài tốn sắp xếp mảng

Bài tốn 2
Cho mảng a có n phần tử. Hãy sắp xếp mảng theo thứ tự tăng dần

(giảm dần).
Ý tưởng:
Chọn ngẫu nhiên một phần tử chốt x.
Chia mảng ban đầu thành hai mảng con: mảng con trái và mảng
con phải
Mảng con bên trái gồm các phần tử nhỏ hơn phần tử chốt
Mảng con bên phải gồm các phần tử lớn hơn phần tử chốt.

Sắp xếp mảng con trái, và mảng con phải

Chia để trị

7 / 20


Một số bài tốn điển hình

Bài tốn sắp xếp mảng
Ví dụ

Chia để trị

8 / 20


Một số bài tốn điển hình

Bài tốn sắp xếp mảng
Phân hoạch ngay trên mảng


Duyệt mảng từ bên trái (theo chỉ số i) trong khi còn ai < x.
Duyệt mảng từ bên phải (theo chỉ số j) trong khi còn aj > x.
Đổi chỗ ai và aj nếu hai phía chưa vượt qua nhau...tiếp tục quá
trình duyệt và đổi chỗ như trên nếu i ≤ j

Chia để trị

9 / 20


Một số bài tốn điển hình

Bài tốn sắp xếp mảng
QuickSort(a, l, r)
i = l; j = r; x = a[(l+r)/2];
while (i<=j){
while (a[i] < x) i++;
while (a[j] > x) j–-;
if (i<=j){
đổi chỗ a[i] và a[j];
i++;
j–-;
}
}
if (lQuickSort(a,l,j);
if (r>i)
QuickSort(a,i,r);
Chia để trị


10 / 20


Một số bài tốn điển hình

Bài tốn sắp xếp
Ví dụ- step by step

Chia để trị

11 / 20


Một số bài tốn điển hình

Bài tốn MinMax

Bài tốn 3
Cho mảng a có n phần tử. Tìm giá trị lớn nhất (max ), giá trị nhỏ
nhất (min) trong đoạn al ...ar của mảng.

Chia để trị

12 / 20


Một số bài tốn điển hình

Bài tốn MinMax


Bài tốn 3
Cho mảng a có n phần tử. Tìm giá trị lớn nhất (max ), giá trị nhỏ
nhất (min) trong đoạn al ...ar của mảng.
Ý tưởng:
Tại mỗi bước chia đôi đoạn cần tìm rồi tìm min, max của từng
đoạn. Sau đó, tổng hợp lại kết quả;
Nếu đọan chỉ có 1 phần tử thì min = max và bằng phần tử đó.

Chia để trị

12 / 20


Một số bài tốn điển hình

Bài tốn MinMax

min(a, l, r)
if (l==r)
return
else
min1 =
min2 =
return

a[l];
min (a, l, (l+r)/2);
min (a, (l+r)/2 + 1, r);
(min1 < min2)?min1: min2;


Chia để trị

13 / 20


Một số bài tốn điển hình

Bài tốn nhân ma trận vng
Thuật tốn nhân ma trận vng thơng thường

C11 C12
A11 A12
B11 B12
=
×
C21 C22
A21 A22
B21 B22
trong đó:
C11 = A11 B11 + A12 B21
C12 = A11 B12 + A12 B22
C21 = A21 B11 + A22 B21
C22 = A21 B12 + A22 B22

Chia để trị

14 / 20


Một số bài tốn điển hình


Bài tốn nhân ma trận vng
Thuật tốn nhân ma trận Strassen

C11
C12
C21
C22

= P5 + P4 − P2 + P6
= P1 + P2
= P3 + P4
= P1 + P5 − P3 − P7

trong đó:
P1
P2
P3
P4
P5
P6
P7

= A11 (B12 − B22 )
= (A11 + A12 )B22
= (A21 + A22)B11
= (A22 )(B21 − B11 )
= (A11 + A22 )(B11 + B22 )
= (A12 − A22 )(B21 + B22 )
= (A11 − A21 )(B11 + B12 )

Chia để trị

15 / 20


Một số bài tốn điển hình

Thuật tốn nhân ma trận Strassen

Chia để trị

16 / 20


Một số bài tốn điển hình

Bài tốn lát gạch

Bài tốn 5
Cho một nền nhà hình vng, kích thước 2n × 2n . Người ta dành riêng
một ơ để thốt nước. Hãy tìm cách xếp những viên gạch hình chữ L
trên nền nhà, sao cho nền nhà được lát kín gạch (trừ ơ vng được
dùng để thốt nước).

Chia để trị

17 / 20


Một số bài tốn điển hình


Bài tốn lát gạch

Bài tốn 5
Cho một nền nhà hình vng, kích thước 2n × 2n . Người ta dành riêng
một ơ để thốt nước. Hãy tìm cách xếp những viên gạch hình chữ L
trên nền nhà, sao cho nền nhà được lát kín gạch (trừ ơ vng được
dùng để thốt nước).

Chia để trị

17 / 20


Một số bài tốn điển hình

Bài tốn lát gạch

Hình 1: Lát nền nhà kích thước 2 × 2

Chia để trị

18 / 20


Một số bài tốn điển hình

Bài tốn lát gạch

Hình 1: Lát nền nhà kích thước 2 × 2


Ý tưởng: Làm cách nào đó, giảm kích thước nền nhà về kích thước
2 × 2 với 1 ơ trống để giải nó.

Chia để trị

18 / 20


×