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

Bài giảng Thiết kế và đánh giá thuật toán: Chia để trị - TS. Lê Nguyên Khôi

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 (264.96 KB, 21 trang )

Thiết Kế & Đánh Giá Thuật Toán
Chia Để Trị
TS. Lê Nguyên Khôi
Trường Đại Học Công Nghệ - ĐHQGHN


Nội Dung
Kỹ thuật thiết kế
 Sắp xếp gộp
 Tính lũy thừa
 Tìm kiếm nhị phân
 Tính số Fibonacci
 Tháp Hanoi
 Nhân ma trận
 Thuật toán Strassen


1


Kỹ Thuật Thiết Kế Chia Để Trị


Chia bài toán lớn thành các bài toán nhỏ
Bài toán nhỏ đơn giản, giải trực tiếp
 Nếu khơng tiếp tục chia nhỏ bài tốn con




Gộp lời giải của các bài toán con



2


Sắp Xếp Gộp (Merge Sort)




Chia: chia đôi mảng
Trị: Sử dụng đệ quy sắp xếp 2 mảng con
Gộp: gộp 2 mảng với thời gian tuyến tính

MergeSort (, 1, )
1
if  = 1 return
2
MergeSort (, 1, /2 )
3
MergeSort (, /2 + 1, )
4
Merge (, 1, /2 , /2 + 1, )

() = 2 (/2) + Θ()
chia và gộp

# bài toán con

độ lớn bài toán con
3



Định Lý Tổng Quát – (nhắc lại)
 =  / + ()

Nếu   ∈ (  ) với hằng số  > 0
 ∈ (  )
2. Nếu   ∈ (  )
 ∈ (  log )
3. Nếu   ∈ "( # ) với hằng số  > 0
và   thỏa mãn  / ≤ %() với % < 1
 ∈ (())
Sắp xếp gộp:  = 2,  = 2 ⇒   = ( ) = 
⇒ trường hợp 2 ⇒ () ∈ ( log )
1.

4


Tính Lũy Thừa
Tính

*
 ,

với  ∈ ℕ

Thuật tốn đơn giản: ()
Thuật tốn áp dụng chia để trị:
*/) ×  */)


* = , (*0)/)

× (*0)/) × 

 chẵn
 lẻ

() = (/2) + (1) ⇒ () ∈ (log )
5


Tính Lũy Thừa
Thuật tốn áp dụng chia để trị:
*/) ×  */)

*
 = , (*0)/)

× (*0)/) × 
PowerN(, )
1
if  = 0 return 1
2
if %2 = 0
3
4
5

return PowerN

else

*
,
)

return PowerN(,

 chẵn
 lẻ

*
×PowerN(, )
)

*0
)
)

×PowerN(,

*0

)



() = 2 (/2) + (1) ⇒ () ∈ () ⇒ SAI !!!!
6



Tính Lũy Thừa
Thuật tốn áp dụng chia để trị:
*/) ×  */)

*
 = , (*0)/)

× (*0)/) × 
PowerN(, )
1
if  = 0 return 1
2
if %2 = 0

3
4
5
6
7

 chẵn
 lẻ

*

2 ← PowerN ,
)
return 2 × 2
else


*0

2 ← PowerN(,
)
)
return 2 × 2 × 

() = (/2) + (1) ⇒ () ∈ (log )
7


Tìm Kiếm Nhị Phân
Tìm một phần tử trong dãy đã sắp xếp
 Chia: Kiểm tra phần tử chính giữa
 Trị: Sử dụng đệ quy tìm kiếm trên 1 mảng
con tương ứng
 Gộp: hiển nhiên
Ví dụ: Tìm 9
3
5
7

8

9

12

15

8


Tìm Kiếm Nhị Phân – Phân Tích
() = 1 (/2) + (1)
# bài-toán-con

chia và gộp

độ lớn bài toán con

Áp dụng Định Lý Tổng Quát
  = ( 0 = 4 = 1
⇒ trường hợp 2
⇒  ∈    log  = (log )
9


Tính Số Fibonacci
=0,1
5* = ,
5*0 +5*)  ≥ 2
0

1

1

2


3

5

8

13

21 …

Thuật toán đệ quy: 7(8 * ) (thời gian hàm mũ),
với 8 = (1 + 5)/2 – golden ratio

10


Tính Số Fibonacci
Thiết kế Bottom-up:
 Tính lần lượt 54 , 50 , 5) , …, 5* theo thứ tự, số
sau bằng tổng hai số trước




Thời gian chạy: ()

5* = 8 * / 5 làm trịn
Tính lũy thừa: (log )



Tuy nhiên cách này khơng đáng tin cậy, do dễ có lỗi
làm trịn khi tính tốn với số thực.

11


Tháp Hanoi


Chuyển chồng đĩa từ A sang B sử dụng C
trung gian. Đĩa to luôn ở dưới đĩa nhỏ

move(, , ;, <)
1
if  = 1
2
chuyển đĩa A sang B
3
else
4
move( = 1, , <, ;)
5
chuyển đĩa A sang B
6
move( = 1, <, ;, )
() = 2 ( = 1)
(1)
12



Nhân Ma Trận



Input:  = >? , ; = >?
Output: < = %>? =  ∙ ;
với A, B = 1, 2, … ,  và
*

%>? = C >D ∙ D?
DE0

13


Nhân Ma Trận – Mã Giả
for A ← 1 to  do
for B ← 1 to  do
%>? ← 0
for F ← 1 to  do
%>? ← %>? + >D ∙ D?
Thời gian chạy (G )

14


Nhân Ma Trận – Chia-Để-Trị
Ý tưởng:

 ×  MT = 2 × 2 MT của (/2) × (/2) MT-con


H
J

H = M + N
I =  + ℎ
J = %M + LN

K = % + Lℎ

I

=
K
%

M


L N




< =∙;
8 nhân
4 cộng

*
*

( ) × ( ) MT-con
)
)
*
*
( ) × ( ) MT-con
)
)
15


Nhân Ma Trận – Phân Tích
() = 8 (/2) +
# bài-toán-con

)
( )

chia và gộp

độ lớn bài toán con






Q
(



=
=
⇒ trường hợp 1
⇒ () ∈ (G )
Không tốt hơn !!!

G


16


Nhân Ma Trận – Thuật Tốn Strassen


Nhân 2 × 2 ma trận với 7 phép nhân

R0 =  · (– ℎ)
R) = ( + ) · ℎ
RG = (% + L) · M

RV = L · (N– M)
RU = ( + L) · (M + ℎ)

RW = (– L) · (N + ℎ)

RX = (– %) · (M + )

H = RU + RV – R) + RW

I = R0 + R)
J = RG + RV
K = RU + R0 – RG – RX

7 nhân, 18 cộng/trừ.

17


Nhân Ma Trận – Thuật Toán Strassen
Chia: Chia  và ; thành (/2) × (/2)
ma trận con.
 Trị: Thực hiên đệ quy 7 phép nhân
(/2) × (/2) ma trận




Gộp: Tạo ma trận < sử dụng + và – trên
(/2) × (/2) ma trận con
() = 7 (/2) + () )
18


Thuật Tốn Strassen – Phân Tích
() = 7 (/2) + () )
  = ( X = ).Q0 ⇒ () ∈ ( X )
log 7 = 2.81 trông không nhỏ hơn 3 là mấy.
Tuy nhiên, nên nhớ sự khác biệt là số mũ.
Do đó thời gian chạy sẽ bị ảnh hưởng rất nhiều.

Trên thực thế, thuật toán Strassen’s tốt hơn
thuật tốn nhân ma trận thơng thường với
 ≥ 32
19


Tổng Kết
Chia để trị chỉ là một trong những
phương pháp thiết kế thuật tốn.
 Thuật tốn chia để trị có thể được phân
tích dựa trên quy nạp và phương pháp
định lý tổng quát.
 Thông thường phương pháp chia để trị
khá hiệu quả.


20



×