Dr.Surasak Mungsing E-mail: Surasak.mu@spu.ac.th CSE 221/ICT221 การวิเคราะห์และออกแบบขั้นตอนวิธี Lecture 11: เทคนิคการออกแบบขั้นตอนวิธีตอนวิธี Greedy, Divide and Conquer Dr.Surasak Mungsing E-mail: Surasak.mu@spu.ac.th Apr-19
Common algorithm Greedy Algorithms Divide and Conquer Dynamic Programming Randomized algorithms Backtracking algorithms 4/23/2019
Greedy Algorithms เป็นเทคนิคที่การตัดสินใจเลือกหนทางปฏิบัติโดยพิจารณาทางเลือกที่เห็นว่าดีที่สุดในขณะนั้น หนทางปฏิบัติที่เลือกอาจเป็นเพียง Local optimum ตัวอย่างการใช้เทคนิค Greedy Algorithm Dijkstra’s, Prim’s และ Kruskal’s Algorithms ปัญหาการกำหนดงาน (Simple Scheduling Problems) ปัญหาการบรรจุ (Approximate Bin Packing) 4/23/2019
ตัวอย่างการแก้ปัญหา Simple Scheduling Problems Job Time J1 J2 J3 J4 15 8 3 10 J4 J1 J2 J3 15 23 26 36 Schedule #1: Average completion time = 25 Avg. completion time = (15 + 23 + 26 + 36)/4 = 100/4 = 25 J3 J1 J2 J4 36 21 11 3 Schedule #2:Average completion time = 17.75 Avg. completion time = (3 + 11 + 21 + 36)/4 = 71/4 = 17.75 4/23/2019
Approximate Bin Packing (On-line Next Fit) Item Size: 0.2, 0.5, 0.4, 0.7, 0.1, 0.3, 0.8 B1 B2 B3 empty B4 B5 empty empty 0.1 0.8 empty 0.5 empty 0.7 0.4 0.3 0.2 On-line algorithm: Next fit for 0.2, 0.5, 0.4, 0.7, 0.1, 0.3, 0.8 4/23/2019
Approximate Bin Packing (On-line First Fit) Item Size: 0.2, 0.5, 0.4, 0.7, 0.1, 0.3, 0.8 B1 empty B2 B3 empty B4 empty empty 0.1 0.8 0.5 0.7 0.3 0.4 0.2 On-line algorithm: First fit for 0.2, 0.5, 0.4, 0.7, 0.1, 0.3, 0.8 4/23/2019
Approximate Bin Packing (On-line Best Fit) Item Size: 0.2, 0.5, 0.4, 0.7, 0.1, 0.3, 0.8 B1 empty B2 empty B3 0.3 empty B4 0.1 0.8 0.5 0.7 0.4 0.2 On-line algorithm: Best fit for 0.2, 0.5, 0.4, 0.7, 0.1, 0.3, 0.8 4/23/2019
Approximate Bin Packing (Off-line Best Fit) Item Size: 0.8, 0.7, 0.5, 0.4, 0.3, 0.2, 0.1 0.1 0.2 B1 B2 0.3 B3 0.4 0.8 0.7 0.5 Off-line algorithm: Best fit for 0.8, 0.7, 0.5, 0.4, 0.3, 0.2, 0.1 4/23/2019
เป็นเทคนิคการออกแบขั้นตอนวิธีที่แบ่งออกเป็น 2 ขั้นตอน Divide and Conquer เป็นเทคนิคการออกแบขั้นตอนวิธีที่แบ่งออกเป็น 2 ขั้นตอน Divide ซึ่งเป็นขั้นตอนการแบ่งปัญหาออกเป็นส่วนย่อยๆแล้วแก้ปัญหาย่อยเหล่านั้นโดยวิธีการของฟังก์ชันที่เรียกตัวเองอย่างน้อย 2 ครั้ง Conquer เป็นขั้นตอนของการสร้างผลลัพธ์ของปัญหาใหญ่จากผลลัพธ์ของปัญหาย่อย 4/23/2019
ตัวอย่างการแก้ปัญหาโดยใช้เทคนิค Divide and Conquer ปัญหา the Maximum Subsequence Sum การเรียงลำดับแบบ Mergesort และ Quicksort ปัญหาการคูณเมตริกซ์ (Matrix Multiplication) ปัญหาการหาคู่ของจุดที่ใกล้กันที่สุด (Closest-point Problem) 4/23/2019
The Maximum Subsequence Sum Problem ให้ A1, A2, A3, …, AN เป็นเลขจำนวนเต็มบวกหรือลบก็ได้ จงหา = Ak ที่มีค่ามากที่สุด j k=i ถ้า Input -2, 11, -4, 13, -5, -2 Max subsequence sum = ? คำตอบที่ถูกต้องคือ 20 (A2 through A4) 4/23/2019
Mergesort 1 26 24 13 2 38 27 15 1 26 24 13 2 38 27 15 1 26 24 13 2 38 27 15 1 26 24 13 2 38 27 15 1 26 24 13 2 38 27 15 1 26 24 13 2 38 27 15 1 26 24 13 2 38 27 15 1 26 24 13 2 38 27 15 Apr-19 4/23/2019 12
O(n3) Matrix Multiplication C=AB where A, B, and C are N x N matrices Public static int [ ] [ ] multiply (int [ ] [ ] a, int [ ] [ ] b) { int n=a.length; int [ ] [ ] c=new int [n] [n]; for ( int i=0; I < n; i++) // initialization for( int j = 0; j < n; j++) c [i] [j] = 0; for ( int i=0; I < n; i++) for ( int j = 0; j < n; j++) for ( int k = 0; k < n; k++) c [i] [j] += a[i] [k] * b[k] [j]; return c; } 4/23/2019
Example AB = 1 2 5 7 3 4 1 6 5 1 2 9 4 3 5 6 4 5 3 1 5 6 9 3 1 1 8 4 3 1 4 1 Decompose AB into four quadrants A1,1 = 3 4 1 2 A1,2 = 1 6 5 7 B1,1 = 5 6 4 5 B1,2 = 9 3 3 1 A2,1 = 5 1 4 3 A2,2 = 2 9 5 6 B2,1 = 1 1 3 1 B2,2 = 8 4 4 1 Eight N/2 by N/2 matrices 4/23/2019
Matrix Multiplication A1,1 A1,2 A2,1 A2,2 B1,1 B1,2 B2,1 B2,2 = C1,1 C1,2 C2,1 C2,2 C1,1 = A1,1B1,1 + A1,2B2,1 C1,2 = A1,1B1,2 + A1,2B2,2 C2,1 = A2,1B1,1 + A2,2B2,1 C2,2 = A2,1B1,2 + A2,2B2,2 4/23/2019
Closest-point Problem กำหนดให้มีจุด n จุด บนระนาบสองมิติ สิ่งที่อยากทราบคือว่าคู่จุดใดอยู่ใกล้กันที่สุด ให้จุด i อยู่ที่พิกัด (xi, yi) ดังนั้น dij ซึ่งคือระยะระหว่างจุด หาได้ดังนี้ dij = √ (xi-xj)2 + (yi-yj)2 ถ้าใช้วิธีเปรียบเทียบทุกคู่จุด มีอยู่ n จุด ก็ต้องมี n(n-1)/2 คู่ คำนวณระยะของคู่จุดหนึ่งคู่ใช้เวลาคงที่ ต้องคำนวณทุกคู่ ก็ใช้เวลาอยู่ใน O(n2) 4/23/2019
Closest-point Problem ขั้นตอนการแก้ปัญหานี้ด้วยกลวิธีการแบ่งแยกและเอาชนะ (Divide and Conquer) แบ่งจุดเป็นสองฝั่ง (ซ้ายและขวา) ขนาดพอๆกัน หาคู่จุดที่ใกล้กันที่สุดของฝั่งซ้าย หาคู่จุดที่ใกล้กันที่สุดของฝั่งขวา หาคู่จุดที่ใกล้กันที่ข้ามฝั่ง (จุดหนึ่งอยู่ฝั่งซ้ายและอีกจุดหนึ่งอยู่ฝั่งขวา) เปรียบเทียบสามคู่ที่ได้จากขั้นตอนที่ 2, 3 และ 4 ก็จะได้คู่จุดที่ใกล้กันที่สุดในระนาบ T(n) = 2T(n/2) + O(n) + (เวลาของขั้นตอนที่ 4) 4/23/2019
Closest-point Problem สมมติให้ dL คือระห่างระหว่างคู่จุดใกล้กันที่สุดที่ได้พบแล้วฝั่งซ้ายและ dR คือระห่างระหว่างคู่จุดใกล้กันที่สุดที่ได้พบแล้วฝั่งขวา d = min (dL, dR) การพิจาณาคู่จุดข้ามฝั่งจะพิจารณาเฉพาะจุดที่อยู่ห่างจากเส้นแบ่งไม่เกิน d และจุดใดที่อยู่ห่างกันตามแนวดิ่งเกิน d ก็ไม่ต้องสนใจ ด้วยวิธีการพิจารณาดังกล่าวจะใช้เวลาหาคู่จุดที่ใกล้ที่สุดข้ามฝั่งเป็น O(n) ดังนั้น เวลาที่ใช้ในการหาคู่จุดที่ใกล้ที่สุด n จุดบนระนาบ T(n) = 2T(n/2) + O(n) + (เวลาของขั้นตอนที่ 4) = 2T(n/2) + O(n) +O(n)= O(n log n) 4/23/2019
เทคนิคการออกแบบขั้นตอนวิธีตอนวิธี Dynamic Programming, Backtracking Next Lecture: เทคนิคการออกแบบขั้นตอนวิธีตอนวิธี Dynamic Programming, Backtracking 23-Apr-19