2012-12-21 18 views
13

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

अब, मान लीजिए कि आपके पास इन शब्दों को स्टोर करने के लिए पर्याप्त स्मृति है, तो स्मृति उपयोग को कम करने और बिग-ओ जटिलता में निरंतर ओवरहेड को कम करने के मामले में प्रश्न का बेहतर तरीका क्या है? मेरा मानना ​​है कि दो मूल एल्गोरिदम हैं जिनका उपयोग आप कर सकते हैं:

  1. घटनाओं को संग्रहीत करने के लिए हैश तालिका और एक न्यूनतम-ढेर का उपयोग करें और शीर्ष के शब्दों को देखा गया। यह ओ (एन + nlogk) ~ ओ (एन)
  2. शब्दों और घटनाओं को स्टोर करने के लिए एक trie का उपयोग करें और फिर सबसे लगातार शब्दों की गणना करने के लिए trie पार करें। यह ओ (एन * पी) ~ ओ (एन) है जहां पी सबसे लंबे शब्द की लंबाई है।

कौन सा बेहतर तरीका है?

इसके अलावा: यदि आपके पास हैश टेबल/ट्राई (यानी 10 एमबी की सीमित स्मृति) के लिए पर्याप्त स्मृति नहीं है, तो सबसे अच्छा तरीका क्या है?

+0

शायद 1 जीबी फ़ाइल में आप कितने अलग शब्द होने की उम्मीद कर रहे हैं? – NPE

+0

मैं वास्तव में विशेष रूप से कुछ भी उम्मीद नहीं कर रहा हूं। इस समस्या को वास्तविक दुनिया के शब्दों में फिर से लिखा जा सकता है क्योंकि खोजों की सूची या उस तरह की किसी चीज़ से शीर्ष 10 खोज शब्द ढूंढते हैं, इसलिए मुझे लगता है कि यह किसी प्रकार की संभाव्यता वितरण का पालन करेगा, लेकिन मैं किसी विशेष पर सेट नहीं हूं। – user1921187

उत्तर

0

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

यह शायद प्रारंभिक सूची के लिए ठीक काम करेगा, लेकिन पूरी सूची स्कैन करने और गिनती के साथ हैश तालिका को पॉप्युलेट करने से धीमा होगा।

+1

आप बबल प्रकार क्यों करेंगे? Quicksort का उपयोग कर किसी प्रकार का बाहरी प्रकार अधिक कुशल नहीं होगा? – user1921187

+0

हाँ, मेरी गलती - quicksort होना चाहिए था! पहले छंटनी का मतलब है कि आपको गिनती वाले शब्दों की एक सूची बनाए रखने की आवश्यकता नहीं है - यदि प्रत्येक शब्द अद्वितीय था, तो यह स्मृति को दोगुना कर सकता है, सॉर्टिंग इसे n + k में रखता है। –

+0

सीमित स्मृति Quicksort के साथ भयानक है (याद रखें कि आप फ़ाइल को स्मृति में संग्रहीत नहीं कर सकते हैं)। यदि कोई है, तो आपको बाहरी प्रकार का उपयोग करना चाहिए (जो आम तौर पर विलय प्रकार की भिन्नता है)। हालांकि, यह शायद ही कभी किया जाता है - डिस्क पर डेटा हैशिंग आमतौर पर अधिक कुशल होता है और बहुत कम डिस्क की आवश्यकता होती है – amit

5

जो निरंतर पर निर्भर करता है, बहुत निर्भर है। एक तरफ, ट्राई सभी तत्वों को सम्मिलित करने के लिए सख्त O(N) समय जटिलता प्रदान करता है, जबकि हैश तालिका खराब स्थिति पर क्वाड्रिक समय से क्षय हो सकती है।
दूसरी ओर, की कोशिश करता है जब यह cache की बात आती है बहुत ही कुशल नहीं हैं - प्रत्येक तलाश O(|S|)रैंडम एक्सेस स्मृति अनुरोध किया गया प्रदर्शन में काफी क्षय के कारण हो सकता की आवश्यकता है।

दोनों दृष्टिकोण मान्य हैं, और मुझे लगता है कि अधिकतम latency (यदि यह वास्तविक समय प्रणाली है), थ्रूपुट, और विकसित करने के लिए समय जैसे दूसरे को चुनते समय कई विचार-विमर्श किए जाने चाहिए।

यदि औसत केस प्रदर्शन सभी महत्वपूर्ण है, तो मैं फ़ाइलों का एक समूह उत्पन्न करने और statistical analysis चलाने का सुझाव देता हूं जो दृष्टिकोण बेहतर है। Wilcoxon हस्ताक्षरित परीक्षण उपयोग में कला परिकल्पना परीक्षण की वास्तविक तथ्य है।


एम्बेडेड सिस्टम के बारे में: दोनों दृष्टिकोण अभी भी मान्य हैं, लेकिन यहाँ में: प्रत्येक "नोड" (या नोड्स के गुच्छा) trie में डिस्क पर नहीं बल्कि उसके बाद राम पर होगा। ध्यान दें कि इसका अर्थ है ट्राई ओ (| एस |) यादृच्छिक पहुंच डिस्क प्रति प्रविष्टि प्रति प्रविष्टि चाहता है, जो धीमा हो सकता है।

हैशिंग समाधान के लिए, आपके पास 10 एमबी है, मान लीजिए कि वे डिस्क में पॉइंटर्स की हैश तालिका के लिए इनमें से 5 एमबी का उपयोग कर सकते हैं।आइए यह भी मान लें कि आप इन 5 एमबी (यहां निराशावादी विश्लेषण) पर 500 अलग-अलग डिस्क पतों को स्टोर कर सकते हैं, इसका मतलब है कि आपके पास प्रत्येक हैश की तलाश के बाद बाल्टी लोड करने के लिए 5 एमबी शेष है, और यदि आपके पास 0.5 बाल्टी के साथ 500 बाल्टी हैं, तो इसका मतलब है आप 500 * 5 एमबी * 0.5 ~ = 1.25 जीबी> डेटा का 1 जीबी स्टोर कर सकते हैं, इस प्रकार हैश टेबल समाधान का उपयोग कर रहे हैं, इसलिए हैशिंग का उपयोग करके - प्रत्येक खोज को केवल O(1)यादृच्छिक डिस्क की तलाश में बाल्टी खोजने के लिए प्रासंगिक स्ट्रिंग

ध्यान दें कि यदि यह अभी भी पर्याप्त नहीं है, तो हम पॉइंटर्स टेबल को रीहाश कर सकते हैं, वर्चुअल मेमोरी मैकेनिज्म में paging table में क्या किया जा रहा है।

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


पुनश्च, radix tree आमतौर पर तेजी से और अधिक कॉम्पैक्ट तो trie है, लेकिन (बेशक, हालांकि कम महत्वपूर्ण) टेबल हैश करने के लिए की तुलना trie का एक ही साइड इफेक्ट से ग्रस्त है।

+0

इसलिए असीमित स्मृति के मामले में, आप कहते हैं कि त्रिभुज बनाम हैश मामला निर्भर है? यदि हां, तो कौन सा मामला डेटा संरचना को बेहतर बनाता है? दूसरे मामले में, क्या त्रिभुज या हैश की बजाय समस्या से संपर्क करने का एक बेहतर तरीका है? – user1921187

+1

@ user1921187: यहां कुछ उदाहरण दिए गए हैं: यदि आपके सिस्टम में उदाहरण के लिए बहुत खराब हैश तंत्र है, या कोई कैश नहीं है - कोशिशों का "नकारात्मक" अब प्रासंगिक नहीं है - इसका उपयोग करें।अन्य उदाहरण - यदि आपके पास प्रति प्रश्न सख्त समय सीमा है - तो आप क्वाड्रिक समय के लिए हैश समाधान क्षय की कम संभावना को बर्दाश्त नहीं कर सकते हैं, और आप ट्राई चुन सकते हैं, भले ही यह औसत मामले पर धीमा हो। इसके अलावा, कुछ हैश टेबल की पेशकश करने की कोशिश नहीं करता है - ऑर्डर करें। यदि आवश्यक हो तो कोशिश करने के लिए आप आसानी से पुन: प्रयास कर सकते हैं, और उपसर्ग खोज प्रयासों के साथ भी बहुत आसान है, लेकिन मुझे नहीं लगता कि यह एक मुद्दा है। – amit

+0

@ user1921187: दूसरे मामले (एम्बेडेड सिस्टम) के संबंध में - विकल्प क्रमबद्ध और पुनरावृत्ति है। हालांकि, आमतौर पर इसे अधिक डिस्क की आवश्यकता होती है (मुझे लगता है कि ~ * 2 और डिस्क की तलाश है, लेकिन अगर यह एक मुद्दा है तो मैं गलत हो सकता हूं, मैं बाद में गणित कर सकता हूं) फिर हैशिंग समाधान। चूंकि इस परिदृश्य में डिस्क आईओ बाधा है, इसका मतलब है कि सॉर्ट और इटेटेट ~ * 2 और समय का उपभोग करेगा – amit

0

क्या आप मध्यवर्ती परिणामों को स्टोर करने के लिए ड्राइव करते हैं? यदि सही है:

आपके पास कुछ मेटा संरचना हो सकती है। और हेथेटेबल का एक सेट। आप डेटा का एक हिस्सा पढ़ते हैं (जबकि आपके आकार हैश < 3 एमबी) और हैशटेबल भरें। जबकि आकार> 3 एमबी आप डिस्क पर सहेजते हैं। यदि आप हैशटेबल का 10 एमबी आकार सीमित है तो 3 एमबी (उदाहरण के लिए) है।

मेटा आपके हैशटेबल्स का वर्णन करें। मेटा में आप इस हैश में अद्वितीय शब्द और सभी शब्दों की गिनती और एक दुनिया की अधिकतम गिनती की संख्या संग्रहीत कर सकते हैं !!! मैं

इसके बाद। आप डिस्क से हैशटेबल लोड कर सकते हैं और विलय कर सकते हैं।

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

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