คำถามติดแท็ก binary-search

20
การค้นหาแบบไบนารี (bisection) ใน Python
มีฟังก์ชั่นห้องสมุดที่ดำเนินการค้นหาแบบไบนารีในรายการ / ทูเปิลและส่งคืนตำแหน่งของรายการหากพบและ 'เท็จ' (-1, ไม่มี, ฯลฯ ) ถ้าไม่? ฉันพบฟังก์ชัน bisect_left / ขวาในโมดูล bisectแต่พวกเขายังคงส่งคืนตำแหน่งแม้ว่ารายการไม่ได้อยู่ในรายการ มันดีมากสำหรับการใช้งานที่ต้องการ แต่ฉันแค่อยากรู้ว่ารายการนั้นอยู่ในรายการหรือไม่ (ไม่ต้องการแทรกอะไร) ฉันคิดว่าจะใช้bisect_leftแล้วตรวจสอบว่ารายการในตำแหน่งนั้นเท่ากับสิ่งที่ฉันกำลังค้นหาหรือไม่ แต่ดูเหมือนว่าจะยุ่งยาก (และฉันต้องทำการตรวจสอบอย่าง จำกัด หากจำนวนอาจมากกว่าจำนวนที่มากที่สุดในรายการของฉัน) หากมีวิธีที่ดีกว่าฉันต้องการทราบเกี่ยวกับมัน แก้ไขเพื่อชี้แจงสิ่งที่ฉันต้องการสิ่งนี้สำหรับ: ฉันทราบว่าพจนานุกรมจะเหมาะมากสำหรับสิ่งนี้ แต่ฉันพยายามรักษาปริมาณการใช้หน่วยความจำให้ต่ำที่สุดเท่าที่จะทำได้ การใช้งานที่ฉันตั้งใจจะเป็นตารางค้นหาสองทาง ฉันมีรายการของค่าในตารางและฉันต้องสามารถเข้าถึงค่าตามดัชนีของพวกเขา และฉันต้องการหาดัชนีของค่าใดค่าหนึ่งหรือไม่มีถ้าค่านั้นไม่อยู่ในรายการ การใช้พจนานุกรมสำหรับวิธีนี้จะเป็นวิธีที่เร็วที่สุด แต่จะ (ประมาณ) ความต้องการของหน่วยความจำเพิ่มขึ้นเป็นสองเท่า ฉันถามคำถามนี้โดยคิดว่าฉันอาจมองข้ามบางอย่างในห้องสมุด Python ดูเหมือนว่าฉันจะต้องเขียนโค้ดของตัวเองตามที่ Moe แนะนำ

14
วิธีการคำนวณความซับซ้อนของการค้นหาแบบไบนารี
ฉันได้ยินบางคนบอกว่าเนื่องจากการค้นหาแบบไบนารีจะลดการป้อนข้อมูลลงในการค้นหาจึงเป็นอัลกอริธึม log (n) เนื่องจากฉันไม่ได้มาจากภูมิหลังทางคณิตศาสตร์ฉันจึงไม่สามารถเกี่ยวข้องกับมันได้ บางคนสามารถอธิบายรายละเอียดเพิ่มเติมได้หรือไม่ มันต้องทำอะไรกับซีรี่ส์ลอการิทึมหรือไม่?

30
ค้นหาองค์ประกอบที่เล็กที่สุด kth ในโครงสร้างการค้นหาแบบไบนารีด้วยวิธีที่เหมาะสมที่สุด
ฉันต้องการค้นหาองค์ประกอบที่เล็กที่สุด kth ในโครงสร้างการค้นหาไบนารีโดยไม่ต้องใช้ตัวแปรคงที่ / ทั่วโลก จะบรรลุอย่างมีประสิทธิภาพได้อย่างไร? วิธีแก้ปัญหาที่ฉันคิดไว้คือการดำเนินการใน O (n) ซึ่งเป็นกรณีที่เลวร้ายที่สุดเนื่องจากฉันวางแผนที่จะทำการลัดเลาะตามลำดับของต้นไม้ทั้งหมด แต่ลึก ๆ แล้วฉันรู้สึกว่าไม่ได้ใช้คุณสมบัติ BST ที่นี่ วิธีแก้ปัญหาสมมติของฉันถูกต้องหรือมีวิธีที่ดีกว่านี้หรือไม่?

9
ฉันจะหาอัลกอริธึมการค้นหาไบนารี C ++ ที่“ มีประโยชน์” ได้จากที่ใด
ฉันต้องการอัลกอริทึมการค้นหาแบบไบนารีที่เข้ากันได้กับคอนเทนเนอร์ C ++ STL บางอย่างเช่นstd::binary_searchใน<algorithm>ส่วนหัวของไลบรารีมาตรฐานแต่ฉันต้องการให้มันส่งคืนตัววนซ้ำที่ชี้ไปที่ผลลัพธ์ไม่ใช่บูลีนธรรมดาที่บอกฉันว่ามีองค์ประกอบอยู่หรือไม่ (โปรดทราบว่าคณะกรรมการมาตรฐานคิดอะไรอยู่เมื่อพวกเขากำหนด API สำหรับ binary_search!) ข้อกังวลหลักของฉันที่นี่คือฉันต้องการความเร็วของการค้นหาแบบไบนารีดังนั้นแม้ว่าฉันจะสามารถค้นหาข้อมูลด้วยอัลกอริทึมอื่น ๆ ดังที่ได้กล่าวไว้ด้านล่าง แต่ฉันต้องการใช้ประโยชน์จากข้อเท็จจริงที่ว่าข้อมูลของฉันถูกจัดเรียงเพื่อให้ได้ประโยชน์จากไบนารี ค้นหาไม่ใช่การค้นหาเชิงเส้น จนถึงตอนนี้lower_boundและupper_boundล้มเหลวหากไม่มีข้อมูล: //lousy pseudo code vector(1,2,3,4,6,7,8,9,0) //notice no 5 iter = lower_bound_or_upper_bound(start,end,5) iter != 5 && iter !=end //not returning end as usual, instead it'll return 4 or 6 หมายเหตุ:ฉันยังใช้อัลกอริทึมที่ไม่ได้เป็นของเนมสเปซมาตรฐานตราบใดที่เข้ากันได้กับคอนเทนเนอร์ ชอบพูดboost::binary_search.

17
จะหาองค์ประกอบที่เล็กที่สุด kth ในการรวมอาร์เรย์สองอาร์เรย์ได้อย่างไร
นี่คือคำถามการบ้าน พวกเขาบอกว่ามันจะใช้เวลาO(logN + logM)ที่NและMมีความยาวอาร์เรย์ มาตั้งชื่ออาร์เรย์aและb. เห็นได้ชัดว่าเราสามารถเพิกเฉยได้ทั้งหมดa[i]และb[i]ที่ไหน i> k แรกให้เปรียบเทียบและa[k/2] b[k/2]ให้b[k/2]> a[k/2]. ดังนั้นเราสามารถทิ้งทั้งหมดได้b[i]โดยที่ i> k / 2 ตอนนี้เรามีทั้งหมดa[i]แล้วโดยที่ i <k และทั้งหมดb[i]ที่ฉัน <k / 2 เพื่อค้นหาคำตอบ ขั้นตอนต่อไปคืออะไร?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.