अन्य सभी उत्तर सही हैं, मैं केवल निम्नलिखित संशोधन करना चाहता हूं। मैं देखना चाहता था, अगर आंतरिक के-लूप के निष्पादन में कमी वास्तविक जटिलता को कम करने के लिए पर्याप्त थी, O(n⁴).
तो मैंने निम्नलिखित लिखा:
for (int n = 1; n < 363; ++n) {
int sum = 0;
for(int i = 1; i < n; ++i) {
for(int j = 1; j < i * i; ++j) {
if(j % i == 0) {
for(int k = 0; k < j; ++k) {
sum++;
}
}
}
}
long cubic = (long) Math.pow(n, 3);
long hypCubic = (long) Math.pow(n, 4);
double relative = (double) (sum / (double) hypCubic);
System.out.println("n = " + n + ": iterations = " + sum +
", n³ = " + cubic + ", n⁴ = " + hypCubic + ", rel = " + relative);
}
इसे निष्पादित करने के बाद, यह स्पष्ट हो जाता है, कि वास्तव में जटिलता है n⁴
। आउटपुट की अंतिम लाइनें इस तरह दिखती हैं:
n = 356: iterations = 1989000035, n³ = 45118016, n⁴ = 16062013696, rel = 0.12383254507467704
n = 357: iterations = 2011495675, n³ = 45499293, n⁴ = 16243247601, rel = 0.12383580700180696
n = 358: iterations = 2034181597, n³ = 45882712, n⁴ = 16426010896, rel = 0.12383905075183874
n = 359: iterations = 2057058871, n³ = 46268279, n⁴ = 16610312161, rel = 0.12384227647628734
n = 360: iterations = 2080128570, n³ = 46656000, n⁴ = 16796160000, rel = 0.12384548432498857
n = 361: iterations = 2103391770, n³ = 47045881, n⁴ = 16983563041, rel = 0.12384867444612208
n = 362: iterations = 2126849550, n³ = 47437928, n⁴ = 17172529936, rel = 0.1238518469862343
यह क्या दिखाता है, कि वास्तविक n⁴
और इस कोड सेगमेंट की जटिलता के बीच वास्तविक अंतर एक मूल्य के आस-पास का कारक है 0.124...
(वास्तव में 0.125)। हालांकि यह हमें सही मूल्य नहीं देता है, हम निम्नलिखित कटौती कर सकते हैं:
समय जटिलता वह है n⁴/8 ~ f(n)
जहाँ f
आपका कार्य / विधि है।
- बिग ओ नोटेशन पर विकिपीडिया-पेज 'फैमिली ऑफ बच्चन-लैंडौ नोटेशन' की तालिका में बताता है कि
~
दोनों ऑपरेंड पक्षों की सीमा को बराबर करता है। या:
f, asymptotically g के बराबर है
(मैंने ऊपरी बंधे को छोड़कर 363 को चुना, क्योंकि n = 362
अंतिम मूल्य है जिसके लिए हमें एक समझदार परिणाम मिलता है। उसके बाद, हम लंबे स्थान से अधिक हो जाते हैं और सापेक्ष मूल्य नकारात्मक हो जाता है।)
उपयोगकर्ता kaya3 निम्नलिखित का पता लगाता है:
स्पर्शोन्मुख स्थिरांक वैसे तो 1/8 = 0.125 है; यहाँ वुल्फराम अल्फा के माध्यम से सटीक सूत्र है ।
for (j = i; j < i *i; j += i)
फिर आपको मापांक परीक्षण की आवश्यकता नहीं है (क्योंकिj
विभाज्य होने की गारंटी हैi
)।