Thiết Kế & Đánh Giá Thuật Toán Phân Tích Thuật Toán

TS. Lê Nguyên Khôi Trường Đại Học Công Nghệ - ĐHQGHN

(cid:1) Thuật toán

(cid:1) Bài toán sắp xếp

(cid:1) Sắp xếp chèn

(cid:1) Phân tích thời gian chạy sắp xếp chèn

1

Nội Dung

(cid:1) Một thủ tục tính toán được định nghĩa rõ ràng (cid:1) Một chuỗi các bước tính toán (cid:1) Nhận một tập các giá trị đầu vào (cid:1) Trả một tập các giá trị đầu ra (cid:1) Tính đúng đắn: với tất cả các tập giá trị đầu

vào, thuật toán đưa ra tập giá trị đầu ra đúng

2

Thuật Toán

(cid:1) Sắp xếp (cid:1) Tìm kiếm (cid:1) Mạng Internet (Định tuyến dữ liệu) (cid:1) Thương mại điện tử (cid:1) Doanh nghiệp sản xuất (cid:1) Đường đi ngắn nhất (cid:1) Chuỗi chung dài nhất (cid:1) Vân vân …

3

Bài Toán

(cid:1) Cấu trúc dữ liệu

(cid:1) Cách lưu trữ và tổ chức dữ liệu tạo điều kiện truy

cập và thay đổi một cách dễ dàng

(cid:1) Hiệu quả:

(cid:1) P: thuật toán có thể chạy trong thời gian đa thức (cid:1) NP-complete: không thể chạy trong khoảng thời gian

hợp lý (cid:1) Song song:

(cid:1) Nhiều phép tính mỗi giây bằng nhiều lõi

4

Một Số Vấn Đề Khác

(cid:7) sao

(cid:7) , … , (cid:1)(cid:6)

(cid:7) , (cid:1)(cid:4)

(cid:1) Input: một dãy số (cid:1)(cid:2), (cid:1)(cid:4), … , (cid:1)(cid:6) (cid:1) Output: tổ hợp của dãy trên (cid:1)(cid:2) (cid:7) ≤ ⋯ ≤ (cid:1)(cid:6) (cid:7)

(cid:7) ≤ (cid:1)(cid:4)

cho (cid:1)(cid:2) (cid:1) Ví dụ:

(cid:1) Input: 8 2 4 9 3 6 (cid:1) Output: 2 3 4 6 8 9

(cid:1) Hiệu quả:

(cid:1) Thời gian chạy của thuật toán sắp xếp dãy số? (cid:1) Thuật toán tốt nhất (chạy nhanh nhất)?

5

Bài Toán Sắp Xếp

(cid:1) Sắp xếp chèn:

(cid:25)(cid:26)é(cid:25) (cid:28)í(cid:30)(cid:26)

(cid:4) (cid:2)(cid:21)(cid:22) (cid:23) (cid:2)(cid:21)(cid:31) (cid:25)(cid:26)é(cid:25) (cid:28)í(cid:30)(cid:26)/"#â% = 20.000 giây ≈ 5,5 giờ

(cid:1) Sắp xếp trộn:

≈ 1.163 giây < 20 phút

*(cid:21) . (cid:2)(cid:21)(cid:22) . +," (cid:2)(cid:21)(cid:22)(cid:25)(cid:26)é(cid:25) (cid:28)í(cid:30)(cid:26) (cid:2)(cid:21)(cid:22) (cid:25)(cid:26)é(cid:25) (cid:28)í(cid:30)(cid:26)/"#â%

(cid:1) Khi nào s.x. chèn nhanh hơn s.x. trộn?

6

Thuật Toán Sắp Xếp (cid:1) Sắp xếp chèn (Insertion sort): (cid:10)(cid:2)(cid:11)(cid:4) (cid:1) Sắp xếp trộn (Merge sort): (cid:10)(cid:4)(cid:11) log (cid:11) (cid:1) Với (cid:10)(cid:2) = 2; (cid:10)(cid:4) = 50; (cid:11) = 10.000.000

Sắp Xếp Chèn – Minh Họa

8 2

4 9 3 6

2 8 4

9 3 6

2 4 8 9

3 6

2 4 8 9 3

6

2 3 4 8 9 6

2 3 4 6 8 9

7

>:? ← 5[7] B ← 7 − 1

Sắp Xếp Chèn – Mã Giả

InsertionSort (5) 1 for 7 ← 2 to 5. 9:(cid:11);<= do 2 3 4 while B > 0 and 5 B > >:? do 5 5 B + 1 ← 5[B] 6 B ← B − 1 7 5 B + 1 ← >:?

Mã giả xem tr.18, tr.20 – 22

8

(cid:1) Khái niệm tính bất biến (loop invariant):

(cid:1) Bắt đầu mỗi vòng lặp for dãy con 5[1 … 7 − 1] chính

là dãy ban đầu nhưng đã được sắp xếp.

(cid:1) Khởi tạo: đúng trước khi vòng for lặp bắt đầu (cid:1) Duy trì: đúng trước một lần lặp thì đúng trước

lần lặp tiếp theo

(cid:1) Kết thúc: tính bất biến giúp chứng minh thuật

toán đúng

9

Sắp Xếp Chèn – Tính Đúng Đắn

(cid:1) Trường hợp cơ bản (base case) (cid:1) Trường hợp quy nạp (inductive case) (cid:1) Chứng minh tính “Duy trì” sử dụng chứng

Chứng Minh Quy Nạp – Induction Proof

10

minh quy nạp: (cid:1) Cho rằng 5[1 … > − 1] đã được sắp xếp (cid:1) Chỉ ra 5[1 … >] cũng được sắp xếp (cid:1) Xem chứng minh tr.19 – 20

(cid:1) Kiến trúc Random Access Machine

(cid:1) Xử lý tuần tự các phép toán (cid:1) Các phép toán (thao tác) cơ bản

, …

, =, +, -, *, /, %, load, store, copy, … điều khiển, rẽ nhánh, …

(cid:1) Mỗi phép toán thực hiện trong thời gian cố định (cid:10) (cận trên) (cid:1) Dữ liệu đầu vào (cid:11) được biểu diễn (cid:10) log (cid:11) bit (cid:1) Không bộ nhớ ảo, cache

11

Phân Tích Thuật Toán – Giả Định

(cid:1) Thời gian chạy phụ thuộc vào dữ liệu đầu vào: dãy đã sắp xếp ≠ dãy chưa sắp xếp

(cid:1) Thời gian chạy phụ thuộc vào độ lớn dữ

Phân Tích Thuật Toán – Thời Gian Chạy

(cid:1) Thông thường xét cận trên (trường hợp

liệu đầu vào: dãy ngắn ≠ dãy dài

12

xấu nhất)

(cid:1) Trường hợp xấu nhất: (thông thường)

(cid:1)

F((cid:11)) = thời gian lâu nhất thuật toán chạy với dữ liệu đầu vào cỡ (cid:11) bất kỳ

(cid:1) Trường hợp trung bình: (đôi khi)

(cid:1)

F((cid:11)) = thời gian trung bình thuật toán chạy với tất cả dữ liệu đầu vào

(cid:1) Cần giả thiết về hàm phân phối xác xuất cho dữ liệu

đầu vào

(cid:1) Trường hợp tốt nhất: (hiếm)

(cid:1) Lợi dụng thuật toán chậm chạy nhanh với một số dữ

liệu đầu vào

13

Phân Tích Thuật Toán – Thời Gian Chạy

>:? ← 5[7] B ← 7 − 1

Mã giả xem tr.18, tr.20 – 22

14

Sắp Xếp Chèn – Mã Giả InsertionSort (5) 1 for 7 ← 2 to 5. 9:(cid:11);<= do 2 3 4 while B > 0 and 5 B > >:? do 5 5 B + 1 ← 5[B] 6 B ← B − 1 7 5 B + 1 ← >:?

Sắp Xếp Chèn – Phân Tích Thời Gian

InsertionSort (5) 1

(cid:11)

for 7 ← 2 to 5. 9:(cid:11);<= do

2

(cid:11) − 1

>:? ← 5[7]

3

(cid:11) − 1

B ← 7 − 1

(cid:10)(cid:2) (cid:10)(cid:4) (cid:10)G

(cid:6)

4

while B > 0 and 5 B > >:? do

(cid:10)H I

JK(cid:4)

5

5 B + 1 ← 5[B]

6

B ← B − 1

(cid:6) (cid:10)* I

7

(cid:11)

5 B + 1 ← >:?

(cid:10)M

15

(cid:1) Tổng thời gian:

F (cid:11)

(cid:6)

= (cid:10)(cid:2)(cid:11) + (cid:10)(cid:4) (cid:11) − 1 + (cid:10)G (cid:11) − 1 + (cid:10)H I

JK(cid:4)

(cid:6)

(cid:6)

+ (cid:10)* I

+ (cid:10)L I

+ (cid:10)M (cid:11) − 1

(cid:1)

Sắp Xếp Chèn – Phân Tích Thời Gian

: số lần lặp vòng while

16

(cid:1) Trường hợp tốt nhất (

Sắp Xếp Chèn – Phân Tích Thời Gian

F (cid:11)

(cid:1)

F (cid:11) hàm tuyến tính

(cid:1) Khi mảng đã sắp xếp tăng dần

17

= (cid:10)(cid:2)(cid:11) + (cid:10)(cid:4) (cid:11) − 1 + (cid:10)G (cid:11) − 1 + (cid:10)H (cid:11) − 1 + (cid:10)M (cid:11) − 1 = (cid:10)(cid:2) + (cid:10)(cid:4) + (cid:10)G + (cid:10)H + (cid:10)M (cid:11) + N = (cid:1)(cid:11) + N

(cid:1) Trường hợp xấu nhất

F (cid:11)

= (cid:10)(cid:2)(cid:11) + (cid:10)(cid:4) (cid:11) − 1 + (cid:10)G (cid:11) − 1

+ (cid:10)H

− 1 + (cid:10)*

(cid:11) (cid:11) − 1 2

+ (cid:10)L

+ (cid:10)M (cid:11) − 1

(cid:11) (cid:11) + 1 2 (cid:11) (cid:11) − 1 2

= … (cid:11)(cid:4) + … (cid:11) + … = (cid:1)(cid:11)(cid:4) + N(cid:11) + (cid:10)

(cid:1)

F (cid:11) hàm bậc hai

(cid:1) Khi mảng đã sắp xếp giảm dần

18

Sắp Xếp Chèn – Phân Tích Thời Gian

(cid:1) Exercise: 2.1-4 tr.22

(cid:1) Cộng 2 số n-bit

(cid:1) Exercise: 2.2-2 tr.29

(cid:1) Sắp xếp lựa chọn (selection sort)

(cid:1) Problem: 2-2 tr.40

(cid:1) Sắp xếp nổi bọt (bubble sort)

19

Bài Tập

Bài Tập – Exercise 2.1-4

mảng n-phần tử A & B. Tổng 2 số này lưu trong mảng n+1-phần tử C dưới dạng nhị phân. (cid:1) Viết mã giả cho thuật toán cộng 2 số này. (cid:1) Phân tích độ phức tạp của thuật toán.

20

Cộng 2 số n-bit: (cid:1) Cho 2 số nguyên nhị phân n-bit, lưu trong 2

P 7 + 1 ← 5 7 + O 7 + Q:RB(cid:11)S:Q Q:RB(cid:11)S:Q ← P 7 + 1 div 2 P 7 + 1 ← P 7 + 1 mod 2

P 1 ← Q:RB(cid:11)S:Q

Thời gian chạy:

F (cid:11) = (cid:10)(cid:2) + (cid:10)(cid:4) (cid:11) + 1 + (cid:10)G(cid:11) + (cid:10)H(cid:11) + (cid:10)*(cid:11) + (cid:10)L

= (cid:10)(cid:4) + (cid:10)G + (cid:10)H + (cid:10)* (cid:11) + N = (cid:1)(cid:11) + N

21

Bài Tập – Exercise 2.1-4 BinaryAdder (5, O, P, (cid:11)) 1 Q:RB(cid:11)S:Q ← 0 2 for 7 ← (cid:11) downto 1 do 3 4 5 6

Bài Tập – Exercise 2.2-2

tử nhỏ nhất của A và đổi chỗ với A[1]. Tìm phần tử nhỏ nhất thứ hai của A và đổi chỗ với A[2]. Tiếp tục như vậy cho n-1 phần tử đầu tiên của A.

(cid:1) Viết mã giả cho thuật toán trên. (cid:1) Tính bất biến (loop invariant) của thuật toán? (cid:1) Tại sao chỉ cần chạy với n-1 phần tử đầu tiên. (cid:1) Phân tích độ phức tạp của thuật toán (trường

hợp tốt nhất & xấu nhất)

22

Sắp xếp lựa chọn (selection sort): (cid:1) Sắp xếp n số trong mảng A theo cách tìm phần

WR(cid:1)99:W< ← B

if 5 7 < 5[WR(cid:1)99:W<] WR(cid:1)99:W< ← 7

23

Bài Tập – Exercise 2.2-2 SelectionSort (5) 1 for B ← 1 to 5. 9:(cid:11);<= − 1 do 2 3 for 7 ← B + 1 to 5. 9:(cid:11);<= do 4 5 6 exchange 5 B with 5[WR(cid:1)99:W<]

F (cid:11)

(cid:6)

(cid:6)

= (cid:10)(cid:2)(cid:11) + (cid:10)(cid:4) (cid:11) − 1 + (cid:10)G I

+ (cid:10)H I

JK(cid:4)

(cid:6)

(cid:6)

+ (cid:10)* I

+ (cid:10)L I

= … (cid:11)(cid:4) + … (cid:11) + … = (cid:1)(cid:11)(cid:4) + N(cid:11) + (cid:10)

24

Bài Tập – Exercise 2.2-2 SelectionSort (5) Thời gian chạy:

(cid:1) Sắp xếp nổi bọt (bubble sort):

25

Bài Tập – Problem 2-2

:X(cid:10)= ← Y(cid:1)9W:

26

Bài Tập – Problem 2-2 BubbleSort (5) 1 do 2 3 for 7 ← 5. 9:(cid:11);<= downto 2 do 4 if 5 7 < 5[7 − 1] 5 exchange 5 7 with 5 7 − 1 6 :X(cid:10)= ←

27

Bài Tập – Problem 2-2 BubbleSort (5) 1 for B ← 1 to 5. 9:(cid:11);<= − 1 do 2 for 7 ← 5. 9:(cid:11);<= downto B + 1 do 3 if 5 7 < 5[7 − 1] 4 exchange 5 7 with 5[7 − 1]

(cid:1) Phân tích thời gian chạy dựa trên độ lớn

Tổng Kết

(cid:1) Phân tích thời gian chạy thuật toán trong

dữ liệu đầu vào

(cid:1) Thời gian chạy của sắp xếp chèn là hàm bậc hai đối với độ lớn dữ liệu đầu vào

28

trường hợp xấu nhất