पहले समझते हैं कि बड़े ओ, बड़े थेटा और बड़े ओमेगा क्या हैं। वे सभी कार्यों के सेट हैं।
बिग ओ ऊपरी असममित बाउंड दे रहा है , जबकि बड़ा ओमेगा कम बाउंड दे रहा है। बिग थीटा दोनों देता है।
सब कुछ जो है Ө(f(n))
भी O(f(n))
, लेकिन दूसरे तरीके से नहीं।
T(n)
कहा जाता है कि Ө(f(n))
अगर यह दोनों में O(f(n))
और अंदर है Omega(f(n))
।
सेट शब्दावली में, Ө(f(n))
का चौराहा है O(f(n))
औरOmega(f(n))
उदाहरण के लिए, मर्ज सॉर्ट सबसे खराब स्थिति दोनों है O(n*log(n))
और Omega(n*log(n))
- और इस तरह से भी है Ө(n*log(n))
, लेकिन यह भी है O(n^2)
, क्योंकि n^2
यह स्पर्शोन्मुख रूप से "बड़ा" है। हालाँकि, यह नहीं है Ө(n^2)
, क्योंकि एल्गोरिथ्म नहीं है Omega(n^2)
।
थोड़ा गहरा गणितीय व्याख्या
O(n)
स्पर्शोन्मुख ऊपरी बाध्य है। यदि T(n)
है O(f(n))
, तो इसका मतलब है कि एक निश्चित से n0
, एक स्थिर C
ऐसा है T(n) <= C * f(n)
। दूसरी ओर, बड़े-ओमेगा कहते हैं कि एक निरंतर C2
ऐसा है T(n) >= C2 * f(n))
)।
असमंजस में मत डालो!
सबसे खराब, सबसे अच्छे और औसत मामलों के विश्लेषण के साथ भ्रमित होने की नहीं: सभी तीन (ओमेगा, हे, थीटा) संकेतन एल्गोरिदम के सबसे अच्छे, सबसे खराब और औसत मामलों के विश्लेषण से संबंधित नहीं हैं । इनमें से प्रत्येक को प्रत्येक विश्लेषण पर लागू किया जा सकता है।
हम आमतौर पर एल्गोरिदम की जटिलता का विश्लेषण करने के लिए इसका उपयोग करते हैं (जैसे ऊपर मर्ज सॉर्ट उदाहरण)। जब हम कहते हैं कि "एल्गोरिथम ए O(f(n))
" है, तो हमारा वास्तव में मतलब है "सबसे खराब 1 केस विश्लेषण के तहत एल्गोरिदम की जटिलता है O(f(n))
" - अर्थ - यह "समान" (या औपचारिक रूप से, इससे भी बदतर नहीं) फ़ंक्शन को मापता है f(n)
।
हम एक एल्गोरिथ्म के असममित रूप से क्यों देखभाल करते हैं?
वैसे, इसके कई कारण हैं, लेकिन मेरा मानना है कि उनमें से सबसे महत्वपूर्ण हैं:
- सटीक जटिलता फ़ंक्शन को निर्धारित करना बहुत कठिन है , इस प्रकार हम बड़े-ओ / बड़े-थीटा नोटेशन पर "समझौता" करते हैं, जो कि सैद्धांतिक रूप से पर्याप्त जानकारीपूर्ण हैं।
- ऑप्स की सही संख्या भी प्लेटफॉर्म पर निर्भर है । उदाहरण के लिए, यदि हमारे पास 16 नंबरों की एक वेक्टर (सूची) है। कितना ऑप्स लगेगा? उत्तर है, यह निर्भर करता है। कुछ सीपीयू वेक्टर परिवर्धन की अनुमति देते हैं, जबकि अन्य नहीं करते हैं, इसलिए उत्तर अलग-अलग कार्यान्वयन और विभिन्न मशीनों के बीच भिन्न होता है, जो एक अवांछित संपत्ति है। बिग-ओ नोटेशन हालांकि मशीनों और कार्यान्वयन के बीच बहुत अधिक स्थिर है।
इस समस्या को प्रदर्शित करने के लिए, निम्नलिखित ग्राफ़ पर एक नज़र डालें:
यह स्पष्ट है कि f(n) = 2*n
"इससे भी बदतर" है f(n) = n
। लेकिन यह अंतर उतना भी कठोर नहीं है जितना कि यह दूसरे कार्य से है। हम देख सकते हैं कि f(n)=logn
अन्य कार्यों की तुलना में बहुत कम हो रही है, और f(n) = n^2
दूसरों की तुलना में बहुत अधिक हो रही है।
इसलिए - उपरोक्त कारणों के कारण, हम स्थिर कारकों (रेखांकन उदाहरण में 2 *) को "अनदेखा" करते हैं, और केवल बड़े-ओ संकेतन लेते हैं।
उपरोक्त उदाहरण में, f(n)=n, f(n)=2*n
दोनों में O(n)
और Omega(n)
- में होगा और इस तरह से भी रहेगा Theta(n)
।
दूसरी ओर - में f(n)=logn
होगा O(n)
(यह "से बेहतर" है f(n)=n
), लेकिन इसमें नहीं होगा Omega(n)
- और इस तरह से भी नहीं होगा Theta(n)
।
सांकेतिक रूप से, में f(n)=n^2
होगा Omega(n)
, लेकिन अंदर नहीं है O(n)
, और इस प्रकार भी नहीं है Theta(n)
।
1 आमतौर पर, हालांकि हमेशा नहीं। जब विश्लेषण वर्ग (सबसे खराब, औसत और सबसे अच्छा) गायब है, तो हम वास्तव में सबसे खराब स्थिति का मतलब है।