Trong lĩnh vực Công Nghệ Thông Tin nói riêng, yêu cầu quan trọng nhất của người học đó chính là thực hành. Có thực hành thì người học mới có thể tự mình lĩnh hội và hiểu biết sâu sắc với lý thuyết. Với ngành mạng máy tính, nhu cầu thực hành được đặt lên hàng đầu. Tuy nhiên, trong điều kiện còn thiếu thốn về trang bị như hiện nay, người học đặc biệt là sinh viên ít có điều kiện thực hành. Đặc biệt là với các thiết bị đắt tiền như Router, Switch chuyên dụng
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 Kỹ Thuật Thiết Kế Chia Để Trị Chia toán lớn thành 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ỏ toán Gộp lời giải toán Sắp Xếp Gộp (Merge Sort) Chia: chia đôi mảng Trị: Sử dụng đệ quy xếp mảng Gộp: gộp mảng với thời gian tuyến tính MergeSort (, 1, ) if = return MergeSort (, 1, /2 ) MergeSort (, /2 + 1, ) Merge (, 1, /2 , /2 + 1, ) () = 2(/2) + Θ() chia gộp # toán độ lớn toán Định Lý Tổng Quát – (nhắc lại) = / + () Nếu ∈ ( ) với số > ∈ ( ) Nếu ∈ ( ) ∈ ( log ) Nếu ∈ "( # ) với số > thỏa mãn / ≤ %() với % < ∈ (()) Sắp xếp gộp: = 2, = ⇒ = ( ) = ⇒ trường hợp ⇒ () ∈ ( log ) Tính Lũy Thừa Tính * , với ∈ ℕ Thuật toán đơn giản: () Thuật toán áp dụng chia để trị: */) × */) * = , (*0)/) × (*0)/) × chẵn lẻ () = (/2) + (1) ⇒ () ∈ (log ) Tính Lũy Thừa Thuật tốn áp dụng chia để trị: */) × */) * = , (*0)/) × (*0)/) × PowerN(, ) if = return if % 2 = return PowerN else * , ) return PowerN(, chẵn lẻ * ×PowerN(, ) ) *0 ) ) ×PowerN(, *0 )× ) () = 2(/2) + (1) ⇒ () ∈ () ⇒ SAI !!!! Tính Lũy Thừa Thuật tốn áp dụng chia để trị: */) × */) * = , (*0)/) × (*0)/) × PowerN(, ) if = return if % 2 = chẵn lẻ * ← PowerN , ) return × else *0 ← PowerN(, ) ) return × × () = (/2) + (1) ⇒ () ∈ (log ) Tìm Kiếm Nhị Phân Tìm phần tử dãy xếp Chia: Kiểm tra phần tử Trị: Sử dụng đệ quy tìm kiếm mảng tương ứng Gộp: hiển nhiên Ví dụ: Tìm 9 12 15 Tìm Kiếm Nhị Phân – Phân Tích () = 1(/2) + (1) # bài-toán-con chia gộp độ lớn toán Áp dụng Định Lý Tổng Quát = ( = 4 = ⇒ trường hợp ⇒ ∈ log = (log ) Tính Số Fibonacci = 0,1 5* = , 5*0 +5*) ≥ 1 13 21 … Thuật toán đệ quy: 7(8 * ) (thời gian hàm mũ), với = (1 + 5)/2 – golden ratio 10 Tính Số Fibonacci Thiết kế Bottom-up: Tính 54 , 50 , 5) , …, 5* theo thứ tự, số sau tổng hai số trước Thời gian chạy: () 5* = * / làm trịn Tính lũy thừa: (log ) Tuy nhiên cách không đáng tin cậy, dễ có lỗi làm trịn tính toá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 đĩa nhỏ move(, , ;, ? = ∙ ; với A, B = 1, 2, … , * %>? = C >D ∙ D? DE0 13 Nhân Ma Trận – Mã Giả for A ← to for B ← to %>? ← for F ← to %>? ← %>? + >D ∙ D? Thời gian chạy (G ) 14 Nhân Ma Trận – Chia-Để-Trị Ý tưởng: × MT = × MT (/2) × (/2) MT-con H J H = M + N I = + ℎ J = %M + LN K = % + Lℎ I = K % M ∙ L N ℎ < =∙; nhân cộng * * ( ) × ( ) MT-con ) ) * * ( ) × ( ) MT-con ) ) 15 Nhân Ma Trận – Phân Tích () = 8(/2) + # bài-tốn-con ) ( ) chia gộp độ lớn toán Q ( = = ⇒ trường hợp ⇒ () ∈ (G ) Không tốt !!! G 16 Nhân Ma Trận – Thuật Tốn Strassen Nhân × ma trận với 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 nhân, 18 cộng/trừ 17 Nhân Ma Trận – Thuật Toán Strassen Chia: Chia ; thành (/2) × (/2) ma trận Trị: Thực hiên đệ quy phép nhân (/2) × (/2) ma trận Gộp: Tạo ma trận < sử dụng + – (/2) × (/2) ma trận () = 7(/2) + () ) 18 Thuật Toán Strassen – Phân Tích () = 7(/2) + () ) = ( X = ).Q0 ⇒ () ∈ ( X ) log = 2.81 trông không nhỏ Tuy nhiên, nên nhớ khác biệt số mũ Do thời gian chạy bị ảnh hưởng nhiều Trên thực thế, thuật toán Strassen’s tốt thuật tốn nhân ma trận thơng thường với ≥ 32 19 Tổng Kết Chia để trị phương pháp thiết kế thuật toán Thuật tốn chia để trị phân tích dựa quy nạp phương pháp định lý tổng quát Thông thường phương pháp chia để trị hiệu 20