उस तत्व को खोजना जो एक बहुत बड़ी फ़ाइल में सबसे अधिक होता है


12

मैंने सुना है कि यह साक्षात्कार प्रश्न बहुत कुछ पूछा गया था और मुझे उम्मीद थी कि कुछ अच्छे उत्तर मिल सकते हैं: आपके पास एक बड़ी फ़ाइल 10+ जीबी है और आप यह पता लगाना चाहते हैं कि कौन सा तत्व सबसे अधिक होता है, एक अच्छा तरीका क्या है यह करने के लिए?

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

अन्य विचारों को मैंने कई थ्रेड्स के माध्यम से पुनरावृत्त करने और संसाधित करने के लिए फ़ाइल को विभाजित करना शामिल किया था और फिर उन परिणामों को संयुक्त किया है, लेकिन नक्शे के लिए मेमोरी मुद्दा अभी भी है।


2
फ़ाइल के तत्व क्या हैं? क्या वे तार हैं? यदि आप तत्वों के लिए वर्ण लेते हैं, तो मानचित्र में मेमोरी की समस्या नहीं होगी। अगर तत्व शब्द हैं, तो फिर से मुझे लगता है कि यह एक समस्या नहीं होगी। यदि आपके पास सभी संभव पदार्थ हैं, तो आपको समस्याएं हो सकती हैं ...
Nejc

1
यदि स्थिति "एक ऐसा तत्व है जो कुल तत्वों से आधे से अधिक दिखाई देता है" तो एक रैखिक समाधान था।
st0le

मेरा मानना ​​है कि तत्व आमतौर पर तार होते हैं। लेकिन मैं यह नहीं देखता कि नक्शा कैसा मुद्दा नहीं है। बदतर स्थिति में जहां हर तत्व अद्वितीय है, क्या आपने अपनी मेमोरी आवश्यकता को दोगुना नहीं किया है?
पैट

1
यदि बॉयर-मूर बहुमत उम्मीदवार एल्गोरिदम लागू है, तो यह रैखिक समय में चलता है और इन-प्लेस है।
जुहो

जवाबों:


6

>1/kO(k)O()। इस समस्या को अब हैवी हिटर की समस्या के रूप में जाना जाता है।

>1/kk

k=2

  • यदि फ़ाइल का वर्तमान तत्व संग्रहीत तत्व के समान है, तो गणना को एक से बढ़ाएं
  • यदि फ़ाइल का वर्तमान तत्व संग्रहीत तत्व से अलग है, तो गिनती को एक से घटा दें
  • यदि अद्यतन गणना 0 है, तो संग्रहीत तत्व को "किक आउट" करें और फ़ाइल के वर्तमान तत्व को संग्रहीत करें; गिनती को 1 तक बढ़ाएं
  • फ़ाइल के अगले तत्व के लिए आगे बढ़ें

इस प्रक्रिया के बारे में थोड़ी-सी सोच आपको आश्वस्त कर देगी कि यदि कोई "बहुमत" तत्व मौजूद है, यानी एक जो आधे से अधिक समय तक होता है, तो वह तत्व पूरी फ़ाइल के संसाधित होने के बाद संग्रहीत तत्व होगा।

kk1k1kk

k11/kO(k)

k1/kk1


आप बॉयर-मूर या मिश्रा-ग्रिज़-डेमन एल्गोरिदम का उपयोग नहीं कर सकते। जैसा कि कहा गया है समस्या अलग है: आप बहुमत तत्व की खोज नहीं कर रहे हैं, लेकिन ऐसे तत्व के लिए जिसकी घटनाएँ हैं = सभी तत्वों की घटनाओं का =। यहाँ एक सरल प्रतिसाद है। चलो n तत्वों की कुल संख्या है, जैसे कि n = 2k + 1 । पहले k तत्वों को 0 होने दें, अगले k तत्वों को 1 और अंतिम तत्व को 2 होना चाहिए। Boyer-Moore एल्गोरिथ्म अंतिम तत्व, 2 को संभावित बहुसंख्यक उम्मीदवार के रूप में रिपोर्ट करेगा। लेकिन, इस विशेष उदाहरण के लिए, आउटपुट या तो 0 या 1. होना चाहिए
मासिमो कैफ़रो

O(1)Ω(n)

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

@MassimoCafaro वह ट्रेडऑफ़ नहीं है जिसे आपको लेने की आवश्यकता है। जैसा कि मैंने फ़ाइल पर एक एकल पास को इंगित किया है आसानी से पुष्टि करता है कि क्या धारणा संतुष्ट है!
साशो निकोलेव

@MassimoCafaro और यह केवल तुच्छ समाधान है! इस धारणा को सीएम स्केच के साथ बिना किसी अतिरिक्त पास के उच्च संभावना के साथ सत्यापित किया जा सकता है।
साशो निकोलोव

3

स्पष्ट उत्तर निश्चित रूप से हैश मैप रखने और तत्वों की घटना का एक काउंटर स्टोर करने के लिए है जैसा कि आप फ़ाइल के माध्यम से आगे बढ़ते हैं जैसा कि नेजेक ने पहले ही सुझाया था। यह (समय जटिलता के संदर्भ में) इष्टतम समाधान है।

Θ(nlogn).


क्या आप हफ़मैन एन्कोडिंग दृष्टिकोण पर अधिक विस्तृत कर सकते हैं? मैंने पहले एक हफ़मैन एनकोडर लिखा है, लेकिन इसके कुछ समय हो गए हैं, तो आप वास्तव में इस मामले में इसका उपयोग कैसे करेंगे?
पाट

@Pat नेवरमाइंड उस भाग को सुबह बहुत जल्दी था और किसी तरह मैंने सोचा कि यह इनपुट को संपीड़ित करने के लिए समझ में आता है।
१२:१३

1

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


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