quá trình phân chia sẽ cùng dạng với bài toán ban đầu, chỉ khác nhau về kích thước. – Có thể có một số bài toán con không cùng[r]
Trang 1CƠ SỞ LẬP TRÌNH
NÂNG CAO
Biên soạn: Ths.Tôn Quang Toại TonQuangToai@yahoo.com
TPHCM, NĂM 2013
KHOA CÔNG NGHỆ THÔNG TIN
Trang 2PHƯƠNG PHÁP THIẾT KẾ
THUẬT TOÁN − CHIA ĐỂ TRỊ −
Chương 6
Trang 3Nội dung
• Giới thiệu
• Phương pháp
• Sơ đồ cài đặt
• Các ví dụ
Trang 4Hình ảnh
Trang 5Giới thiệu
• Chia để trị là phương pháp thiết kế thuật toán từ trên xuống dưới (top – down) với ý tưởng:
– Chia bài toán lớn thành những bài toán nhỏ hơn có dạng giống bài toán ban đầu
– Các bài toán nhỏ hơn được chia thành những bài toán nhỏ hơn nữavới hy vọng rằng các bài
toán nhỏ dễ giải hơn
Trang 6Phương pháp
• Phương pháp Chia để trị gồm 3 bước:
– Bước 1 [Divide] – Chia bài toán thành các phần
– Bước 2 [Solve] – Giải quyết các phần
– Bước 3 [Combine] – Kết hợp các lời giải của các phần thành lời giải của bài toán
Trang 7Phương pháp
• Nhận xét quan trọng:
– Các bài toán con (các phần) nhận được trong quá trình phân chia sẽ cùng dạng với bài toán ban đầu, chỉ khác nhau về kích thước
– Có thể có một số bài toán con không cùng
dạng với bài toán lớn
– Các bài toán con Không được giao nhau
Trang 8Sơ đồ cài đặt
• Cài đặt bằng phương pháp Đệ qui
void DivideConquer(A, x)
{
if (A du nho) Solve(A)
else
{
- Phan chia A thanh A0, A1, …, An-1
- for (i=0; i<n; i++)
DivideConquer(Ai, xi)
- Ket hop cac nghiem xi de duoc nghiem x }
}
Trang 9Các ví dụ
• Ví dụ 1 [Sorting 1]: Cho dãy a1, a2, …,
an Hãy xây dựng thuật toán sắp xếp dãy trên tăng dần
…
• Bước 1: Divide
Trang 10Các ví dụ
– Bước 2: Solve
Sorted
• Bước 3: Combine