ทำไมการค้นหาแบบไบนารี่ซึ่งต้องการข้อมูลที่เรียงลำดับถือว่าดีกว่าการค้นหาแบบเชิงเส้น


20

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

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

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

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


6
เช่นเดียวกับสิ่งอื่น ๆ มากมายมันทั้งหมดลงมาที่: "มันขึ้นอยู่กับ ... ;)"
เจฟฟ์ B

หากรายการเรียงลำดับแล้วคุณคิดว่าการค้นหาเชิงเส้นยังดีกว่าหรือไม่ นั่นอาจเป็นสิ่งที่ต้องพิจารณาที่นี่
JB King

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

คำตอบ:


53

มีข้อควรพิจารณาในทางปฏิบัติใดบ้างที่ฉันมองเห็นซึ่งทำให้การค้นหาแบบไบนารีดีกว่าการค้นหาแบบเชิงเส้น

ใช่ - คุณต้องทำการเรียงลำดับ O (n log n) เพียงครั้งเดียวจากนั้นคุณสามารถทำการค้นหาไบนารี O (log n) ได้บ่อยเท่าที่คุณต้องการในขณะที่การค้นหาเชิงเส้นคือ O (n) ทุกครั้ง

แน่นอนว่านี่เป็นข้อได้เปรียบหากคุณทำการค้นหาหลายครั้งบนข้อมูลเดียวกัน แต่สถานการณ์ "การเขียนครั้งเดียวอ่านบ่อย" เป็นเรื่องปกติ


หากคุณทำอะไรซักอย่างเพียงครั้งเดียวก็ไม่ควรที่จะปรับให้เหมาะสม

14

สมมติฐานพื้นฐานคือคุณไม่ได้ทำการค้นหาเพียงครั้งเดียว

ดังนั้นหากคุณต้องการค้นหาข้อมูลเดียวกันหลาย ๆ ครั้งคุณต้องเรียงลำดับครั้งเดียวและสามารถทำกำไรจากการค้นหาแบบไบนารี

หากคุณค้นหาบ่อยและมีการเปลี่ยนแปลงข้อมูลมันคุ้มค่าที่จะใช้รายการที่เรียงซึ่งรายการใหม่จะถูกจัดเรียงลงในรายการ

ดังนั้นโดยทั่วไปการค้นหาแบบไบนารี่จะดีกว่าเมื่อคุณค้นหารายการเดียวกันหลาย ๆ ครั้งโดยไม่จำเป็นต้องหันไปใช้

เมื่อคุณต้องการจัดเรียงทุกครั้งก่อนค้นหาไม่มีประโยชน์

โปรดทราบว่ามีอัลกอริทึมการเรียงลำดับซึ่งเร็วมากเมื่อรายการเรียงลำดับแล้ว (หรือเรียงเกือบ) การกำหนดประสิทธิภาพส่วนใหญ่คาดว่าจะมีรายการที่ไม่เรียงลำดับ


2
หากคุณค้นหาบ่อยครั้งและแทรกบ่อยครั้งคุณอาจดูโครงสร้างข้อมูลที่ซับซ้อนมากขึ้น (เช่นต้นไม้ไบนารี)
MarkJ

@ MarkJ คำถามพื้นฐานของโปสเตอร์ต้นฉบับเกี่ยวกับการค้นหาในรายการ ถ้าเช่นนั้นฉันจะอยู่กับคุณอย่างสมบูรณ์
Uwe Plonus

7

เพราะเมื่อคุณมีรายการเรียงลำดับคุณไม่จำเป็นต้องเรียงลำดับใหม่ทุกครั้งซึ่งหมายความว่าถ้าคุณมีมากกว่า (บันทึกการค้นหา) การเรียงลำดับล่วงหน้าจะทำให้คุณชนะสุทธิ ( O(n log n + k log n)vs)O(k*n)


5

ลองนึกภาพสมุดโทรศัพท์สองเล่ม

สมุดโทรศัพท์หนึ่งเล่มมีชื่อเรียงตามตัวอักษร ในการค้นหารายการที่คุณต้องการคุณเปิดตรงกลางตรวจสอบรายการจากนั้นเลื่อนไปข้างหน้าหรือข้างหลังขึ้นอยู่กับว่าคุณมีส่วนเกินหรือขีดล่าง

สมุดโทรศัพท์อื่น ๆ มีชื่อตามลำดับแบบสุ่ม เพื่อค้นหารายการที่คุณต้องการคุณเริ่มต้นที่จุดเริ่มต้นและดำเนินการต่อไปจนกว่าคุณจะพบสิ่งที่คุณต้องการ

หนังสือเล่มที่สองจะทำงานในเมืองที่มีขนาดพอสมควรหรือไม่


3

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


3

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

"จุดเปลี่ยน" คำนวณโดยการแก้สมการเชิงซ้อนเชิงเชิงเส้น:

n log n + log n = n

อย่างที่คุณเห็นใน Wolfram Alphaมีค่าตัวเลขสำหรับnที่ช่วยให้มั่นใจว่าการค้นหาแบบไบนารี่และการเรียงลำดับจะเร็วกว่าการค้นหาแบบเส้นตรงเสมอ แน่นอนว่ามูลค่าจริงของnที่ใช้ในกรณีของคุณขึ้นอยู่กับปัจจัยหลายอย่างซึ่งอาจประเมินได้ยาก

อ้างอิงจากบทความที่น่าสนใจโดย Mark Probst ซึ่งรวมถึงการวัดประสิทธิภาพเชิงลึกในโปรเซสเซอร์ปัจจุบัน:

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


2

ในคำพูดของคนธรรมดา:

หากคุณมีรายการที่ไม่มีการเรียงลำดับที่มีหมื่นล้านรายการและรายการที่คุณกำลังมองหาคือรายการสุดท้ายคุณจะต้องอ่านรายการหมื่นล้านรายการ

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


2

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

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

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