एक प्रोग्राम (या फ़ंक्शन) लिखें जो चार सामान्य बड़ी ओ समय जटिलताओं को प्रदर्शित करता है कि यह कैसे चलाया जाता है। किसी भी रूप में यह एक सकारात्मक पूर्णांक एन में लेता है जिसे आप मान सकते हैं कि 2 31 से कम है ।
जब कार्यक्रम अपने मूल रूप में चलाया जाता है तो इसमें निरंतर जटिलता होनी चाहिए । यही है, जटिलता Θ (1) या, समकक्ष, 1 (1 ^ एन) होनी चाहिए ।
जब कार्यक्रम को उलट दिया जाता है और इसे चलाया जाता है तो इसमें रैखिक जटिलता होनी चाहिए । यही है, जटिलता Θ (एन) या, समकक्ष, N (एन ^ 1) होनी चाहिए ।
(इसका उल्टाN^1
होता1^N
है।)जब कार्यक्रम को दोगुना कर दिया जाता है , अर्थात स्वयं को सम्मिलित किया जाता है, और इसे चलाने के लिए घातीय जटिलता होनी चाहिए , विशेष रूप से 2 एन । यही है, जटिलता Θ (2 ^ एन) होनी चाहिए ।
(यह समझ में आता है क्योंकि2
अंदर2^N
से दोगुना1
है1^N
।)जब कार्यक्रम को दोगुना और उलट दिया जाता है और इसे चलाया जाता है तो इसमें बहुपद जटिलता होनी चाहिए , विशेष रूप से एन 2 । यही है, जटिलता Θ (एन ^ 2) होनी चाहिए ।
(इसका उल्टाN^2
होता2^N
है।)
ये चार मामले केवल वही हैं जिन्हें आपको संभालने की आवश्यकता है।
ध्यान दें कि अनिश्चितता के लिए मैं बड़े O के बजाय बड़ी थीटा (ation) संकेतन का उपयोग कर रहा हूं क्योंकि आपके कार्यक्रमों के रनटाइम को आवश्यक जटिलताओं से ऊपर और नीचे दोनों से बांधा जाना चाहिए। अन्यथा केवल O (1) में एक फ़ंक्शन लिखने से सभी चार बिंदुओं को पूरा किया जाएगा। यहां बारीकियों को समझना बहुत जरूरी नहीं है। मुख्य रूप से, यदि आपका प्रोग्राम कुछ निरंतर k के लिए k * f (N) संचालन कर रहा है तो यह Θ (f (N)) में होने की संभावना है।
उदाहरण
यदि मूल कार्यक्रम थे
ABCDE
फिर इसे चलाने के लिए निरंतर समय लेना चाहिए। यही है, चाहे इनपुट एन 1 या 2147483647 (2 31 -1) या बीच में कोई मूल्य है, इसे लगभग उसी समय में समाप्त करना चाहिए।
कार्यक्रम का उलटा संस्करण
EDCBA
N के संदर्भ में रैखिक समय लेना चाहिए। अर्थात, समाप्त होने में लगने वाला समय N के समानुपाती रूप से होना चाहिए। इसलिए N = 1 को कम से कम समय लगता है और N = 2147483647 सबसे अधिक लेता है।
कार्यक्रम का दोगुना संस्करण
ABCDEABCDE
एन के संदर्भ में दो-टू-एन समय लेना चाहिए। अर्थात, समाप्त होने में लगने वाला समय लगभग 2 एन के समानुपातिक होना चाहिए । अतः यदि N = 1 लगभग एक सेकंड में समाप्त हो जाता है, तो N = 60 को समाप्त होने में ब्रह्मांड की आयु से अधिक समय लगेगा। (नहीं, आपको इसका परीक्षण करने की आवश्यकता नहीं है।)
कार्यक्रम का दोहरा और उलटा संस्करण
EDCBAEDCBA
N के संदर्भ में चुकता समय लेना चाहिए। अर्थात, समाप्त होने में लगने वाला समय N * N के लगभग आनुपातिक होना चाहिए। इसलिए यदि N = 1 लगभग एक सेकंड में समाप्त हो जाता है, तो N = 60 को समाप्त होने में लगभग एक घंटा लगेगा।
विवरण
आपको यह दिखाने या बहस करने की ज़रूरत है कि आपके कार्यक्रम उन जटिलताओं में चल रहे हैं जो आप कहते हैं कि वे हैं। कुछ समय डेटा देना एक अच्छा विचार है, लेकिन यह भी समझाने की कोशिश करें कि सैद्धांतिक रूप से जटिलता सही क्यों है।
यह ठीक है अगर अभ्यास के समय आपके कार्यक्रम पूरी तरह से उनकी जटिलता (या यहां तक कि नियतात्मक) के प्रतिनिधि नहीं हैं। उदाहरण के लिए इनपुट N + 1 कभी-कभी N की तुलना में तेज़ी से चल सकता है।
जिस वातावरण में आप अपने कार्यक्रम चला रहे हैं वह मायने रखता है। आप इस बारे में बुनियादी धारणा बना सकते हैं कि कैसे लोकप्रिय भाषाएं कभी भी एल्गोरिदम में जानबूझकर समय बर्बाद नहीं करती हैं लेकिन, उदाहरण के लिए, यदि आप तेजी से छँटाई एल्गोरिथ्म के बजाय जावा के अपने विशेष संस्करण को बबल सॉर्ट के रूप में जानते हैं , तो आपको यह ध्यान में रखना चाहिए कि क्या आप कोई छँटाई करते हैं ।
यहां सभी जटिलताओं के लिए हम मानते हैं कि हम सबसे खराब स्थिति के बारे में बात कर रहे हैं , सबसे अच्छा मामला या औसत-मामला नहीं।
कार्यक्रमों की अंतरिक्ष जटिलता मायने नहीं रखती है, केवल समय जटिलता।
कार्यक्रम कुछ भी उत्पादन कर सकते हैं। यह केवल मायने रखता है कि वे सकारात्मक पूर्णांक एन में लेते हैं और सही समय जटिलताएं हैं।
टिप्पणियों और बहुस्तरीय कार्यक्रमों की अनुमति है। (आप मान सकते हैं कि
\r\n
उलट\r\n
विंडोज संगतता के लिए है।)
बिग ओ रिमाइंडर्स
सबसे तेज़ से लेकर सबसे धीमी गति तक O(1), O(N), O(N^2), O(2^N)
(क्रम 1, 2, 4, 3 ऊपर)।
धीमी शर्तें हमेशा हावी रहती हैं, जैसे O(2^N + N^2 + N) = O(2^N)
।
O(k*f(N)) = O(f(N))
निरंतर कश्मीर के लिए। तो O(2) = O(30) = O(1)
और O(2*N) = O(0.1*N) = O(N)
।
याद रखें O(N^2) != O(N^3)
और O(2^N) != O(3^N)
।
स्कोरिंग
यह सामान्य कोड गोल्फ है। बाइट्स जीत में सबसे छोटा मूल कार्यक्रम (लगातार समय एक)।
n = input(); for i in xrange(n): pass
में घातीय जटिलता है, क्योंकि यह 2 ** k
कदम उठाता है, जहां k = log_2(n)
इनपुट आकार है। आपको यह स्पष्ट करना चाहिए कि क्या यह मामला है, क्योंकि यह नाटकीय रूप से आवश्यकताओं को बदलता है।