วิธีเขียนโค้ดการค้นหาแบบไบนารีใน JavaScript
การค้นหาอัลกอริทึมทำให้ชีวิตง่ายขึ้นมากในฐานะโปรแกรมเมอร์ การทำเช่นนี้ทำให้ง่ายต่อการค้นหารายการใดรายการหนึ่งภายในชุดข้อมูลที่มีหลายสิบ หลายร้อย หรือหลายพันรายการ
รูปแบบการค้นหาที่ได้รับความนิยมมากที่สุดรูปแบบหนึ่งคือการค้นหาแบบไบนารี การค้นหานี้จะค้นหารายการในอาร์เรย์อย่างรวดเร็ว ทุกครั้งที่การค้นหาดูผ่านรายการใดรายการหนึ่ง จะลดจำนวนรายการที่เหลือให้ค้นหาลงครึ่งหนึ่ง
ในคู่มือนี้ เราจะพูดถึงการค้นหาแบบไบนารีคืออะไรและทำงานอย่างไร จากนั้นเราจะดำเนินการค้นหาแบบไบนารีโดยใช้สองวิธีที่แตกต่างกัน:แบบวนซ้ำและแบบเรียกซ้ำ
มาสร้างอัลกอริทึมการค้นหาแบบไบนารีใน JavaScript!
การค้นหาแบบไบนารีคืออะไร
การค้นหาแบบไบนารีคืออัลกอริธึมวิทยาการคอมพิวเตอร์ที่ค้นหารายการในอาร์เรย์ที่จัดเรียง
โดยเริ่มต้นจากตรงกลางของอาร์เรย์ และตรวจสอบว่ารายการตรงกลางมีค่าน้อยกว่า เท่ากับ หรือมากกว่าจำนวนที่คุณกำลังค้นหาหรือไม่
ถ้าจำนวนน้อยกว่า อัลกอริธึมรู้ว่าต้องค้นหาต่อไปในครึ่งซ้ายของอาร์เรย์ โดยที่ตัวเลขที่น้อยกว่าคือ ถ้าจำนวนมากกว่า อัลกอริธึมจะเน้นที่ครึ่งขวาของอาร์เรย์ การค้นหาไบนารีทำงานเฉพาะกับรายการที่เรียงลำดับ
การค้นหาแบบไบนารีมีประสิทธิภาพมากกว่าการค้นหาเชิงเส้น เนื่องจากทุกครั้งที่ทำการค้นหา จำนวนรายการที่เหลือให้ค้นหาในรายการจะลดลงครึ่งหนึ่ง
81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้
ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก
วิธีใช้การค้นหาแบบไบนารี
การค้นหาแบบไบนารีจะเข้าใจได้ง่ายเมื่อคุณเข้าใจแล้ว
ก่อนที่เราจะใช้อัลกอริธึมการค้นหาแบบไบนารี เรามาทำความเข้าใจทีละขั้นตอนกันก่อน เราจะค้นหาหมายเลข "9" ในรายการ เริ่มจากรายการที่เรียงกัน:
2 | 6 | 8 | 9 | 10 |
อันดับแรก เราต้องหาเลขตรงกลางและกำหนดให้กับตัวแปร พบได้โดยการคำนวณผลรวมของตัวเลขตัวแรกและตัวสุดท้ายแล้วหารด้วยสอง เราจะเรียกตัวแปรนี้ว่า "กลาง":
เริ่ม | | กลาง | | จบ |
2 | 6 | 8 | 9 | 10 |
8 คือเลขกลางของเรา จากนั้น เราสามารถเปรียบเทียบตัวเลขตรงกลางกับตัวเลขที่เรากำลังค้นหาได้ หากตัวเลขตรงกลางเท่ากับตัวเลขที่เรากำลังค้นหา การค้นหาของเราจะยุติลงได้
ในตัวอย่างนี้ 8 ไม่เท่ากับ 9 การค้นหาของเราดำเนินต่อไป
ต่อไปเราต้องเปรียบเทียบว่าเลขกลางมากกว่า 9 หรือไม่ ไม่ใช่
สิ่งนี้บอกเราว่าตัวเลขที่เรากำลังค้นหาต้องอยู่หลังหมายเลขตรงกลาง 9 มากกว่า 8 ในรายการที่เรียงลำดับ เราจะตั้งค่าจำนวนเริ่มต้นของเราให้เท่ากับจำนวนตรงกลาง เนื่องจากเราทราบดีว่าจำนวนที่เรากำลังค้นหาไม่ได้มาก่อนเลขกลาง
หากจำนวนที่เรากำลังค้นหาน้อยกว่า เราจะกำหนดจำนวนสิ้นสุดให้เท่ากับจำนวนตรงกลาง เนื่องจากตัวเลขมีขนาดเล็กกว่าตัวเลขตรงกลาง เราจึงสามารถเน้นการค้นหาที่ครึ่งล่างของรายการ
การค้นหาไบนารีซ้ำอีกครั้งในครึ่งบนของรายการเนื่องจาก 9 มากกว่า 8:
| | เริ่ม | กลาง | จบ |
2 | 6 | 8 | 9 | 10 |
เราพบเลขกลางอีกครั้ง นี่คือ 9 เราสามารถเปรียบเทียบ 9 กับตัวเลขที่เรากำลังค้นหา 9 เท่ากับจำนวนที่เราค้นหา
ซึ่งหมายความว่าการค้นหาของเราสามารถหยุดได้ เราพบหมายเลข 9 ในรายการของเราเรียบร้อยแล้ว!
วิธีการใช้การค้นหาแบบไบนารีใน JavaScript
การค้นหาแบบไบนารีสามารถดำเนินการได้โดยใช้วิธีการแบบวนซ้ำหรือแบบเรียกซ้ำ
การค้นหาไบนารีแบบวนซ้ำ
การค้นหาไบนารีแบบวนซ้ำใช้การวนซ้ำ while เพื่อค้นหารายการในรายการ วนซ้ำนี้จะดำเนินการจนกว่าจะพบรายการในรายการหรือจนกว่าจะมีการค้นหารายการ
เริ่มต้นด้วยการเขียนฟังก์ชันที่ทำการค้นหาแบบไบนารีของเรา:
function binarySearch(array, numberToFind) { let start = 0; let end = array.length - 1; while (start <= end) { let middle = Math.floor((start + end) / 2); if (array[middle] === numberToFind) { return middle; } else if (array[middle] < numberToFind) { start = middle + 1; } else { end = middle - 1; } } return -1; }
เราเริ่มต้นด้วยการกำหนดตัวแปรสองตัว:เริ่มต้นและสิ้นสุด สิ่งเหล่านี้ติดตามค่าสูงสุดและต่ำสุดที่การค้นหาของเราทำงานด้วย เราใช้ while loop ที่ทำงานจนกว่าจำนวนเริ่มต้นจะมากกว่าจำนวนสิ้นสุด การวนซ้ำนี้คำนวณจำนวนตรงกลางระหว่างจุดเริ่มต้นและจุดสิ้นสุดในรายการ
หากหมายเลขที่เรากำลังค้นหามีค่าเท่ากับหมายเลขกลาง หมายเลขกลางจะถูกส่งกลับไปยังโปรแกรมหลักของเรา หากจำนวนน้อยกว่า ค่าเริ่มต้นจะถูกตั้งค่าให้เท่ากับตัวเลขตรงกลางบวกหนึ่ง การเปรียบเทียบเหล่านี้ดำเนินการโดยใช้คำสั่ง if
มิฉะนั้น เลขท้ายจะถูกกำหนดให้เท่ากับเลขกลางลบหนึ่ง หากไม่พบหมายเลขของเราหลังจากรัน while loop จะส่งกลับ -1 เราเรียกสิ่งนี้ว่าเงื่อนไขพื้นฐาน ในโปรแกรมหลัก เราจะตรวจสอบว่าจำนวนที่ส่งคืนเท่ากับ -1 หรือไม่ หากใช่ แสดงว่าไม่พบหมายเลขของเรา
ฟังก์ชันของเรายังไม่ทำงาน เราต้องเขียนโปรแกรมหลักที่เรียกว่า:
let numbers = [2, 6, 8, 9, 10]; let toFind = 9; let findNumber = binarySearch(numbers, toFind); if (findNumber !== -1) { console.log(`${toFind} has been found at position ${findNumber}.`); } else { console.log(`${toFind} has not been found.`); }
เราได้กำหนดรายการตัวเลขที่จะค้นหาและหมายเลขที่เราต้องการค้นหาในรายการของเรา ต่อไป เราได้เรียกฟังก์ชัน binarySearch สิ่งนี้จะทำการค้นหาของเรา การค้นหาจะส่งกลับ -1 หรือตำแหน่งของรายการที่เรากำลังค้นหา
-1 หมายถึงไม่พบรายการ หากไม่พบรายการเนื้อหาของ else
. ของเรา คำสั่งจะถูกดำเนินการ มิฉะนั้น เนื้อหาของ if
คำสั่งถูกเรียกใช้
เรียกใช้รหัสของเรา:
9 has been found at position 3.
สิ่งนี้บอกเราว่าการค้นหาของเราประสบความสำเร็จ!
การค้นหาไบนารีแบบเรียกซ้ำ
การค้นหาไบนารีแบบเรียกซ้ำนั้นถือว่าสวยงามกว่าการค้นหาแบบวนซ้ำ เนื่องจากการค้นหาไบนารีดำเนินการเดียวกันซ้ำแล้วซ้ำอีกในรายการ ลักษณะการทำงานนี้สามารถนำไปใช้ได้โดยใช้อัลกอริธึมการเรียกซ้ำ
เปิดไฟล์ JavaScript ใหม่แล้ววางในโค้ดนี้:
function binarySearch(array, numberToFind, start, end) { if (start => end) { return -1; } let middle = Math.floor((start + end) / 2); if (array[middle] === numberToFind) { return middle; } else if (array[middle] < numberToFind) { return binarySearch(array, numberToFind, middle + 1, end); } else { return binarySearch(array, numberToFind, start, middle - 1); } }
รหัสนี้ทำให้การเปรียบเทียบเหมือนกับการค้นหาครั้งแรกของเรา ตรวจสอบว่าจำนวนตรงกลางเท่ากับ มากกว่า หรือน้อยกว่าจำนวนที่เรากำลังค้นหา
ในตอนเริ่มต้นของฟังก์ชัน เราได้ใช้คำสั่ง if เพื่อตรวจสอบว่าจำนวนเริ่มต้นมากกว่าจำนวนสิ้นสุดหรือไม่ หากใช่ แสดงว่าไม่พบรายการของเราในรายการที่เราระบุ เราคืนค่า -1 ไปที่โปรแกรมหลักหากเป็นกรณีนี้
หากหมายเลขที่เราต้องการตรงกับหมายเลขกลาง หมายเลขกลางจะถูกส่งกลับไปยังโปรแกรมหลัก หากตัวเลขที่เราต้องการมากกว่าหรือน้อยกว่าตัวเลขตรงกลาง ฟังก์ชัน binarySearch ของเราจะกลับมาทำงานอีกครั้ง สิ่งนี้จะดำเนินต่อไปจนกว่าจะพบรายการของเรา
ในการเรียกใช้ฟังก์ชันนี้ เราจำเป็นต้องทำการเปลี่ยนแปลงในโปรแกรมหลักของเรา:
let numbers = [2, 6, 8, 9, 10]; let toFind = 9; let findNumber = binarySearch(numbers, toFind, 0, numbers.length - 1); …
เราจำเป็นต้องส่งผ่านพารามิเตอร์เพิ่มเติมสองรายการ:ค่าของ "เริ่มต้น" และ "สิ้นสุด" ค่าของ "เริ่มต้น" เท่ากับ 0 ค่าของ "สิ้นสุด" เท่ากับความยาวของรายการลบหนึ่ง
เรียกใช้โค้ดของเราแล้วดูว่าเกิดอะไรขึ้น:
9 has been found at position 3.
การค้นหาไบนารีของเราประสบความสำเร็จ! มันใช้อัลกอริธึมพื้นฐานเดียวกันกับวิธีการวนซ้ำ ความแตกต่างคือการค้นหาไบนารีจะดำเนินการโดยใช้ฟังก์ชันที่เรียกตัวเองจนกระทั่งพบรายการหรือจนกว่ารายการจะถูกค้นหาโดยสมบูรณ์ แล้วแต่ว่าจะถึงอย่างใดก่อน
บทสรุป
การค้นหาแบบไบนารีทำให้ง่ายต่อการค้นหารายการในรายการ ทุกครั้งที่ทำการค้นหา จำนวนรายการที่เหลือให้ค้นหาในรายการจะลดลงครึ่งหนึ่ง ทำให้การค้นหาแบบไบนารีมีประสิทธิภาพมากกว่าการค้นหาเชิงเส้น
ตอนนี้คุณพร้อมที่จะใช้งานการค้นหาแบบไบนารีใน JavaScript อย่างผู้เชี่ยวชาญแล้ว!