อัลกอริทึม Binary Search เป็นวิธีที่มีประสิทธิภาพในการค้นหาค่าเฉพาะในอาร์เรย์ที่เรียงลำดับ วิธีนี้จะแบ่งอาร์เรย์ออกเป็นส่วนเล็กๆ และเปรียบเทียบค่าที่ตำแหน่งกึ่งกลางของช่วงการค้นหากับค่าเป้าหมายอย่างต่อเนื่อง หากค่าตรงกันจะพบค่าที่ต้องการ มิฉะนั้น อัลกอริทึมจะยังคงจำกัดช่วงการค้นหาให้แคบลงและทำกระบวนการซ้ำจนกว่าจะพบค่าหรือไม่มีองค์ประกอบให้ตรวจสอบอีกต่อไป
ขั้นตอน:
- เริ่มต้นช่วงการค้นหา: เริ่มต้นด้วยการเลือกช่วงการค้นหาจากตำแหน่งแรก
left
ไปยังตำแหน่งสุดท้ายright
ของอาร์เรย์ - ค้นหาจุดกึ่งกลาง: คำนวณจุดกึ่งกลางโดยหาค่าเฉลี่ย
left
และตำแหน่งที่เหมาะสม นี่คือจุดกึ่งกลางของช่วงการค้นหา - เปรียบเทียบค่า: เปรียบเทียบค่าที่จุดกึ่งกลางกับค่าเป้าหมาย
- จับผลการเปรียบเทียบ: ถ้าค่าที่จุดกึ่งกลางตรงกับค่าเป้าหมาย ส่งคืนตำแหน่งนี้ หากค่าที่จุดกึ่งกลางน้อยกว่าค่าเป้าหมาย ให้อัปเดตตำแหน่งด้านซ้ายเป็นตรงกลาง + 1 เพื่อค้นหาด้านขวา หากค่าที่จุดกึ่งกลางมากกว่าค่าเป้าหมาย ให้อัปเดตตำแหน่งด้านขวาเป็นตรงกลาง- 1 เพื่อค้นหาครึ่งซ้าย
- ทำซ้ำ: ทำซ้ำขั้นตอนที่ 2 ถึง 4 จนกว่าจะพบค่าหรือไม่มีองค์ประกอบให้ตรวจสอบ
left > right
อีก
ข้อดีและข้อเสีย
ข้อดี:
- ประสิทธิภาพที่มีประสิทธิภาพ: ความซับซ้อนของเวลาของอัลกอริทึมคือ O(log n) ทำให้มีประสิทธิภาพสูงในการจัดการชุดข้อมูลขนาดใหญ่
- มีประสิทธิภาพสำหรับชุดข้อมูลขนาดใหญ่: การค้นหาแบบไบนารีมีประสิทธิภาพในการลดจำนวนองค์ประกอบเพื่อตรวจสอบชุดข้อมูลขนาดใหญ่ได้อย่างรวดเร็ว
ข้อเสีย:
- ใช้ได้กับอาร์เรย์ที่เรียงลำดับเท่านั้น: อัลกอริทึมใช้งานได้กับอาร์เรย์ที่เรียงลำดับเท่านั้น
- จำนวนขั้นตอนที่เปลี่ยนแปลงได้: จำนวนขั้นตอนที่จำเป็นในการค้นหาค่าขึ้นอยู่กับตำแหน่งในอาร์เรย์ และอาจใช้หลายขั้นตอนสำหรับค่าที่ใกล้ถึงจุดสิ้นสุด
ตัวอย่าง: Binary Search เพื่อค้นหาค่า 12 ในอาร์เรย์ที่เรียงลำดับใน PHP
function binarySearch($arr, $target) {
$left = 0;
$right = count($arr)- 1;
while($left <= $right) {
$mid = floor(($left + $right) / 2);
if($arr[$mid] == $target) {
return $mid; // Return the position of the value
} elseif($arr[$mid] < $target) {
$left = $mid + 1;
} else {
$right = $mid- 1;
}
}
return -1; // Value not found
}
$array = [2, 5, 8, 12, 15, 20, 30];
$targetValue = 12;
$result = binarySearch($array, $targetValue);
if($result != -1) {
echo "Value $targetValue found at position $result.";
} else {
echo "Value $targetValue not found in the array.";
}
คำอธิบายของตัวอย่าง
- เราเริ่มต้นด้วยช่วงการค้นหาเริ่มต้นจากตำแหน่งแรก
left = 0
ถึงตำแหน่งสุดท้ายright = 6
ของอาร์เรย์ - เราคำนวณจุดกึ่งกลาง(กลาง) โดยเฉลี่ยตำแหน่งซ้ายและขวา
mid = 3
. ค่ากลางคือ 12 - เราเปรียบเทียบค่าที่
mid(12
) กับค่าเป้าหมาย(12) และพบการจับคู่ เราจึงส่งคืนตำแหน่งที่ 3 - อัลกอริทึมสิ้นสุดลง และเราแสดงผลลัพธ์ "พบค่า 12 ที่ตำแหน่ง 3"