1. Trang chủ
  2. » Công Nghệ Thông Tin

Thuật toán nâng cao

120 317 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 120
Dung lượng 804,28 KB

Nội dung

Knuth, Kỹ thuật nhánh và cận branch and bound Kỹ thuật biến ựổi Fourier Fourier transform Thuật toán di truyền genetic algorithm Tìm hiểu và trình bày về chủ ựề Minh hoạ và giải thắch ph

Trang 1

Thuật toán nâng cao

Nguyễn Thanh Bình

Khoa Công nghệ Thông tin

Trường ựại học Bách khoa

đại học đà Nẵng

2

Mục ựắch

giải quyết bài toán

Trang 2

Tài liệu tham khảo

1 Introduction to algorithms, T.H Cormen, C.E Leiserson,

R.R Rivest, Mit Press 1990

2 Type de Données et Algorithmes, M-C Gaudel, M Soria, C

Froidevaux, Ediscienne international, 1993

3 Cours Complexité, M Daniel, ESIL, 2006

4 Data structures and algorithms, Alfred V Aho, John E

Hopcroft, Addison-Wesley, 1983

5 Algorithm Analysis and Computational Comlexity, Ian

Parberry, Lecture Notes, University of North Texas, 2001

6 The Art of Computer Programming, Volume 2, D Knuth,

Kỹ thuật nhánh và cận (branch and bound)

Kỹ thuật biến ựổi Fourier (Fourier transform)

Thuật toán di truyền (genetic algorithm)

Tìm hiểu và trình bày về chủ ựề

Minh hoạ và giải thắch phương pháp bởi ắt nhất 2 vắ dụ

cụ thể

đánh giá và phân tắch giải pháp các vắ dụ

Học viên tự tìm kiếm các tài liệu liên quan ựến chủ ựề

Báo cáo từ 10 ựến 20 trang

Báo cáo phải trắch dẫn rỏ ràng các tài liệu tham khảo

Giới thiệu (1)

Nguyễn Thanh Bình

Khoa Công nghệ Thông tin

Trường ựại học Bách khoa

đại học đà Nẵng

8

Giới thiệu

Thuật toán là một dãy xác ựịnh các thao tác cơ bản áp dụng trên dữ liệu vào nhằm ựạt ựược giải pháp cho một vấn ựề

Tìm một giải pháp hiệu quả

Phân biệt giải thuật và chương trình

Chương trình là cài ựặt thuật toán bằng một ngôn ngữ lập trình

Trang 3

Giới thiệu

(input) và tạo các dữ liệu ra (output)

nếu thuật toán dừng cho kết quả ñúng với

mọi dữ liệu vào

liệu vào chứ không chỉ là một mẫu dữ liệu vào

Trang 4

Giới thiệu

So sánh hai phần tử liên tiếp nhau từ trái qua phải,

nếu không ñúng thứ tự thì hoán ñổi vị trí chúng

n = n – 2endwhile

15

Giới thiệu

Các thao tác trong thuật toán phải ñược ñặc tả chặt chẽ

Ở mỗi bước thực thi, bước tiếp theo sẽ ñược thực thi phải

p = 1for i from 1 to n do

p = p * i;

endforend

gt2 (n)begin

if (n = 0) return (1)else

return (n*gt(n-1))endif

end

Trang 5

Kêt hợp ngôn ngữ tự nhiên và các kí hiệu toán học

 Sơ ñồ khối, ngôn ngữ giả, …

Ngôn ngữ giả tựa C/Pascal kết hợp ngôn ngữ tự nhiên

if (ñiều kiện) then

…else

…endif

for … from … to … do

…endfor

while () do

…endwhile

19

Giới thiệu

ñặt chúng vào trong 15 ngăn kéo Chúng ta

cần phải thực hiện thế nào ñể có thể lấy ñược

loại ñinh chúng ta cần một cách nhanh nhất?

Trường hợp xấu nhất: phải mở 15 ngăn kéo

Trường hợp trung bình: giả sử xác xuất lấy các loại ñinh ngang nhau, phải mở 8 ngăn kéo

Nếu những loại ñinh trong các ngăn kéo cuối cùng luôn ñược sử dụng, cần nhiều lần mở các ngăn kéo

8 2 16

* 15

* 15

1 15

1 15

i

Trang 6

Giới thiệu

Giải pháp Las Vegas

Chúng ta chọn ngăn kéo ñể mở một cách ngẫu nhiên

Nếu may mắn, chúng ta có loại ñinh cần lấy

Nếu không, chúng ta loại bỏ ngăn kéo vừa mở, thực

hiện mở ngăn kéo khác một cách ngẫu nhiên

8151

31311413

*1514214115141

15

1 =

=++

Xếp vào các ngăn kéo theo thứ tự trên

Nếu lại mở các ngăn kéo từ trái sang phải thì sẽ không thu ñược lợi ích gì

Mở các ngăn kéo theo phương pháp tìm kiếm nhị phân

Trường hợp xấu nhất: 4 lần mở ngăn kéo

Trường hợp trung bình: 3.26

Giải pháp chỉ có ý nghĩa khi chúng ta thường xuyên mởcác ngăn kéo lấy ñinh

26.34158315421521151

=+++

23

Giới thiệu

Thuật toán nhân hai số nguyên

Thuật toán nhân Bắc Mỹ

Trang 7

Giới thiệu

Thuật toán nhân Ả-rập

So sánh ñộ hiệu quả các thuật toán ?

282420

211815

141210

0706

0 5

ðếm số phép toán nhân và cộng ñược thực hiện

Thuật toán nhân Bắc Mỹ và thuận toán nhân Anh ñều sửdụng 12 phép nhân và 15 phép cộng

Thuật toán Ả-rập sử dụng 12 phép nhân và 20 phép cộng

Số phép toán phụ thuộc vào số chữ số của mỗi số nguyên

Số phép nhân bằng m*n với m và n lần lượt là số chữ số của mỗi số nguyên

3159042

1579524

789768

3948817

1974435

987270

4936141

2468283

1234567

699678

Ưu ñiểm: không cần ghi nhớ các kết quảnhân trung gian, chỉcần thực hiện phép cộng và chia cho 2

28

Giới thiệu

Thuật toán nhân « chia ñể trị »

Số chữ số của hai số nguyên phải bằng nhau và phải bằng luỹ thừa 2

Nếu số chữ số của hai số nguyên khác nhau thì thêm vào các

Trang 8

Thuật toán nhân « chia ñể trị »

Giảm số phép nhân a và b bởi các nữa của a và b từ 4 xuống còn 3

Số phép nhân sử dụng bởi thuật toán này ñược ñánh giá

y = xendiffor i from 1 to n do

y = y * xendfor

Trang 9

Ý tưởng: sử dụng các kết quả trung gian

Nguyên tắc: nếu n/2 = 0 thì xn= xn/2* xn/2 nếu không thì

1. Biểu diễn n bởi dãy nhị phân

2. Thay mỗi bít nhị phân

Biểu diễn n bởi dãy nhị phân: ek-1ek-2…e0

if ek-1= 0 then

y = 1 // khi n = 0else

y = xendif

for i from k-2 to 0 do

y = y * y

if ei= 1 then

y = y * xendif

1

số phép nhâny

ei

Trang 10

Giới thiệu

Thuật toán nhị phân: giải thích

Biểu diễn nhị phân của n:

Giả sử chúng ta ñang trong quá trình tính xn Gọi j là vị trí

bít bên cuối cùng (trái nhất) biểu diễn n, yjlà kết quả cuối

cùng có ñược Ban ñầu: j = p, yp= x = xAp

Có hai khả năng của Aj-1

Aj-1= 1 Thay thế Aj-1bởi SX Vậy yj-1= yj2* x

Aj-1= 0 Thay thế Aj-1bởi S Vậy yj-1= yj2

Cả hai trường hợp: yj-1= yj2* xAj-1

Vậy: yp-1= yp * xAp-1= (xAp)2* xAp-1 = x2Ap + Ap-1

Bằng truy hồi:

∑=

i i

i A

n A

x x

y

p i i

=

= ∑=0 21

Tuy nhiên, chúng ta có thể tính x15bởi:

x2, x3, x6, x12, x15= x12* x3Nghĩa là chỉ cần sử dụng 5 phép nhân

Trang 11

Chứng minh sự ựúng ựắn

(2)

Nguyễn Thanh Bình

Khoa Công nghệ Thông tin

Trường ựại học Bách khoa

đại học đà Nẵng

42

Phân tắch thuật toán

ựợi sau một số bước thực hiện

Chứng minh rằng thuật toán cho kết quả ựúng với

mọi dữ liệu vào

44

Ưu nhược ựiểm

-Khó thực hiện

-Không thể áp dụng cho các thuật toán phức tạp

-Không bảo ựảm hoàn toàn tắnh ựúng ựắn

Nhược ựiểm

-Bảo ựảm tắnh ựúng ựắn

-đơn giản hơn

-Dễ thực hiện

Ưu ựiểm

Lý thuyếtThực nghiệm

Trang 12

Chứng minh sự ñúng ñắn

46

Tiền ñiều kiện và hậu ñiều kiện

 Tiền ñiều kiện (preconditions)

Các tính chất mà dữ liệu vào phải thoả mãn

 Hậu ñiều kiện (postconditions)

Các tính chất mà kết quả của thuật toán phải thoả mãn

Trạng thái của thuật toán

 Trạng thái của thuật toán

là tập các giá trị tương ứng với tất cả các biến ñược sử

dụng trong thuật toán

thay ñổi

nó thoả mãn hậu ñiều kiện

Trang 13

 Chứng minh ñúng ñắn một phần (partial correctness)

 Chứng minh rằng khi dữ liệu vào thoả mãn tiền ñiều kiện thìkết quả thuật toán sẽ thoả mãn hậu ñiều kiện

 Chứng minh ñúng ñắn toàn phần (total correctness)

 Chứng minh rằng thuật toán ñúng ñắn một phần và thuật toán dừng

 Các bước trung gian trong chứng minh sự ñúng ñắn

 Phân tích trạng thái của thuật toán

 Phân tích sự ảnh hưởng của mỗi bước xử lý ñến trạng thái của thuật toán

51

Chứng minh sự ñứng ñắn

A sẽ

cho kết quả thoả mãn Q

dừng sau một số bước xử lý hữu hạn

Xác ñịnh các tiền ñiều kiệnvàhậu ñiều kiện

Chú thích thuật toán bằng cánh chèn thêm các xác nhận liên quan ñến trạng thái của thuật toán sao cho

tiền ñiều kiện ñược thoả mãn

xác nhận cuối cùng phải bao hàm hậu ñiều kiện

Chứng minhrằng mỗi bước xử lý, thuật toán ñi từ xác nhận trước xử lý ñến xác nhận sau xử lý

Trang 14

-xác nhận cuối cùng bao hàm hậu ñiều kiện

Thì-dãy lệnh tuần tự A ñúng

55

Quy tắc lệnh tuần tự

Hai biến x và y nhận hai giá trị tương ứng a và b Hoán

ñổi giá trị hai biến x và y

Thì

{P} A {Q}

Nghĩa là:

Nếu-tiền ñiều kiện P bao hàm xác nhận ñầu tiên-C có thể ñược ñịnh giá

-cả hai nhánh ñều bao hàm hậu ñiều kiện

Thì-lệnh ñiều kiện A ñúng

Trang 15

1 Nếu nó dừng, nóthoả mãn hậu ñiều kiện

2 Nódừngsau một số bước hữu hạn

phần

59

Bất biến vòng lặp

ðịnh nghĩaMột bất biến vòng lặp I làmột xác nhận thoả mãn:

1. Bất biến vòng lặp ñúng khi bắt ñầu vòng lặp

2. Trong quá trình lặp (tức

là ñiều kiện c ñúng) thìbất biến vòng lặp I luôn ñúng

3. Khi thoát khỏi vòng lặp (tức là ñiều kiện c sai) thì bất biến vòng lặp I phải bao hàm hậu ñiều kiện

Khi xác ñịnh ñược bất biến vòng lặp, nghĩa là ñã

chứng minh ñược thuật toán ñúng ñắn một phần

min (x[1 n])begin

Trang 16

- nếu i=n, m=min(x[j], j=1 n)

chính là hậu ñiều kiện

 T phụ thuộc biến ñếm của vòng lặp p

Sau lần lặp thư nhất p = 1, sau lần lặp thứ hai p = 2, …

Nếu ñiều kiện vòng lặp ñúng,thì ip< n, vậy T(p) > 0Nếu T(p) = 0, thì n – ip = 0Khi ñó ñiều kiện vòng lặp sai

postconditions: ∃i∈[1 n]: a[i]=x, ∀k∈[1 i-1]:a[k]≠x

Chứng minh thuật toán sau là ñúng

timphantu (a[1 n], x)begin

i = 1while (a[i] ≠x) do

i = i + 1endwhilereturn (i)end

Trang 17

-nếu a[i+1]≠x thì a[k] ≠x, k=1 i, nghĩa là I ñúng-nếu a[i+1]=x thì ta có hậu ñiều kiện Q

i = 1while (a[i] ≠x) do

i = i + 1

{ip=ip-1+1}

endwhilereturn (i)end

Nếu ñiều kiện a[ip]≠x ñúng, thìk>ip, vậy T(p) >0

Nếu T(p) = 0, thì k=ip, khi ñó ñiều kiện a[ip]≠x sai

67

Nhận xét

kiện

1 Viết thuật toán tính n! và chứng minh nó ñúng ñắn

2 Thuật toán sau làm gì ? Chứng minh câu trả lời

begin

m = n

k = 0b[0] = m MOD 2

m = m DIV 2while (m ≠0) do

k = k + 1b[k] = m MOD 2

m = m DIV 2endwhileend

Trang 18

Bài tập

3 Thuật toán sau làm gì ? Chứng minh câu trả lời

4 Viết thuật toán tắnh giá trị trung bình các phần tử của

mảng a[1 n] Chứng minh thuật toán ựúng ựắn

// cho b[1 n], ∀i: b[i] = 0 hoặc b[i] = 1

 Phụ thuộc vào dữ liệu vào

 độ phức tạp là một hàm phụ thuộc vào kắch thước n của bộ dữliệu vào

 độ phức tạp có ý nghĩa khi n lớn

 đánh giá ựộ phức tạp thuật toán nhằm

 Nghiên cứu hoạt ựộng của thuật toán

Tối ưu hay không

Phát hiện những phần phức tạp, làm chậm thuật toán

 So sánh các giải pháp khác nhau trong cùng ngữ cảnh

vấn ựề

ngôn ngữ

máy tắnh

Trang 19

thường mâu thuẩn nhau

 Chúng ta thường tìm cách giảm ựộ phức tạp về mặt thời

gian

 bỏ qua ựộ phức tạp về mặt bộ nhớ

 Dẫn ựến

 thường làm tăng ựộ phức tạp về mặt bộ nhớ

 làm tăng ề ựộ phức tạp trắ tuệ Ừ của thuật toán

Thời gian phát triển

Rủi ro xảy ra lỗi

đánh giá một cách chi tiết thuật toán

Tất cả các câu lệnh ựều ựược xem xét

đánh giá riêng rẽ các hoạt ựộng khác nhau

 Thường chỉ ựánh giá tập các thao tác cơ bản

thời gian thực thi thuật toán tỷ lệ thuận với số các thao tác này

Vắ dụ

 Số phép so sánh và trao ựổi dữ liệu ựối với thuật toán sắp xếp

 Số các phép cộng và phép nhân ựối với thuật toán nhân hai ma trận

 Số các truy cập ựĩa ựối với thuật toán thao tác trên CSDL

 Các thao tác cơ bản ựược ựánh giá riêng rẽ

 Sự lựa chọn tập các thao tác cơ bản phụ thuộc

kắch thước dữ liệu

chi tiết cần ựánh giá

khả năng phân tắch

Ầ

Trang 20

Tính ñộ phức tạp

các nguyên tắc tính ñộ phức tạp như sau:

ðối với các thao tác cơ bản là các lệnh tuần tự thì cộng

dồn số các thao tác

ðối với lệnh ñiều kiện, giả sử P(X) là số thao tác cơ bản

của cấu trúc lệnh X, thì:

P(if C then I1else I2) ≤P(C) + max(P(I1), P(I2))

ðối với các lệnh lặp, số các thao tác cơ bản trong vòng

lặp là ∑P(i), trong ñó i biến ñiều khiển lặp, P(i) số thao

tác cơ bản ở lần lặp thứ i

78

Tính ñộ phức tạp

Nếu không có hàm ñệ quy, chúng ta luôn có thể tổchức sao cho mỗi một hàm gọi hàm khác mà số thao tác cơ bản của hàm ñó ñã xác ñịnh

Nếu là hàm ñệ quy, tính số các thao tác cơ bản thường dẫn ñến hệ thức truy hồi

Ví dụ

function factorial(n)Begin

If (n = 1) then

factorial = 1Elsefactorial = n * factorial (n-1)EndIf

End

Thao tác cơ bản: số phép nhân

C(0) = 0C(n) = C(n-1) + 1

 Dữ liệu tương ứng với sự tổ chức ñược xem là trung bình

 Không ñơn giản ñể xác ñịnh

p(d) : xác xuất xuất hiện của d

Trang 21

For i from 1 to nFor j from 1 to nC(i,j) = 0For k from 1 to nC(i,j) = C(i,j) + A(i,k) * B(k,j)EndFor

EndForEndForEnd

Quan hệ: CminA(n) ? CmoyA(n) ? CmaxA(n)

84

Tính ñộ phức tạp: ba trường hợp

q: xác xuất X ở trong danh sách L

X trong L: khả năng xuất hiện tại các vị trí như nhau

Dn,i: tập dữ liệu với X ở vị trí i, p(Dn,i) = q/n

Dn,0: tập dữ liệu với X không thuộc L, p(Dn,0) = 1-q

Trang 22

notations) theo n và thay ñổi của hàm khi mà n rất lớn

87

Các hàm tiệm cận

f = o(g) khi n → ∞nếu:

g(n) là tiệm cận trên của f(n) với mọi hằng số c

g n n fn

88

Các hàm tiệm cận

f = O(g) khi n → ∞nếu:

g(n) là tiệm cận trên của f(n) với một số hằng số c

Nếu f = o(g) thì f = O(g)

f(n) không tăng nhanh hơn g(n)

,

Trang 23

0 2

Trang 24

n f

f = Ω(g)

ñộ phức tạp của f cùng cở ñộ phức tạp của g (theo các hằng số xác ñịnh)

f = Θ(g)

ñộ phức tạp của f ≤ ñộ phức tạp của g (theo các hằng số xác ñịnh)

 Giả sử CminA(n) = 8n2+ 2n + 1 và CminB(n) = 1000n2+ 10n

+ 2 là các hàm biểu diễn thoài gian thực thi của hai phương

pháp cài ñặt cùng một thuật toán trong trường hợp xấu nhất

Xác ñịnh O của hai hàm trên

n

i θ1 1

i

) ( 1 1

2 2

i

i i

) ( 1 1

Trang 25

 Truy hồi bậc hai

 Các họ hệ thức truy hồi thường gặp (tiếp)

 Truy hồi hoàn toàn

tuyến tính:

an= b1an-1 + b2an-2 + … + bk an-k + … + + bn-1 a1 + g(n)

không tuyến tính: …

n-1 hạng ñầu tiên phải có giá trị

 Truy hồi phân hoạch

an= b an/2+ c an/2+ g(n)hoặc dưới dạng: an= c an/b+ g(n), với ñiều kiện n/b

là số nguyên

 Nhiều trường hợp, rất phức tạp ñể giải hệ thức truy hồi

 ðề cập ñến giải hệ thức

truy hồi tuyến tính bậc nhất

Truy hồi tuyến tính thuần nhất bậc 2 hệ số hằng số

truy hồi phân hoạch

∑ bn -i

Trang 26

b b

g y

y

i 2 1 i n

1 i 0

=+

=

b

b b

g (a

a

i 2 1 i n

1 i 0 n

1 i

(gọi là phương trình ñặc trưng của hệ thức truy hồi)

 Trong trường hợp tổng quát, ta thu ñược hai nghiệm phân

Phương trình ñặc trưng của hệ thức truy hồi: r2-r-2=0

Nghiệm của phương trình ñặc trưng: r1= 2 và r2= -1

Trang 27

Hệ thức truy hồi

 Truy hồi tuyến tính thuần nhất bậc 2 hệ số hằng số (3)

 Nếu phương trình ñặc trưng có nghiệm kép thì nghiệm của

Phương trình ñặc trưng của hệ thức truy hồi: r2-4r+4=0

Phương trình ñặc trưng có nghiệm kép: r = 2

vậy, thông thường b = c (= 1)

g(n): chi phí phân tích và trộn các giải pháp con

 Truy hồi phân hoạch (2)

 Thường ñược xét dưới dạng:

k b

1

0

i k k

i i k

1

0 log

i k

i i c n

b

n g c n

=+

Trang 28

n n

i i

) (

1

0 log

i k

i

i c

n

b

n g c n

1

0 2 log 2 + −

k

i i n

n n

a

) 1 2 ( 2

=

− +

=

k k

i i

a

) 1 2 ( log

2 − − +

a

1 log2 +

Trang 29

độ phức tạp thực tế

 Vắ dụ (1)

 đánh giá ựộ phức tạp của thuật toán sắp xếp chèn (insertion sort)

 Mỗi lệnh ựược gán chi phắ (cost) về thời gian thực thi và số lần thực

thi (times) Với mỗi j = 2,3,Ần, kắ hiệu tjlà số lần thực thi lệnh lặp

// chèn A[j] vào mảng ựã ựược sắp xếp A[1 j-1]

While (i > 0 and A[i] > key) do c4

Tổng thời gian thực thi là

độ phức tạp trong trường hợp tốt nhất: danh sách ựã ựược sắp xếp ựúng thứ tự, khi ựó tj= 1 với mọi j Vậy:

1()1(

2 4 3 2

=

n c t c t c t c n c n c n c n

n

j j

115

độ phức tạp thực tế

 Vắ dụ (2)

 độ phức tạp trong trường hợp xấu nhất: danh sách ựã ựược

sắp xếp theo thứ tự ngược lại, khi ựó tj= j với mọi j

6 5 4 3 2 1 2 6

5

4

7 6 5 4

3 2

1

2222

2

2

)1(2)1(2)1(12)1()1()1

(

)

c c c c n c c c c c c c n c

c

c

n c n c n c n c n c n

 + + + − − ++

 + +

=

−+

 −+

 −+

 + −+

−+

+

=

2)1()1(,12)1(,2)1(

2 2

=+

n

j n

j n

j

116

độ phức tạp thực tế

độ phức tạp trong trường hợp trung bình

giả sử áp dụng thuật toán cho danh sách n phân tử ựược chọn một cách ngẫu nhiên

Giá trị của tj? Phần tử A[j] ựược chèn vào vị trắ nào trong danh sách A[1 j-1] ?

Trường hợp trung bình, một nữa số phần tử của A[1 j-1]

lớn hơn A[j] và một nữa số phần tử của A[1 j-1] nhỏ hơn A[j]

Trang 30

độ phức tạp thực tế

Tuy nhiên, thông thường cái chúng ta quan tâm thực

sự là giá trị của các hàm tiệm cận (thường là O vàΘ)

Chỉ có số hạng quan trọng của biểu thức ựộ phức tạp

có ý nghĩa khi n rất lớn, bỏ qua các số hạng còn lại

Khi n lớn, chúng ta bỏ qua luôn hằng số của số hạng

Các lớp thuật toán theo ựộ phức tạp

 Các thuật toán thường ựược so sánh bởi ựộ phức tạp trong trường hợp xấu nhất, tức là giá trị của O(g(n))

 Các lớp thuật toán theo ựộ phức tạp

 Hằng số: O(1), tất cả các lệnh thực thi ựúng một lần không phụ thuộc kich thước dữ liệu

 Dưới tuyến tắnh: O(log(n)), kắch thước của bài toán ựược chia nhỏ bởi một hằng số ở mỗi bước lặp

 Tuyến tắnh:

O(n), vòng lặp n lần, thân vòng lặp thực hiện công việc ựộc lập với n

O(nlog(n)), kắch thước của bài toán ựược chia nhỏ bởi một hằng số

ở mỗi bước lặp,và ở mỗi lần chia nhỏ một bước duyệt tuyến tắnh các dữ liệu ựược thực hiện

 đa thức: O(nk), các thuật toán ựược xem là chậm khi k>3

 Hàm mũ: O(kn), k≥2, các thuật toán là không thể ứng dụng ựược

 Các thuật toán sử dụng ựược thường có ựộ phức tạp ≤O(n3)

119

Các lớp thuật toán theo ựộ phức tạp

1018

1012

19 931 56819.931

100

1024

103

10033.23.32

10

21

100

3. đề xuất thuật toán hiệu quả hơn

4. đánh giá ựộ phức tạp của thuật toán bởi số phép so sánh

Trang 31

if (x ≤A[m]) then return (timkiemnhiphan (A, x, l, m))

else return (timkiemnhiphan (A, x, m+1, r))

Hàm ñược ñịnh nghĩa ñệ quy

Thuật toán ñệ quy

1khi n x x n khi

function ham_mu (x, n)

begin

if (n=0) then ham_mu = 1else ham_mu = x * ham_mu(x, n-1)endif

ðệ quy

lời gọi ñệ quy

if ((n=0) or (n=1)) then fib = 1else fib = fib(n-1) + fib(n-2)endif

end

Trang 32

ðệ quy

Các ñịnh nghĩa ñược gọi là ñệ quy chéo nếu chúng phụ

even

) 1 (

0 )

( )

1 (

0 )

(

function even (n)

begin

if (n=0) then even = true

else even = odd(n-1)

endif

end

function odd (n)begin

if (n=0) then odd = falseelse odd = even(n-1)endif

ðệ quy

Các ñịnh nghĩa ñược gọi ñệ quy lồng nhau

=

else n m A m A

n m if m A m if n n m A

))1,(,1(

0,0)1,1(

01),(

function Ackermann (m, n)begin

if (m=0) then Ackermann = n+1else if (n=0) Ackermann = Ackermann(m-1,1)else Ackermann = Ackermann(m-1, Ackermann(m, n-1))endif

endifend

127

ðệ quy

Chúng ta cần có

một số trường hợp mà giải pháp xác ñịnh – « trường hợp

ñơn giản »: các trường hợp dừng của ñệ quy

Dãy các giá trị liền nhau của các tham số ñược gọi phải

thay ñổi ñơn ñiệu và ñạt ñến một giá trị mà giải pháp

tương ứng ñã ñược xác ñịnh

128

ðệ quy

Dãy các giá trị b, b-a, b-2a … liên tuc giảm cho ñến khi a≥b thì sẽ dừng, trường hợp ñã ñược xác ñịnh

function divisor (a, b) // giả sử a>0, b>0begin

if (a≥b) then

if (a=b) divisor = trueelse divisor = falseendif

else divisor=divisor(a, b-a)endif

end

Trang 33

chương trình P

bộ dữ liệu D

Ra

ñúng, nếu chương trình P dừng trên bộ dữ liệu D

sai, nếu ngược lại

end

Vấn ñề dừng là không thể xác ñịnh !

132

ðệ quy

Hãy cho biết kết quả của hai thuật toán sau

Thuật toán ñệ quy in dãy nhị phân tương ứng của một

số nguyên

T(n) // n≥0begin

if (n=0) then do nothingelse

T(n-1)print(n) //in nendif

end

G(n) // n≥0begin

if (n=0) then do nothingelse

print(n) //in nG(n-1)endifend

Trang 34

ðệ quy

thể chồng các ñĩa có kích thước khác nhau,

nguyên tắc chồng ñĩa to dưới ñĩa nhỏ trên; yêu

cầu chuyển n ñĩa trên cọc A sang cọc C với các

ñiều kiện:

Mỗi lần chỉ ñược chuyển một ñĩa

Không khi nào có tình huống ñĩa to chồng trên ñĩa

ðể chuyển n ñĩa từ cọc A sang cọc C, thực hiện

chuyển n-1 ñĩa nhỏ hơn từ cọc A sang cọc B

chuyển ñĩa lớn nhất từ cọc A sang cọc C

chuyển n-1 ñĩa nhỏ hơn từ cọc B sang cọc C

Thuật toán

Hanoi(n, A, B, C) begin

if (n=1) then chuyển ñĩa lớn từ cọc A sang cọc Celse Hanoi(n-1, A, C, B)

chuyển ñĩa lớn từ cọc A sang cọc CHanoi(n-1, B, A, C)

endifend

=

=

else n

C n

C

n if n

C

1 1 1

1 1

C

n if n

C

1 1 2

1 1

f(a, b, c)

…end

Trang 35

if (n = 1) thenfactorial = 1elsefactorial = n * factorial(n-1)endif

endn-1 phép nhân

n phép so sánh

n lời gọi hàm

Khử ñệ quy

tương ñương không chứa lời gọi ñệ quy

Sử dụng vòng lặp

ðệ quy kết thúc (terminal recursion)

Thuật toán ñược gọi là ñệ quy kết thúc nếu nó không chứa bất kỳ xử lý nào sau lời gọi ñệ quy

ðệ quy không kết thúc (non terminal recursion)

Thuật toán ñược gọi là ñệ quy không kết thúc nếu nó chứa các xử lý nào sau lời gọi ñệ quy

C : ñiều kiện phụ thuộc U

D : xử lý cơ bản của thuật toán

α(U) : biểu diễn sự chuyển ñổi tham số

T : xử lý dừng

P’(U) beginwhile C doD

U = α(U)endwhileTend

if (l≤r) then

m = (l+r)/2

if (X = A[m]) then bsearch = melse if (X < A[m]) then bsearch = bsearch(X, A, l, m-1)else bsearch = bsearch(X, A, m+1, r)

endifendifelsebsearch = 0endif

end

Trang 36

bsearch’ = 0

end

142

Khử ñệ quy

Cần ghi nhớ lại ngữ cảnh của lời gọi ñệ quy

ñiển hình là các tham số của lời gọi ñệ quy

Sử dụng cấu trúc ngăn xếp (stack) ñể ghi nhớ ngữ cảnh

Các thao tác với ngăn xếp

U = α(U)endwhileT(U)while not isempty(S) do

U = top(S)E(U)pop(S)endwhileend

Gọi Q’(U0) ?

Trang 37

if (n=0) then do nothingelse

while (n>0) dopush(S, n)

n = n-1endwhilewhile (not isempty(S)) do

n = top(S)print(n) //in npop(S)endwhileendif

if C(U) thenB(U)Q(α(U))E(U)elseT(U)endifend

begincreate(S)push(S, (newcall, U))while not isempty(S) do(state, V) = top(S)pop(S)

if (state = newcall) then

U = V

if C(U) thenB(U)push(S, (end, U))push(S, (newcall, α(U)))else T(U)

endifendif

if (state = end) then

U = VE(U)endifendwhileend

if (n=0) then do nothingelse

T(n-1)print(n) //in nendif

end

T’(n) begincreate(S)push(S, (newcall, n))while not isempty(S) do(state, k) = top(S)pop(S)

if (state = newcall) then

if (k>0) thenpush(S, (end, k))push(S, (newcall, k-1))else do nothingendifendif

if (state = end) thenprint(k)endifendwhileend

Trang 38

 Hãy thực hiện

1.Xây dựng thuật toán ựệ quy tắnh Fib(n)

2.Chứng minh rằng ựộ phức tạp (bởi số phép cộng) của thuật toán làΩ(2n/2)

3.Xây dựng thuật toán tắnh cặp (Fib(n), Fib(n-1)) với n > 0

4.Sử dụng thuật toán trong câu 3 ựể xây dựng thuật toán mới tắnh Fib(n)

5.đánh giá ựộ phức tạp (bởi số phép cộng) của thuật toán trên

151

Bài tập

 Bài 2

Ước số chung lớn nhất của hai số nguyên dương ựược ựịnh

nghĩa như sau

 nếu x = y thì usc(x, y) = x

 nếu x > y thì usc(x, y) = usc(x-y, y)

 nếu x < y thì usc(x, y) = usc(x, y-x)

1. Xây dựng thuật toán ựệ quy tắnh ước số chung lớn nhất

hai số nguyên dương

2. Khử ựệ quy của thuật toán

Trang 39

Chia ñể trị (Divide and Conquer)

Nhiều thuật toán có cấu trúc ñệ quy

ðể giải quyết vấn ñề ñặt ra, thuật toán gọi lại chính nó ñể

giải quyết các vấn ñề con có kích thước nhỏ hơn, cuối cùng

kết hợp các kết quả thu ñược giải pháp

Gồm các bước

Chia: chia vấn ñề thành các vấn ñề con

Trị: giải quyết các vấn ñề con một cách ñệ quy, nếu vấn

ñề con có kích thước ñủ nhỏ thì giải quyết trực tiếp

Kết hợp: các kết quả của các vấn ñề con là giải pháp cho

phân tích x thành nhiều bài toán con x1, x2, … xkfor i from 1 to k do

yi = chia-ñể-trị(xi)endfor

kết hợp các giải pháp yithành giải pháp y của xreturn (y)

endifend

 Thuật toán vét cạn

maxmin(A, n)beginmax = A[1]

Trang 40

(max1, min1) = maxmin(A, x, (x+y)/2)

(max2, min2) = maxmin(A, (x+y)/2+1, y)

return (max(max1, max2), min(min1, min2))

2212

11

)12/)(x y y x y y x n

C n if n

C

2 ) 2 / ( 2

2 1

) (

3 1 2 2 2 2 1 2 1 2

2 ) 2 ( 2 2 ) 2 / ( 2

2 2 2 ) 8 / ( 2

2 2 ) 4 / ( 2 2 ) 2 / ( 2 )

log log 1 log 1 log

1 log

1 1 log 1

2 3 3

2 2

+

=

− +

=

− +

=

+

= +

=

+ + +

=

+ +

C

n C n C n C n

C

n n n n

n

k k n

i k k i i

Thuật toán chia ñể trị chỉ sử dụng 75% số phép toán so sánh

so với thuật toán vét cạn

for i from 1 to nfor j from 1 to nC(i,j) = 0for k from 1 to nC(i,j) = C(i,j) + A(i,k) * B(k,j)endfor

endforendforreturn (C)end

Thuật toán thực hiện O(n3) phép cộng và phép nhân

Ngày đăng: 22/12/2016, 13:15

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w