परिचय
प्रोग्रामिंग सीखते समय, एल्गोरिदम की दक्षता को समझना बहुत महत्वपूर्ण है। इसमें ** जटिलता ** (Complexity) की अवधारणा हमेशा सामने आती है। इस लेख में, हम समय जटिलता और स्थान जटिलता की मूल बातों से लेकर, O नोटेशन (Big O Notation) की विस्तृत व्याख्या और उदाहरणों के साथ गहरी समझ तक, लगभग 20,000 वर्णों में गहराई से चर्चा करेंगे।
जटिलता क्या है
एल्गोरिदम के प्रदर्शन का मूल्यांकन करने के लिए जटिलता एक मीट्रिक है। जटिलता को मुख्य रूप से निम्नलिखित 2 भागों में विभाजित किया जा सकता है।
- ** समय जटिलता ** (Time Complexity)
- ** स्थान जटिलता ** (Space Complexity)
1. समय जटिलता
समय जटिलता एक मीट्रिक है जो एल्गोरिदम को पूरा होने में लगने वाले “समय” या “चरणों की संख्या” को दर्शाती है।
2. स्थान जटिलता
स्थान जटिलता एक मीट्रिक है जो एल्गोरिदम को पूरा होने में लगने वाले “मेमोरी स्थान” को दर्शाती है।
O नोटेशन (बिग ओ नोटेशन) क्या है
O नोटेशन (Big O Notation) एक गणितीय नोटेशन है जो इनपुट आकार $n$ के पर्याप्त रूप से बड़ा होने पर जटिलता में वृद्धि दर की ऊपरी सीमा को दर्शाता है।
$$ O(f(n)) = \{ g(n) \mid \text{कुछ धनात्मक स्थिरांक } c, n_0 \text{ मौजूद हैं, और सभी } n \ge n_0 \text{ के लिए } 0 \le g(n) \le c f(n) \text{ को पूरा करते हैं} \} $$O नोटेशन के मूल नियम
- ** स्थिरांक पदों को अनदेखा करना ** : $O(2n)$, $O(n)$ हो जाता है।
- ** केवल सबसे प्रभावशाली पद को रखना ** : $O(n^2 + n)$, $O(n^2)$ हो जाता है।
graph TD
A["इनपुट आकार n"] -->|"मूल्यांकन"| B["O नोटेशन"]
B --> C["समय जटिलता"]
B --> D["स्थान जटिलता"]
विशिष्ट समय जटिलताएं और Python के साथ उदाहरण
यहां से, आइए विशिष्ट O नोटेशन वर्गों के बारे में विस्तृत व्याख्या और Python कोड उदाहरण देखें।
1. O(1) : निरंतर समय (Constant Time)
यह एक ऐसा एल्गोरिदम है जो इनपुट आकार $n$ की परवाह किए बिना हमेशा एक निश्चित संख्या में चरणों में पूरा होता है।
| |
2. O(log n) : लघुगणकीय समय (Logarithmic Time)
जैसे-जैसे इनपुट आकार $n$ बढ़ता है, निष्पादन का समय भी बढ़ता है, लेकिन वृद्धि की दर बहुत धीमी होती है। इसका एक विशिष्ट उदाहरण बाइनरी सर्च है।
| |
3. O(n) : रैखिक समय (Linear Time)
यह एक एल्गोरिदम है जिसमें निष्पादन का समय इनपुट आकार $n$ के अनुपात में बढ़ता है।
| |
4. O(n log n) : अर्ध-रैखिक समय (Linearithmic Time)
यह O(n) और O(log n) का गुणनफल है। कई कुशल तुलनात्मक छँटाई एल्गोरिदम (मर्ज सॉर्ट, क्विक सॉर्ट, हीप सॉर्ट आदि) में यह जटिलता होती है।
| |
5. O(n^2) : द्विघाती समय (Quadratic Time)
निष्पादन का समय इनपुट आकार $n$ के वर्ग के अनुपात में बढ़ता है। बबल सॉर्ट और इंसर्शन सॉर्ट जैसे सरल छँटाई एल्गोरिदम इसके अंतर्गत आते हैं।
| |
6. O(2^n) : घातांकीय समय (Exponential Time)
प्रत्येक बार जब इनपुट आकार $n$ 1 से बढ़ता है, तो निष्पादन का समय दोगुना हो जाता है। फाइबोनैचि अनुक्रम का सरल पुनरावर्ती कार्यान्वयन इसके अंतर्गत आता है।
| |
7. O(n!) : फैक्टोरियल समय (Factorial Time)
निष्पादन का समय इनपुट आकार के फैक्टोरियल के अनुपात में बढ़ता है। ट्रैवलिंग सेल्समैन समस्या की संपूर्ण खोज (ब्रूट फोर्स) इसके अंतर्गत आती है।
| |
डेटा संरचनाएं और जटिलता
| डेटा संरचना | एक्सेस | खोज | इन्सर्ट | डिलीट | स्थान जटिलता |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
छँटाई एल्गोरिदम और जटिलता
| एल्गोरिदम | सबसे अच्छा | औसत | सबसे खराब | स्थान जटिलता |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
