@ ब्लिंडी के बारे में वार्तालाप दृष्टिकोण है कि जावा pow
लागू करने में सक्षम हो सकता है।
सबसे पहले, सामान्य मामला गुणा दोहराया नहीं जा सकता है। यह सामान्य मामले के लिए काम नहीं करेगा जहां एक्सपोनेंट एक पूर्णांक नहीं है। (! pow
के लिए हस्ताक्षर Math.pow(double, double)
है)
OpenJDK 8 codebase में, pow
के लिए मूल कोड कार्यान्वयन को दो तरह से काम कर सकते हैं:
e_pow.c
में पहली कार्यान्वयन घात श्रृंखला का उपयोग करता है। दृष्टिकोण सी टिप्पणी में वर्णित इस प्रकार है:
* Method: Let x = 2 * (1+f)
* 1. Compute and return log2(x) in two pieces:
* log2(x) = w1 + w2,
* where w1 has 53-24 = 29 bit trailing zeros.
* 2. Perform y*log2(x) = n+y' by simulating multi-precision
* arithmetic, where |y'|<=0.5.
* 3. Return x**y = 2**n*exp(y'*log2)
दूसरा कार्यान्वयन w_pow.c
में मानक सी पुस्तकालय द्वारा प्रदान की pow
समारोह के लिए एक आवरण है। रैपर किनारे के मामलों से संबंधित है।
अब यह संभव है कि मानक सी लाइब्रेरी CPU विशिष्ट गणित निर्देशों का उपयोग करे। यदि ऐसा हुआ, और जेडीके बिल्ड (या रनटाइम) ने दूसरा कार्यान्वयन चुना, तो जावा उन निर्देशों का भी उपयोग करेगा।
लेकिन किसी भी तरह से, मैं किसी भी विशेष केस कोड का कोई निशान नहीं देख सकता जो बार-बार गुणा का उपयोग करता है। आप सुरक्षित रूप से मान सकते हैं कि यह O(1)
है।
1 - मैं कैसे जब चयन है/बनाया जा सकता है में delved नहीं किया है।
स्रोत
2015-09-06 01:20:08
यदि आप केवल पूर्णांक शक्तियां चाहते हैं, तो अपना स्वयं का पावर फ़ंक्शन लिखना बेहतर है। चूंकि एक int में फिट होने वाली 10 की केवल कुछ शक्तियां हैं, बस एक लुकअप टेबल का उपयोग करें और आप ओ (1) –
@ LưuVĩnhPhúc के साथ अच्छे हैं, लेकिन इसका मतलब है कि आप^बी के लिए बी ऑपरेशन करते हैं। है न?। मूल प्रश्न में, यदि सरणी लंबाई n है, तो सरणी की श्रेणी 0 और n के बीच है, और अधिकतम कम से कम n-1 है। इस प्रकार उपरोक्त कोड में जटिलता ओ (एन^2) होगी? –
मैंने कहां कहा था कि आप शक्तियों के लिए तत्परता से करते हैं? मैंने जो कहा वह एक [लुकअप टेबल] है (https://en.wikipedia.org/wiki/Lookup_table) जैसे 'int pow10 [] = {1, 10, 100, 1000, ... 1000000000};' और प्राप्त करने के लिए 'Math.pow (10, i) 'बस' pow10 [i]' का उपयोग करें। भले ही आप मैन्युअल रूप से गुणा करते हैं, आपको केवल ओ (लॉग एन) की आवश्यकता होती है [स्क्वायरिंग द्वारा एक्सपोनेंटिएशन] (https: //en.wikipedia।संगठन/विकी/Exponentiation_by_squaring) ([एक पूर्णांक आधारित पावर फ़ंक्शन पाउ (int, int) को लागू करने का सबसे प्रभावी तरीका] (http://stackoverflow.com/q/101439/995714)), ओ (एन) ऐसा करने की तरह नहीं यह iteratively –