बिग ओ: अपर बाउंड
"बिग ओ" ( ) अब तक का सबसे आम है। जब आप एक एल्गोरिथ्म की जटिलता का विश्लेषण करते हैं, तो अधिकांश समय, यह मायने रखता है कि इनपुट के आकार बढ़ने पर रन टाइम कितना बढ़ता है, इस पर कुछ ऊपरी बाध्यता है। मूल रूप से हम यह जानना चाहते हैं कि एल्गोरिथ्म को चलाने के लिए "बहुत लंबा" नहीं है। हम इसे वास्तविक समय इकाइयों (सेकंड) में व्यक्त नहीं कर सकते, क्योंकि यह सटीक कार्यान्वयन पर निर्भर करेगा (जिस तरह से प्रोग्राम लिखा गया है, कंपाइलर कितना अच्छा है, मशीन का प्रोसेसर कितना तेज़ है ...)। इसलिए हम मूल्यांकन करते हैं कि ऐसे विवरणों पर क्या निर्भर नहीं करता है, जो कि एल्गोरिथ्म को चलाने में कितना समय लगता है जब हम इसे बड़ा इनपुट देते हैं। और हम मुख्य रूप से परवाह करते हैं जब हम यह सुनिश्चित कर सकते हैं कि कार्यक्रम किया जाता है, इसलिए हम आम तौर पर जानना चाहते हैं कि इस तरह की-और इस तरह की मात्रा में समय लगेगा या कम।O
यह कहने के लिए कि एल्गोरिथ्म में इनपुट आकार लिए का रन टाइम है, इसका मतलब है कि कुछ निरंतर मौजूद है जैसे कि एल्गोरिथ्म सबसे चरणों में पूरा होता है, अर्थात रनिंग टाइम एल्गोरिथ्म रूप में उपवास के रूप में तेजी से बढ़ता है (एक स्केलिंग कारक तक)। नोटिंग इनपुट आकार , के लिए एल्गोरिदम का रन समय अनौपचारिक रूप से इसका मतलब है कि कुछ स्केलिंग कारक तक।n K KO(f(n))nKच टी ( एन ) एन हे ( एन ) टी ( एन ) ≤ च ( एन )Kf(n)fT(n)nO(n)T(n)≤f(n)
निम्न परिबंध
कभी-कभी, ऊपरी सीमा से अधिक जानकारी होना उपयोगी होता है। का काव्य है : यह व्यक्त करता है कि एक फंक्शन कम से कम उतनी ही तेजी से बढ़ता है। अर्थ है कि कुछ स्थिर , या इसे अनौपचारिक रूप से डालने के लिए, up कुछ स्केलिंग कारक के लिए।ΩOT(n)=Ω(g(n))T(N)≥K′g(n)K′T(n)≥g(n)
जब एल्गोरिथ्म के चलने का समय ठीक से निर्धारित किया जा सकता है, तो और को जोड़ता है : यह व्यक्त करता है कि एक फ़ंक्शन के विकास की दर एक स्केलिंग कारक तक ज्ञात है। अर्थ है कि कुछ स्थिरांक और । अनौपचारिक रूप से, कुछ स्केलिंग कारक तक ।ΘOΩT(n)=Θ(h(n))Kh(n)≥T(n)≥K′h(n)KK′T(n)≈h(n)
आगे के विचार
"छोटे" और का उपयोग जटिलता विश्लेषण में बहुत कम बार किया जाता है। लिटिल बड़ा तुलना में मजबूत है ; जहाँ एक ऐसी वृद्धि को इंगित करता है जो तेज़ नहीं है, इंगित करता है कि विकास सख्ती से धीमा है। इसके विपरीत, सख्ती से तेज विकास को इंगित करता है।oωoOOoω
मैं ऊपर चर्चा में थोड़ा अनौपचारिक रहा हूं। विकिपीडिया की औपचारिक परिभाषाएँ और अधिक गणितीय दृष्टिकोण है।
ध्यान रखें कि और समान में समान चिह्न का उपयोग एक मिथ्या नाम है। सख्ती से बोलना, चर के कार्यों का एक समूह है , और हमें लिखना चाहिए ।T(n)=O(f(n))O(f(n))nT∈O(f)
उदाहरण: कुछ सॉर्टिंग एल्गोरिदम
जैसा कि यह सूखा है, मैं एक उदाहरण देता हूं। अधिकांश सॉर्टिंग एल्गोरिदम में द्विघात सबसे खराब स्थिति होती है, अर्थात आकार इनपुट के लिए , एल्गोरिथम का रन समय । उदाहरण के लिए, चयन प्रकार में रन समय होता है, क्योंकि तत्व का चयन करने लिए कुल तुलनाओं के लिए तुलनाओं की आवश्यकता होती है । वास्तव में, तुलनाओं की संख्या हमेशा होती है, जो रूप में बढ़ती है । इसलिए हम चयन प्रकार की समय जटिलता के बारे में अधिक सटीक हो सकते हैं: यह ।nO(n2)O(n2)kn−kn(n−1)/2n(n−1)/2n2Θ(n2)
अब मर्ज सॉर्ट लें । मर्ज सॉर्ट भी द्विघात ( ) है। यह सच है, लेकिन बहुत सटीक नहीं है। वास्तव में मर्ज सॉर्ट में सबसे खराब स्थिति में का समय चल रहा है । चयन प्रकार की तरह, मर्ज सॉर्ट का कार्य प्रवाह अनिवार्य रूप से इनपुट के आकार से स्वतंत्र होता है, और इसका चलने का समय हमेशा होता है, जो एक स्थिर गुणन कारक तक होता है, अर्थात यह ।O(n2)O(nlg(n))nlg(n)Θ(nlg(n))
अगला, क्विकॉर्ट पर विचार करें । क्विकॉर्ट अधिक जटिल है। यह निश्चित रूप से । इसके अलावा, quicksort की सबसे खराब स्थिति द्विघात है: सबसे खराब स्थिति है । हालांकि, क्विकसॉर्ट का सबसे अच्छा मामला (जब इनपुट पहले से ही सॉर्ट किया गया है) रैखिक है: सबसे अच्छा हम सामान्य रूप से क्विकॉर्ट के लिए कम बाध्यता के लिए कह सकते हैं । मैं यहाँ प्रमाण नहीं दुहराऊँगा, लेकिन क्विकसॉर्ट की औसत जटिलता (इनपुट के सभी संभावित क्रमों पर लिया गया औसत) ।O(n2)Θ(n2)Ω(n)Θ(nlg(n))
सामान्य सेटिंग्स में एल्गोरिदम को सॉर्ट करने की जटिलता पर सामान्य परिणाम हैं। मान लें कि एक सॉर्टिंग एल्गोरिथ्म एक समय में केवल दो तत्वों की तुलना कर सकता है, हां-या-कोई परिणाम नहीं (या तो या )। फिर यह स्पष्ट है कि किसी भी छंटाई एल्गोरिथ्म का चलने का समय हमेशा (जहाँ को क्रमबद्ध करने के लिए तत्वों की संख्या होती है), क्योंकि एल्गोरिथ्म को हर तत्व की तुलना करने के लिए कम से कम एक बार यह जानना होगा कि वह कहाँ फिट होगा। इस निचले बाउंड को पूरा किया जा सकता है, उदाहरण के लिए, यदि इनपुट पहले से ही सॉर्ट किया गया है और एल्गोरिथ्म केवल प्रत्येक तत्व की अगले एक के साथ तुलना करता है और उन्हें क्रम में रखता है (यह तुलना है)। क्या कम स्पष्ट है कि अधिकतम चलने का समय आवश्यक हैx≤yx>yΩ(n)nn−1Ω(nlg(n)) । यह संभव है कि एल्गोरिथ्म कभी-कभी कम तुलना करेगा, लेकिन कुछ निरंतर होना चाहिए जैसे कि किसी भी इनपुट आकार , कम से कम एक इनपुट होता है जिस पर एल्गोरिथ्म तुलना। प्रमाण का विचार एल्गोरिथ्म के निर्णय वृक्ष का निर्माण करना है, अर्थात एल्गोरिथ्म प्रत्येक निर्णयों के परिणाम से होने वाले निर्णयों का पालन करता है। चूँकि प्रत्येक तुलना हाँ-या-नहीं का परिणाम देती है, इसलिए निर्णय वृक्ष एक द्विआधारी वृक्ष है। वहाँइनपुट के संभावित क्रमांकन, और एल्गोरिथ्म को उन सभी के बीच अंतर करने की आवश्यकता है, इसलिए निर्णय पेड़ का आकारKnKnlg(n)n!n!। चूंकि पेड़ एक द्विआधारी पेड़ है, इसलिए इन सभी नोड्स को फिट करने के लिए गहराई लगती है । गहराई एल्गोरिदम को ले जाने वाले निर्णयों की अधिकतम संख्या है, इसलिए एल्गोरिथ्म को चलाने में कम से कम यह कई तुलनाएं शामिल हैं: अधिकतम चलने का समय ।Θ(lg(n!))=Θ(nlg(n))Ω(nlg(n))
¹ या अन्य संसाधन खपत जैसे मेमोरी स्पेस। इस उत्तर में, मैं केवल समय चलाने पर विचार करता हूं।