การค้นหาไบนารี Python ค้นหาตำแหน่งของรายการในอาร์เรย์ที่จัดเรียง มันแบ่งรายการออกเป็นสองส่วน หากค่าที่ระบุสูงกว่าตัวเลขตรงกลาง การค้นหาจะเน้นที่ด้านขวาของรายการ มิฉะนั้น การค้นหาจะค้นหาหมายเลขทางด้านซ้ายของรายการ
คุณจะค้นหาตำแหน่งของรายการในรายการได้อย่างไร? การค้นหาแบบไบนารีช่วยคุณได้ โดยใช้การค้นหาแบบไบนารี คุณสามารถค้นหาตำแหน่งขององค์ประกอบภายในอาร์เรย์ที่จัดเรียงได้อย่างง่ายดาย
คอมพิวเตอร์สามารถค้นหารายการต่างๆ เพื่อค้นหารายการเฉพาะได้ดี กฎที่คอมพิวเตอร์ใช้เพื่อค้นหารายการในรายการเรียกว่าอัลกอริธึมการค้นหา อัลกอริธึม Python ที่ได้รับความนิยมมากที่สุดตัวหนึ่งคือการค้นหาแบบไบนารี
ในคู่มือนี้ เราจะพูดถึงการค้นหาแบบไบนารีคืออะไรและทำงานอย่างไร เราจะพูดถึงตัวอย่างการค้นหาไบนารีใน Python เพื่อให้คุณสามารถเรียนรู้วิธีการเขียนมันลงในโปรแกรมของคุณ เริ่มกันเลย!
การค้นหาไบนารีของ Python คืออะไร
การค้นหาไบนารีของ Python เป็นอัลกอริธึมที่ค้นหาตำแหน่งขององค์ประกอบในอาร์เรย์ที่เรียงลำดับ การค้นหาแบบไบนารีแบ่งรายการออกเป็นสองส่วนซ้ำๆ จากนั้น การค้นหาจะเปรียบเทียบว่าค่าสูงหรือต่ำกว่าค่ากลางในรายการ
มีสองวิธีในการค้นหาไบนารี ทั้งสองวิธีตั้งค่าพอยน์เตอร์ที่ใช้ในการติดตามตำแหน่งสูงสุดและต่ำสุด ณ จุดใดจุดหนึ่งในอาร์เรย์
วิธีแรกที่คุณสามารถใช้ได้คือวิธีการวนซ้ำ ในแนวทางนี้ จะมีการทำซ้ำชุดคำสั่งเพื่อกำหนดตำแหน่งขององค์ประกอบในอาร์เรย์ ใน Python เราใช้ while วนซ้ำเพื่อการนี้
อีกวิธีหนึ่งคือวิธีการแบบเรียกซ้ำ นี่คือที่ที่คุณเขียนฟังก์ชันที่เรียกตัวเองซ้ำแล้วซ้ำอีกจนกว่าจะพบองค์ประกอบในรายการ วิธีการแบบเรียกซ้ำใช้วิธีการแบ่งและพิชิตที่เราได้พูดคุยกันก่อนหน้านี้และทำซ้ำขั้นตอนการค้นหาจนกว่าจะพบองค์ประกอบ
81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้
ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก
Binary Search Tree Python:ทีละขั้นตอน
เมื่อพูดถึงการแบ่งแยก พิชิต และเรียกซ้ำ การค้นหาแบบไบนารี่ทำงานได้ง่ายเพียงใด ด้วยเหตุผลดังกล่าว เราจะมาดูตัวอย่างการทำงานของการค้นหาแบบไบนารี พิจารณารายการต่อไปนี้:
7 | 9 | 14 | 22 | 34 |
เราจะค้นหาหมายเลข “22” ในรายการของเรา
ในการเริ่มต้น เราจะตั้งค่าตัวชี้สองตัวในรายการของเรา ตัวชี้หนึ่งจะแสดงค่าสูงสุดในรายการ และอีกจุดหนึ่งจะแสดงค่าต่ำสุด:
ต่ำ | | | | สูง |
7 | 9 | 14 | 22 | 34 |
ขั้นตอนต่อไปของเราคือการหาองค์ประกอบตรงกลางในอาร์เรย์ ซึ่งก็คือ 14 หากค่านี้เท่ากับค่าที่เรากำลังค้นหา ค่านี้ควรถูกส่งกลับ
ในกรณีนี้ 14 ไม่ใช่ 22 ดังนั้นโปรแกรมของเราจำเป็นต้องทำการเปรียบเทียบ
เราจะเปรียบเทียบตัวเลขที่เรากำลังค้นหากับองค์ประกอบตรงกลางขององค์ประกอบทางด้านขวาขององค์ประกอบตรงกลางปัจจุบัน เราจะทำสิ่งนี้ก็ต่อเมื่อตัวเลขที่เรากำลังค้นหามากกว่าตัวเลขตรงกลาง มิฉะนั้น เราจะเปรียบเทียบองค์ประกอบกับองค์ประกอบตรงกลางทางด้านซ้ายขององค์ประกอบกลางปัจจุบัน
ตัวเลข 22 มากกว่า 14 โปรแกรมของเราเริ่มเปรียบเทียบ 22 กับองค์ประกอบตรงกลางทางด้านขวาขององค์ประกอบตรงกลางปัจจุบันของเรา (14) ในกรณีนี้ ตัวเลขนั้นคือ 22 ซึ่งเท่ากับตัวเลขที่เรากำลังค้นหา
| | ต่ำ | กลาง | สูง |
7 | 9 | 14 | 22 | 34 |
เราพบค่ากลางของเราแล้ว โปรแกรมของเราจะคืนค่าตำแหน่งดัชนีของตัวเลขนั้น ในกรณีนี้ ตำแหน่งดัชนีของ 22 คือ 3 (โปรดจำไว้ว่า รายการจะถูกสร้างดัชนีโดยเริ่มที่ 0!)
วิธีการใช้การค้นหาแบบไบนารีใน Python
มาทำให้มือของเราสกปรกด้วยรหัส Python เราจะสำรวจการใช้งาน Python ของการค้นหาไบนารีโดยใช้ทั้งสองวิธีที่เราพูดถึงก่อนหน้านี้:วิธีการแบบวนซ้ำและแบบเรียกซ้ำ
การค้นหาไบนารีแบบวนซ้ำใน Python
เราจะเริ่มต้นด้วยวิธีการวนซ้ำ นี่คือที่ที่เราจะวนรอบทุกรายการในรายการของเรา จากนั้นเราจะพบค่ากลางในรายการ เราจะทำต่อไปจนกว่าจะพบคุณค่าที่เราต้องการ
ฟังก์ชันการค้นหาไบนารี
เริ่มต้นด้วยการกำหนดฟังก์ชัน Python สำหรับการค้นหาไบนารีของเรา:
def findValue(numbers, number_to_find): low = 0 high = len(listnumbers - 1 while low <= high: middle = low + (high - low) // 2 if numbers[middle] == number_to_find: return middle elif numbers[middle] < number_to_find: low = middle + 1 else: high = middle - 1 return -1
ฟังก์ชันของเรายอมรับพารามิเตอร์ 2 ตัว ได้แก่ รายการที่เราต้องการค้นหา และตัวเลขที่เราต้องการค้นหาในรายการของเรา
จากนั้นเราได้ประกาศตัวแปร Python สองตัวที่เก็บค่าเริ่มต้นสำหรับค่าต่ำสุดและสูงสุดในรายการ ต่ำ ถูกตั้งค่าเป็น 0 ซึ่งเป็นค่าดัชนีเริ่มต้นในรายการ สูง ถูกกำหนดเป็นความยาวของรายการลบหนึ่ง (เพราะรายการถูกสร้างดัชนีจากศูนย์)
ขั้นตอนต่อไปของเราคือการประกาศ Python while loop วนรอบนี้ทำงานในขณะที่องค์ประกอบต่ำสุดมีขนาดเล็กกว่าหรือเท่ากับจำนวนสูงสุด ซึ่งหมายความว่าการวนซ้ำของเราจะรันก็ต่อเมื่อยังไม่พบหมายเลขของเรา
จากนั้นเราคำนวณจำนวนตรงกลาง เราทำสิ่งนี้โดยการลบค่าต่ำสุดออกจากค่าสูงสุด จากนั้นเราคำนวณโมดูโล (ส่วนที่เหลือ) ของตัวเลขนั้นเมื่อหารด้วย 2 จากนั้นเราเพิ่มโมดูโลให้กับค่าของตัวเลขที่ต่ำที่สุด
หากหมายเลขตรงกลางในรายการของเราตรงกับตัวเลขที่เราต้องการค้นหา เราจะคืนค่าตำแหน่งของหมายเลขนั้น
เราตั้งค่าตัวเลข "ต่ำ" ใหม่ให้เท่ากับหนึ่งที่มากกว่าตำแหน่งตรงกลาง สิ่งนี้จะเกิดขึ้นหากจำนวนตรงกลางน้อยกว่าจำนวนที่เราต้องการหา สิ่งนี้จะย้ายการค้นหาของเราลงไปที่ด้านซ้ายของรายการของเรา เช่นเดียวกับที่เราทำในตัวอย่างภาพก่อนหน้านี้
มิฉะนั้น เราจะตั้งค่าตัวเลข "สูง" ให้เท่ากับหนึ่งตำแหน่งที่น้อยกว่าตำแหน่งตรงกลาง สิ่งนี้จะย้ายการค้นหาของเราไปทางด้านขวาของรายการของเรา
ทำซ้ำจนต่ำเท่ากับหรือน้อยกว่าสูง หากไม่พบค่าของเรา เราจะคืนค่า -1 เราจะพูดถึงเหตุผลในอีกสักครู่
ดำเนินการค้นหา
เพิ่มรหัสต่อไปนี้ที่ด้านล่างของโปรแกรมของคุณ นอก findValue ฟังก์ชัน:
numbers = [7, 9, 14, 22, 34] number_to_find = 22 final = findValue(numbers, number_to_find) if final == -1: print("This item was not found in the list.") else: print("The number " + str(number_to_find) + " was found at index position " + str(final) + ".")
เราเริ่มต้นด้วยการประกาศรายการสิ่งของที่เราต้องการค้นหา จากนั้นเราได้ระบุตัวเลขที่ต้องการหาคือ 22
ต่อไป เราเรียก findValue() . ของเรา และส่งต่อรายการ
นี่คือที่มาของ -1 ก่อนหน้านี้ หากหมายเลขที่ส่งคืนโดยฟังก์ชันของเราคือ -1 แสดงว่าไม่พบรายการของเราในรายการ โปรแกรมเมอร์มักใช้ -1 ในสถานการณ์เช่นนี้ เนื่องจากฟังก์ชันการค้นหาของเราไม่สามารถคืนค่าจำนวนลบได้
มิฉะนั้น โปรแกรมของเราจะพิมพ์ข้อความแจ้งตำแหน่งดัชนีของค่านั้นให้เราทราบ
รหัสของเราส่งคืน:
The number 22 was found at index position 3.
ตอนนี้เรารู้แล้วว่าเลข 22 ปรากฏขึ้นที่ตำแหน่งดัชนี 3
การค้นหาไบนารีแบบเรียกซ้ำใน Python
เรายังสามารถใช้การเรียกซ้ำเพื่อทำการค้นหาแบบไบนารี นี่คือที่ที่เราจะกำหนดฟังก์ชันที่เรียกตัวเองไปเรื่อยๆ จนกว่าจะพบเงื่อนไข – ตัวเลขของเราถูกพบ
กำหนดฟังก์ชันแบบเรียกซ้ำ
เช่นเดียวกับในตัวอย่างที่แล้ว เราจะเริ่มต้นด้วยการเขียนฟังก์ชันที่ทำการค้นหาแบบไบนารีของเรา:
def findValue(numbers, number_to_find, low, high): if high >= low: middle = low + (high - low) // 2 if numbers[middle] == number_to_find: return middle elif numbers[middle] < number_to_find: return findValue(numbers, number_to_find, middle + 1, high) else: return findValue(numbers, number_to_find, low, middle - 1) else: return -1
รหัสของเราค่อนข้างคล้ายกับตัวอย่างที่แล้ว
เราเริ่มต้นด้วยการตรวจสอบว่าค่าสูงสุดมากกว่าหรือเท่ากับค่าต่ำสุด หากเป็นเช่นนั้น โปรแกรมของเราจะคืนค่า -1 มิฉะนั้น จะเริ่มดำเนินการค้นหาแบบไบนารี
เราคำนวณเลขตรงกลางโดยใช้วิธีการเดียวกับในตัวอย่างที่แล้ว อันดับแรก เราลบค่าต่ำสุดจากค่าสูงสุด จากนั้น เราคำนวณโมดูโล (ส่วนที่เหลือ) ของค่านั้นเมื่อหารด้วย 2 สุดท้าย เราก็บวกตัวเลขที่ต่ำที่สุด
จากนั้นเราก็เขียน if คำสั่งที่ตัดสินว่าการค้นหาไบนารีของเราควรดำเนินการอย่างไร:
- หากหมายเลขตรงกลางเท่ากับหมายเลขที่เรากำลังมองหา ตำแหน่งของหมายเลขนั้นจะถูกส่งคืน
- ถ้าตัวเลขตรงกลางน้อยกว่าที่เรากำลังมองหา findValue() ของเรา ฟังก์ชันถูกเรียกอีกครั้ง คราวนี้ค่า ต่ำ ถูกกำหนดให้มีค่ามากกว่าค่ากลางของเราหนึ่งค่า
- หากตัวเลขตรงกลางมากกว่าตัวเลขที่เรากำลังมองหา findValue() เรียกว่าฟังก์ชัน ค่าของ “สูง” จะเท่ากับค่าที่น้อยกว่าค่ากลางหนึ่งค่า
เขียนโปรแกรมหลัก
สิ่งที่เราต้องทำคือเขียนโปรแกรมหลักของเรา:
numbers = [7, 9, 14, 22, 34] number_to_find = 22 final = findValue(numbers, number_to_find, 0, len(numbers) - 1) if final == -1: print("This item was not found in the list.") else: print("The number " + str(number_to_find) + " was found at index position " + str(final) + ".")
โปรแกรมหลักของเราเหมือนกับตัวอย่างก่อนหน้าของเราแถบหนึ่งความแตกต่าง เรากำลังส่งพารามิเตอร์ใหม่สองตัวไปยัง findValue() . ของเรา ฟังก์ชั่น:ต่ำและสูง
เราจำเป็นต้องทำเช่นนี้เพราะอัลกอริทึมของเราเป็นแบบเรียกซ้ำ และเราไม่สามารถกำหนดค่าเหล่านั้นในฟังก์ชันของเราได้ หากเรากำหนดค่าในฟังก์ชันของเรา ค่าเหล่านั้นจะถูกรีเซ็ตทุกครั้งที่เรียกใช้ฟังก์ชัน ซึ่งจะทำให้อัลกอริธึมการค้นหาเสียหาย
รหัสของเราส่งคืน:
The number 22 was found at index position 3.
เราได้รับผลเช่นเดียวกันจากก่อนหน้านี้ ในตัวอย่างนี้ เราใช้โปรแกรมแบบเรียกซ้ำแทนโปรแกรมแบบวนซ้ำเพื่อทำการค้นหาแบบไบนารีของเรา
เมื่อใดที่คุณควรใช้ Python Binary Search
การค้นหาแบบไบนารีเป็นวิธีที่มีประสิทธิภาพในการค้นหาผ่านรายการตัวเลข การค้นหานี้มีประสิทธิภาพมากกว่าการค้นหาเชิงเส้น นี่เป็นเพราะวิธีไบนารีลดการค้นหาของคุณลงครึ่งหนึ่งทันทีที่คุณพบตรงกลางของรายการที่จัดเรียง
สิ่งสำคัญที่ควรทราบคือต้องเรียงลำดับรายการเป็นตัวเลขก่อนจึงจะสามารถค้นหาได้โดยใช้การค้นหาแบบไบนารี ก่อนที่คุณจะทำการค้นหาแบบไบนารี ตรวจสอบให้แน่ใจว่าตัวเลขของคุณเรียงลำดับจากน้อยไปหามาก
การค้นหาไบนารีในรายละเอียดความซับซ้อนของ Python
ความซับซ้อนของการค้นหาไบนารีคืออะไร? เป็นคำถามที่ดี
อัลกอริธึมการค้นหาแบบไบนารีมีความซับซ้อนของตัวพิมพ์ที่ดีที่สุดของ O(1) กรณีนี้เกิดขึ้นเมื่อการเปรียบเทียบครั้งแรกเท่ากับรายการที่คุณกำลังค้นหา
ความซับซ้อนโดยเฉลี่ยและกรณีที่เลวร้ายที่สุดสำหรับการค้นหาแบบไบนารีคือ O(log n) ซึ่งหมายความว่าระยะเวลาที่ใช้ในการค้นหาจะเพิ่มขึ้นตามลอการิทึม ขึ้นอยู่กับจำนวนรายการที่ต้องค้นหาในรายการ
บทสรุป
การค้นหาแบบไบนารีเป็นวิธีที่มีประสิทธิภาพในการค้นหาตำแหน่งดัชนีของค่าในรายการ
ทุกครั้งที่ดำเนินการค้นหาแบบไบนารี การค้นหาจะแบ่งรายการออกเป็นสองส่วน การค้นหาจะเน้นที่ด้านข้างของรายการใกล้กับหมายเลขที่คุณกำลังค้นหามากที่สุด
ทุกครั้งที่ทำการค้นหา จำนวนตัวเลขที่โปรแกรมต้องค้นหาจะลดลงครึ่งหนึ่ง
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ Python โปรดอ่านคู่มือ How to Learn Python