बाइनरी सर्च टर्नरी सर्च से ज्यादा तेज क्यों है?


49

द्विआधारी खोज का उपयोग करके तत्वों की एक सरणी खोजना , सबसे खराब स्थिति में पुनरावृत्तियों को लेता है, क्योंकि प्रत्येक चरण में हम अपने खोज स्थान का आधा भाग ट्रिम कर देते हैं। यदि, इसके बजाय, हमने 'टर्नरी खोज' का उपयोग किया, तो हम प्रत्येक पुनरावृत्ति पर अपने खोज स्थान का दो-तिहाई भाग काट देंगे, इसलिए सबसे खराब स्थिति में पुनरावृत्तियों को लेना चाहिए ...एनलॉग इन करें2एनलॉग इन करें3एन<लॉग इन करें2एन

ऐसा लगता है कि टर्नरी खोज तेज है, इसलिए हम बाइनरी खोज का उपयोग क्यों करते हैं?


3
क्या क्वाटरनेरी खोज के बारे में एक ही तर्क का उपयोग नहीं किया जा सकता है? या यहां तक ​​कि दशमलव खोज ... या 2 से बड़ा कुछ भी नहीं
d'alar'cop

4
कृपया B + पेड़ के बारे में पढ़ें
arunmoezhi

5
रैखिक खोज अक्सर आधुनिक हार्डवेयर पर छोटे से मध्यम आकार की समस्याओं पर द्विआधारी खोज की तुलना में तेज़ होती है, क्योंकि यह कैश-सुसंगत है और लगभग सभी शाखाओं की सही भविष्यवाणी की जाती है।
छद्म नाम

2
साथ ही 2 * log_3 (N) = log_3 (N ^ 2) अगर यह आपके अंतर्ज्ञान के लिए बोलता है।
पावेलप

6
इसे सहज शब्दों में कहें। यदि 3-आधारित खोज का उपयोग करना तेज़ है, क्योंकि यह प्रत्येक पुनरावृत्ति पर खोज स्थान को अधिक काट देता है, तो वह एक लाख-आधारित खोज का तेज़ी से उपयोग नहीं कर रहा है? लेकिन आप आसानी से देख सकते हैं कि लक्ष्य को समाहित करने वाले 1-मिलियन स्लाइस को निर्धारित करने के लिए आपको प्रत्येक पुनरावृत्ति के अंदर औसतन 500,000 चेक करने होंगे। स्पष्ट रूप से, प्रत्येक पुनरावृत्ति और अधिक नहीं में खोज स्थान को काटने से, आपको एक ही चरण में, मज़बूती से सबसे अधिक जानकारी मिलती है।
ErikE

जवाबों:


76

आप द्विआधारी खोज लागू होते हैं, आप कई तुलना। आप त्रिगुट खोज लागू होते हैं, आपके पास 2 लॉग 3 ( एन ) + हे ( 1 ) कई तुलना, हर कदम के रूप में, आप तीन भागों में खोज अंतरिक्ष में कटौती करने के 2 तुलना प्रदर्शन करने की जरूरत है। अब अगर आप गणित, तो आप उस का निरीक्षण कर सकते हैं: 2 लॉग 3 ( एन ) + हे ( 1 ) = 2 लॉग ( 2

लॉग इन करें2(n)+हे(1)
2लॉग इन करें3(n)+हे(1)
के बाद से हम जानते हैं कि2लॉग(2)
2लॉग इन करें3(n)+हे(1)=2लॉग इन करें(2)लॉग इन करें(3)लॉग इन करें2(n)+हे(1)
, हम वास्तव में मिलअधिकत्रिगुट खोज के साथ तुलना।2लॉग इन करें(2)लॉग इन करें(3)>1

वैसे: -ary खोज मामले में बहुत मायने रख सकती है यदि तुलना काफी महंगी है और इसे समानांतर किया जा सकता है, तो, समानांतर कंप्यूटरों को लागू किया जा सकता है।n

ध्यान दें कि तर्क को -ary खोज में काफी आसानी से सामान्यीकृत किया जा सकता है । तुम बस दिखाने की जरूरत है कि समारोह ( कश्मीर ) = ( कश्मीर - 1 ) लॉग ( 2 )n सख्ती से की पूर्णांक मूल्यों के लिए बढ़ रही है एक लय हैकश्मीर()=(-1)लॉग इन करें(2)लॉग इन करें()


1
और LHS रैखिक है और RHS लॉगरिदमिक है, इसलिए यह किसी भी चतुर्धातुक या इससे अधिक के लिए कुछ भी मदद नहीं करेगा .... अच्छा स्पष्टीकरण .... धन्यवाद
मतलब स्क्वायर

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

10
एक टर्नरी खोज में, 1/3 समय आपको केवल 1 तुलना की आवश्यकता होगी (कम तुलना करें: यदि निचले तीसरे में, आपको दूसरी तुलना की आवश्यकता नहीं है)। यह 25% के बजाय केवल 5% धीमा बनाता है (इस दुनिया में जिसमें हम केवल तुलना गणना के बारे में परवाह करते हैं)। मुझे यकीन नहीं है कि इसे एन-एरी को कैसे सामान्य किया जाए, हालांकि मुझे संदेह है कि यह बाइनरी की तुलना में कभी तेज नहीं होता है।
हारून डफ़र

2
@AaronDufour: चूँकि कोई पहले मध्य वस्तु की तुलना करके चतुर्धातुक खोज कर सकता है और फिर दूसरी तुलनाओं के परिणाम को अनदेखा कर सकता है, एक ही रास्ता चतुर्विध खोज तेजी से हो सकता है यदि तीन तुलनाओं को समानांतर में दो तुलनात्मक रूप से सस्ते में किया जा सकता है। क्रमिक रूप से किया जा सकता है।
सुपरकाट

1
@AaronDufour लेकिन आप खोज करने के लिए तत्वों पर परिशोधन कर रहे हैं, और यह मेरे लिए स्पष्ट नहीं है कि यह ठीक क्यों है। सबसे खराब स्थिति में दोनों की तुलना हर कदम पर की जा सकती है।
साशो निकोलेव

26

DCTLib सही है, लेकिन एक सेकंड के लिए गणित को भूल जाओ।

आपके तर्क से, n -ary सबसे तेज़ होनी चाहिए। लेकिन अगर आप इसके बारे में सोचते हैं, तो n -ary एक नियमित पुनरावृत्ति खोज के बराबर है (सिर्फ सूची 1 से 1 के माध्यम से पुनरावृत्ति, लेकिन रिवर्स ऑर्डर में)। पहले आप सूची में अंतिम (या अंतिम से अगले) आइटम का चयन करें और उस मूल्य की तुलना अपने मूल्य से करें। फिर आप अपनी सूची से उस आइटम को हटाते हैं, और फिर नई सूची में अंतिम आइटम चुनते हैं, जो कि सरणी में अंतिम मूल्य के बगल में है। हर बार, आप केवल एक समय में 1 मूल्य को समाप्त कर रहे होंगे जब तक कि आपको अपना मूल्य नहीं मिला।

इसके बजाय, आपको इसके बारे में इस तरह सोचना चाहिए - मैं प्रत्येक पुनरावृत्ति सूची से सबसे अधिक मूल्यों को कैसे समाप्त करूं? एक द्विआधारी खोज में, आप हमेशा आधी सूची को समाप्त करते हैं। एक टर्नरी खोज में, एक संभावना (33.33% संभावना है, वास्तव में) है कि आप सूची के 2/3 को समाप्त कर सकते हैं, लेकिन एक और भी अधिक मौका (66.66%) है कि आप केवल 1/3 सूची को समाप्त करेंगे। ओ (एन) की गणना करने के लिए, आपको सबसे खराब स्थिति को देखने की जरूरत है, जो 1/3, 1/2 से कम है। जैसे-जैसे आप नज़दीकी और n के करीब आते हैं, यह और भी बदतर होता जाता है।

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

(P_lower) x (वह भाग जिसे हम कम कर सकते हैं) + (P_higher) x (यदि हम उच्चतर निकाल सकते हैं) = E

बाइनरी खोज के लिए, यह .5x.5 + .5x.5 = .5 है (हम हमेशा आधी सूची निकालते हैं)। टर्नरी खोजों के लिए, यह मान .666x.333 + .333x.666 = 0.44 है, या प्रत्येक चरण में, हम संभवतः केवल 44% सूची को हटा देंगे, जो औसतन बाइनरी खोज की तुलना में कम कुशल है। यह मान 1/2 (आधी सूची) पर बोलता है, और आपके द्वारा n (रिवर्स पुनरावृत्ति) और 0 (नियमित पुनरावृत्ति) के करीब आने की संख्या कम हो जाती है।

ठीक है, इसलिए मैंने झूठ बोला..तो थोड़ा गणित में शामिल है, लेकिन मुझे आशा है कि मदद करता है!


1
यह एक बेहतरीन जवाब है।
the_Sympathizer

हां सीमा विश्लेषण कठिन गणित को समझने में मदद करता है! n-ary क्रमिक खोज में रैखिक खोज O (n) की समान लागत होती है।
शुवा

-2

कृपया ध्यान दें कि लॉग (एन) बनाम 2 लॉग (एन) तुलना तर्क एल्गोरिथ्म की एक भोली व्याख्या पर आधारित है। अगर मैं वास्तव में x86 असेंबली में बैठकर यह लिखता तो परिणाम उलटे होते। समस्या यह है कि परीक्षण के मामलों के लिए पूर्णांकों का उपयोग एक अपर्याप्त स्मार्ट कंपाइलर के साथ किया जाता है जो अनावश्यक तुलना को दूर नहीं कर सकता है। तार और एक उपयुक्त स्ट्रिंग तुलना फ़ंक्शन के साथ पुन: प्रयास करें, और इसे प्रति लूप में एक बार तुलनात्मक फ़ंक्शन को कॉल करने के लिए कोड करें और आप पाएंगे कि टर्नरी खोज फिर से तेज है।


2
यदि आप इसे प्रति पुनरावृत्ति केवल एक तुलना के साथ कर सकते हैं, तो निश्चित रूप से टर्नरी खोज तेज होगी। लेकिन, कोई बात नहीं अगर तार या पूर्णांक, आप नहीं कर सकते।
फ्रैंकव सिप

तुलना बेमानी नहीं होगी और समस्या का कंपाइलर से कोई लेना-देना नहीं है। खोज स्थान को तीन भागों में विभाजित करने के लिए, आपको 2 तुलनाओं की आवश्यकता है। एक द्विआधारी खोज में, आपको केवल मध्य तत्व की तुलना करने की आवश्यकता होती है और आपको पता होता है कि खोज स्थान का आधा भाग किस परिणाम में निहित होगा। टर्नरी खोज के साथ, आपको रास्ते के 1/3 तत्व से तुलना करने की आवश्यकता होगी। सूची और सूची के माध्यम से रास्ते का एक 2/3। आप किस प्रकार के डेटा की तुलना कर रहे हैं या आप किस भाषा का उपयोग कर रहे हैं वह अप्रासंगिक है। दी गई है, यदि आइटम 1st 3rd में है, तो आप 1 तुलना के बाद रोक सकते हैं।
18

2
कुछ प्लेटफार्मों पर, तुलना के लिए ज़रूरत से पहले सीपीयू को ऑपरेंड को रैम से लाने के लिए सीपीयू को अधिक समय देने की वजह से टर्नरी खोज तेज हो सकती है। लेकिन यह पूरी तरह से इस्तेमाल किए गए प्लेटफॉर्म और इसकी लेटेंसी और कैश पर निर्भर करता है।
जेपा

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