2013-02-27 186 views
5

का तेज़ विकल्प मेरा प्रोग्राम Math.pow() का उपयोग करता है ताकि अपेक्षाकृत बड़ी डबल संख्या 2 की शक्ति की गणना हो सके। बाद में मुझे बहुत बड़ी डबल की वर्ग रूट खोजने की आवश्यकता है नंबर। समस्या यह है कि, मुझे इसे 100,000 बार करना है और यह वास्तव में लंबा समय ले रहा है। क्या कोई विकल्प है जो इस प्रक्रिया को तेज कर सकता है? धन्यवादजावा - Math.pow() और Math.sqrt()

संपादित करें: बड़ी संख्या में मेरा मतलब 1000 से 10000 के बीच है (तो शायद कंप्यूटिंग शर्तों में इतना बड़ा नहीं है)। और इसे लंबे समय तक लेने में, 500 गुना

+0

आपको 100,000 अद्वितीय संख्याओं के लिए यह वही ऑपरेशन करना है? – Brad

+5

क्या आप "अपेक्षाकृत बड़े", "बहुत बड़े", और "वास्तव में लंबे" को परिभाषित कर सकते हैं? – asteri

+0

http://stackoverflow.com/questions/7902418/the-best-alternative-of-math-pow-in-j2me – Brad

उत्तर

7

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

यदि यह काम नहीं करता है, तो आप इसे अधिक उपयुक्त भाषा में कार्यान्वित करने का प्रयास कर सकते हैं जिसका अर्थ है कि तेजी से गणितीय गणना (मैटलैब की तरह कुछ)।

अन्यथा, आप इसे अन्य क्षेत्रों में अनुकूलित करने का प्रयास कर सकते हैं। शायद आप बाद में उपयोगी होने पर पिछले परिणामों को कैश करने का प्रयास कर सकते हैं।

+0

वैसे इसमें यूक्लिडियन दूरी सूत्र शामिल है, इसलिए मैं इसे – Matt9Atkins

+0

से बच नहीं सकता @ Matt9Atkins क्या आपको वास्तव में यूक्लिडियन दूरी की आवश्यकता है? आप तुलना के लिए अपने वर्ग का उपयोग कर सकते हैं ... –

+0

वैसे भी इस गति को तेज करने के विकल्प अभी भी हैं। क्या आपको वास्तविक दूरी की आवश्यकता है, या आप बस उनकी तुलना कर रहे हैं? यदि आप उनकी तुलना कर रहे हैं, तो आप वर्ग रूट भाग से बच सकते हैं। – Oleksi

8

"2 की शक्ति" वर्गिंग है। आप स्वयं को संख्या गुणा करके ऐसा करने से बेहतर होगा।

sqrt का लाइब्रेरी संस्करण शायद कहीं और खोदने से कहीं अधिक तेज़ है। यदि आप सी सी रूटीन कहते हैं, तो आप क्रॉस-भाषा कॉल से ओवरहेड जोड़ देंगे। लेकिन क्या आपको सटीक वर्ग की जड़ों की आवश्यकता है, या अनुमानों का एक टेबल लुकअप करेगा? क्या मूल्य बहुत दोहराते हैं, यानी आपको अक्सर समान संख्या की जड़ों की गणना करने की आवश्यकता होती है? यदि ऐसा है, तो HashMap में वर्ग जड़ों को कैशिंग करना उन्हें कंप्यूटिंग करने से तेज़ हो सकता है।

1

अच्छी तरह से 2 की शक्ति के साथ आपकी समस्या केवल संख्या को गुणा करके किया जा सकता है। उदाहरण के लिए, मान लीजिए कि चर एक नंबर पर आप 2. को बढ़ाने के लिए चाहते हैं यह वही के रूप में बताया गया है: int a=5; int b=a*a;

0

आप उपयोग कर सकते हैं एक्स * एक्स के बजाय पॉव (एक्स, 2)।

वर्ग रूट के लिए, आपको पहले एसकर्ट कार्यान्वयन (सन्निकटन विधि) पर एक नज़र डालना चाहिए।

शायद आप एक बेहतर खोज सकते हैं, उदाहरण के लिए Newton's method (समीकरण sqrt (एन) -x = 0 पर)।

यह आवश्यक सटीकता पर भी निर्भर करता है, आप सटीकता बनाम समय व्यापार कर सकते हैं।

आप एक ही प्रविष्टियों पर एकाधिक गणना से बचने के लिए परिणाम भी स्टोर कर सकते हैं।

+0

निश्चित रूप से आपका मतलब है कि आप 'पाउ (x, 2)' के बजाय 'x * x' का उपयोग कर सकते हैं। और हाँ, एक्स * एक्स के रूप में इसकी गणना करना निश्चित रूप से बेहतर है। – NovaDenizen

+0

सही, तय ... – fso

1

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