การแบ่งแยกและเอาชนะ Divide & Conquer
บทนำ กลวิธีนี้มีใช้เพื่อจัดการกับปัญหาในหลากหลายศาสตร์กับการออกแบบ อัลกอริทึม เพื่อแก้ไขปัญหาเชิงคำนวณ แนวคิดการแก้ปัญหาแบบนี้มี หลักการว่า แบ่งปัญหาใหญ่นั้นออกเป็นปัญหาย่อยๆ หลาย ๆ ปัญหาที่มี ขนาดเล็กกว่า หาคำตอบของแต่ละปัญหาย่อย แล้วนำคำตอบย่อยๆ ที่ได้นี้มา รวมกันเพื่อกลายเป็นคำตอบของปัญหาใหญ่ อาจจะซับซ้อนน้อยกว่า และ ใช้เวลาโดยรวมที่ดีกว่าก็ได้ อัลกอริทึมแบบแบ่งแยกและเอาชนะมักมีประสิทธิภาพที่ดีกว่าอัลกอริทึมที่ ทำงานอย่างตรงไปตรงมา ค่อยเป็นค่อยไป นอกจากนี้ยังเขียนบรรยายตัว อัลกอริทึมในรูปของการทำซ้ำแบบเรียกซ้ำได้อย่างเหมาะมาก ทำให้เขียน บรรยายอัลกอริทึมได้อย่างไม่ซับซ้อน และวิเคราะห์ประสิทธิภาพการทำงาน ได้ง่าย
หัวข้อ โครงของอัลกอริทึมแบบ Divide & Conquer ตัวอย่าง Binary search Modular exponentiation Karatsuba integer multiplication Strassen matrix multiplication Merge sort Quick sort Quick select Closet point Min + Max Celebrity problem
โครงของอัลกอริทึมแบบ Divide & Conquer
Divide – Conquer - Combine DQ ( P) { if ( P is trivial ) return Solve ( P ) Divide P into P1, P2, … , Pk for ( i =1to k ) Si = DQ ( Pi ) S = Combine ( S1, S2, …, Sk) return S }
Binary Search
Binary Search input : x และ 𝐷=< 𝑑 1 , 𝑑 2 , 𝑑 3 ,…, 𝑑 𝑛 > 𝑑 1 ≤ 𝑑 2 ≤𝑑 3 ≤…≤ 𝑑 𝑛 x และ 𝑑 𝑖 เป็นจำนวนจริง output : ค่า k ที่ 𝑑 𝑘 =𝑥 ถ้าหาไม่พบ คืน -1
Binary Search bsearch( d[1…n], x, left, right ) { if ( left > right ) return -1 mid = (𝑙𝑒𝑓𝑡+𝑟𝑖𝑔ℎ𝑡)/2 if ( x == d[mid] ) return mid if ( x < d[mid]) return bsearch( d, x, left, mid – 1) else return bsearch( d, x, mid + 1, right) }
บางครั้งใช้ binary search ดีกว่า
Modular exponentiation
2 60 𝑚𝑜𝑑 10=? แสดงโดยการใช้เครื่องคิดเลขให้ดูก่อน
𝑎 𝑘 𝑚𝑜𝑑 𝑚
การคำนวณ 𝑎 𝑘 𝑚𝑜𝑑 𝑚
การคูณหารเลขขนาดใหญ่ไม่ใช่ Θ(1)
การหาค่า Fibonacci
Karatsuba integer multiplication
A x B : คูณได้เร็วกว่า Θ( 𝑛 2 )
A x B
A x B อีกแบบ
A x B : Karatsuba (1962)
เปรียบเทียบเวลาการทำงาน
Strassen matrix multiplication
A x B : การคูณเมทริกซ์ MatrixMult( A[1..n][1..n], B[1..n][1..n] ){ C = new array[1..n][1..n] for ( i = 1; i <= n; i++ ) { for(j= 1; j<= n; j++){ C[i][j] = 0 for ( k = 1; k <= n; k++ ) { C[i][j] += A[i][k] * B[k][j] } return C n
A x B : Divide & Conquer
A x B : Divide & Conquer
A x B : Strassen (1969)
Master Method (ตีความ)
Merge Sort
Merge Sort
Merge Sort
Merge Sort
Merge
Merge : #cmps
Merge Sort : ถ้าแบ่ง 30 - 70
Quick Sort
Quick Sort
Quick Sort
Partition (การแบ่งส่วน)
Quick Sort
Quick Sort : กรณีเร็วสุด
Quick Sort : กรณีช้าสุด
Quick Sort : กรณีเฉลี่ย
Quick Sort : กรณีเฉลี่ย
Quick Sort : เวลาการทำงาน
เวลาการทำงาน
เวลา / n log n