การค้นหาการแก้ไขกับการค้นหาแบบไบนารี


13

เมื่อใดฉันจึงควรใช้การค้นหาแบบสอดแทรกแทนการค้นหาแบบไบนารี

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

คุณสมบัติของชุดข้อมูลใดที่จะเป็นปัจจัยกำหนด?

คำตอบ:


12

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

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

ตัวอย่างเช่นพิจารณาชุดข้อมูลที่มีสตริงตัวอักษรตัวพิมพ์เล็กเป็นคีย์ สมมติว่าคุณมีคีย์ที่ขึ้นต้นด้วย "x" การค้นหาแบบสอดแทรกจะระบุอย่างชัดเจนว่าคุณควรเริ่มค้นหาใกล้กับส่วนท้ายของชุด อย่างไรก็ตามหากคีย์ส่วนใหญ่ของคุณเริ่มต้นด้วย 'z' และเกือบจะไม่มีสิ่งใดจาก 'a' ถึง 'y' สิ่งที่คุณกำลังค้นหาอาจใกล้เคียงกับจุดเริ่มต้นของชุดแทน สามารถ / อาจใช้การวนซ้ำจำนวนมากก่อนที่การค้นหาจะเข้าใกล้จุดเริ่มต้นที่สตริงเริ่มต้นด้วย 'w' การวนซ้ำแต่ละครั้งจะลบเพียง 10% ของชุดข้อมูลออกจากการพิจารณาดังนั้นจึงต้องใช้การวนซ้ำหลายครั้งก่อนที่จะเข้าใกล้จุดเริ่มต้นโดยที่ปุ่มเริ่มต้นด้วย 'w'

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

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

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


1
ปัญหาที่คุณอธิบายนั้นสามารถปรับเปลี่ยนได้ง่ายโดยใช้องค์ประกอบแรกและสุดท้ายเพื่อกำหนดช่วงแทนที่จะสมมติว่า Int.MIN_VALUE และ Int.MAX_VALUE ซึ่งฉันเชื่อว่า (อย่างน้อยนั่นคือวิธีที่ฉันเรียนรู้อัลกอริธึม)
Malfist

2
@ มัลลิสต์: นั่นสามารถช่วยได้ แต่ไม่จำเป็นต้องแก้ไขปัญหา ในตัวอย่างหากคุณมีคีย์ศูนย์ที่เริ่มต้นด้วยอะไรจาก (พูด) 'a' ถึง 'q' การแก้ไขจะเป็นไปอย่างราบรื่น ค่าเริ่มต้นเดียวที่เริ่มต้นด้วยaจะทำให้ประสิทธิภาพเสียหายอย่างมาก
Jerry Coffin

1

ฉันอาจคิดว่าคำถามคือคุณสามารถใช้ฟังก์ชันการแก้ไขที่ทำได้ดีกว่าการค้นหาแบบไบนารี

จากวิกิพีเดียในการค้นหาการแก้ไข:

ใช้สัญลักษณ์ขนาดใหญ่ประสิทธิภาพของอัลกอริธึมการแก้ไขในชุดข้อมูลขนาด N คือ O (N) อย่างไรก็ตามภายใต้สมมติฐานของการกระจายแบบสม่ำเสมอของข้อมูลในระดับเชิงเส้นที่ใช้สำหรับการแก้ไขประสิทธิภาพสามารถแสดงเป็น O (log log N)

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

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


0

การค้นหาแบบไบนารี่และการค้นหาแบบสอดแทรกถูกพิจารณาว่าเป็นวิธีการค้นหาแบบเชิงเส้น

พวกเขาทั้งสองคาดว่าเป็นรายการสืบค้นจะเรียงลำดับในคอลัมน์อ้างว่าเป็นกุญแจสำคัญ สิ่งนี้สำคัญมาก

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

"Interpolation การค้นหาใช้งานได้เฉพาะกับองค์ประกอบตัวเลขที่จัดเรียงตามลำดับอาร์เรย์ที่มีการแจกแจงแบบสม่ำเสมอ (นั่นคือช่วงเวลาระหว่างองค์ประกอบใด ๆ ถึงองค์ประกอบที่ต่อเนื่องจะมีค่าคงที่ประมาณ" (อ้างจากการอ้างอิงต่ำกว่า P 737) )

Google Books - โครงสร้างข้อมูลแบบคลาสสิค 2 Ed

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