इंटरपोलेशन सर्च बनाम बाइनरी सर्च


13

मुझे बाइनरी खोज के बजाय प्रक्षेप खोज का उपयोग कब करना चाहिए?

उदाहरण के लिए, मेरे पास एक सॉर्ट किया गया डेटासेट है, इस डेटासेट में किसी आइटम को खोजने के लिए मैं किन स्थितियों में बाइनरी खोज का उपयोग करूंगा या किस स्थिति में मुझे प्रक्षेप खोज का उपयोग करना चाहिए?

डेटासेट के कौन से गुण निर्धारण कारक होंगे?

जवाबों:


12

जाहिर है, एक प्रक्षेप खोज करने के लिए, आपको कुछ प्रकार की कुंजी की आवश्यकता होती है जिसके लिए ऑर्डर देने से अधिक ज्ञात होता है - आपको संभावित दूरी का अनुमान लगाने के लिए कुंजियों पर कम्प्यूटेशन करने में सक्षम होना चाहिए, न कि यह निर्धारित करने के लिए कुंजियों की तुलना करें जो अधिक से अधिक है या कम।

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

उदाहरण के लिए, कम-केस अक्षरों के तारों के साथ सेट के रूप में एक डेटा पर विचार करें। मान लेते हैं कि आपके पास एक कुंजी है जो "x" से शुरू होती है। एक प्रक्षेप खोज स्पष्ट रूप से इंगित करेगी कि आपको सेट के अंत के बहुत करीब खोज शुरू करनी चाहिए। यदि, हालांकि, आपकी अधिकांश कुंजियाँ वास्तव में 'z' से शुरू होती हैं, और 'a' हालांकि 'y' से किसी भी चीज़ के साथ लगभग कोई भी नहीं है, तो आप जिसे खोज रहे हैं वह वास्तव में सेट की शुरुआत के बहुत करीब हो सकता है। खोज की शुरुआत के करीब पहुंचने से पहले यह काफी संख्या में पुनरावृत्तियां ले सकता है / कर सकता है जहां स्ट्रिंग 'w' से शुरू होती है। प्रत्येक पुनरावृत्ति विचार से सेट किए गए डेटा का केवल ~ 10% निकाल देगी, इसलिए यह शुरुआत से करीब पहुंचने से पहले कई पुनरावृत्तियों को ले जाएगा जहां कुंजी 'w' से शुरू होती है।

इसके विपरीत, एक द्विआधारी खोज मध्य में शुरू होती है , दूसरे पुनरावृत्ति में एक-चौथाई निशान पर पहुंचती है, तीसरे पर एक-आठवां निशान, और इसी तरह। इसका प्रदर्शन कुंजियों में तिरछा होने से लगभग अप्रभावित रहेगा। प्रत्येक पुनरावृत्तियों को विचार से आधा डेटा सेट हटा दिया जाएगा, जैसे कि कुंजी समान रूप से वितरित की गई थी।

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

मुझे यह भी उल्लेख करना चाहिए कि एक प्रक्षेप खोज को रैखिक प्रक्षेप का उपयोग करने की आवश्यकता नहीं है। उदाहरण के लिए, यदि आपकी कुंजियों को कुछ गैर-रेखीय वितरण (जैसे, घंटी-वक्र) का पालन करने के लिए जाना जाता है, तो यह एक समान वितरण होने से परिणामों को थोड़ा अलग करने के लिए प्रक्षेप समारोह में खाते में लेना काफी आसान हो जाता है।


1
आपके द्वारा वर्णित समस्या को Int.MIN_VALUE और Int.MAX_VALUE मानने के बजाय सीमा निर्धारित करने के लिए पहले और अंतिम तत्वों का उपयोग करके आसानी से समायोजित किया जाता है, जो मुझे विश्वास है (कम से कम यही है कि मैंने एल्गोरिथ्म कैसे सीखा) यह सबसे अधिक है।
मैल्फिस्ट

2
@ मालफिस्ट: यह मदद कर सकता है, लेकिन जरूरी नहीं कि समस्या ठीक हो। उदाहरण में, यदि आपके पास शून्य कुंजी (')' a 'से' q 'से शुरू होती है, तो प्रक्षेप काफी सुचारू रूप से चलेगा। aहालाँकि, इसके साथ शुरू हुआ एक एकल प्रदर्शन नाटकीय रूप से प्रदर्शन को प्रभावित करेगा।
जेरी कॉफिन

1

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

इंटरपोलेशन खोज पर विकिपीडिया से:

बड़े-ओ संकेतन का उपयोग करते हुए, आकार N के डेटा सेट पर प्रक्षेप एल्गोरिथम का प्रदर्शन O (N) है; हालांकि प्रक्षेप के लिए उपयोग किए जाने वाले रैखिक पैमाने पर डेटा के एक समान वितरण की धारणा के तहत, प्रदर्शन को ओ (लॉग लॉग एन) दिखाया जा सकता है।

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

बी-ट्रीज़ जैसे इंडेक्स स्ट्रक्चर भी डिस्क एक्सेस की संख्या को कम करते हैं, और इनका उपयोग अक्सर डिस्क पर डेटा को इंडेक्स करने के लिए किया जाता है क्योंकि वे कई तरह के डेटा को इंडेक्स कर सकते हैं और ऑनलाइन अपडेट किए जा सकते हैं। फिर भी, प्रक्षेप की खोज तब उपयोगी हो सकती है जब किसी को कुछ छांटे गए लेकिन बिना-खोजे हुए डिस्क डेटासेट पर खोज करने के लिए मजबूर किया जाता है।


0

बाइनरी खोज और प्रक्षेप खोज दोनों को रैखिक खोज विधियों के रूप में माना जाता है।

वे दोनों उम्मीद करते हैं कि सूची को कुंजी के रूप में संदर्भित कॉलम पर छांटा जाए । यह बहुत महत्वपूर्ण है।

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

"समान वितरण के साथ क्रमबद्ध सरणियों के क्रम में व्यवस्थित संख्यात्मक तत्वों पर" इंटरपोलेशन खोज कार्य करता है (अर्थात, क्रमिक तत्वों में से किसी के बीच का अंतराल लगभग स्थिर है " )।

Google पुस्तकें - क्लासिक डेटा संरचनाएं 2Nd एड।

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