เทคนิคอัลกอริทึมแบบ
Divide-and-Conquer
Advance Computer Programming
รหัสวิชา 32090207
อ. กิตตินันท์ น้1อยมณี 1
เนื้อหา
1. Introduction
2. Binary Search
3. Select Sort
4. Merge Sort
5. Divide-and-Conquer
อ. กิตตินันท์ น้1อยมณี 2
Introduction
อ. กิตตินันท์ น้3อยมณี 3
Introduction
• เราจะใช้ Big O ในการวิเคราะห์ Worse Case ของ
แต่ละกรณี
• แทนด้วยสัญลักษณ์ O( symbol )
อ. กิตตินันท์ น้1อยมณี 4
Introduction
การวิเคราะห์การใช้เวลาของอัลกอริทึม
อ. กิตตินันท์ น้1อยมณี 5
t = f(n)
n (ขนาดข้อมูลที่โตขึ้นเรื่อยๆ)
O(n!)
O(2n)
O(n2)
O(n)
O(1)
Introduction
การวิเคราะห์การใช้เวลาของอัลกอริทึม
อ. กิตตินันท์ น้1อยมณี 6
O(n2)
O(n)
Introduction
การวิเคราะห์การใช้เวลาของอัลกอริทึม
อ. กิตตินันท์ น้1อยมณี 7
t = f(n)
n (ขนาดข้อมูลที่โตขึ้นเรื่อยๆ)
O(n!)
O(2n)
O(n2)
O(n)
O(1)
O( n logn )
O( logn )
Introduction
การวิเคราะห์การใช้เวลาของอัลกอริทึม
อ. กิตตินันท์ น้1อยมณี 8
t = f(n)
n (ขนาดข้อมูลที่โตขึ้นเรื่อยๆ)
O(n!)
O(2n)
O(n2)
O(n)
O(1)
O( n logn )
O( logn )
Sort
Search
สูตรเฉพาะ เช่น เกาส์
Binary Search
อ. กิตตินันท์ น้9อยมณี 9
Binary Search
• แรกเริ่มเดิมทีเราจะใช้การ Search แบบ Linear
Search (หรือเรียกว่า Sequential Search) ซึ่งมี
ลักษณะการทํางานดังนี้
อ. กิตตินันท์ น้1อยมณี 10
Binary Search
อ. กิตตินันท์ น้1อยมณี 11
Binary Search
อ. กิตตินันท์ น้1อยมณี 12
0 1 2 3 4 5
7 4 1 8 3 2
Binary Search
อ. กิตตินันท์ น้1อยมณี 13
0 1 2 3 4 5
7 4 1 8 3 2
Binary Search
อ. กิตตินันท์ น้1อยมณี 14
0 1 2 3 4 5
7 4 1 8 3 2
Binary Search
อ. กิตตินันท์ น้1อยมณี 15
0 1 2 3 4 5
7 4 1 8 3 2
Binary Search
อ. กิตตินันท์ น้1อยมณี 16
Binary Search
• แต่กว่าจะเจอข้อมูลที่ต้องการใช้เวลานาน
• กรณีที่แย่ที่สุด (Worse Case) ก็คือกรณีที่เลขที่
ต้องการค้นหาอยู่ด้านหลังสุดของ Array แสดงว่า
เราต้องวนจนสุด Loop กันเลยทีเดียว
• ดังนั้นจึงมีการคิดค้นการ Search อีกรูปแบบคือ
Binary Search (มีเงื่อนไขข้อมูลใน Array ต้องถูก
เรียงมาก่อนแล้ว) อ. กิตตินันท์ น้1อยมณี 17
Binary Search
อ. กิตตินันท์ น้1อยมณี 18
0 1 2 3 4 5
Data 1 2 4 5 8 9 Find 8
• หลักการคือ ตัดชุดข้อมูลที่ไม่สนใจออกครึ่งนึงเลย
• วิธีการคือ กําหนดให้
– i ชี้ที่ Front (ด้านหน้าสุด)
– j ชี้ที่ Rear (ด้านหลังสุด)
– m ชี้ที่ Middle (ด้านกลาง)
Binary Search
อ. กิตตินันท์ น้1อยมณี 19
0 1 2 3 4 5
Data 1 2 4 5 8 9 Find 8
i jj
• ก่อนเข้า Loop ต้องให้ i = 0 และ j = n-1 (ตัว
สุดท้าย)
• หลักการคือเอา data[m] ไปเทียบกับ find
mm
Binary Search
อ. กิตตินันท์ น้1อยมณี 20
0 1 2 3 4 5
Data 1 2 4 5 8 9 Find 8
i jj
รอบที่ 0 i = 0 รอบแรก %2 Floor j = n - 1
รอบที่ 1
รอบที่ 2
รอบที่ 3
mm
Binary Search
อ. กิตตินันท์ น้1อยมณี 21
0 1 2 3 4 5
Data 1 2 4 5 8 9 Find 8
i jj
รอบที่ 0 i = 0 รอบแรก %2 Floor j = n - 1
รอบที่ 1 i = m+1
= 3
m = 2 j = 5
รอบที่ 2
รอบที่ 3
mm
Binary Search
อ. กิตตินันท์ น้1อยมณี 22
0 1 2 3 4 5
Data 1 2 4 5 8 9 Find 8
i jj
รอบที่ 0 i = 0 รอบแรก %2 Floor j = n - 1
รอบที่ 1 i = m+1
= 3
m = 2 j = 5
รอบที่ 2 m = 4
รอบที่ 3
mm
หมายเหตุ: ตรวจดูว่าเจอรึยัง ถ้ายังไม่เจอก็ทําต่อ
Binary Search
อ. กิตตินันท์ น้1อยมณี 23
0 1 2 3 4 5
Data 1 2 4 5 8 9 Find 8
i jj
รอบที่ 0 i = 0 รอบแรก %2 Floor j = n - 1
รอบที่ 1 i = m+1
= 3
m = 2 j = 5
รอบที่ 2 i = 3 m = 4 j = 4
รอบที่ 3 m = 3
mm
Binary Search
อ. กิตตินันท์ น้1อยมณี 24
0 1 2 3 4 5
Data 1 2 4 5 8 9 Find 8
i jj
รอบที่ 0 i = 0 รอบแรก %2 Floor j = n - 1
รอบที่ 1 i = m+1
= 3
m = 2 j = 5
รอบที่ 2 i = 3 m = 4 j = 4
รอบที่ 3 i = 4 m = 3 j = 4
mm
หมายเหตุ: หยุด ถ้าใช่เจอ ถ้าไม่ใช่แสดงว่าไม่เจอ
Binary Search
อ. กิตตินันท์ น้1อยมณี 25
Algorithm BinarySearch( data[n]:integer, find:integer )
i:=0, j:=n-1
while( i<j )
m:=
if data[m] < find then i:=m+1
else j:=m
if data[i] = find then pos:=I
else pos:= -1 {not found}
return pos
End Algorithm
Binary Search
อ. กิตตินันท์ น้1อยมณี 26
Binary Search
อ. กิตตินันท์ น้1อยมณี 27
0 1 2 3 4 5
Data 1 2 4 5 8 9 Find 8
Binary Search
อ. กิตตินันท์ น้1อยมณี 28
เปรียบเทียบ Linear Binary
ข้อมูล 6 ตัว 6 รอบ รอบ
=
= 2.xxx รอบ
(Worse case คือ 3 รอบ)
ข้อมูล 100 ตัว 100 รอบ รอบ
=
= 6.xxx รอบ
เร็วกว่าเห็นๆ
Binary Search
• คราวที่แล้วเราเรียนเรื่อง Recursion ไปแล้ว ดังนั้น
ลองเอาความรู้ที่ได้มาประยุกต์ใช้กันดู
อ. กิตตินันท์ น้1อยมณี 29
Binary Search
อ. กิตตินันท์ น้1อยมณี 30
เราจะวนคิดไปเรื่อยๆ
ตรงนี้คือเงื่อนไขการจบ
Binary Search
อ. กิตตินันท์ น้1อยมณี 31
Binary Search
อ. กิตตินันท์ น้1อยมณี 32
• ช่วงข้อมูลในการพิจารณาคือ i และ j โดยมี
ตําแหน่งตรงกลางคือ m
• ดังนั้นเราเอาตําแหน่งกลางไปเทียบกับ find ได้เลย
• หากค่า find มากกว่าตําแหน่งตรงกลาง เราก็จะ
ทําครึ่งขวา โดยทําตั้งแต่ตําแหน่ง m + 1 จนถึง j
นั่นเอง (แสดงว่า find ไม่ได้อยู่ในซีกซ้าย จะอยู่ใน
ซีกขวานั่นเอง)
Binary Search
อ. กิตตินันท์ น้1อยมณี 33
• สามารถเขียนฟังก์ชันเพิ่มเติมได้ในลักษณะนี้
Binary Search
อ. กิตตินันท์ น้1อยมณี 34
Binary Search
อ. กิตตินันท์ น้1อยมณี 35
• โดยเมื่อหาเจอจะต้อง Return ตําแหน่งที่พบใน
BinSearch โดยจะทําการเรียก BSRecur เพื่อใช้ใน
การหา ซึ่งจะส่งข้อมูลเริ่มต้นไปให้ นั่นคือ i = 0
และ j = n-1 นั่นเอง
• ผลสุดท้ายจะได้ค่า i ออกมา ถ้าเจอก็ได้ pos แต่
ถ้าไม่เจอก็ให้เป็นเลข -1
Binary Search
อ. กิตตินันท์ น้1อยมณี 36
• เทคนิคการคิดลักษณะนี้มันจะตรงกับอัลกอริทึมที่
เรียกว่า Divide-and-Conquer (แบ่งและชนะ) ทํา
ให้การทํางานของโปรแกรมดีขึ้น
• ยังมีอัลกอริทึมอีกอันนึงคือ Merge Sort ซึ่งอันนี้ก็
ใช้ Divide-and-Conquer ด้วยเหมือนกัน
Select Sort
อ. กิตตินันท์ น้37อยมณี 37
Select Sort
• แปลตรงๆ คือการเลือกไปเรียง
• แปลดีๆ คือการเลือกค่าที่ต้องการ เพื่อไปวางยัง
ตําแหน่งที่ถูกต้อง
อ. กิตตินันท์ น้1อยมณี 38
0 1 2 3 4 5
Data 8 2 1 3 4 6
Select Sort
อ. กิตตินันท์ น้1อยมณี 39
0 1 2 3 4 5
Data 8 2 1 3 4 6
• เราจะเรียกจากน้อยไปมาก
• ดังนั้นต้องเลือกค่าที่ต้องการไปไว้ในตําแหน่งที่
ถูกต้อง
Select Sort
อ. กิตตินันท์ น้1อยมณี 40
0 1 2 3 4 5
Data 8 2 1 3 4 6
0 1 2 3 4 5
Data 8 2 1 3 4 6
รอบที่ 0
วนหาค่าที่น้อยที่สุดให้ได้
ก่อนว่าอยู่ตรงไหน
จากนั้นค่อยจับมาใส่
Select Sort
อ. กิตตินันท์ น้1อยมณี 41
0 1 2 3 4 5
Data 8 2 1 3 4 6
0 1 2 3 4 5
Data 1 2 8 3 4 6
รอบที่ 0
เลือก 1 มาวางที่ตําแหน่ง 0
ดังนั้นสลับเลข 1 กับ 8
หมายเหตุ: วนหา 6 รอบ
Select Sort
อ. กิตตินันท์ น้1อยมณี 42
0 1 2 3 4 5
Data 1 2 8 3 4 6
0 1 2 3 4 5
Data 1 2 8 3 4 6
รอบที่ 1
ดูต่อว่าค่าที่เหลือมีอันไหน
น้อยสุดบ้าง ถ้ามีก็สลับเลย
(ถ้าไม่มีก็ไปต่อได้)
หมายเหตุ: วนหา 5 รอบ
Select Sort
อ. กิตตินันท์ น้1อยมณี 43
0 1 2 3 4 5
Data 1 2 8 3 4 6
0 1 2 3 4 5
Data 1 2 3 8 4 6
รอบที่ 2
หมายเหตุ: วนหา 4 รอบ
Select Sort
อ. กิตตินันท์ น้1อยมณี 44
0 1 2 3 4 5
Data 1 2 3 8 4 6
0 1 2 3 4 5
Data 1 2 3 4 8 6
รอบที่ 3
หมายเหตุ: วนหา 3 รอบ
Select Sort
อ. กิตตินันท์ น้1อยมณี 45
0 1 2 3 4 5
Data 1 2 3 4 8 6
0 1 2 3 4 5
Data 1 2 3 4 6 8
รอบที่ 4
หมายเหตุ: วนหา 2 รอบ
Select Sort
• แสดงว่าต้องมีการวนทั้งหมด 2 Loop ซ้อนกัน
• นั่นคือ O(n2) นั่นเอง
อ. กิตตินันท์ น้1อยมณี 46
Select Sort
อ. กิตตินันท์ น้1อยมณี 47
ต้องมี temp เพราะเดี๋ยว
จะมีการสลับค่าเกิดขึ้น
Select Sort
อ. กิตตินันท์ น้1อยมณี 48
หาตําแหน่งที่มี
ข้อมูลน้อยที่สุด
Select Sort
อ. กิตตินันท์ น้1อยมณี 49
เอาข้อมูลมาสลับ
Select Sort
อ. กิตตินันท์ น้1อยมณี 50
Select Sort
อ. กิตตินันท์ น้1อยมณี 51
Merge Sort
อ. กิตตินันท์ น้52อยมณี 52
Merge Sort
อ. กิตตินันท์ น้1อยมณี 53
1 2 1 8 6 5 4
Merge Sort
อ. กิตตินันท์ น้1อยมณี 54
1 2 1 8 6 5 4
1 2 1 8 6 5 4
Merge Sort
อ. กิตตินันท์ น้1อยมณี 55
1 2 1 8 6 5 4
1 2 1 8 6 5 4
1 2 1 8 6 5 4
Merge Sort
อ. กิตตินันท์ น้1อยมณี 56
1 2 1 8 6 5 4
1 2 1 8 6 5 4
1 2 1 8 6 5 4
1 2 1 8 6 5 4
Merge Sort
อ. กิตตินันท์ น้1อยมณี 57
1 2 1 8 6 5 4
1 2 1 8 6 5 4
1 2 1 8 6 5 4
1 2 1 8 6 5 4
1 1 2 6 8 4 5*
Merge Sort
อ. กิตตินันท์ น้1อยมณี 58
1 2 1 8 6 5 4
1 2 1 8 6 5 4
1 2 1 8 6 5 4
1 2 1 8 6 5 4
1 1 2 6 8 4 5
1 1 2 4 5 6 8
*
*
Merge Sort
อ. กิตตินันท์ น้1อยมณี 59
1 2 1 8 6 5 4
1 2 1 8 6 5 4
1 2 1 8 6 5 4
1 2 1 8 6 5 4
1 1 2 6 8 4 5
1 1 2 4 5 6 8
1 1 2 4 5 6 8
*
*
*
Merge Sort
อ. กิตตินันท์ น้1อยมณี 60
Algorithm mergesort( T[n] )
if n > 1 then
u[0 … -1 ] := T[ 0 … -1]
v[0 … -1] := T[ … n-1]
mergesort( u )
mergesort( v )
merge( u, v, T )
End Algorithm
5 4
5 4
u v
T
แบ่งต่อไปเรื่อยๆ อีก
อีกอัลกอริทึมนึง
Merge Sort
อ. กิตตินันท์ น้1อยมณี 61
Algorithm merge( u[m], v[n], T[m+n] )
i := 0, j := 0
for k := 0 to m+n-1
if i >= m then T[k] := v[j], j := j + 1
else if j >= n then T[k] := u[i], i := i + 1
else if u[i] < v[j] then T[k] := u[i], i := i + 1
else T[k] := v[j], j := j + 1
End Algorithm
5 4
5 4
u v
T
Merge Sort
อ. กิตตินันท์ น้1อยมณี 62
ลองทําด้วยตัวเองดูนะครับ
Merge Sort
อ. กิตตินันท์ น้1อยมณี 63
ลองทําด้วยตัวเองดูนะครับ
Merge Sort
อ. กิตตินันท์ น้1อยมณี 64
Divide-and-Conquer
อ. กิตตินันท์ น้65อยมณี 65
Divide-and-Conquer
• ดังนั้น Divide-and-Conquer คือการแบ่งข้อมูล
(ปัญหาต่างๆ) ให้มีขนาดเล็กลง แล้วจึงแก้ไข
ปัญหาไปทีละอย่าง
• แล้วค่อยนําคําตอบจากส่วนเล็กๆ มาประกอบกัน
จนเป็นคําตอบของโจทย์ปัญหาทั้งหมดนั่นเอง
• ซึ่งทั้ง Binary Search และ Merge Sort ล้วนแต่ใช้
เทคนิคของ Divide-and-Conquer ทั้งสิ้นอ. กิตตินันท์ น้1อยมณี 66

(Big One) C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer