Bài giảng gồm các bài tập áp dụng Chia để trị có hướng dẫn chi tiết phương pháp làm nhằm giúp các bạn hiểu rõ hơn về thuật toán này. Tài liệu tham khảo hữu ích dành cho các bạn ngành Công nghệ thông tin. Mời các bạn cùng tham khảo.
2/2/2017 Phân tích Thiết kế THUẬT TOÁN Hà Đại Dương duonghd@mta.edu.vn Web: fit.mta.edu.vn/~duonghd Bài - Chia để trị (tiếp) PHÂN TÍCH VÀ THIẾT KẾ THUẬ TOÁN NỘI DUNG I II III IV Giới thiệu Lược đồ chung Bài toán áp dụng Bài tập 2/2/2017 III Bài toán áp dụng Nhân số nguyên (lớn) Bài toán: Nhân số nguyên (lớn) x, y có n chữ số x x n 1 x n x1 x0 y y n 1 y n y1 y z x * y z n 1 z n z1 z Quá quen: Đến mức không cần phải thắc mắc tính tối ưu Cách thức làm (quá quen): Độ phức tạp O(n2) III Bài toán áp dụng Nhân số nguyên (lớn) Ý tưởng: Chia để trị Đặt a x n 1 x n x n / b x ( n / ) 1 x ( n / ) x c y n 1 y n y n / d y ( n / ) 1 y ( n / ) y Khi x a * 10 n / b Và z x * y (a *10n /2 b)(c *10n /2 d ) y c * 10 n / d (a * c) *10n (a * d b * c) *10n /2 (b * d ) III Bài toán áp dụng Nhân số nguyên (lớn) Ý tưởng: Chia để trị x,y: có độ dài độ dài có dạng 2m, Có chữ số: làm trực tiếp Có n chữ số: Tích biểu diễn qua tích số nguyên có độ dài n/2 chữ số z (a * c) *10n (a * d b * c) *10n /2 (b * d ) (và phép cộng, dịch phải) 2/2/2017 III Bài toán áp dụng Nhân số nguyên (lớn) Ý tưởng: Chia để trị z (a * c) *10n (a * d b * c) *10n /2 (b * d ) Gọi T(n) thời gian thực phép nhân số nguyên có độ dài n T(n)=4T(n/2)+O(n) (O(n) thời gian thực phép cộng dịch phải) Giải công thức truy hồi ta T(n) = O(n 2) Chưa nhanh không chia để trị III Bài toán áp dụng Nhân số nguyên (lớn) Ý tưởng: Năm 1962 nhà toán học người Nga Anatoly Alexeevitch Karatsuba (Karatsuba) tối ưu thời gian thực phép nhận số nguyên có n chữ số sau: Khi T(n) = 3T(n/2)+O(n) Giải phương trình đệ qui ta T(n) = O(nlog23) O(n1.585) III Bài toán áp dụng Nhân số nguyên (lớn) Thuật toán: Karatsuba Karatsuba(x, y, n); { If n == Return x*y Else { a = x[n-1] x[n/2]; b = x[n/2-1] x[0]; c = y[n-1] y[n/2]; d = y[n/2-1] y[0]; U = Karatsuba(a, c, n/2); V = Karasuba(b, d, n/2); W = Karatsuba(a+b, c+d, n/2); Return U*10n + (W-U-V)*10n/2 + V } } 2/2/2017 III Bài toán áp dụng Nhân ma trận III Bài toán áp dụng Nhân ma trận III Bài toán áp dụng Nhân ma trận 2/2/2017 III Bài toán áp dụng Nhân ma trận III Bài toán áp dụng Nhân ma trận III Bài toán áp dụng Dãy lớn Bài toán: Cho mảng A[1 n] Mảng A[p q] gọi mảng A, trọng lượng mảng tổng giá trị phần tử Tìm mảng có trọng lượng lớn (1