बिग ओ समय जटिलता का निर्धारण करने के लिए ऑनलाइन जावास्क्रिप्ट विश्लेषक
बिग ओ नोटेशन कंप्यूटर विज्ञान में एक मौलिक अवधारणा है जिसका उपयोग किसी एल्गोरिथम की दक्षता या जटिलता का वर्णन करने के लिए किया जाता है। यह इनपुट आकार बढ़ने पर एल्गोरिथम के संसाधन उपयोग (आमतौर पर समय या स्थान) की विकास दर पर एक ऊपरी सीमा प्रदान करता है। महत्वपूर्ण रूप से, बिग ओ संसाधन उपयोग का प्रतिनिधित्व करने वाले फ़ंक्शन के प्रमुख शब्द पर ध्यान केंद्रित करता है और स्थिर कारकों और निचले क्रम के शब्दों को अनदेखा करता है। इसका मतलब है कि हम इस बात में रुचि रखते हैं कि एल्गोरिथम बड़े इनपुट के साथ कैसे स्केल करता है, न कि किसी विशिष्ट मशीन पर इसके सटीक निष्पादन समय में।
यहाँ सामान्य बिग ओ जटिलताओं की एक सूची दी गई है, जो सबसे अधिक से कम कुशल तक क्रमबद्ध हैं:
यहाँ एक कोड स्निपेट के बिग ओ नोटेशन को निर्धारित करने के लिए चरण-दर-चरण दृष्टिकोण दिया गया है:
इनपुट की पहचान करें: निर्धारित करें कि "इनपुट आकार" (आमतौर पर 'n' द्वारा दर्शाया जाता है) क्या होता है। यह किसी सरणी में तत्वों की संख्या, स्ट्रिंग की लंबाई, डेटा संरचना का आकार आदि हो सकता है।
विश्लेषण लूप:
पुनरावर्ती कॉल: पुनरावर्ती फ़ंक्शन की जटिलता पुनरावर्ती कॉल की संख्या और प्रत्येक कॉल में किए गए कार्य पर निर्भर करती है। मास्टर प्रमेय जैसी तकनीकें पुनरावर्ती कार्यों का विश्लेषण करने में मदद कर सकती हैं। सरल पुनरावर्ती कार्य घातांकीय (O(2ⁿ)) या फैक्टोरियल (O(n!)) भी हो सकते हैं।
अन्य फ़ंक्शन कॉल: यदि आपका कोड अन्य फ़ंक्शन कॉल करता है, तो आपको उनकी बिग O जटिलताओं पर विचार करने की आवश्यकता है। यदि आप O(n) लूप के अंदर O(n²) फ़ंक्शन को कॉल करते हैं, तो समग्र जटिलता O(n³) हो जाती है।
स्थिरांक हटाएँ: स्थिरांक कारकों को अनदेखा करें। O(2n) और O(n) दोनों को O(n) माना जाता है। बिग O विकास दर के बारे में है, सटीक समय के बारे में नहीं।
निम्न-क्रम शब्द हटाएँ: केवल प्रमुख शब्द रखें। उदाहरण के लिए, O(n² + n) को O(n²) में सरलीकृत किया जाता है, क्योंकि n² n की तुलना में बहुत तेज़ी से बढ़ता है।
सर्वश्रेष्ठ, औसत और सबसे खराब स्थिति:
आइए कुछ कोड स्निपेट का विश्लेषण करें:
उदाहरण 1: ऐरे एलिमेंट तक पहुँचना
function getElement(arr, index) {
return arr[index];
}
arr और index। सरणी का आकार (arr.length) इनपुट आकार 'n' है।उदाहरण 2: रैखिक खोज
function linearSearch(arr, target) {
for (let i = 0; i < arr.length; i++) {
if (arr[i] === target) {
return i;
}
}
return -1;
}
arr और target। सरणी का आकार (arr.length) 'n' है।उदाहरण 3: नेस्टेड लूप्स (बबल सॉर्ट)
function bubbleSort(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// तत्वों को स्वैप करें
let temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
arr. सरणी (arr.length) का आकार 'n' है.उदाहरण 4: बाइनरी सर्च
function binarySearch(arr, target) {
let left = 0;
let right = arr.length - 1;
while (left <= right) {
let mid = Math.floor((left + right) / 2);
if (arr[mid] === target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
arr और target. ऐरे का आकार (arr.length) 'n' है.while लूप के प्रत्येक पुनरावृत्ति में, हम प्रभावी रूप से खोज स्थान को आधा कर देते हैं. यह आधा करना तब तक जारी रहता है जब तक कि लक्ष्य नहीं मिल जाता या खोज स्थान खाली नहीं हो जाता. हम जितनी बार 'n' को आधा कर सकते हैं वह log₂(n) (लॉगरिदम बेस 2) है.उदाहरण 5: रिकर्सिव फाइबोनैचि (नाइव)
function fibonacci(n) {
if (n <= 1) {
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
n.fibonacci(n) (जहाँ n > 1) के प्रत्येक कॉल के लिए, हम दो और पुनरावर्ती कॉल करते हैं. इससे कॉल का एक शाखा वृक्ष बनता है. 'n' में प्रत्येक वृद्धि के साथ कॉल की संख्या लगभग दोगुनी हो जाती है.उदाहरण 6: लूप के अंदर फ़ंक्शन कॉल
function doSomething(arr) {
for (let i = 0; i < arr.length; i++) {
anotherFunction(arr[i]);
}
}
function anotherFunction(value){
for (let j=0; j<value; j++){
console.log(j);
}
}
doSomething n बार पुनरावृत्त होता है।anotherFunction, लूप के अंदर, की जटिलता O(m) है जहाँ m इनपुट value का आकार है। सबसे खराब स्थिति में, value n के समानुपातिक हो सकता है। इसलिए anotherFunction O(n) हैanotherFunction को doSomething के लूप के अंदर बुलाया जाता है, इसलिए जटिलताएँ कई गुना बढ़ जाती हैं।बिग O नोटेशन निर्धारित करना किसी भी प्रोग्रामर के लिए एक महत्वपूर्ण कौशल है। प्रमुख संचालन की पहचान करने, लूप और फ़ंक्शन कॉल का विश्लेषण करने और विकास दर पर ध्यान केंद्रित करने के बुनियादी सिद्धांतों को समझकर, आप अपने एल्गोरिदम की दक्षता का प्रभावी ढंग से आकलन और तुलना कर सकते हैं और सूचित डिज़ाइन निर्णय ले सकते हैं। अपनी समझ को मजबूत करने के लिए कोड स्निपेट का विश्लेषण करने का अभ्यास करना याद रखें।