C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer
Transcript of C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 1
เทคนิคอัลกอริทึมแบบ
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
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 2
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
สูตรเฉพาะ เช่น เกาส์
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 3
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
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 4
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
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 5
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
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 6
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
หมายเหตุ: หยุด ถ้าใช่เจอ ถ้าไม่ใช่แสดงว่าไม่เจอ
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 7
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 รอบ
เร็วกว่าเห็นๆ
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 8
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 ไม่ได้อยู่ในซีกซ้าย จะอยู่ใน
ซีกขวานั่นเอง)
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 9
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 ด้วยเหมือนกัน
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 10
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วนหาค่าที่น้อยที่สุดให้ได้
ก่อนว่าอยู่ตรงไหน จากนั้นค่อยจับมาใส่
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 11
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 รอบ
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 12
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
หาตําแหน่งที่มีข้อมูลน้อยที่สุด
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 13
Select Sort
อ. กิตตินนัท์ น้1อยมณี 49
เอาข้อมูลมาสลับ
Select Sort
อ. กิตตินนัท์ น้1อยมณี 50
Select Sort
อ. กิตตินนัท์ น้1อยมณี 51
Merge Sort
อ. กิตตินนัท์ น้52อยมณี 52
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 14
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
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 15
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
แบ่งต่อไปเรื่อยๆ อีก
อีกอัลกอริทึมนึง
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 16
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 4u v
T
Merge Sort
อ. กิตตินนัท์ น้1อยมณี 62
ลองทําด้วยตัวเองดูนะครับ???
Merge Sort
อ. กิตตินนัท์ น้1อยมณี 63
ลองทําด้วยตัวเองดูนะครับ???
Merge Sort
อ. กิตตินนัท์ น้1อยมณี 64
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 17
Divide-and-Conquer
อ. กิตตินนัท์ น้65อยมณี 65
Divide-and-Conquer
• ดังนั้น Divide-and-Conquer คือการแบ่งข้อมูล
(ปัญหาต่างๆ) ให้มีขนาดเล็กลง แล้วจึงแก้ไข
ปัญหาไปทีละอย่าง
• แล้วค่อยนําคําตอบจากส่วนเล็กๆ มาประกอบกัน
จนเป็นคําตอบของโจทย์ปัญหาทั้งหมดนั่นเอง
• ซึ่งทั้ง Binary Search และ Merge Sort ล้วนแต่ใช้
เทคนิคของ Divide-and-Conquer ทั้งสิ้นอ. กิตตินนัท์ น้1อยมณี 66