मेरे मूल कार्य निर्धारित करने के लिए एक नंबर प्रधानमंत्री था:जांच करें कि प्रधानमंत्री बड़े-ओ
bool is_prime(int x) {
for (int y = 2; y < x; ++y) {
if (x % y == 0) {
return false;
}
}
return true;
}
यह O(x)
की जटिलता के साथ भाग गया के रूप में आप x
पर जाने के लिए हो सकता था।
मैंने कुछ अनुकूलन के बारे में सीखा है और मेरे बड़े-ओ पर एक चेक की आवश्यकता है। यहाँ बेहतर कार्यक्रम है:
bool is_prime(int x)
{
if (x % 2 == 0 && x > 2) {
return false;
}
for (int y = 3; y*y <= x; y += 2) {
if (x % y == 0) {
return false;
}
}
return true;
}
तथ्य यह है कि मैं अब तक sqrt()
परिवर्तन को यह O(sqrt(x))
करने जा रहा हूँ करता है?
@ मैट टिमर्मन कंसूर आपके साथ और एंडीजी के सुझाव। मैंने 'x' के साथ फ़ंक्शन लिखा है, इसलिए यह 'x' नहीं होना चाहिए था। – datta
एक और अनुकूलन 'x' के पूर्णांक वर्ग रूट को पूर्व-गणना करना होगा (यानी एक पूर्णांक' एम 'ढूंढें, जैसे कि' एम * एम 'सकारात्मक' x' के लिए 'x-1' और' x' के बीच है) । फ्लोटिंग पॉइंट का उपयोग किये बिना, एक पूर्णांक वर्ग रूट की गणना के लिए कुशल एल्गोरिदम (जटिलता ओ (लॉग (एक्स)) या बेहतर) हैं। – Peter
@ पीटर मैं मूल रूप से फ्लोटिंग पॉइंट रूपांतरण नहीं करता था, लेकिन गणित से पता चला कि 'एम * एम' यहां अपना उद्देश्य प्रदान करेगा। – datta