क्या इस एल्गोरिथ्म को अभी भी एक द्विआधारी खोज एल्गोरिदम माना जा सकता है?


14

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

अगर मेरे पास 100 की क्रमबद्ध सरणी है और मुझे लगता है कि इसके शुरुआती क्षेत्र में 200 नंबर है और इसके अंतिम क्षेत्र में 400 नंबर है, मुझे, मानव का अध्ययन करने वाले गणित के रूप में, यदि मैं खोज कर रहा था तो मुझे 35 के आसपास खोज शुरू करने की संभावना होगी। संख्या 270, और सामान्य बाइनरी खोज एल्गोरिदम की तरह क्षेत्र 50 नहीं।

फिर, यदि सरणी के क्षेत्र 35 पर संख्या 270 है, तो 35 वह सूचकांक है जिसे मैं खोज रहा था।

यदि ऐसा नहीं है, तो मुझे मिली संख्या की तुलना कर सकते हैं (280 कहते हैं) और सरणी के निचले हिस्से को लेते हुए ऑपरेशन को दोहराएं (इसलिए मेरे पास 35 फ़ील्ड हैं जिसमें शुरुआती फ़ील्ड 200 और समाप्ति फ़ील्ड युक्त 280 है) यदि संख्या जो मुझे मिली है उससे अधिक है जो मैं खोज रहा हूं, या सरणी का ऊपरी भाग (कहो कि मुझे 260 मिला: अब मेरे पास 65 इंडेक्स हैं, पहला 260 है और अंतिम एक 400 है। ओरिएंटेटिवली, मैं प्रमुख होगा इस उप सरणी का सूचकांक 4, जो पूरे सरणी का सूचकांक 39 है) यदि मुझे मिली संख्या उस संख्या से छोटी है जिसे मैं खोज रहा हूं।

सवाल यह है: क्या इस एल्गोरिथ्म को एक द्विआधारी खोज एल्गोरिदम माना जा सकता है? यदि नहीं, तो क्या इसका अपना नाम है?


2
यह द्विआधारी खोज है या नहीं यह विशुद्ध रूप से राय का विषय है। अनिवार्य रूप से, एकमात्र उत्तर जो आप दे सकते हैं, "हाँ, यह द्विआधारी खोज के काफी करीब है, इसे द्विआधारी खोज" या "यह नहीं है।" तर्क-वितर्क करता है।
डेविड रिचीर्बी

जवाबों:


23

मैं इसे बाइनरी सर्च नहीं कहूंगा।

यह स्पष्ट रूप से बाइनरी खोज के समान है और इसे बाइनरी खोज के शोधन के रूप में देखना स्वाभाविक है। हालाँकि, इसमें अलग-अलग एल्गोरिथ्म की जटिलता विशेषताएँ हैं, इंटरपोलेशन सर्च ने O (लॉग (n)) के रन टाइम का अनुमान लगाया है, यह मानते हुए कि डेटा समान रूप से वितरित किया गया है, हालाँकि यह O (n) सबसे खराब केस रन टाइम होने से इसके लिए भुगतान करता है।

मैं यह कहना पसंद करता हूं कि "बाइनरी सर्च का सबसे खराब मामला रन टाइम O (लॉग (n)) है" बाउंडिंग एलिमेंट्स की पसंद के आधार पर बाइनरी सर्च का सबसे खराब केस रन टाइम O (लॉग (n)) है। " इसका मतलब है कि मैं इंटरपोलेशन खोज को बाइनरी सर्च एल्गोरिथ्म के रूप में वर्गीकृत नहीं कर सकता।


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

वह हत्यारा-इनपुट विचार दिलचस्प है। क्या होगा यदि हत्यारे इनपुट को अनुमति देने के बजाय खोज को नकारात्मक रूप से प्रभावित करें (जैसे कि किसी सरणी के अंत में विभाजित करके) हम सरणी के 2 तिहाई या उसके समान "स्प्लिटेबल रेंज" को सीमित / ट्रिम करते हैं। यह एक सबसे खराब मामला होगा log3 (n) लेकिन फिर भी एक लॉग (लॉग) सर्वश्रेष्ठ मामले का आनंद लें।
एंड्रयू गैलाश ने

1
@SteveJessop याद रखें कि असममित जटिलता पूर्ण चित्र नहीं है। O (log n) बहुत तेज है। इसके अलावा बाइनरी सर्च प्रत्येक लूप में बहुत कम काम करता है। तो पहले से ही इंटरपोलेशन खोज के लिए समस्या यह है कि आपको इस तथ्य के लिए बहुत लंबा इनपुट चाहिए कि आप प्रत्येक लूप पर अधिक काम करते हैं। आप सुझाव देते हैं कि इसमें और काम जोड़ा जाएगा। अगर मैं डेटा के लिए O (n) को स्वीकार करने में असमर्थ था जो एक समान नहीं था तो मुझे संदेह है कि कुछ हाइब्रिड दृष्टिकोण के बजाय शुद्ध बाइनरी खोज के लिए सबसे अच्छा समाधान है।
तैमूर

@SteveJessop: एल्गोरिदम को स्विच करने की कोई आवश्यकता नहीं है; यह समानांतर में किया जा सकता है। एक सीमा आर को देखते हुए, आप द्विआधारी खोज के लिए सामान्य मिडपॉइंट के रूप में बिंदु पी 1 निर्धारित कर सकते हैं, और प्रक्षेप का उपयोग करके पी 2। अब आपको तीन सबग्रेज मिल गए हैं, जिनमें से कोई भी आधा मूल रेंज से बड़ा हो सकता है। पी 1 और पी 2 दोनों के खिलाफ लक्ष्य मान की जांच करें, और आप जानते हैं कि इन तीनों में से
कौन सी परत को दोबारा बनाना है

17

हां, इसे इंटरपोलेशन सर्च के रूप में जाना जाता है । कुछ कैविएट्स (आपके कम्प्यूटेशनल मॉडल और डेटा के वितरण के आधार पर) के साथ, इसका अपेक्षित रनिंग टाइम , जो बाइनरी सर्च से बेहतर है।O(loglogn)


ठंडा। अब सवाल यह है कि क्या मैं इसे कोड काटा के लिए उपयोग कर सकता हूं, लेकिन यह मेरी समस्या है। मैं इसे बाइनरी खोज की तुलना में अधिक जटिल पा रहा हूं, हालांकि ऐसा क्यों नहीं है।
user6245072

मुझे यह एक बार पता चला जब कोड लिखना एक लॉग फाइल को कुछ साल पीछे करना था। मुझे यह भी पता चला कि मेरे डेटा के लिए प्रक्षेप और बाइनरी स्लाइस के बीच वैकल्पिक कदम अपने आप में किसी भी विकल्प से बेहतर थे। मुझे यकीन नहीं है कि अगर इसका कोई नाम है, या एक ज्ञात प्रभाव है।
नील स्लेटर

@NeilSlater ने हेजल इंटरपोलेशन खोज की शायद?
स्टीव कॉक्स

@SteveCox: मैंने अभी उस शब्द को खोजा और कुछ भी नहीं मिला। एक नए प्रश्न के रूप में यह पूछने का निर्णय लिया गया कि: cs.stackexchange.com/questions/59750/…
नील स्लेटर

-1

मुझे लगता है कि सही शब्दावली डाइकोटोमियल पॉन्डर्ड खोज होगी।

आप एक फ्लैट ऐरे में खोज करते हैं, जिसमें बाद में मिले अंकों के आधार पर उसमें अनुमानित फ्लैट वितरण की मांग की जाती है।

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

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