More Related Content Similar to (Big One) C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer (15) (Big One) C Language - 10 เทคนิคอัลกอริทึมแบบ divide-and-conquer17. Binary Search
• แต่กว่าจะเจอข้อมูลที่ต้องการใช้เวลานาน
• กรณีที่แย่ที่สุด (Worse Case) ก็คือกรณีที่เลขที่
ต้องการค้นหาอยู่ด้านหลังสุดของ Array แสดงว่า
เราต้องวนจนสุด Loop กันเลยทีเดียว
• ดังนั้นจึงมีการคิดค้นการ Search อีกรูปแบบคือ
Binary Search (มีเงื่อนไขข้อมูลใน Array ต้องถูก
เรียงมาก่อนแล้ว) อ. กิตตินันท์ น้1อยมณี 17
18. 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 (ด้านกลาง)
19. 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
20. 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
21. 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
22. 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
หมายเหตุ: ตรวจดูว่าเจอรึยัง ถ้ายังไม่เจอก็ทําต่อ
23. 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
24. 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
หมายเหตุ: หยุด ถ้าใช่เจอ ถ้าไม่ใช่แสดงว่าไม่เจอ
25. 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
28. Binary Search
อ. กิตตินันท์ น้1อยมณี 28
เปรียบเทียบ Linear Binary
ข้อมูล 6 ตัว 6 รอบ รอบ
=
= 2.xxx รอบ
(Worse case คือ 3 รอบ)
ข้อมูล 100 ตัว 100 รอบ รอบ
=
= 6.xxx รอบ
เร็วกว่าเห็นๆ
32. Binary Search
อ. กิตตินันท์ น้1อยมณี 32
• ช่วงข้อมูลในการพิจารณาคือ i และ j โดยมี
ตําแหน่งตรงกลางคือ m
• ดังนั้นเราเอาตําแหน่งกลางไปเทียบกับ find ได้เลย
• หากค่า find มากกว่าตําแหน่งตรงกลาง เราก็จะ
ทําครึ่งขวา โดยทําตั้งแต่ตําแหน่ง m + 1 จนถึง j
นั่นเอง (แสดงว่า find ไม่ได้อยู่ในซีกซ้าย จะอยู่ใน
ซีกขวานั่นเอง)
35. Binary Search
อ. กิตตินันท์ น้1อยมณี 35
• โดยเมื่อหาเจอจะต้อง Return ตําแหน่งที่พบใน
BinSearch โดยจะทําการเรียก BSRecur เพื่อใช้ใน
การหา ซึ่งจะส่งข้อมูลเริ่มต้นไปให้ นั่นคือ i = 0
และ j = n-1 นั่นเอง
• ผลสุดท้ายจะได้ค่า i ออกมา ถ้าเจอก็ได้ pos แต่
ถ้าไม่เจอก็ให้เป็นเลข -1
36. Binary Search
อ. กิตตินันท์ น้1อยมณี 36
• เทคนิคการคิดลักษณะนี้มันจะตรงกับอัลกอริทึมที่
เรียกว่า Divide-and-Conquer (แบ่งและชนะ) ทํา
ให้การทํางานของโปรแกรมดีขึ้น
• ยังมีอัลกอริทึมอีกอันนึงคือ Merge Sort ซึ่งอันนี้ก็
ใช้ Divide-and-Conquer ด้วยเหมือนกัน
38. Select Sort
• แปลตรงๆ คือการเลือกไปเรียง
• แปลดีๆ คือการเลือกค่าที่ต้องการ เพื่อไปวางยัง
ตําแหน่งที่ถูกต้อง
อ. กิตตินันท์ น้1อยมณี 38
0 1 2 3 4 5
Data 8 2 1 3 4 6
39. Select Sort
อ. กิตตินันท์ น้1อยมณี 39
0 1 2 3 4 5
Data 8 2 1 3 4 6
• เราจะเรียกจากน้อยไปมาก
• ดังนั้นต้องเลือกค่าที่ต้องการไปไว้ในตําแหน่งที่
ถูกต้อง
40. 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
วนหาค่าที่น้อยที่สุดให้ได้
ก่อนว่าอยู่ตรงไหน
จากนั้นค่อยจับมาใส่
41. 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 รอบ
42. 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 รอบ
43. 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 รอบ
44. 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 รอบ
45. 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 รอบ
58. 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
*
*
59. 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
*
*
*
60. 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
แบ่งต่อไปเรื่อยๆ อีก
อีกอัลกอริทึมนึง
61. 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
66. Divide-and-Conquer
• ดังนั้น Divide-and-Conquer คือการแบ่งข้อมูล
(ปัญหาต่างๆ) ให้มีขนาดเล็กลง แล้วจึงแก้ไข
ปัญหาไปทีละอย่าง
• แล้วค่อยนําคําตอบจากส่วนเล็กๆ มาประกอบกัน
จนเป็นคําตอบของโจทย์ปัญหาทั้งหมดนั่นเอง
• ซึ่งทั้ง Binary Search และ Merge Sort ล้วนแต่ใช้
เทคนิคของ Divide-and-Conquer ทั้งสิ้นอ. กิตตินันท์ น้1อยมณี 66