2010-10-09 22 views
5

एक फ़ाइल में बड़ी संख्या में (उदाहरण के लिए 10 बिलियन) स्ट्रिंग हैं और आपको डुप्लिकेट स्ट्रिंग्स खोजने की आवश्यकता है। आपके पास एन सिस्टम उपलब्ध हैं। आपको डुप्लिकेटबड़ी फ़ाइल में डुप्लिकेट स्ट्रिंग खोजें

+1

क्या यह होमवर्क है? यह होमवर्क की तरह लगता है। – SoapBox

उत्तर

4

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

+0

भाग को एकल स्ट्रीम में मर्ज करने के लिए, आपको स्मृति में सभी रिकॉर्ड लोड करना होगा। 1 मिलियन रिकॉर्ड फ़ाइल के लिए, उपरोक्त एल्गोरिदम में अंतिम विलय चरण पर सभी 1 मिल रिकॉर्ड रिकॉर्ड में होना चाहिए? यदि हां, तो वह उद्देश्य को हरा देता है। –

+0

@AndyDufresne "एकल स्ट्रीम में भाग को मर्ज करने के लिए, आपको स्मृति में सभी रिकॉर्ड लोड करना होगा।" नहीं, आप नहीं करेंगे। उन्हें तुलना करने के लिए, आपको प्रत्येक खंड से एक बार में अगली स्ट्रिंग को लोड करने के लिए पर्याप्त स्मृति की आवश्यकता होती है। एक बार तुलना करने के बाद, अगली स्ट्रिंग उस मेमोरी स्पेस पर कब्जा कर लेगी। – erickson

+0

मुझे आपके मर्ज एल्गोरिदम को समझ में नहीं आया। मान लें कि हमारे पास 1 मिलियन रिकॉर्ड फ़ाइल है और स्मृति में केवल 5k रिकॉर्ड लोड किए जा सकते हैं। जो मैंने समझा, उससे मुझे पहले एनके टुकड़ों में फाइल को 5 के रिकॉर्ड के साथ विभाजित करने की आवश्यकता है। फिर प्रत्येक 5k रिकॉर्ड फ़ाइलों में सभी रिकॉर्ड सॉर्ट करें और वापस लिखें। दो 5k रिकॉर्ड फ़ाइलों को मर्ज करने के लिए, मुझे मेमोरी में 10k रिकॉर्ड लोड करना होगा? यदि यह आपके लिए नहीं है, तो क्या आप केवल 1k रिकॉर्ड लोड करने की स्मृति सीमा के साथ 1 मिल रिकॉर्ड फ़ाइल में डुप्लिकेट रिकॉर्ड खोजने के चरणों को समझा सकते हैं। –

8

एरिक्सन का जवाब शायद इस प्रश्न को सेट करने वाले किसी भी व्यक्ति द्वारा अपेक्षित है।

आप एक hashtable में एक बाल्टी के रूप में एन मशीनों में से प्रत्येक के इस्तेमाल कर सकते हैं: प्रत्येक स्ट्रिंग के लिए

  • , (जैसे कि स्ट्रिंग संख्या मैं अनुक्रम में) एक हैश समारोह उस पर गणना, ज।
  • स्टोरेज के लिए मशीन नंबर एन के लिए i और h के मानों को भेजें, जहां n = h% N.
  • प्रत्येक मशीन से, सभी हैश मानों की एक सूची पुनर्प्राप्त करें जिसके लिए एक से अधिक अनुक्रमणिका प्राप्त हुईं, साथ में इंडेक्स की सूची के साथ।
  • समान हैश मानों के साथ तारों के सेट की जांच करें, यह देखने के लिए कि वे वास्तव में बराबर हैं या नहीं।

ईमानदार होने के लिए, हालांकि, 10 अरब तारों के लिए आप संभवतः 1 पीसी पर ऐसा कर सकते हैं। सटीक हैशटेबल कार्यान्वयन के आधार पर हैशटेबल 32 बिट हैश के साथ 80-120 जीबी की तरह कुछ पर कब्जा कर सकता है। यदि आप एक कुशल समाधान की तलाश में हैं, तो आपको "मशीन" से थोड़ा सा विशिष्ट होना चाहिए, क्योंकि यह निर्भर करता है कि प्रत्येक के पास कितना संग्रहण है, और नेटवर्क संचार की सापेक्ष लागत।

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