Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

Binary Search JavaScript: คู่มือการเขียน Binary Search

วิธีเขียน Binary Search ใน JavaScript

Searching algorithms ทำชีวิต programmer ง่ายขึ้นมาก ทำให้หา item เฉพาะใน data set ที่มีสิบ ร้อย หรือพัน items ง่ายขึ้น

หนึ่งในรูปแบบ searches ที่นิยมที่สุดคือ binary search การค้นหานี้หา item ใน array ได้เร็ว ทุกครั้งที่ search ดูผ่าน item จะลดจำนวน items ที่เหลือต้องค้นหาลงครึ่งหนึ่ง

ในคู่มือนี้ เราจะพูดถึง binary searches คืออะไร และทำงานอย่างไร แล้วไป implement binary search ด้วยสอง approaches: iterative และ recursive

มาสร้าง binary search algorithm ใน JavaScript!

Binary Search คืออะไร?

Binary search เป็น computer science algorithm ที่ค้นหา item ใน sorted array

มันเริ่มตรงกลาง array และเช็คว่า middle item น้อยกว่า เท่ากับ หรือมากกว่า number ที่คุณค้นหา

ถ้า number น้อยกว่า algorithm รู้ว่าต้องค้นหาต่อใน left half ของ array ที่ตัวเลขน้อยกว่าอยู่ ถ้า number มากกว่า algorithm จะ focus ที่ right half ของ array Binary searches ทำงานได้เฉพาะ sorted lists

Binary searches มีประสิทธิภาพมากกว่า linear searches เพราะทุกครั้งที่ search ทำ จำนวน items ที่เหลือต้องค้นหาในลิสต์ลดลงครึ่งหนึ่ง

วิธีใช้ Binary Search

Binary search เข้าใจง่ายตอนคุณจับเคล็ดลับ

ก่อน implement binary search algorithm มาเดินผ่านทีละขั้นตอน เราจะหา number "9" ในลิสต์ เริ่มจาก sorted list:

268910

ก่อนอื่น ต้องหา middle number assign ให้ variable หาได้จากการคำนวณ sum ของ first และ last numbers หารสอง เราจะเรียก variable นี้ว่า "middle":

Start
Middle
End
268910

8 คือ middle number ต่อมา เราเปรียบเทียบ middle number กับ number ที่ค้นหา ถ้า middle number เท่ากับที่ค้นหา search ของเราหยุดได้

ในตัวอย่าง 8 ไม่เท่ากับ 9 search ของเราดำเนินต่อ

ต่อไป ต้องเปรียบเทียบว่า middle number มากกว่า 9 หรือไม่ มันไม่มากกว่า

นี่บอกเราว่า number ที่ค้นหาต้องอยู่หลัง middle number 9 มากกว่า 8 ใน sorted list เราจะตั้ง starting number ให้เท่ากับ middle number เพราะเรารู้ว่า number ที่ค้นหาไม่ได้มาก่อน middle number

ถ้า number ที่ค้นหาน้อยกว่า เราจะตั้ง end number ให้เท่ากับ middle number เพราะ number น้อยกว่า middle number เราสามารถ focus search ที่ lower half ของ list

Binary search ทำซ้ำบน top half ของ list เพราะ 9 มากกว่า 8:



StartMiddleEnd
268910

เราหา middle number อีกครั้ง คือ 9 เราเปรียบเทียบ 9 กับ number ที่ค้นหา 9 เท่ากับ number ที่ค้นหา

หมายความว่า search ของเราหยุดได้ เราหา number 9 ในลิสต์สำเร็จ!

วิธี Implement Binary Search ใน JavaScript

Binary searches implement ได้ด้วย iterative หรือ recursive approach

Iterative Binary Search

Iterative binary search ใช้ while loop หา item ในลิสต์ Loop นี้ execute จนกว่าจะเจอ item ในลิสต์ หรือจนกว่าลิสต์จะถูกค้นหา

เริ่มเขียนฟังก์ชันทำ binary search:

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; }

เราเริ่มกำหนดสอง variables: start และ end เก็บ highest และ lowest values ที่ search ทำงาน ใช้ while loop รันจน start number มากกว่า end number Loop นี้คำนวณ middle number ระหว่าง start และ end ในลิสต์

ถ้า number ที่ค้นหาเท่ากับ middle number middle number คืนค่าไป main program ถ้า number น้อยกว่า start value ตั้งให้เท่ากับ middle number plus one การเปรียบเทียบเหล่านี้ทำด้วย if statement

ไม่เช่นนั้น end number ตั้งให้เท่ากับ middle number minus one ถ้า number ไม่เจอหลัง while loop รัน -1 จะคืนค่า เราเรียกว่า base condition ใน main program เราจะเช็คว่าค่าที่คืนเท่ากับ -1 หรือไม่ ถ้าใช่ หมายความว่า number หาไม่เจอ

ฟังก์ชันของเรายังไม่ทำงาน ต้องเขียน main program เรียกมัน:

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.`); }

เรากำหนดลิสต์เลขที่จะ search และ number ที่อยากหาในลิสต์ ต่อมา เรียก binarySearch function จะทำ search search จะคืนค่า -1 หรือ position ของ item ที่ค้นหา

-1 หมายถึง item หาไม่เจอ ถ้า item ไม่เจอ เนื้อหา else statement จะ execute ไม่เช่นนั้น เนื้อหา if statement จะรัน

ลองรันโค้ด:

9 has been found at position 3.

บอกเราว่า search สำเร็จ!

Recursive Binary Search

Recursive binary search ถูกมองว่า elegant กว่า iterative เพราะ binary searches ทำ operation เดียวกันซ้ำๆ บนลิสต์ พฤติกรรมนี้ implement ได้ด้วย recursion algorithm

เปิด JavaScript file ใหม่ วางโค้ดนี้:

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); } }

โค้ดนี้ทำ comparisons เหมือน search แรก เช็คว่า middle number เท่ากับ มากกว่า หรือน้อยกว่า number ที่ค้นหา

ต้นฟังก์ชัน เราใช้ if statement เช็คว่า start number มากกว่า end number ถ้าใช่ item หาไม่เจอในลิสต์ที่ระบุ คืนค่า -1 ไป main program

ถ้า number ที่หาเท่ากับ middle number middle number คืนค่าไป main program ถ้า number ที่หามากกว่าหรือน้อยกว่า middle number binarySearch function รันอีกครั้ง ดำเนินต่อจนกว่าจะเจอ item

ต้องรันฟังก์ชันนี้ ต้องแก้ main program:

let numbers = [2, 6, 8, 9, 10]; let toFind = 9; let findNumber = binarySearch(numbers, toFind, 0, numbers.length - 1); … 

ต้องส่ง parameter เพิ่มสองตัว: ค่า "start" และ "end" ค่า "start" เท่ากับ 0 ค่า "end" เท่ากับความยาวลิสต์ลบหนึ่ง

ลองรันโค้ดดู:

9 has been found at position 3.

Binary search ของเราสำเร็จ! ใช้ underlying algorithm เหมือน iterative approach ต่างตรงที่ binary search ทำโดย function เรียกตัวเองจนกว่าจะเจอ item หรือลิสต์ถูกค้นหาเต็มที่

สรุป

Binary searches ทำให้หา item ในลิสต์ง่าย ทุกครั้งที่ search execute จำนวน items ที่เหลือต้องค้นหาลดลงครึ่งหนึ่ง ทำให้ binary search มีประสิทธิภาพมากกว่า linear search

ตอนนี้คุณพร้อม implement binary search ใน JavaScript แบบมืออาชีพแล้ว!