PHÂN TÍCH THIẾT KẾ THUẬT GIẢI

ĐỘ PHỨC TẠP CỦA GIẢI THUẬT

NGÔ QUỐC VIỆT 2014

Nội dung

Xác định độ phức tạp

1. Giới thiệu 2. 3. Bài tập 4. Hỏi đáp.

t

i

ệ V c ố u Q ô g N

2

Ví dụ: thuật giải tìm tuyến tính

t

i

ệ V c ố u Q ô g N

linear_search(x: integer; a1, a2, …, an: integers) i := 1 while (i  n and x  ai) i := i + 1 if i  n then location := i else location := 0 location = vị trí tìm thấy x, hoặc bằng zero nếu không tìm thấy

3

Ví dụ: tìm nhị phân

Tìm nhị phân ký tự ‘j’

Khoảng tìm

t

i

ệ V c ố u Q ô g N

a c d f g h j l m o p r s u v x z

Phần tử giữa

4

Ví dụ: tìm nhị phân

Tìm nhị phân ký tự ‘j’

Khoảng tìm

t

i

a c d f g h j l m o p r s u v x z

ệ V c ố u Q ô g N

Phần tử giữa

5

Ví dụ: tìm nhị phân

Tìm nhị phân ký tự ‘j’

search interval

t

i

a c d f g h j l m o p r s u v x z

ệ V c ố u Q ô g N

center element

6

Ví dụ: tìm nhị phân

Tìm nhị phân ký tự ‘j’ Khoảng tìm

t

i

a c d f g h j l m o p r s u v x z

ệ V c ố u Q ô g N

Phần tử giữa

7

Ví dụ: tìm nhị phân

Tìm nhị phân ký tự ‘j’

Khoảng tìm

t

i

a c d f g h j l m o p r s u v x z

ệ V c ố u Q ô g N

Phần tử giữa

OK

8

Tìm nhị phân-thuật giải

t

i

ệ V c ố u Q ô g N

m = (i + j)/2 if x > am ) i = m + 1 else j = m

procedure binary_search(int x, int a1, a2, …, an) i = 1 // i is left endpoint of search interval j = n // j is right endpoint of search interval while (i < j) begin end if x == ai then location = i else location = 0 Độ phức tạp tìm nhị phân: 𝑶 𝒍𝒐𝒈𝒏 ≪ 𝒏. Hướng dẫn: cần chia n cho 2 bao nhiêu lần để có được mảng 1 phần tử.

1 =

9

𝑛 2𝑘 ⇒ 𝑘 = 𝑙𝑜𝑔2𝑛

Độ phức tạp

• Hai ví dụ về tìm kiếm trên có số lần lặp khác

nhau.

• Thuật giải A cần chạy 5000𝑛 lần (vd: lệnh so

sánh), trong khi B là 1.1 𝑛 lần.

t

i

ệ V c ố u Q ô g N

• Với 𝑛 = 10, B hiệu quả hơn A, khi 𝑛 = 1000, A cần 5.000.000 lần chạy, nhưng B cần 2.5. 1041 lần

• Số lần thực hiện với 𝑛 input được gọi là độ phức

tạp thuật giải  được biểu diễn hàm T(n).

10

Giới thiệu

• Yêu cầu cần phải có thuật giải chính xác và nhanh

 cần có tiêu chuẩn đánh giá.

t

i

ệ V c ố u Q ô g N

• Một yếu tố quan trọng nhất ảnh hưởng đến tốc độ là kích thước dữ liệu cần xử lý. Nếu n là kích thước đầu vào  cần tìm hàm T(n) thể hiện độ phức tạp. Hàm T(n) gọi là độ phức tạp của giải thuật.

• Các yếu tố khác như: phần cứng, ngôn ngữ lập

trình, v.v.. được bỏ qua khi xét độ phức tạp.

11

Định nghĩa O “lớn”

• Định nghĩa:

t

i

Cho một hàm T(n), T(n) gọi là có độ phức tạp f(n) nếu tồn tại các hằng C, n0 sao cho 𝑇(𝑛) ≤ 𝐶𝑓(𝑛) với mọi n ≥ n0 (tức là T(n) có tỷ suất tăng là f(n)) và kí hiệu T(n) là 𝑂(𝑓(𝑛)) (đọc là “ô của f(n)”). • Ví dụ: 𝑇(𝑛) = (𝑛 + 1)2 có tỷ suất tăng là 𝑛2 nên

𝑇(𝑛) = (𝑛 + 1)2 là 𝑂(𝑛2).

ệ V c ố u Q ô g N

• Chú ý: 𝑂(𝐶. 𝑓(𝑛)) = 𝑂(𝑓(𝑛)) với C là hằng số.

Ðặc biệt 𝑂(𝐶) = 𝑂(1).

12

O lớn

• Ý tưởng của big-O là tìm cận trên của độ tăng

trưởng của hàm 𝑓(𝑛) khi n đủ lớn.

• Cận trên xác định bởi hàm 𝑔(𝑛) đơn giản hơn

𝑓(𝑛).

t

i

• Xác định được hằng C sao cho 𝑓(𝑛)  𝐶𝑔(𝑛)

khi 𝑛 > 𝑘.

ệ V c ố u Q ô g N

• Mục tiêu là tìm cận trên nhỏ nhất 𝑔(𝑛) sao cho

𝑓(𝑛)  𝐶𝑔(𝑛) khi 𝑛 > 𝑘

13

O lớn

t

i

Cho 𝑓 𝑛 = 𝑛2 + 2𝑛 + 1. Chứng minh 𝑓(𝑛) là 𝑂 𝑛2 𝑛2 + 2𝑛 + 1 ≤ 4𝑛2. Chọn 𝑘 = 1, 𝐶 = 4, 𝑓 𝑛 ≤ 4. 𝑛2, ∀𝑛 ≥ 1 ⇒ 𝑓(𝑛) là 𝑂 𝑛2

ệ V c ố u Q ô g N

14

Các tính chất O “lớn”

• Định lý: Cho đa thức

t

với ai hằng số, ad > 0, thì

i

ệ V c ố u Q ô g N

15

Một số tính chất của O lớn

t

i

ệ V c ố u Q ô g N

trình

QUI TẮC

Quy tắc tổng: Thời gian thực hiện của đoạn hai chương trình nối tiếp nhau là 𝑻(𝒏) = 𝑶(max (𝒇(𝒏), 𝒈(𝒏)))

Quy tắc nhân: Thời gian thực hiện của đoạn hai đoạn chương lồng nhau là: 𝑻(𝒏) = 𝑶(𝒇(𝒏). 𝒈(𝒏))

16

Quy tắc tổng

• Độ phức tạp chương trình P1 là: 𝑂(𝑓(𝑛)). • Độ phức tạp chương trình P2 là: 𝑂(𝑔(𝑛)). • Thời gian thực hiện tuần tự P1, P2 là:

𝑂(max (𝑓(𝑛), 𝑔(𝑛))).

t

i

• Chứng minh:

ệ V c ố u Q ô g N

𝑛1.

𝑇2(𝑛) = 𝑂(𝑔(𝑛)) nên  𝑛2, 𝑐2 sao cho 𝑇2(𝑛) < 𝑐2. 𝑔(𝑛) ∀𝑛 >

𝑛2.

Chọn 𝑛0 = max (𝑛1, 𝑛2); 𝑐 = max (𝑐1, 𝑐2) =>  𝑛 > 𝑛0

𝑇1(𝑛) + 𝑇2(𝑛) <= 𝑐1. 𝑓(𝑛) + 𝑐2. 𝑔(𝑛) <= 𝑐. 𝑓(𝑛) + 𝑐. 𝑔(𝑛) <

= 2𝑐. max (𝑓(𝑛), 𝑔(𝑛))

𝑇1(𝑛) + 𝑇2(𝑛) = 𝑂(max (𝑓(𝑛), 𝑔(𝑛)))

17

𝑇1(𝑛) = 𝑂(𝑓(𝑛)) nên  𝑛1, 𝑐1 sao cho 𝑇1(𝑛) < 𝑐1. 𝑓(𝑛) ∀ 𝑛 >

Quy tắc nhân

phức tạp là: 𝑂(𝑓(𝑛). 𝑔(𝑛)).

t

i

(𝑛), theo đn:

ệ V c ố u Q ô g N

• Độ phức tạp chương trình P là: 𝑂(𝑓(𝑛)). • Nếu thực hiện P 𝑘(𝑛) lần, với 𝑘(𝑛) = 𝑂(𝑔(𝑛)), thì độ

,

ta

 𝑛 >= max (𝑛𝑘, 𝑛𝑇)

𝑘(𝑛). 𝑇(𝑛) <= 𝑐𝑇. 𝑐𝑘. (𝑔(𝑛). 𝑓(𝑛))

18

• Chứng minh: Thời gian thực hiện 𝑘(𝑛) lần P sẽ là 𝑘(𝑛). 𝑇  𝑛𝑘, 𝑐𝑘 > 0 sao cho 𝑘(𝑛) < 𝑐𝑘. 𝑔(𝑛) ∀𝑛 > 𝑛𝑘  𝑛𝑇, 𝑐𝑇 > 0 sao cho T 𝑛 < 𝑐𝑇. 𝑓 𝑛 ∀𝑛 > 𝑛𝑇 Vậy:

Một số tính chất O lớn

t

i

ệ V c ố u Q ô g N

19

Một số hàm độ phức tạp phổ biến

n

n3

2n

t

i

ệ V c ố u Q ô g N

1 2 3 8 16 32

logn nlogn n2 0 1 2 3 4 5

1 4 16 64 256 1024

0 2 8 24 64 160

1 8 64 512 4096 32768

2 4 16 256 65536 2147483648

20

o nhỏ

• Định nghĩa: 𝑓(𝑛) = 𝑜(𝑔(𝑛)), nghĩa là với mọi 𝑐 > 0 tồn tại 𝑘 > 0 sao cho 0 ≤ 𝑓(𝑛) < 𝑐𝑔(𝑛) với mọi 𝑛 ≥ 𝑘. Giá trị k độc lập n, nhưng có thể phụ thuộc c.

• Ví dụ: 3𝑛 + 4 là 𝑜(𝑛²). Chọn 𝑘 > (3 + √(9 + 16𝑐))/2𝑐.

Trong khi, 3𝑛 + 4 ≠ 𝑜(𝑛)

t

i

• Hàm nếu là o-nhỏ của g cũng là O-lớn của g, nhưng ngược lại

không đúng. o-nhỏ là cận trên, nhưng không nhỏ nhất

ệ V c ố u Q ô g N

21

Ví dụ về phân tích độ phức tạp

• Sắp xếp hoán vị trực tiếp

t

i

ệ V c ố u Q ô g N

22

void exchangesort(int n, int a[]) { for (i = 0; i < n - 1; i++) for (j = i + 1; j< n; j++) if (a[j] < a[i]) swap(a[i], S[j]); }

Ví dụ về phân tích độ phức tạp

• Nhân ma trận

t

i

for (i = 0; i < n; i++) for (j = 0; j < n; j++) { C[i][j] = 0; for (k = 0; k < n; k++) C[i][j] = C[i][j] + A[i][k] * B[k][j];

ệ V c ố u Q ô g N

}

void matrixmult(int n, A[][], B[][], C[][]) {

23

}

Ví dụ về phân tích độ phức tạp

• Trộn hai danh sách A=a1,…, an với B=b1,..,bn

t

i

ệ V c ố u Q ô g N

24

Ví dụ về phân tích độ phức tạp

• Liệt kê mọi cặp phần tử

t

i

ệ V c ố u Q ô g N

25

Ví dụ về phân tích độ phức tạp

• Cho đồ thị n node, hãy liệt kê mọi đồ thị con k nút sao cho hai nút không được nối bởi cạnh.

t

i

ệ V c ố u Q ô g N

26

Ví dụ so sánh độ phức tạp

t

i

ệ V c ố u Q ô g N

if (|ai – aj| > m) m = |ai

1 2

1 2

𝑛2 – = maxdiff (a1, a2, …, an: integers) m = 0 for i = 1 to n-1 for j = i + 1 to n – aj| Số phép so sánh: 𝑛 − 1 + 𝑛 − 2 + 𝑛 − 3 + … + 1 = 𝑛 – 1 𝑛 𝑛 = 𝑂 𝑛2 2

27

maxdiff (a1, a2, …, an: integers) min = a1 max = a1 for i = 2 to n if (ai < min) min = ai else (if ai > max) max = ai m = max – min Số phép so sánh: 2𝑛 − 2𝑙 = 𝑂(𝑛)

Một số độ phức tạp khác

• Hai khái niệm tương tự O “lớn” là:  “lớn” và

 “lớn”.

• Định nghĩa  “lớn”: Cho hàm g(n). Ký hiệu

t

i

Ω(𝑔(𝑛)) là tập của các hàm: Ω(𝑔(𝑛)) = *𝑓(𝑛): 𝑐 𝑣à 𝑛0 0 ≤ 𝑐𝑔(𝑛) ≤ 𝑓(𝑛), ∀𝑛

ệ V c ố u Q ô g N

g(n) là biên tiệm cận dưới của f(n). Ký hiệu:

𝑓(𝑛) ∈ Ω(𝑔(𝑛))

≥ 𝑛0+

• 𝑓 𝑥 =  𝑔 𝑥 ⟺ 𝑔 𝑥 = 𝑂 𝑓(𝑥)

•  ngược với O lớn, nghĩa là

28

•  “lớn” chỉ độ phức tạp tối thiểu

Một số độ phức tạp khác

•  lớn: lân cận trên và dưới, nghĩa là 𝑓 𝑥 = Θ 𝑔 𝑥 ⟺ 𝑓 𝑥 = 𝑂 𝑔 𝑥 ∧ 𝑓 𝑥

= Ω 𝑔 𝑥

t

i

• Nhận xét: mọi đa thức là  lớn của phần tử có mũ lớn nhất:𝑥4/100000 + 3𝑥3 + 5𝑥2– 9 = Θ(𝑥4)

ệ V c ố u Q ô g N

29

Ví dụ về O-lớn, , 

• Sắp từ nhỏ đến lớn các hàm sau

;

1 𝑥 + 𝑠𝑖𝑛𝑥; ln 𝑥 ; 𝑥 + 𝑥; 𝑥 13 + 𝑥; 𝑒 𝑥; 𝑥𝑒; 𝑥 𝑥; 𝑥 + 𝑠𝑖𝑛𝑥 𝑥20 − 101 ; 𝑥𝑙𝑛 𝑥; 𝑥 ln 𝑥 2; 𝑙𝑔2𝑥

t

i

ệ V c ố u Q ô g N

; ln 𝑥 ; 𝑙𝑔2𝑥; 13 + 𝑥; 𝑥 + 𝑠𝑖𝑛𝑥; 𝑥 +

1 𝑥

Trả lời: 1 ; 13 + 𝑥 𝑥; 𝑥𝑙𝑛 𝑥; 𝑥 ln 𝑥 2; 𝑥𝑒;

𝑥 + 𝑠𝑖𝑛𝑥 𝑥20 − 101 ; 𝑒 𝑥; 𝑥 𝑥

30

Các hàm không so sánh được

• Hai hàm 𝑓(𝑛) và 𝑔(𝑛) gọi là không so sánh được

nếu chúng không là cận (trên hoặc dưới) của nhau

• Thể hiện: độ phức tạp của chúng không hoàn

t

i

toàn trội (hoặc nhỏ) với các khoảng giá trị n khác nhau

ệ V c ố u Q ô g N

• Ví dụ: 𝑓 𝑛 = 𝑥2𝑠𝑖𝑛𝑥 , 𝑔 𝑛 = 5𝑥1.5

31

Phân tích insertsort

t

i

ệ V c ố u Q ô g N

x = a[i]; j = i -1; while( (j > 0) && (x < a[i])) { a[j+1]=a[j]; j --; } a[j+1]=x;

32

for(i=2; i <= n; i ++) { }

Phân tích insertsort

𝑖 − 1 =

= 𝑂 𝑛2

𝑊𝑐𝑜𝑚𝑝 𝑛 =

𝑛 𝑖=2

𝑛(𝑛−1) 2

• Trường hợp tốt nhất: 𝐵𝑐𝑜𝑚𝑝 𝑛 = 𝑛 − 1 • Trường hợp xấu nhất:

t

i

• Trường hợp trung bình: lần duyệt thứ i, có tối đa i vị trí

ệ V c ố u Q ô g N

33

để chèn x  xác suất để chèn x vào một vị trí xác định ở bước i là 1/𝑖.

Phân tích insertsort

Vị trí (giá trị j)

Số lần so sánh x < a[i]

1

i

2

i-1

3

i-2

t

i

...

i-2

2

ệ V c ố u Q ô g N

i-1

1

• Số lần so sánh nếu chèn x ở bước i ở vị trí

𝑖−1

1.

+ 2.

+ ⋯ + 𝑖 − 1

=

=

=

1 𝑖

1 𝑖

1 𝑖

1 𝑖

1 𝑖

𝑖 𝑖 − 1 2

𝑖 − 1 2

𝑘 𝑘=1

• Số lần lặp ở bước i

𝑛 𝑖=2

34

= 𝑂 𝑛2 • Số lần lặp cho cả mảng: 𝑖−1 2

Phân tích SelectionSort

t

i

ệ V c ố u Q ô g N

k = j; x = a[j];

x = a[i]; k = i; for( j=i+1; j <= n; j ++) { if(a[j]

35

for(i=1; i <= n-1; i ++) { } • Ý tưởng thuật giải: với mỗi i, dãy i phần tử là dãy tăng

Phân tích SelectionSort

𝑛 𝑛−1 2

• Số phép so sánh a[i] < x: = 𝑂 𝑛2

• Số lệnh gán:

t

• Tốt nhất (các lệnh đỏ): 4 𝑛 − 1

i

2.𝑛 𝑛−1 2

= • Xấu nhất (lệnh đỏ và xanh lá): 4 𝑛 − 1 +

ệ V c ố u Q ô g N

𝑂 𝑛2

• Trung bình: số lệnh gán trung bình là: 2. 𝑛 − 𝑖 − 1 2 .

𝑛−1 𝑖=1

36

Vậy tổng số lệnh gán 𝑛 − 𝑖 − 1 + 4 𝑛 − 1 = 𝑂 𝑛2

Định lý master

• Ước lượng độ phức tạp trong các thuật giải chia để trị • Xét thủ tục:

t

i

ệ V c ố u Q ô g N

Do work of amount f(n)

Function T( n : size) : if n < 1 exit T(n/b) T(n/b) ...repeat for a total of a times... T(n/b) end

• Khi đó: 𝑇 𝑛 = 𝑎𝑇

+ 𝑓(𝑛), f(n) là chi phí thực hiện

𝑛 𝑏

37

ngoài đệ quy.

Định lý master

• Định lý: giả sử 𝑓(𝑛) = 𝑂 𝑛𝑐

t

i

• Ví dụ:

• 𝑇 𝑛 = 8𝑇 𝑛/2 + 1000𝑛2 (trường hợp 𝑐 = 2 <

ệ V c ố u Q ô g N

• Case 1: Nếu 𝑐 < 𝑙𝑜𝑔𝑏𝑎 thì 𝑇 𝑛 = Θ 𝑛𝑙𝑜𝑔𝑏𝑎 • Case 2: Nếu 𝑐 = 𝑙𝑜𝑔𝑏𝑎 thì 𝑇 𝑛 = Θ 𝑛𝑐𝑙𝑜𝑔𝑛 • Case 3: Nếu 𝑐 > 𝑙𝑜𝑔𝑏𝑎 thì 𝑇 𝑛 = Θ 𝑛𝑐

𝑙𝑜𝑔𝑏𝑎 = 𝑙𝑜𝑔28 = 3  𝑇 𝑛 = Θ 𝑛3

38

• 𝑇 𝑛 = 2𝑇 𝑛/2 + 10𝑛 (trường hợp 𝑐 = 1 = 𝑙𝑜𝑔𝑏𝑎 = 𝑙𝑜𝑔22 = 1  𝑇 𝑛 = Θ 𝑛𝑙𝑜𝑔𝑛 • 𝑇 𝑛 = 2𝑇 𝑛/2 + 𝑛2 (trường hợp 𝑐 = 2 > 𝑙𝑜𝑔𝑏𝑎 = 𝑙𝑜𝑔22 = 1  𝑇 𝑛 = Θ 𝑛2

Định lý master

• Định lý (Case 1): nếu 𝑓 𝑛 = 𝑂 𝑛𝑙𝑜𝑔𝑏𝑎−𝜀 , 𝜀 > 0, thì

t

i

𝑇 𝑛 = Θ 𝑛𝑙𝑜𝑔𝑏𝑎 .

ệ V c ố u Q ô g N

• Định lý (Case 2): nếu 𝑓(𝑛) = Θ 𝑛𝑙𝑜𝑔𝑏𝑎𝑙𝑜𝑔𝑘𝑛 thì 𝑇 𝑛 = Θ 𝑛𝑙𝑜𝑔𝑏𝑎𝑙𝑜𝑔𝑘+1𝑛 (k thường bằng zero).

𝑛 𝑏

≤ • Định lý (Case 3): nếu 𝑓(𝑛) = Ω 𝑛𝑙𝑜𝑔𝑏𝑎+𝜀 , và a𝑓

39

𝑐𝑓 𝑛 , 𝑐 < 1 , thì 𝑇 𝑛 = Θ 𝑓(𝑛) .

Bài tập

• Xác định độ phức tạp của các biểu

t

i

ệ V c ố u Q ô g N

thức sau, hoặc xác định là không thể áp dụng định lý master. • 𝑇 𝑛 = 3𝑇 𝑛/2 + 𝑛2 • 𝑇 𝑛 = 4𝑇 𝑛/2 + 𝑛2 • 𝑇 𝑛 = 𝑇 𝑛/2 + 2𝑛 • 𝑇 𝑛 = 2𝑛𝑇 𝑛/2 + 𝑛𝑛 • 𝑇 𝑛 = 16𝑇 𝑛/4 + 𝑛 • 𝑇 𝑛 = 2𝑇 𝑛/2 + 𝑛𝑙𝑜𝑔𝑛 • 𝑇 𝑛 = 2𝑇 𝑛/2 + 𝑛/𝑙𝑜𝑔𝑛

– Θ 𝑛2 (case 3) – Θ 𝑛2𝑙𝑜𝑔𝑛 (case 2)) – Θ 2𝑛 (case 3) – 𝑁𝑜𝑡 (a: not const) – Θ 𝑛2 (case 1) – 𝑛 𝑙𝑜𝑔2𝑛 – 𝑁𝑜𝑡

40

(non-polynomial difference between f(n) 𝑎 and 𝑛𝑙𝑜𝑔𝑏 )

Bài tập

 𝑇 𝑛 = 2𝑇 𝑛/4 + 𝑛0.51

1 𝑛  𝑇 𝑛 = 16𝑇 𝑛/4 + 𝑛!

t

i

ệ V c ố u Q ô g N

 𝑇 𝑛 = 0.5𝑇 𝑛/2 +

41

 Θ 𝑛0.51 (case 3)  𝑁𝑜𝑡 (a < 1)  Θ 𝑛! (case 3)  Θ 𝑛 (case 1)  Θ 𝑛𝑙𝑜𝑔3 (case 1)  Θ 𝑛 (case 1)  Θ 𝑛2 (case 1)  Θ 𝑛𝑙𝑜𝑔𝑛 (case 3)  Θ 𝑛𝑙𝑜𝑔𝑛 (case 3)  Θ 𝑛2𝑙𝑜𝑔𝑛 (case 2)  Θ 𝑛2 (case 1)  𝑇 𝑛 = 2𝑇 𝑛/2 + 𝑙𝑜𝑔𝑛  𝑇 𝑛 = 3𝑇 𝑛/2 + 𝑛  𝑇 𝑛 = 3𝑇 𝑛/3 + 𝑛  𝑇 𝑛 = 4𝑇 𝑛/2 + 𝑐𝑛  𝑇 𝑛 = 3𝑇 𝑛/4 + 𝑛𝑙𝑜𝑔𝑛  𝑇 𝑛 = 3𝑇 𝑛/3 + 𝑛/2  𝑇 𝑛 = 6𝑇 𝑛/3 + 𝑛2𝑙𝑜𝑔𝑛  𝑇 𝑛 = 4𝑇 𝑛/2 + 𝑙𝑜𝑔𝑛/𝑛

Bài tập

• Cho đoạn chương trình

t

i

ệ V c ố u Q ô g N

1 2 3 4 5 6 7 8 9

sum = 0; i =1; while (i<=n){ j = n – i; while (j<=i){ sum = sum + j; j = j+1; } i = i +1; }

a) Tính số phép gán và phép so sánh được thực hiện trong đoạn chương

trình trên

b) Tính độ phức tạp

42

Bài tập

𝐼𝑓 𝑓 = 𝑂(𝑔) 𝑎𝑛𝑑 𝑔 = 𝑂(𝑕) 𝑡𝑕𝑒𝑛 𝑓 = 𝑂(𝑕).

t

i

1. Chứng minh tính chất bắc cầu của O lớn 2. Chứng minh các tính chất / quy tắc của O lớn. 3. Phân tích độ phức tạp các giải thuật sắp xếp

ệ V c ố u Q ô g N

(buble sort, quicksort, v.v).

4. Đọc thêm và trình bày: Tìm kiếm chuỗi (tìm chuỗi trong một chuỗi khác-sử dụng cấu trúc mảng). Phân tích độ phức tạp.

Morris-Pratt. Phân tích độ phức tạp

43

5. Đọc thêm và trình bày: thuật giải tìm kiếm Knuth-