2012-03-23 13 views
5

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

क्या आप कृपया मेरे साथ सहन कर सकते हैं और मुझे इस समस्या से संपर्क करने के लिए सिखा सकते हैं? धन्यवाद आपकी मदद की सराहना की जाती है।

+0

आम तौर पर, चीजों के एक बड़े सेट को खोजने के लिए, कोई किसी प्रकार की हैश तालिका का उपयोग करता है। –

+0

[जो तेज है, हैश लुकअप या बाइनरी खोज?] (Http://stackoverflow.com/questions/360040/which-is-faster-hash-lookup-or-binary-search) – Josh

+2

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

उत्तर

0

अन्य त्वरित सॉर्टिंग एल्गोरिदम भी हैं। शेल कम दिमाग में आता है।

http://en.wikipedia.org/wiki/Shellsort

+0

अभी भी NlogN सबसे अच्छा मामला। – Kevin

1

मुझे यकीन है कि वह क्या मन में था नहीं हूँ।

यदि आप सिर्फ एक बार नंबर खोजना चाहते हैं, और आपको कोई गारंटी नहीं है कि सरणी सॉर्ट की गई है, तो मुझे नहीं लगता कि आप रैखिक खोज को हरा सकते हैं। औसतन आपको मूल्य खोजने से पहले सरणी के माध्यम से आधे रास्ते की तलाश करनी होगी, यानी अपेक्षित चलने का समय ओ (एन); सॉर्ट करते समय आपको कम से कम एक बार और प्रत्येक से अधिक मूल्य को छूना पड़ता है, यानी अपेक्षित चलने का समय ओ (एन लॉग एन)।

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

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

लेकिन जैसा कि @ हॉट लिक्स ने कहा, इस प्रकार की चीज़ के लिए अक्सर हैश टेबल का उपयोग किया जाता है, और यह अद्यतन करने के लिए बहुत सस्ता है: आप केवल मुख्य सरणी पर एक मान संलग्न करें, और नए मान को इंगित करने के लिए हैश तालिका अद्यतन करें। और एक हैश टेबल ओ (1) समय के बहुत करीब है, जिसे आप हरा नहीं सकते। (एक हैश टेबल ओ (1) यदि कोई हैश टकराव नहीं है; एक अच्छा हैश एल्गोरिदम मानना ​​और एक बड़ी पर्याप्त हैश तालिका में लगभग कोई टकराव नहीं होगा। मुझे लगता है कि आप कह सकते हैं कि हैश तालिका ओ (एन) है जहां एन प्रति "बाल्टी" की हैश टकराव की औसत संख्या है। अगर मैं इसके बारे में गलत हूं तो मुझे बहुत जल्दी सुधारने की उम्मीद है; यह स्टैक ओवरफ्लो है!)

+0

मुझे समझ में नहीं आया कि तीसरी खोज से आपका क्या मतलब था? कोई exaple plz? –

+0

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

+0

यदि आपको दो बार से अधिक खोजना है तो आप हैश तालिका का उपयोग कर शायद बेहतर हो सकते हैं। –

0

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

+0

तो अंत में मेरा मतलब है कि इस प्रश्न के लिए कोई निश्चित उत्तर नहीं है। – jianpx

1

मैं एक ऐसी ही सवाल का मोड़ पूछा गया था क्रमबद्ध में खोज करने के लिए था और फिर एक अवर्गीकृत सरणी ये अपने जवाब सभी अस्वीकृत

  1. हल कर लिए थे मैं सुझाव दिया है कि हम केंद्र खोजने के लिए और एक रेखीय खोज कर सकते हैं ।बाइनरी सर्च यहां भी काम करेगी
  2. बिना छेड़छाड़ के लिए मैंने फिर से रैखिक सुझाव दिया।
  3. फिर मैंने बाइनरी का सुझाव दिया जो कि गलत है।
  4. हैशसेट में सरणी को संग्रहीत करने और हैशिंग का उपयोग करने का सुझाव दिया गया है। (उच्च अंतरिक्ष complexcity के बाद से स्वीकार किए जाते हैं नहीं)
  5. मैं सुझाव ट्री सेट जो एक लाल काला पेड़ देखने के लिए काफी अच्छा। (उच्च अंतरिक्ष complexcity के बाद से नहीं स्वीकार किए जाते हैं) ArrayList खोदना में
  6. प्रतिलिपि बनाई जा रही भूमि के ऊपर भी विचार किया गया है।

अंत में मुझे नकारात्मक प्रतिक्रिया मिली। हालांकि हम सोच सकते हैं कि उपरोक्त में से एक समाधान है लेकिन निश्चित रूप से रैखिक खोज में कुछ खास है जो मुझे याद आ रही है।

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

किसी भी टिप्पणी का स्वागत किया।

संबंधित मुद्दे