2013-04-15 10 views
10

से अधिक आकार की सरणी कैसे बनाएं I 600851475143 से पहले सभी प्राइम्स प्राप्त करने का प्रयास कर रहा था। मैं इसके लिए इरेटोस्टेनेस की चाकू का उपयोग कर रहा था। इसके लिए मुझे उस विशाल आकार की एक बूलियन सरणी बनाने की आवश्यकता है। बुरा विचार, आप स्मृति से बाहर हो सकते हैं। कोई अन्य तरीका। मैंने सही या गलत प्रतिनिधित्व करने के लिए मान1 के साथ प्रत्येक इंडेक्स का उपयोग करके स्ट्रिंग का उपयोग करने का प्रयास किया। लेकिन indexOf विधि भी int देता है।पूर्णांक अधिकतम

अगला मैं अपनी समस्या के लिए 2 डी सरणी का उपयोग कर रहा हूं। ऐसी विशाल सरणी को स्टोर करने का कोई और बेहतर तरीका?

+17

"मैं 600851475143 से पहले सभी प्राइम प्राप्त करने की कोशिश कर रहा था।" उस परियोजना यूलर समस्या के लिए यह पूरी तरह से गलत दृष्टिकोण है। –

+1

आप वेक्टर का उपयोग कर सकते हैं। –

+7

मैं सुझाव दूंगा कि यदि आपके समाधान के लिए आपको 600 बिलियन सरणी प्रविष्टियां बनाने की आवश्यकता है, तो आपको एक नया दृष्टिकोण लेने की आवश्यकता है। – Patashu

उत्तर

0

BitSet का उपयोग करें। फिर आप किसी भी इंडेक्स तत्व को सेट कर सकते हैं। 600851475143 2^39 है इस प्रकार आंतरिक रूप से केवल 39 बिट्स लेते हैं (असल में वास्तव में यह 64 बिट्स पर कब्जा करेगा क्योंकि यह लंबे समय तक उपयोग करता है)।

आप कर सकते हैं 2^63 तक वास्तव में इस कदम का सबसे प्रयोजनों

+3

उन्हें 2^39 बिट्स की आवश्यकता होगी, न कि 39. – assylias

+1

ओपी को 600851475143 बिट फ्लैग की आवश्यकता होती है (या आधे से अधिक संख्याओं को छोड़कर, एक तिहाई अगर 3 के गुणक छोड़ते हैं, तो कुछ छोटे प्राइम के गुणक छोड़ दिए जाने पर कुछ कम होते हैं)। यह अभी भी 'बिट्ससेट' में अनुक्रमित किए जाने से अधिक प्रविष्टियां होगी। –

+0

@assylias हाँ आप सही – Stephan

6

के लिए बड़े पैमाने पर है मैं एक ऐसी ही समस्या थी और मैं एक सा सेट का इस्तेमाल किया (मूल रूप से 1 या 0 के लिए निर्धारित क्रम में ऑफसेट वांछित) और मैं इसे EWAHCompressedBitmap उपयोग करने की अनुशंसा भी अपने बिट

संपादित

सेट के रूप में एलन ने कहा BitSet स्मृति के 70GB को घेरता है सेक होगा लेकिन आप एक और बात कर सकते हैं: ताकि आप निरपेक्ष स्थिति की गणना कर सकते कई BitSets (लगातार लोगों के लिए) और मेमोरी में लोड करें बस बिटकसेट जिसे आपको उस पल में आलसी लोड की तरह कुछ चाहिए, इस मामले में आपके पास इस्तेमाल की गई स्मृति का नियंत्रण होगा।

7

600851475143 बूलियन के लिए स्मृति आवश्यकता सर्वोत्तम 70 जीबी है। यह व्यवहार्य नहीं है। स्टीफन द्वारा सुझाए गए अनुसार आपको संपीड़न का उपयोग करने की आवश्यकता है, या प्राइम्स की गणना के लिए एक अलग एल्गोरिदम खोजना होगा।

+7

यह व्यवहार्य है, लेकिन शायद यथार्थवादी नहीं है! – assylias

+0

खैर, मुझे शायद यह स्पष्ट करना चाहिए कि संभव होने पर, यह गंभीर रूप से highend कंप्यूटर (या संभवतः सुपरकंप्यूटर) से कम कुछ भी के साथ व्यवहार्य (उर्फ व्यावहारिक) नहीं है। – Alan

+0

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

2

यह प्रत्येक नंबर के लिए याद रखना वास्तव में व्यावहारिक नहीं है यदि यह एक प्रमुख था या इतनी बड़ी राशि के लिए नहीं (चलनी सामान्य रूप से बड़ी संख्या में धीमी गति है)।

इस link से आप एक विचार है कि कितने अभाज्य संख्या वहाँ एक्स की तुलना में छोटे उम्मीद की जा करने के लिए अपने 600 बिलियन रेंज आप मोटे तौर पर 20 अरब का अभाज्य उस सीमा के भीतर मौजूद हैं की उम्मीद कर सकते हैं के लिए मिलता है। उन्हें लंबे समय तक भंडारित करना [] को लगभग 160 जीबी मेमोरी की आवश्यकता होगी ... जो कि प्रत्येक संख्या के लिए एक बिट को स्टोर करने के लिए सुझाए गए 70 जीबी से अधिक है, आधा अगर आप संख्याओं को भी बाहर करते हैं (2 केवल एकमात्र प्रधान है)।

डेस्कटॉप कंप्यूटर के लिए 35 जीबी मेमोरी में थोड़ा सा हो सकता है, लेकिन एक अच्छा वर्कस्टेशन में इतना रैम हो सकता है। मैं थोड़ा स्थानांतरण/मास्किंग के साथ एक द्वि-आयामी सरणी कोशिश करता हूँ।

मैं अब भी आपके चलनी कोड को चलाने के लिए समय (कुछ दिनों से कुछ) चलाने की अपेक्षा करता हूं। मेरा सुझाव है कि आप चलनी की तुलना में अधिक उन्नत प्राइम डिटेक्शन विधियों की जांच करें।

1

आप हॉटस्पॉट के आंतरिक sun.misc.Unsafe API का उपयोग बड़े सरणी को आवंटित करने के लिए कर सकते हैं। I wrote a blogpost how to simulate an array with it हालांकि, यह एक आधिकारिक जावा एपीआई नहीं है, इसलिए यह एक हैक के रूप में योग्यता प्राप्त करता है।

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