มีการศึกษาหรือทฤษฎีเบื้องหลังการรวมการค้นหาแบบฐานสองและการค้นหาแบบสอดแทรกหรือไม่?


14

ฉันเพิ่งอ่านอัลกอริทึมนี้ยังสามารถใช้เป็นอัลกอริทึมการค้นหาแบบไบนารี่ได้หรือไม่ และจำได้ว่าไม่กี่ปีหลังฉันเขียนดัชนี / ค้นหาไฟล์บันทึกเพื่อค้นหารายการบันทึกในไฟล์ข้อความธรรมดาขนาดใหญ่ตามหน้าต่างวันที่ / เวลา

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

จากนั้นฉันเปรียบเทียบระบบโดยใช้การค้นหาแบบสอดแทรกที่บริสุทธิ์การค้นหาแบบไบนารีที่แท้จริงและความพยายามในการรวมกันของฉัน วิธีการสลับเป็นผู้ชนะที่ชัดเจนทั้งในเวลาและจำนวนการทดสอบที่จำเป็นก่อนที่จะหาชุดของเวลาที่สุ่มเลือก

ได้รับแรงบันดาลใจจากคำถามที่เชื่อมโยงฉันเพิ่งทำการค้นหาอย่างรวดเร็วสำหรับ "การค้นหาการแก้ไขแบบสลับและการค้นหาแบบไบนารี" และไม่พบอะไรเลย ฉันได้ลองใช้ "การค้นหาแบบสอดแทรกการแก้ไขแบบป้องกันความเสี่ยง" ตามที่แนะนำในความคิดเห็นของฉันในคำตอบข้อใดข้อหนึ่ง

ฉันเจอสิ่งที่รู้หรือไม่? มีเหตุผลทางทฤษฎีใดที่ทำให้ข้อมูลบางประเภทเร็วขึ้น? โดยทั่วไปไฟล์บันทึกจะมีขนาดใหญ่ในเวลานั้น (เช่นข้อความขนาด 1-2 GB ซึ่งอาจค้นหาได้ 10 ล้านแถว) และการแพร่กระจายของวันที่ / เวลานั้นซับซ้อนด้วยการระเบิดของกิจกรรมเวลาสูงสุดทั่วไปและช่วงเวลาที่เงียบสงบ การทดสอบเกณฑ์มาตรฐานของฉันสุ่มตัวอย่างจากการกระจายเวลาเป้าหมายเท่า ๆ กันเพื่อค้นหา

คำตอบ:


5

ฉันเจอสิ่งที่รู้หรือไม่?

มีวิธีการหลายวิธีตามการผสมผสานระหว่างการค้นหา - การค้นหาและการค้นหาแบบไบนารีโดยมีเวลาการเข้าถึงเคสโดยเฉลี่ย (การกระจายเครื่องแบบ) และO ( l o g n )เวลากรณีที่เลวร้ายที่สุด (ค่า กระจายไม่สม่ำเสมอ):O(ล.โอก. ล.โอก. n)O(ล.โอก. n)

  • การค้นหาแบบครุ่นคิดคือวิธีการของคุณ (วนซ้ำระหว่างการค้นหาแบบสอดแทรกและแบบไบนารี) ฉันยังไม่มีรายละเอียดเพิ่มเติม
  • Interpolation-binary search (IBS) โดย N. Santoro, JB Sidney (1985)

    แนวคิดทั่วไปคือการค้นหาการแก้ไขมีประโยชน์เฉพาะเมื่อการค้นหาอาร์เรย์มีขนาดใหญ่กว่าเกณฑ์ที่กำหนด เมื่อส่วนการค้นหาที่พิจารณานั้นมีขนาดเล็กกว่าเกณฑ์ที่ผู้ใช้กำหนดระบบจะใช้การค้นหาแบบไบนารีโดยไม่มีเงื่อนไข ในทางกลับกันเมื่อเทียบกับเกณฑ์นั้นขั้นตอนการค้นหาการแก้ไขจะถูกนำไปใช้ตามด้วยขั้นตอนการค้นหาแบบไบนารี

    สิ่งนี้มีจุดร่วมมากมายกับแนวทางของคุณ

  • Adaptive search (AS) โดย Biagio Bonasera, Emilio Ferrara, Giacomo Fiumara, Francesco Pagano, Alessandro Provetti

    ใช้คำของผู้เขียน:

    [Interpolation-binary search] คิดค้นวิธีการแก้ปัญหาที่คล้ายกันซึ่งรวม (แต่ไม่ได้ผสมผสาน) เข้าด้วยกันการแก้ไขและการค้นหาแบบไบนารี แม้ว่าความซับซ้อนเชิงซีกโลกจะเหมือนกัน แต่ก็มีความแตกต่างที่ชัดเจน

    [ตัด]

    ดังนั้นจึงเป็นไปได้ที่จะแสดงให้เห็นว่าสำหรับอินพุตใด ๆ ที่ AS จะไม่ดำเนินการระดับประถมศึกษามากกว่า IBS

    อัลกอริทึมอาจใช้เวลาถึงสองเท่าของการดำเนินการมากกว่าการค้นหาแบบ "ง่าย" ในการค้นหาอย่างรอบคอบเพื่อลดครึ่งที่ดีที่สุดของส่วนการค้นหาซึ่งจะหมายถึงว่าจะต้องมีการทำซ้ำให้น้อยลง (แต่คุณมีค่าใช้จ่ายสูงกว่า) .


6

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

แม้ว่าทางทฤษฎีจะเร็วกว่าการค้นหาแบบสอดแทรกมีข้อเสียสองประการเมื่อเปรียบเทียบกับการค้นหาแบบไบนารี:

  • มันมีประสิทธิภาพกรณีที่เลวร้ายที่สุด (เชิงเส้น) ที่เลวร้ายที่สุด

  • ค่าใช้จ่ายในการคำนวณจุดกึ่งกลางค่อนข้างใหญ่ การค้นหาซ้ำแบบไบนารีนั้นเร็วกว่าการค้นหาแบบสอดแทรกหลายร้อยเท่า

ฉันคาดหวังว่าวิธีการที่คุณทำการค้นหาการแก้ไขในขณะที่ช่วงมีขนาดใหญ่และเปลี่ยนเป็นการค้นหาแบบไบนารีเมื่อช่วงที่มีขนาดเล็กมีประสิทธิภาพมากที่สุด คงจะดีถ้าคุณลองการทดลองนี้

เข้าสู่ระบบnเข้าสู่ระบบเข้าสู่ระบบnเข้าสู่ระบบnเข้าสู่ระบบเข้าสู่ระบบn

ฉันคิดว่าผลลัพธ์ของคุณสามารถอธิบายได้ด้วยสองปรากฏการณ์:

  • การรวมเข้ากับการค้นหาแบบไบนารีช่วยให้คุณหลีกเลี่ยงพฤติกรรมที่เลวร้ายที่สุด

  • ผลบวกของการสลับเป็นการค้นหาแบบไบนารีบนชุดข้อมูลขนาดเล็ก


3
คุณเขียนว่า: "การวนซ้ำการค้นหาแบบไบนารีนั้นเร็วกว่าการค้นหาแบบสอดแทรกหลายร้อยเท่า" โปรดทราบว่าในกรณีของ OP ความแตกต่างระหว่างการคำนวณจุดกึ่งกลางในวิธีการทั้งสองนั้นจะถูกแคระเวลา I / O ที่จำเป็นเพื่อดึงค่าจุดกึ่งกลาง
liori

@liori: การทำซ้ำสองสามครั้งแรกของการค้นหาไบนารีซ้ำ ๆ บนข้อมูลเดียวกันอาจเป็นมิตรกับแคชมากกว่าเนื่องจากมีการใช้องค์ประกอบสองสามอย่างเดียวกัน ดังนั้นไตรมาสและแปดอาจคาดว่าจะอยู่ในแคชร้อน เริ่มต้นด้วยเลขฐานสองและเปลี่ยนเป็นการประมาณหลังจากสามรอบซ้ำอาจทำให้เข้าใจได้ถ้าช่วงนั้นใหญ่พอ (หรือถ้าคุณสามารถทำ async I / O และใช้ผลลัพธ์ใดก็ได้ที่มาถึงก่อน)
ปีเตอร์กอร์เดส

นอกจากนี้แม้กระทั่งสำหรับการค้นหาในหน่วยความจำ, พลาดแคช (มากกว่า 200 รอบแฝง) มีกี่ครั้งแฝงแม้ส่วน 64bit จำนวนเต็ม (32-96cycles) บน Intel Haswell ตัวอย่างเช่น การแบ่งจำนวนเต็มแบบ 32 บิตนั้นเร็วกว่ามาก (22-29 ครั้ง) แบนด์วิดท์หน่วยความจำหลักเป็นทรัพยากรที่ใช้ร่วมกันสำหรับคอร์ทั้งหมด แต่การแบ่งจำนวนเต็มใช้ทรัพยากรที่ซ้ำกันในแต่ละคอร์
Peter Cordes

2
อย่างไรก็ตามเวลาแฝงของหน่วยความจำแย่กว่าแบนด์วิดท์หน่วยความจำมากถึงแม้จะมีการเข้าถึงที่กระจัดกระจายหลายครั้งก็จะเร็วขึ้นหากพวกเขาอยู่ในเครื่องพร้อมกัน มันเป็น win to prefetch (พร้อมprefetcht0คำแนะนำ ) ทั้งความเป็นไปได้สำหรับการทำซ้ำ NEXT ก่อนที่จะโหลดจุดกึ่งกลางปัจจุบันสำหรับ bsearch ในหน่วยความจำในฮาร์ดแวร์ x86 ที่ทันสมัย คุณไม่สามารถทำเช่นนั้นได้หากคุณไม่สามารถคาดเดาที่อยู่การดึงข้อมูลครั้งต่อไปได้ล่วงหน้า ดังนั้นรายละเอียดการดำเนินการปฏิบัติอย่างมีนัยสำคัญนอกเหนือจากการพิจารณาทางทฤษฎี
Peter Cordes

@liori: แน่นอน I / O ต่อจุดกึ่งกลางเป็นปัจจัยหลักเมื่อจัดทำดัชนีไฟล์บันทึกเนื่องจากมันถูกอ่านตามความต้องการเพื่อค้นหาเร็กคอร์ด อาจมีขนาดมากกว่าสองคำสั่งระหว่างการคำนวณออฟเซ็ตในไฟล์และการอ่านบล็อกดังนั้นจำนวนจุดกึ่งกลางที่คำนวณจะเป็นปัจจัยในการตัดสินใจ ฉันคิดว่าถ้าฉันทำซ้ำในขณะนี้โดยไม่มีไฟล์บันทึกการจัดทำดัชนี - สิ่งที่ฉันจะลองและโพสต์ที่นี่ - นั่นอาจไม่มีความแตกต่างของความเร็วที่วัดได้ แต่อาจมีความแตกต่าง "จำนวนจุดกึ่งกลางที่ต้องการ"
Neil Slater
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.