อัลกอริทึมนี้ยังสามารถใช้เป็นอัลกอริทึมการค้นหาแบบไบนารี่ได้หรือไม่?


14

ในขณะที่ทำรหัสกะตะที่สอง(ซึ่งขอให้คุณใช้อัลกอริทึมการค้นหาแบบไบนารีห้าครั้งแต่ละครั้งด้วยวิธีการที่แตกต่างกัน) ฉันได้มากับโซลูชันที่แตกต่างกันเล็กน้อยซึ่งทำงานดังนี้:

หากฉันมีอาร์เรย์ที่เรียงลำดับความยาว 100 และฉันเห็นว่าเขตข้อมูลเริ่มต้นมีหมายเลข 200 และเขตข้อมูลสิ้นสุดประกอบด้วยหมายเลข 400 ฉันในฐานะคณิตศาสตร์ที่เรียนรู้มนุษย์น่าจะเริ่มค้นหารอบ ๆ เขต 35 ถ้าฉันกำลังค้นหา หมายเลข 270 และไม่ใช่ฟิลด์ 50 เหมือนในอัลกอริธึมการค้นหาไบนารีปกติ

จากนั้นถ้าตัวเลขในฟิลด์ 35 ของอาร์เรย์คือ 270, 35 คือดัชนีที่ฉันค้นหา

หากไม่ใช่กรณีที่ฉันสามารถเปรียบเทียบจำนวนที่ฉันได้รับ (พูด 280) และทำซ้ำการดำเนินการโดยใช้ส่วนล่างของอาร์เรย์ (ดังนั้นฉันจึงมี 35 ฟิลด์กับเขตข้อมูลเริ่มต้นที่มี 200 และเขตสิ้นสุดที่มี 280) ถ้า จำนวนที่ฉันค้นพบมีค่ามากกว่าสิ่งที่ฉันค้นหาหรือส่วนบนของอาร์เรย์ (บอกว่าฉันได้ 260: ตอนนี้ฉันมีดัชนี 65 ตัว, อันแรกที่มี 260 และอันสุดท้ายที่มี 400 ในแนวตั้งฉันจะมุ่งหน้าแบบ Torward ดัชนี 4 ของอาร์เรย์ย่อยนี้ซึ่งเป็นดัชนี 39 ของอาร์เรย์ทั้งหมด) หากจำนวนที่ฉันได้รับมีขนาดเล็กกว่าจำนวนที่ฉันกำลังค้นหา

คำถามคือ: อัลกอริทึมนี้สามารถพิจารณาเป็นอัลกอริทึมการค้นหาแบบไบนารีหรือไม่? ถ้าไม่มันมีชื่อเป็นของตัวเอง?


2
ไม่ว่าจะเป็นการค้นหาแบบไบนารี่หรือไม่ก็เป็นเรื่องของความคิดเห็นล้วนๆ โดยพื้นฐานแล้วคำตอบเดียวที่คุณสามารถให้ได้ก็คือ "ใช่มันอยู่ใกล้พอที่จะค้นหาแบบไบนารี่เพื่อเรียกมันว่าการค้นหาแบบไบนารี่" หรือ "ไม่มันไม่ได้เป็นแบบนั้น" อาร์กิวเมนต์เป็นไปตาม
David Richerby

คำตอบ:


23

ฉันจะไม่เรียกสิ่งนี้เป็นการค้นหาแบบไบนารี่

มันชัดเจนคล้ายกับการค้นหาแบบไบนารีและเป็นเรื่องธรรมดาที่จะเห็นว่าเป็นการปรับแต่งการค้นหาแบบไบนารี อย่างไรก็ตามมันมีลักษณะความซับซ้อนของอัลกอริทึมที่แตกต่างกันอย่างมีนัยสำคัญการค้นหาการแก้ไขได้คาดว่าเวลาทำงานของ O (log (log (n)) สมมติว่าข้อมูลมีการกระจายอย่างสม่ำเสมออย่างไรก็ตามมันจ่ายสำหรับเรื่องนี้โดยมี O (n)

ฉันชอบที่จะพูดว่า "เวลาที่เลวร้ายที่สุดของการค้นหาแบบไบนารีคือ O (log (n))" มากกว่า "ขึ้นอยู่กับการเลือกองค์ประกอบที่มีขอบเขตเวลาที่เลวร้ายที่สุดของการค้นหาแบบไบนารีคือ O (log (n))" ซึ่งหมายความว่าฉันไม่สามารถจัดประเภทการค้นหาการแก้ไขเป็นอัลกอริทึมการค้นหาแบบไบนารี


สันนิษฐานว่าถ้าคุณแยกการค้นหาการแก้ไขเมื่อมันไม่ดีคุณสามารถเก็บ O (log n) กรณีที่เลวร้ายที่สุดและ O (log log n) ในข้อมูลเชิงเส้นอย่างเพียงพอ ฉันเดาว่าบางอย่างเช่น "ถ้าฉันไม่พบเป้าหมายหลังจากความพยายามในการบันทึก n จากนั้นสลับไปใช้การค้นหาแบบไบนารี" จะใช้งานได้ แต่ฉันขี้เกียจเกินกว่าที่จะพิสูจน์ได้ แน่นอนว่าจะมีคลาสของอินพุตของนักฆ่าซึ่งใช้เวลานานกว่าการค้นหาแบบไบนารี่ถึงสองเท่า
Steve Jessop

แนวคิดการป้อนข้อมูลแบบนักฆ่านั้นน่าสนใจ จะเกิดอะไรขึ้นถ้าแทนที่จะปล่อยให้อินพุตของนักฆ่าส่งผลเสียต่อการค้นหา (เช่นโดยการแยกใกล้กับส่วนท้ายของอาร์เรย์) เราจะ จำกัด / ตัด "ช่วงที่แยกได้" ไปยังลำดับที่สองของอาร์เรย์ที่สามหรือคล้ายกัน ที่จะมีกรณีที่เลวร้ายที่สุด log3 (n) แต่ยังคงสนุกกับกรณีที่ดีที่สุดบันทึก (บันทึก)
Andrew Gallasch

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

@SteveJessop: ไม่จำเป็นต้องเปลี่ยนอัลกอริทึม สิ่งนี้สามารถทำได้ในแบบคู่ขนาน กำหนดช่วง R คุณสามารถกำหนดจุด P1 เป็นจุดกึ่งกลางปกติสำหรับการค้นหาแบบไบนารีและ P2 โดยใช้การแก้ไข ตอนนี้คุณมีช่วงย่อยสามช่วงซึ่งไม่มีช่วงใดสามารถใหญ่กว่าครึ่งช่วงเดิมได้ ตรวจสอบค่าเป้าหมายกับทั้ง P1 และ P2 และคุณรู้ว่าหนึ่งในสาม subranges ที่จะเรียกเก็บเงินได้หรือไม่
MSalters

17

ใช่นี้เป็นที่รู้จักกันแก้ไขการค้นหา ด้วยคำเตือนบางอย่าง (ขึ้นอยู่กับรุ่นการคำนวณของคุณและการกระจายของข้อมูล) เวลาทำงานที่คาดหวังคือดีกว่าการค้นหาแบบไบนารี่O(loglogn)


เย็น. ตอนนี้คำถามคือถ้าฉันสามารถใช้มันสำหรับรหัสกะตะ แต่มันเป็นปัญหาของฉัน ฉันพบว่ามันซับซ้อนกว่าการค้นหาแบบไบนารี่ถึงอย่างนั้นทำไมล่ะ
user6245072

ฉันค้นพบครั้งนี้ครั้งเดียวเมื่อเขียนโค้ดเพื่อจัดทำดัชนีไฟล์บันทึกเมื่อไม่กี่ปีหลัง ฉันยังค้นพบว่าสำหรับขั้นตอนการสลับข้อมูลระหว่างการแก้ไขและการแบ่งข้อมูลของฉันนั้นดีกว่าตัวเลือกใด ๆ ฉันไม่แน่ใจว่ามีชื่อหรือมีผลกระทบที่รู้จัก
Neil Slater

@NeilSlater ป้องกันความเสี่ยงการแก้ไขการค้นหาอาจจะ?
Steve Cox

@SteveCox: ฉันเพิ่งค้นหาคำนั้นและไม่พบอะไรเลย ตัดสินใจที่จะถามว่าเป็นคำถามใหม่: cs.stackexchange.com/questions/59750/…
Neil Slater

-1

ฉันคิดว่าคำศัพท์ที่ถูกต้องน่าจะเป็นการค้นหาแบบไตร่ตรอง

คุณค้นหาในอาเรย์แบนที่มีการค้นหาแบบไตร่ตรองในภายหลังโดยพิจารณาจากการแจกแจงแบบแบนของตัวเลขในนั้น

สิ่งนี้สอดคล้องกับวิธีที่บุคคลจะค้นหาคำในพจนานุกรม แต่จะไม่มีประสิทธิภาพมากหากการกระจายข้อมูลไม่สม่ำเสมอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.