1. Trang chủ
  2. » Giáo án - Bài giảng

Thuật toán

75 167 1
Tài liệu đã được kiểm tra trùng lặp

Đ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

Tiêu đề Thuật toán
Trường học Trường Đại Học
Thể loại Bài viết
Định dạng
Số trang 75
Dung lượng 708 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Ví dụ: Với thuật toán Insertion-Sort - Thuật toán mô tả chính xác từng bước thực hiện - Thuật toán dừng sau hữu hạn bước - Các kết quả trung gian ở mỗi bước được xác định một cách đơn t

Trang 1

1 Khái niệm thuật toán

- Thuật toán (Algorithm) được biết đến từ

thế kỷ IX do nhà toán học người Ba tư al-Khowarizmi đưa ra

ánh xạ từ tập các đầu vào nào đó vào tập các đầu ra nhất định.

gồm một dãy các bước cần thực hiện

để từ một đầu vào cho trước nó cho một đầu ra.

Trang 2

Ví dụ: Bài toán sắp xếp một dãy số theo

thứ tự tăng dần.

Đầu vào : Một dãy số (a1, , an)

Đầu ra : Một hoán vị (a1(k), ,an(k)) sao cho

a1(k) <= <= an(k)

Trang 3

Thuật toán Insertion-Sort:

Procedure Insertion-Sort (a, n)

Trang 6

2 Các tính chất của thuật toán

- Tính chính xác (Precision): Thuật toán phải được mô

tả chính xác.

- Tính hữu hạn (Finiteness): Dừng và cho kết quả sau

hữu hạn bước.

- Tính đơn trị (Uniqueness): Các kết quả trung gian ở

mỗi bước phải được xác định đơn trị phụ thuộc vào đầu vào và kết quả của bước trước.

- Tính phổ dụng (Generality): Áp dụng được cho một

lớp bài toán.

Ví dụ: Với thuật toán Insertion-Sort

- Thuật toán mô tả chính xác từng bước thực hiện

- Thuật toán dừng sau hữu hạn bước

- Các kết quả trung gian ở mỗi bước được xác định một

cách đơn trị, chỉ phụ thuộc vào và kết quả ở bước trước

- Thuật toán áp dụng được cho một lớp bài toán

Trang 7

3 Các cấu trúc của thuật toán

- Cấu trúc tuần tự

- Cấu trúc lựa chọn

- Cấu trúc lặp

Trang 8

4 Biểu diễn thuật toán

- Có nhiều cách biểu diễn

- Quy ước về biểu diễn thuật toán bằng ngôn

ngữ giả code:

+ Việc viết dòng thụt vào biểu thị cấu trúc khối + Ký hiệu “” : Lời chỉ dẫn phía sau

+ j  i: Gán giá trị của i cho j

+ j  i  e: Gán giá trị của e cho i và j

+ Các cấu trúc lặp WHILE, FOR, và REPEAT

và các cấu trúc điều kiện IF, THEN, và ELSE được thể hiện giống như trong Pascal

Trang 9

5 Phân tích thuật toán?

những đánh giá về thời gian tính và bộ nhớ cần thiết để thực hiện thuật toán.

- Phân tích có thể cho biết tính khả thi

của thuật toán từ đó có thể loại các thuật toán không tốt

- Lượng thời gian tính và bộ nhớ cần

thiết để thực hiện thuật toán được gọi là

độ phức tạp của thuật toán

* Ở đậy ta chỉ quan tâm đánh giá về thời gian

tính.

Trang 10

6 Một số khái niệm cơ bản.

- Kích thước dữ liệu đầu vào: Số bít cần thiết

để biểu diễn nó

- Phép toán cơ bản: Phép toán có thể thực

hiện với thời gian bị chặn bởi một hằng số không phụ thuộc vào kích thước dữ liệu đầu vào (Phép tính số học, so sánh, gán, )

Từ số lượng phép toán cơ bản => Thời gian

thuật toán đòi hỏi.

Đánh giá độ phức tạp thuật toán là đánh giá

số phép toán cơ bản như là hàm của kích thước dữ liệu đầu vào.

Trang 11

6 Một số khái niệm cơ bản (tiếp)

- Thời gian tính tốt nhất của thuật toán là thời

gian tối thiểu để thực hiện thuật toán với mọi

bộ dữ liệu đầu vào kích thước n

- Thời gian tính tồi nhất của thuật toán là thời

gian nhiều nhất để thực hiện thuật toán với mọi bộ dữ liệu đầu vào kích thước n

- Thời gian tính trung bình của thuật toán là

thời gian trung bình để thực hiện thuật toán với mọi bộ dữ liệu đầu vào kích thước n

Trang 12

Ví dụ Xét thuật toán tìm số lớn nhất trong một dãy hữu

hạn số.

Đầu vào: Một dãy số (a1, , an)

Đầu ra: Số lớn nhất của dãy – max

Trong thuật toán này, số n là đại lượng hợp lý nhất

để đánh giá kích thước đầu vào Khi đó thời gian

Trang 13

7 Các ký hiệu tiệm cận

Trong thực tế, người ta thường quan tâm

tốc độ tăng của thời gian tính khi tăng kích thước đầu vào hơn thời gian chính xác mà thuật toán đòi hỏi Chẳng hạn thời gian tính của một thuật toán với kích đầu vào n là

t(n)=60n2 + 9n+9 Với n đủ lớn, t(n) xấp xỉ bằng n2 Khi đó ta

nói t(n) có bậc là n2 Viết t(n)= Θ (n2).

Ta có các định nghĩa:

Trang 14

7 Các ký hiệu tiệm cận (tiếp)

Giả sử f và g là các hàm đối số nguyên dương

- Ta nói f(n) có bậc không quá g(n), viết

f(n)=O(g(n)) nếu tồn tại hằng số dương c

và số nguyên dương n0 sao cho

|f(n)| ≤ c |g(n)| với mọi n>n0.

- Ta nói f(n) có bậc ít nhất là g(n), viết

f(n)= Ω (g(n)) nếu tồn tại hằng số dương c

và số nguyên dương n0 sao cho

|f(n)| ≥ c |g(n)| với mọi n>n0.

- Ta nói f(n) có bậc là g(n), viết f(n)= Θ (g(n))

nếu f(n)=O(g(n)) và f(n)= Ω (g(n))

Trang 15

Ví dụ Giả sử k là số nguyên dương Chứng

minh rằng 1k +2k+ +nk có bậc là nk+1.

Ta có

1k +2k+ +nk ≤ nk+nk+ +nk = n.nk = nk+1Suy ra 1k +2k+ +nk =O(nk+1)

Mặt khác

1k +2k+ +nk ≥ [n/2]k+ +nk

≥ [n/2]k+ +[n/2]k ≥ n/2.[n/2]k = nk+1/2k+1Suy ra 1k +2k+ +nk = Ω (nk+1)

Vậy 1k +2k+ +nk = Θ (nk+1)

Trang 16

Bài tập.

1 Chứng minh rằng mọi đa thức bậc k hệ số dương

Pk(n)=aknk + ak-1nk-1+ +a1n+a0

có bậc là nk (nghĩa là Pk(n)= Θ(nk)

2 Chứng minh rằng

lg n!= Θ(n lg n)Hướng dẫn lgn! =lgn+lgn-1+ +lg1>=lgn+ +lgn/2

>=lgn/2+ +lgn/2=n/2.lgn/2

>= (nlgn)/4

Trang 17

Định nghĩa thời gian tính của thuật toán.

Nếu thuật toán đòi hỏi thời gian tính tốt nhất là t(n) với

kích thước đầu vào n và t(n)=O(g(n)) thì thời gian tính tốt nhất của thuật toán có bậc không quá g(n)

(hay thời gian tính tốt nhất của thuật toán có bậc

là O(g(n))

Nếu thuật toán đòi hỏi thời gian tính tồi nhất là t(n) với

kích thước đầu vào n và t(n)=O(g(n)) thì thời gian tính tồi nhất của thuật toán có bậc không quá g(n) (hay thời gian tính tồi nhất của thuật toán có bậc

là O(g(n))

Nếu thuật toán đòi hỏi thời gian tính trung bình là t(n)

với kích thước đầu vào n và t(n)=O(g(n)) thì thời gian tính tồi nhất của thuật toán có bậc không quá g(n) (hay thời gian tính trung bình của thuật toán

có bậc là O(g(n))

Trang 18

Khái niệm bậc ít nhất của thời gian tính tốt nhất, tồi

nhất, trung bình của thuật toán được định nghĩa tương tự bằng cách thay O bởi Ω và “không quá” bởi “ít nhất” trong định nghĩa trên

Nếu thời gian tính tốt nhất (tồi nhất, trung bình) của

thuật toán vừa là O(g(n)) vừa là Ω(g(n)) thì ta nói thời gian tính tốt nhất (tồi nhất, trung bình) của thuật toán là Θ(g(n))

!!! Khi nói thời gian tính của thuật toán là O(f(n)) ta hiểu đó là

thời gian tính trong tình huống tồi nhất Còn khi nói thời gian tính của thuật toán là (f(n)) ta hiểu đó là thời gian tính trong tình huống tốt nhất.

Trang 19

Ví dụ 1 Đánh giá số lần thực hiện câu lệnh

x:=x+1 trong đoạn chương trình sau:

Trang 20

Ví dụ 2 Đánh giá số lần thực hiện câu lệnh x:=x+1 trong đoạn

Ký hiệu số lần thực hiện của câu lệnh là t(n) Ta có:

+ Lần lặp while đầu tiên (j=n), câu lệnh x:=x+1 thực hiện n lần

Vì vậy t(n)= Ω (n) (vì t(n)>n)

+ Sau lần lặp đầu tiên đó, j:=j div 2 => j<n/2.

+ Ký hiệu k là số lần lặp của vòng while, khi đó số lần lặp của

câu lệnh x:=x+1 không quá n+n/2+n/4+ +n/2 k-1 Nghĩa là

t(n) < n+n/2+n/4+ +n/2 k-1 = n(1-1/2 k )/(1-1/2) = 2n(1-1/2 k )<2n Suy ra t(n)=O(n)

Vậy số lần thực hiện câu lênh x:=x+1 là t(n) = Θ (n 2 )

Trang 21

Ví dụ 3 Đánh giá thời gian tính của thuật toán

Trang 22

Rõ ràng, thời gian tính của thuật toán có thể đánh giá bởi số lần thực

hiện của câu lệnh i:=i+1;

Ta có:

Nếu s1:=key => câu lệnh i:=i+1 thực hiện 1 lần => thời gian tính tốt nhất

Nếu key không có trong dãy => câu lệnh i:=i+1 thực hiện n+1 lần =>

Ta sẽ tính thời gian trung bình t(n) của thuật toán

bình của thuật toán là

Trang 23

Đánh giá độ phức tập của thuật toán là việc làm

không đơn giản Thông thường, ta sử dụng các đánh giá sau:

Dạng đánh giá Tên gọi

Trang 24

Một số tính chất của các ký hiệu tiệm cận

Trang 26

1 Phân tích độ phức tạp của các cấu trúc

1.1 Cấu trúc tuần tự

Giả sử P, Q là 2 đoạn độc lập của một thuật

toán với thời gian tính tương ứng là T(P) và T(Q).

Quy tắc tuần tự Thời gian đòi hỏi bởi (P; Q)

(thực hiện P rồi tiếp theo thực hiện Q) sẽ là

T(P;Q) = T(P)+T(Q).

Vì vậy

T(P; Q) = Θ (max(T(P),T(Q));

Trang 27

1.2 Cấu trúc lặp

a) Vòng lặp For

Xét vòng lặp

For i:=1 to n do P(i);

Nếu thời gian tính của P(i) là t với mọi i:=1 n

và không tính đến thời gian tổ chức vòng

lặp thì thời gian thực hiện vòng lặp là mxt

Trong trường hợp tổng quát, gọi t(i) là thời gian

thực hiện P(i) Nếu không tính đến thời gian

tổ chức vòng lặp thì thời gian tính của vòng lặp trên là

T= ∑m

i=1t(i).

Trang 28

Ví dụ Xét thuật toán tìm số Fibonacci thứ n sau:

Nếu xem các phép toán số học đòi hỏi thời gian là

hằng số thì thời gian tính của thuật toán là Θ(n)

Trang 29

b) Vòng lặp While và Repeat

Xét vòng lặp

While B do P; hoặc Repeat P Until B;

Việc phân tích các vòng lặp này rất khó khăn vì

không biết số lần lặp.

Kỹ thuật cơ bản:

- Cần xác định một hàm của các biến trong

vòng lặp sao cho nó có giá trị giảm dần trong quá trình lặp Vòng lặp dừng nếu hàm nhận giá trị nguyên dương

- Coi vòng lặp như một thuật toán đệ quy

Trang 30

Ví dụ Xét thuật toán tìm tìm kiếm nhị phân sau:

Trang 31

Hướng dẫn Để phân tích thuật toán này, ta xác định

hàm d:=j-i+1 Như vậy d là số lượng phần tử của mảng T cần được khảo sát

Vòng lặp bắt đầu với d=n và kết thúc khi d<=1 (tương

ứng với i>=j)

Thời gian tính của thuật toán này là O(log n)

Ký hiệu d, d’ là giá trị của j-i+1 và i, j, i’, j’ là giá trị của

i, j trước và sau khi thực hiện vòng lặp

Khi đó:

- Nếu x<T[k], thì i’=i, j’=(i+j) div 2 -1

do đó d’=j’-i’+1=(i+j) div 2 -1-i+1

<=(i+j)/2 – i < (j-i+1)/2=d/2

Trang 32

- Nếu x >T[k], thì j’=j, i’=(i+j) div 2 +1

do đó d’=j’-i’+1=j-(i+j) div 2

<=j-(i+j-1)/2 – i < (j-i+1)/2=d/2

- Nếu x = T[k] thì d’=1 và d>=2

Vậy ta luôn có d’<=d/2 Do vòng lặp dừng khi d<=1

nên thuật toán phải dừng

Tính thời gian tính của thuật toán:

Gọi dm là giá trị của j-i+1 ở lần lặp thứ m, m>=1 và d0 =

Vì mỗi lần lặp, thời gian tính là hằng số nên ta có thời

gian tính của thuật toán là O(logn)

Trang 33

2 Công thức đệ quy

Việc đánh giá thời gian tính của các thuật toán đệ quy

là rất khó Ta thường xây dựng công thức đệ quy

để đánh giá thuật toán đệ quy

Công thức đệ quy thường gặp:

T(n)= Θ(1) nếu n<=cT(n)=T(n/b)+D(n)+C(n) nếu ngược lạiCác phương pháp giả công thức đệ quy:

+ Phương pháp đoán nhận

+ Phương pháp lặp

+ Định lý thợ

Trang 34

C-1) Phương pháp đoán nhận

- Dự đoán lời giải

- Dùng quy nạp để chứng minh tính đúng đắn của

dự đoán

Ví dụ Giải công thức đệ quy T(n)=3T(n/3) +n

- Dự đoán: T(n)=O(n log n)

- Chứng minh điều dự đoán trên:

Ta cần chứng minh T(n)≤ c.n.logn Ta có

T(n) = 3T(n/3) +n ≤ 3.c n/3.log n/3+n

≤ c.n.log(n/3) + n ≤ c’.n.log(n), với c’≥ max(c,1/log3)

Vậy công thức đúng

Trang 35

! Để dự đoán lời giải, ta thường sử dụng các cách

sau:

i) Dựa vào các lời giải tương tự đã gặp

ii) Chứng minh cận trên và cần dưới cho công thức

đệ quy Chẳng hạn nếu T(n)= Ω(n) và T(n)=O(n2)

- Do đó S(m)=O(mlogm) => T(n)=O(log n loglog n).

iv) Nếu không chứng minh được dự đoán => Điều

chỉnh số hạng tăng chậm trong dự đoán

Trang 36

C-2) Phương pháp lặp

Thực hiện thế dần công thức đệ quy để biểu

diễn nó như là tổng của các số hạng chỉ phụ thuộc điều kiện đầu vào n.

Ví dụ Giải công thức đệ quy T(n)=3T(n/4)+n

Trang 37

Khi đó T(n) có thể đánh giá tiệm cận như sau:

1 Nếu f(n)=O(nlogba- ε) với hằng số ε >0 nào đó,

thì T(n)= Θ (nlogba)

Trang 38

2 Nếu f(n)= Θ (nlogba), thì T(n)= Θ (nlogbalogn)

3 Nếu f(n)= Ω (nlogba+ ε) với hằng số ε >0 nào đó

và nếu a.f(n/b)< c.f(n) với hằng số c<1, thì T(n)= Θ (f(n)).

Định lý thợ rút gọn Giả sử a ≥ 1, b>1 là các

hằng số và T(n)=a.T(n/b)+c.nk, với n>0 Khi

đó ta có

1 Nếu a>bk thì T(n)= Θ (nlogba)

2 Nếu a=bk thì T(n)= Θ (nk log n)

3 Nếu a<bk thì T(n)= Θ (nk )

Trang 39

Ví dụ 1 Giải công thức đệ quy T(n)=16T(n/4)+n

Áp dung định lý thợ với trường hợp (1): a=16, b=4 và

ε=1 ta có, f(n)=n= Θ(nlogba- ε ) => T(n)= Θ(nlogba)=

Θ(n2)

Ví dụ 2 Giải công thức đệ quy T(n)=T(3n/7)+1

Áp dung định lý thợ với trường hợp (2): a=1, b=7/3 ta

có, f(n)=1= O(nlogba) => T(n)= Θ(nlogbalogn)=

Θ(logn)

Ví dụ 3 Giải công thức đệ quy T(n)=3T(n/4)+nlogn

Áp dung định lý thợ với trường hợp (3): a=3, b=4 và

ε=(1-log43) ≈ 0.2 ta có, f(n)=n.logn=Ω(nlog43+ ε) (vì

nlog43+ ε≈n => n.logn > n) và lấy c=3/4

=> a.f (n/b)<c.f(n) Vậy T(n)= Θ(f(n))= Θ(nlogn)

Chú ý Có thể áp dụng định lý thợ rút gọn với các ví

dụ 1 và 2

Trang 40

3 Phương pháp sử dụng câu lệnh đặc trưng

- Câu lệnh đặc trưng là câu lệnh có số lần thực

hiện không ít hơn bất kỳ câu lệnh nào trong thuật toán

- Khi phân tích thuật toán ta chỉ quan tâm đến việc

đếm số lần thực hiện của câu lệnh đặc trưng

Ví dụ Với thuật toán Fibiter trên, ta chọn câu lệnh

j:=i+j là câu lệnh đặc trưng Khi đó ta có thời gian tính của thuật toán là Θ(n)

!Ngoài các phương pháp trên còn có các phương

pháp phân tích thuật toán khác, chẳng hạn phương pháp phân tích khấu trừ.

Trang 41

3 Phương pháp phân tích khấu trừ

- Giới thiệu

- Phương pháp tính toán chi li

Trang 43

Một bài toán có thể có nhiều lời giải khác

nhau Các lời giải có thể đã biết hoặc chưa biết

toán là đưa ra thời gian tính của thuật toán tốt nhất trong tất cả các thuật toán

Có 2 cách tiếp cận để giải quyết vấn đề

Trang 44

3.1 Đánh giá cận dưới

3.1.1 Độ phức tạp tính toán của bài toán

Ký hiệu T(A) là thời gian tính của thuật toán A với đầu

vào X Khi đó, thời gian tính trong tình huống tồi nhất của thuật toán A đối với dữ liệu vào kích thước n là

TA(n)=max{TA(X): |X|=n}

Độ phức tạp trong tình huống tồi nhất của bài toán P

là thời gian tính trong tình huống tồi nhất của thuật toán tốt nhất để giải nó Nghĩa là

TP(n) = min{TA(n): A ∈ ∆}=min{max{TA(X)|X|=n}:A ∈ ∆}Trong đó ∆ là tập tất cả các thuật toán giải bài toán P

Trang 45

Cận trên Nếu thuật toán A giải bài toán P có thời gian tính trong

tình huống tồi nhất là TA(n) = O(f(n)) thì

TP(n) <= TA(n) =O(f(n)).

Nghĩa là ta có cận trên cho độ phức tập của bài toán P (vì mọi

thuật toán tốt hơn sẽ cho cận trên tốt hơn)

Cận dưới Việc đánh giá cận dưới của bài toán là chỉ ra mức độ

khó của bài toán

Để chỉ ra

Tp(n) = Ω (f(n))

ta cần chỉ ra rằng

i) Có thuật toán với thời gian tính Ω (f(n)) để giải bài toán P

ii) Mọi thuật toán giải bài toán P đều đòi hỏi thời gian tính trong

tình huống tồi nhất là Ω (f(n)).

Đòi hỏi ii) có thể thay bởi: Cận dưới cho độ phức tạp tính toán

của bài toán P là Ω (f(n)).

Trang 46

3.1.2 Các phương pháp đánh giá cận dưới độ phức tạp tính

toán của bài toán

a) PP sử dụng cây quyết định

• Cây quyết định là cây mà mỗi đỉnh của nó tương ứng với

một truy vấn dữ liệu Các cạnh của nó tương ứng với các khả năng trả lời câu hỏi Mỗi lá tương ứng với một đầu ra.

• Để tính toán với cây quyết định, ta bắt đầu từ gốc và đi

theo một đường đi đến lá Tại mỗi nút trung gian, câu trả lời cho truy vấn sẽ dẫn ta tới nut tiếp theo Khi đến lá, ta thu được một đầu ra.

• Thời gian tính của thuật toán cây quyết định là số truy vấn

trên đường đi từ gốc đến lá.

Như vậy,

⇒ Thời gian tính trong tình huống tồi nhất của thuật toán

sẽ là độ cao của cây quyết định

⇒ Số truy vấn là cận dưới cho thời gian tính.

Trang 47

• Việc xác định cận dưới nhờ sử dụng cây

quyết định được dựa trên lập luận:

- “Các truy vấn đối với dữ liệu phải đảm bảo

đủ thông tin để có thể xác định được đầu ra

có thể”.

- Nếu bài toán có N đầu ra thì mọi cây quyết

đều có N lá

- Nếu cây có N lá và mỗi nút có nhiều nhất k

con thì độ cao của cây ít nhất là

 logkN  = Ω (log N)

- Số trung vấn là cận dưới cho thời gian tính.

Ngày đăng: 07/07/2013, 01:28

Xem thêm

HÌNH ẢNH LIÊN QUAN

toán tra từ điển trong mô hình tính toán cây - Thuật toán
to án tra từ điển trong mô hình tính toán cây (Trang 50)

TỪ KHÓA LIÊN QUAN

w