बाइनरी खोज क्यों है, जिसे क्रमबद्ध डेटा की आवश्यकता है, जिसे रैखिक खोज से बेहतर माना जाता है?


20

मैंने हमेशा सुना है कि रैखिक खोज एक भोली दृष्टिकोण है और द्विआधारी खोज बेहतर विषमता की जटिलता के कारण प्रदर्शन से बेहतर है। लेकिन मुझे यह कभी समझ में नहीं आया कि बाइनरी खोज से पहले जब छंटाई की आवश्यकता होती है तो यह रैखिक खोज से बेहतर क्यों है?

रैखिक खोज है O(n)और बाइनरी खोज है O(log n)। यह कहने का आधार प्रतीत होता है कि बाइनरी खोज बेहतर है। लेकिन बाइनरी खोज के लिए छंटाई की आवश्यकता होती है जो O(n log n)कि सर्वश्रेष्ठ एल्गोरिदम के लिए है। तो बाइनरी खोज वास्तव में तेज़ नहीं होनी चाहिए क्योंकि इसमें छंटाई की आवश्यकता होती है।

मैं सीएलआरएस पढ़ रहा हूं जिसमें लेखक का तात्पर्य है कि भोले रेखीय खोज दृष्टिकोण का उपयोग करने के बजाय सम्मिलन क्रम में उस स्थान को खोजने के लिए द्विआधारी खोज का उपयोग करना बेहतर है जहां आइटम डाला जाना है। इस मामले में यह उचित प्रतीत होता है क्योंकि प्रत्येक लूप पुनरावृत्ति में एक सॉर्ट की गई सूची है, जिस पर द्विआधारी खोज को लागू किया जा सकता है। लेकिन सामान्य मामले में जहां डेटा सेट के बारे में कोई गारंटी नहीं है, जिसमें हमें खोज करने की आवश्यकता नहीं है बाइनरी खोज वास्तव में रैखिक खोज की तुलना में बदतर है जो छंटनी की आवश्यकताओं के कारण है?

क्या कोई व्यावहारिक विचार है कि मैं अनदेखी कर रहा हूं जो द्विआधारी खोज को रैखिक खोज से बेहतर बनाते हैं? या द्विआधारी खोज को क्रमबद्धता के लिए आवश्यक गणना समय पर विचार किए बिना रैखिक खोज से बेहतर माना जाता है?


6
कई अन्य चीजों के साथ, यह सब नीचे आता है: "यह निर्भर करता है ...;)"
जेफ बी

यदि सूची पहले से ही क्रमबद्ध है, तो क्या आप सोच रहे हैं कि रैखिक खोज अभी भी बेहतर है? यहाँ पर विचार करने के लिए कुछ हो सकता है।
जेबी किंग

3
शीर्षक बदलने की सोच रहे किसी के लिए , कृपया सॉर्ट किए गए डेटा के बारे में भाग न लें क्योंकि इसे हटाने से यह पूरी तरह से अलग प्रश्न जैसा लगता है।
असीम बंसल

जवाबों:


53

क्या कोई व्यावहारिक विचार है कि मैं अनदेखी कर रहा हूं जो द्विआधारी खोज को रैखिक खोज से बेहतर बनाता है?

हां - आपको ओ (एन लॉग एन) केवल एक बार छांटना है, और फिर आप ओ (लॉग एन) द्विआधारी खोज को जितनी बार चाहें, कर सकते हैं, जबकि रैखिक खोज हर बार ओ (एन) है।

बेशक, यह केवल एक फायदा है यदि आप वास्तव में एक ही डेटा पर कई खोज करते हैं। लेकिन "एक बार लिखते हैं, अक्सर पढ़ते हैं" परिदृश्य काफी सामान्य हैं।


यदि आप केवल एक बार कुछ कर रहे हैं, तो इसे अनुकूलित करने में ज्यादा मतलब नहीं है।

14

मूल धारणा यह है कि आप एक खोज नहीं करते हैं।

इसलिए यदि आपको एक ही डेटा को कई बार खोजना है तो आपको केवल एक बार छांटना होगा और बाइनरी सर्च से लाभ हो सकता है।

यदि आप अक्सर खोज करते हैं और डेटा बदलते हैं, तो यह एक क्रमबद्ध सूची का उपयोग करने के लायक है जहां नई प्रविष्टियों को सूची में क्रमबद्ध किया जाता है।

तो मूल रूप से द्विआधारी खोज बेहतर है जब आप एक ही सूची को कई बार सहारा लेने की आवश्यकता के बिना खोजते हैं।

जब खोज करने से पहले आपको हर बार छाँटने की आवश्यकता हो तो कोई फायदा नहीं है।

दलील दें कि छँटाई एल्गोरिदम हैं जो बहुत तेज़ हैं जब सूची पहले से ही क्रमबद्ध है (या लगभग क्रमबद्ध)। अधिकांश प्रदर्शन निर्धारण एक अनसोल्ड सूची की अपेक्षा करते हैं।


2
यदि आप अक्सर खोज करते हैं और अक्सर सम्मिलित करते हैं, तो आप अधिक जटिल डेटा संरचनाओं (जैसे बाइनरी ट्री) को देख सकते हैं।
MarkJ

@MarkJ मूल पोस्टर का मूल प्रश्न एक सूची में खोज करने के बारे में था। और मैं तुम्हारे साथ पूरी तरह से सहमत हूँ।
उव प्लोनस

7

क्योंकि एक बार जब आपके पास एक सॉर्ट की गई सूची होती है, तो आपको हर बार इसे पुन: क्रमबद्ध करने की आवश्यकता नहीं होती है, जिसका अर्थ है कि यदि आपके पास ओ (लॉग एन) से अधिक है तो पहले से छंटनी की गई खोजों से आपको लाभ होगा ( O(n log n + k log n)बनाम)O(k*n)


5

दो फोन बुक की कल्पना करो।

एक फोन बुक में वर्णमाला क्रम में नाम हैं। आप जो प्रविष्टि चाहते हैं, उसे खोजने के लिए, आप बीच में खुलते हैं, प्रविष्टि की जांच करते हैं, फिर आगे बढ़ते हैं या पीछे की ओर निर्भर करते हैं कि आप ओवरशूट करते हैं या अंडरशूट।

अन्य फोन बुक में यादृच्छिक क्रम में नाम हैं। आप जो प्रविष्टि चाहते हैं उसे खोजने के लिए, आप शुरुआत में शुरू करते हैं और तब तक जारी रखते हैं जब तक आप जो चाहते हैं वह नहीं मिल जाता।

क्या दूसरी पुस्तक किसी भी आकार के शहर में काम करेगी?


3

मुझे लगता है कि रैखिक खोज पर द्विआधारी खोज का मूल्य प्रासंगिक है। यदि आप एक बड़े पैमाने पर अनियंत्रित डेटा सेट के साथ शुरू करते हैं और केवल इसमें से बहुत कम आइटम गिराने की योजना बनाते हैं, तो एक बाइनरी खोज को सॉर्ट करना और प्रदर्शन करना धीमा हो जाएगा। यदि, हालांकि, आप अपने आवेदन के जीवनकाल में एक आदेशित सूची बनाए रखते हैं और इसे नियमित रूप से एक्सेस करते हैं, तो द्विआधारी खोज एक बेहतर तरीका है।


3

जैसा कि कई अन्य लोगों ने उत्तर दिया है, द्विआधारी खोज वास्तव में बेहतर है क्योंकि छंटाई का चरण केवल एक बार किया जा सकता है और वास्तविक खोज तब जितनी बार चाहें उतनी बार की जा सकती है। हालांकि, n (यानी कुछ इनपुट आकार) के कुछ मूल्यों के लिए , द्विआधारी खोज हमेशा रैखिक खोज (यहां तक ​​कि एक एकल रन के लिए) से अधिक प्रदर्शन होता है।

"टिपिंग पॉइंट" की गणना असममित जटिलता समीकरण को हल करके की जाती है:

n log n + log n = n

जैसा कि आप वुल्फराम अल्फा पर देख सकते हैं कि n के लिए एक संख्यात्मक मान है जो यह सुनिश्चित करता है कि द्विआधारी खोज और छँटाई हमेशा अकेले रैखिक खोज की तुलना में तेज़ होती है। बेशक आपके मामले में काम करने वाले एन का वास्तविक मूल्य कई कारकों पर निर्भर करता है, जिनका अनुमान लगाना मुश्किल हो सकता है।

मार्क प्रोबस्ट के इस दिलचस्प लेख के अनुसार , जिसमें वर्तमान प्रोसेसर पर गहराई से प्रदर्शन माप में कुछ अच्छे शामिल हैं:

यदि आपको पूर्णांक के क्रमबद्ध सरणी के माध्यम से खोज करने की आवश्यकता है और प्रदर्शन वास्तव में महत्वपूर्ण है, तो रैखिक खोज का उपयोग करें यदि आपका सरणी आकार में लगभग 64 तत्वों से नीचे है, तो द्विआधारी खोज यदि यह ऊपर है।


2

आम आदमी के शब्दों में:

यदि आपके पास दस बिलियन आइटमों के साथ एक अनियंत्रित सूची है, और जिस आइटम की आप तलाश कर रहे हैं वह अंतिम एक है, तो आप दस बिलियन आइटमों को पढ़ना समाप्त कर देंगे।

बाइनरी खोज के मामले में, अनुक्रमण केवल एक बार किया जा सकता है। आदेश को बनाए रखने के लिए बाद में प्रविष्टि सही जगह पर की जा सकती है।


2

जबकि "बाइनरी खोज बेहतर है" के कई अच्छे कारण पहले ही सूचीबद्ध किए जा चुके हैं, हमारे पास उपयोगकर्ता के दृष्टिकोण से होने वाले लाभों पर भी एक नज़र हो सकती है:

जब आप सामान्य रूप से डेटा दर्ज करने की क्रियाओं के बीच छोटे प्रतीक्षा समय के विभाजन के साथ बहुत अच्छी तरह से रह सकते हैं, जब आप एक सम्मिलित सम्मिलित करते हैं, तो आप चाहते हैं कि "खोज" जितनी जल्दी हो सके। उपयोगकर्ता के दृष्टिकोण से, बाइनरी खोज के साथ संयुक्त सॉर्ट किए गए सम्मिलित सबसे अच्छा उपयोगकर्ता अनुभव देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.