O (log n) का क्या अर्थ है?


2139

मैं बिग ओ नॉटेशन रनिंग टाइम और एमॉर्टाइज़्ड टाइम के बारे में सीख रहा हूं। मैं O (n) रैखिक समय की धारणा को समझता हूं , जिसका अर्थ है कि इनपुट का आकार आनुपातिक रूप से एल्गोरिथ्म के विकास को प्रभावित करता है ... और उसी के लिए जाता है, उदाहरण के लिए, द्विघात समय O (n 2 ) आदि। एल्गोरिथ्म। , जैसे कि क्रमचय जनरेटर, O (n!) के समय के साथ, जो कि factorials द्वारा विकसित होते हैं।

उदाहरण के लिए, निम्न फ़ंक्शन O (n) है क्योंकि एल्गोरिथ्म इसके इनपुट n के अनुपात में बढ़ता है :

f(int n) {
  int i;
  for (i = 0; i < n; ++i)
    printf("%d", i);
}

इसी तरह, यदि कोई नेस्टेड लूप था, तो समय O (n 2 ) होगा।

लेकिन वास्तव में O (log n) क्या है? उदाहरण के लिए, यह कहने का क्या मतलब है कि एक पूर्ण बाइनरी ट्री की ऊंचाई हे (लॉग एन) ?

मुझे पता है (शायद बहुत विस्तार से नहीं) लॉगरिदम क्या है, इस अर्थ में: लॉग 10 100 = 2, लेकिन मैं यह नहीं समझ सकता कि लॉगरिदमिक समय के साथ फ़ंक्शन की पहचान कैसे करें।


60
1-नोड बाइनरी ट्री की ऊँचाई log2 (1) +1 = 1 है, 2-नोड ट्री की ऊँचाई log2 (2) +1 = 2 है, 4-नोड ट्री की ऊँचाई log2 (4) +1 = 3 है, और जल्द ही। एन-नोड पेड़ की ऊंचाई लॉग 2 (एन) +1 है, इसलिए पेड़ में नोड्स जोड़ने से इसकी औसत ऊंचाई लॉगरिदमिक रूप से बढ़ने लगती है।
डेविड आर ट्रिबल

36
अधिकांश उत्तरों में एक बात जो मैं देख रहा हूं, वह यह है कि वे अनिवार्य रूप से "O (कुछ)" का वर्णन करते हैं, जिसका अर्थ है कि एल्गोरिथ्म का रनिंग टाइम "कुछ" के अनुपात में बढ़ता है। यह देखते हुए कि आपने "ओ (लॉग एन)" का "सटीक अर्थ" पूछा है, यह सच नहीं है। यह बिग-थीटा नोटेशन का सहज वर्णन है, बिग-ओ नहीं। O (लॉग एन) सहजता से मतलब है कि रनिंग टाइम "लॉग एन" के लिए सबसे आनुपातिक रूप से बढ़ता है : stackoverflow.com/questions/471199/…
मेहरदाद अफशरी

31
मुझे हमेशा O (लॉग एन) के लिए उदाहरण के रूप में विभाजित और जीतना याद है
रिचर्ड

14
यह महसूस करना महत्वपूर्ण है कि इसका लॉग बेस 2 (आधार 10 नहीं)। ऐसा इसलिए है क्योंकि एल्गोरिथम में प्रत्येक चरण पर, आप अपने शेष विकल्पों में से आधे को हटा देते हैं। कंप्यूटर विज्ञान में हम लगभग हमेशा लॉग बेस 2 से निपटते हैं क्योंकि हम स्थिरांक को अनदेखा कर सकते हैं। हालांकि कुछ अपवाद हैं (यानी क्वाड ट्री रन टाइम लॉग बेस 4 हैं)
एथन

13
@ ईथन: इससे कोई फर्क नहीं पड़ता कि आप किस बेस में हैं, क्योंकि बेस कन्वर्जन सिर्फ एक स्थिर गुणा है, सूत्र log_b (x) = log_d (x) / log_d (b) है। Log_d (b) केवल एक स्थिरांक होगा।
माइंडवायरस

जवाबों:


2709

मैं समझ नहीं पा रहा हूं कि लॉग टाइम के साथ किसी फंक्शन की पहचान कैसे की जाए।

लॉगरिदमिक रनिंग-टाइम फ़ंक्शन की सबसे आम विशेषताएं हैं:

  • अगले तत्व की पसंद जिस पर कुछ कार्रवाई करने के लिए कई संभावनाओं में से एक है, और
  • केवल एक को चुनने की आवश्यकता होगी।

या

  • जिन तत्वों पर कार्रवाई की जाती है वे n के अंक हैं

यही कारण है कि, उदाहरण के लिए, एक फोन बुक में लोगों की तलाश हे (लॉग एन) है। आपको सही खोजने के लिए फोन बुक में प्रत्येक व्यक्ति की जांच करने की आवश्यकता नहीं है ; इसके बजाय, आप केवल उनके नाम को जहां वर्णानुक्रम में देखते हैं, के आधार पर विभाजित कर सकते हैं और जीत सकते हैं, और प्रत्येक अनुभाग में आपको केवल प्रत्येक अनुभाग के सबसेट का पता लगाने की आवश्यकता होती है, इससे पहले कि आप अंततः किसी का फोन नंबर पाते हैं।

बेशक, एक बड़ी फोन बुक अभी भी आपको अधिक समय लेगी, लेकिन यह अतिरिक्त आकार में आनुपातिक वृद्धि के रूप में जल्दी से नहीं बढ़ेगी।


हम अन्य प्रकार के संचालन और उनके चलने के समय की तुलना करने के लिए फोन बुक उदाहरण का विस्तार कर सकते हैं । हम मानेंगे कि हमारी फोन बुक में व्यवसाय हैं ("येलो पेज") जिनके अद्वितीय नाम और लोग ("व्हाइट पेज") हैं, जिनके अद्वितीय नाम नहीं हो सकते हैं। एक फोन नंबर को एक व्यक्ति या व्यवसाय को सौंपा जाता है। हम यह भी मानेंगे कि किसी विशिष्ट पृष्ठ पर फ़्लिप करने के लिए निरंतर समय लगता है।

यहां कुछ संचालन के समय चल रहे हैं जिन्हें हम फोन बुक में सबसे तेज से सबसे धीमी गति से कर सकते हैं:

  • O (1) (सबसे खराब स्थिति में): उस पृष्ठ को देखते हुए जो किसी व्यवसाय का नाम चालू है और व्यवसाय का नाम, फ़ोन नंबर ढूंढें।

  • O (1) (औसत स्थिति में): उस पृष्ठ को देखते हुए जो किसी व्यक्ति का नाम चालू है और उनका नाम, फ़ोन नंबर ढूंढें।

  • O (लॉग एन): किसी व्यक्ति के नाम को देखते हुए, उस पुस्तक के हिस्से के बारे में एक यादृच्छिक बिंदु उठाकर फ़ोन नंबर ढूंढें, जिसे आपने अभी तक नहीं खोजा है, फिर यह देखने के लिए जांचें कि उस व्यक्ति का नाम उस बिंदु पर है या नहीं। फिर किताब के हिस्से के माध्यम से प्रक्रिया को दोहराएं जहां व्यक्ति का नाम निहित है। (यह किसी व्यक्ति के नाम के लिए एक द्विआधारी खोज है।)

  • O (n): उन सभी लोगों को ढूंढें जिनके फ़ोन नंबरों में अंक "5" है।

  • O (n): किसी फ़ोन नंबर को देखते हुए, उस नंबर वाले व्यक्ति या व्यवसाय को ढूंढें।

  • O (n log n): प्रिंटर के कार्यालय में एक मिक्स-अप था, और हमारी फोन बुक में इसके सभी पृष्ठ एक यादृच्छिक क्रम में डाले गए थे। आदेश को ठीक करें ताकि यह प्रत्येक पृष्ठ पर पहले नाम को देखकर सही हो और फिर उस पृष्ठ को एक नए, खाली फोन बुक में उपयुक्त स्थान पर रखा जाए।

नीचे दिए गए उदाहरणों के लिए, अब हम प्रिंटर के कार्यालय में हैं। फोन की पुस्तकें प्रत्येक निवासी या व्यवसाय को मेल करने की प्रतीक्षा कर रही हैं, और प्रत्येक फोन बुक पर एक स्टिकर है जिससे यह पता लगाया जा सकता है कि इसे कहां भेजा जाना चाहिए। प्रत्येक व्यक्ति या व्यवसाय को एक फोन बुक मिलती है।

  • O (n log n): हम फोन बुक को वैयक्तिकृत करना चाहते हैं, इसलिए हम प्रत्येक व्यक्ति या व्यवसाय का नाम उनकी निर्दिष्ट प्रति में ढूंढने जा रहे हैं, फिर पुस्तक में उनका नाम सर्कल करें और उनके संरक्षण के लिए एक संक्षिप्त धन्यवाद लिखें। ।

  • O (n 2 ): कार्यालय में एक गलती हुई, और प्रत्येक फोन बुक में प्रत्येक प्रविष्टि में फोन नंबर के अंत में एक अतिरिक्त "0" होता है। कुछ व्हाइट-आउट लें और प्रत्येक शून्य को हटा दें।

  • O (n · n!): हम शिपिंग डॉक पर फोनबुक लोड करने के लिए तैयार हैं। दुर्भाग्यवश, जिस रोबोट को किताबों को लोड करना चाहिए था, वह ख़राब हो गया है: यह पुस्तकों को ट्रक पर एक यादृच्छिक क्रम में रख रहा है! इससे भी बदतर, यह ट्रक पर सभी पुस्तकों को लोड करता है, फिर यह देखने के लिए जांचता है कि क्या वे सही क्रम में हैं, और यदि नहीं, तो यह उन्हें अनलोड करता है और खत्म हो जाता है। (यह खूंखार बोगो सॉर्ट है ।)

  • O (n n ): आप रोबोट को ठीक करते हैं ताकि वह चीजों को सही तरीके से लोड कर सके। अगले दिन, आपका एक सहकर्मी आप पर एक प्रैंक खेलता है और लोडिंग डॉक रोबोट को स्वचालित प्रिंटिंग सिस्टम में वायर करता है। हर बार जब रोबोट एक मूल पुस्तक को लोड करने के लिए जाता है, तो फैक्ट्री प्रिंटर सभी फोनबुक का डुप्लीकेट रन बनाता है! सौभाग्य से, रोबोट के बग-डिटेक्शन सिस्टम पर्याप्त परिष्कृत होते हैं कि लोडिंग के लिए डुप्लिकेट बुक का सामना करने पर रोबोट अधिक प्रतियों को प्रिंट करने का प्रयास नहीं करता है, लेकिन इसे अभी भी हर मूल और डुप्लिकेट बुक को लोड करना पड़ता है जो कि प्रिंट किया गया है।


81
@ क्लेटस: संयोग, मुझे डर है। मैंने इसे उठाया क्योंकि फोनबुक में एक बड़ा एन है, लोग समझते हैं कि वे क्या हैं और वे क्या करते हैं, और क्योंकि यह एक उदाहरण के रूप में बहुमुखी है। इसके अलावा मुझे अपने स्पष्टीकरण में रोबोट का उपयोग करने के लिए मिला! चारों तरफ एक जीत। (इसके अलावा, ऐसा लगता है कि आपका जवाब इससे पहले कि मैं भी StackOverflow पर एक सदस्य के साथ शुरू किया गया था!)
जॉन Feminella

12
"कार्यालय में एक गलती हुई, और प्रत्येक फोन बुक में प्रत्येक प्रविष्टि में फोन नंबर के अंत में एक अतिरिक्त" 0 "है। कुछ श्वेत-बाहर ले जाओ और प्रत्येक शून्य को हटा दें।" <- यह आदेश एन वर्ग नहीं है। N को इनपुट के आकार के रूप में परिभाषित किया गया है। इनपुट का आकार फोन नंबर की संख्या है, जो कि किताबों की संख्या के हिसाब से किताबों की संख्या से कई गुना है। यह अभी भी एक रैखिक समय ऑपरेशन है।
बिली ओनेल

21
@ बिली: इस उदाहरण में, Nएक एकल पुस्तक में लोगों की संख्या है। क्योंकि फोन बुक के प्रत्येक व्यक्ति को पुस्तक की अपनी प्रति भी मिलती है, N समान फोन पुस्तकें हैं, जिनमें से प्रत्येक में Nलोग हैं, जो O (N ^ 2) है।
जॉन फेमिनाला

48
क्या ओ (1) सबसे अच्छा मामला नहीं है, बल्कि सबसे खराब स्थिति के रूप में यह अजीब रूप में हाइलाइट किया गया है?
शविप

54
यह मुझे O (long -n! N-55/2) समय लगा O (लॉग एन) परिभाषा खोजने के लिए जो अंत में समझ में आता है। +1
iAteABug_And_iLiked_it

611

O(log N)मूल रूप से समय का मतलब रैखिक रूप से ऊपर जाता है जबकि nतेजी से बढ़ता है। इसलिए यदि तत्वों की 1गणना करने में दूसरा स्थान आता है 10, तो तत्वों की गणना करने के लिए 2सेकंड 100, तत्वों की 3गणना करने के लिए सेकंड 1000, और इसी तरह होगा।

यह O(log n)तब होता है जब हम द्विआधारी खोज जैसे प्रकार के एल्गोरिदम को विभाजित और जीतते हैं। एक अन्य उदाहरण त्वरित प्रकार है जहां हर बार हम सरणी को दो भागों में विभाजित करते हैं और प्रत्येक बार O(N)धुरी तत्व को खोजने में समय लगता है। इसलिए यह N O(log N)


108
ज्ञान की तीन लाइनें जो अन्य सभी निबंधों का जवाब देती हैं ... :) बस अगर कोई इसे याद कर रहा है, तो प्रोग्रामिंग संदर्भ में, लॉग का आधार 2 है (10 नहीं), इसलिए ओ (लॉग एन) 10 सेकंड के लिए 1 सेकंड की तरह तराजू तत्वों, 20 के लिए 2 सेकंड, 40 के लिए 3 आदि
nawfal

3
सहमत, संक्षिप्त और स्पष्ट, हालांकि ओपी से समाप्त होने वाला सवाल था कि कैसे एक लघुगणक समारोह की पहचान की जाए, काफी "क्या है"
एडम

4
हां, लॉगरिदमिक फ़ंक्शन यह घातीय फ़ंक्शन के विपरीत है। ((log x) आधार a) व्युत्क्रम है (एक शक्ति x)। रेखांकन के साथ इन कार्यों का गुणात्मक विश्लेषण अधिक अंतर्ज्ञान देगा।
ओवरएक्सचेंज

7
यह मुझे लगता है कि यह गलत नहीं था एहसास करने के लिए लगभग 3-थ्रू लिया। समय रैखिक रूप से ऊपर जाता है, जबकि तत्वों की संख्या घातीय है। इसका मतलब कम समय के दौरान अधिक तत्व हैं । यह उन लोगों के लिए मानसिक रूप से कर है जो logएक ग्राफ पर परिचित लॉग वक्र के रूप में कल्पना करते हैं।
Qix - MONICA WAS ने

1
मुझे लगता है कि यह एक बहुत अच्छा जवाब है, उस हिस्से को छोड़कर जहां यह दावा है कि द्विआधारी खोज एक विभाजन है और एल्गोरिथ्म को जीतता है। यह नहीं है।
code_dredd

579

इस प्रश्न के कई अच्छे उत्तर पहले ही पोस्ट किए जा चुके हैं, लेकिन मेरा मानना ​​है कि हम वास्तव में एक महत्वपूर्ण याद कर रहे हैं - अर्थात् सचित्र उत्तर।

यह कहने का क्या मतलब है कि एक पूर्ण बाइनरी ट्री की ऊंचाई हे (लॉग एन) है?

निम्नलिखित ड्राइंग में एक बाइनरी ट्री को दर्शाया गया है। ध्यान दें कि प्रत्येक स्तर में ऊपर के स्तर की तुलना में नोड्स की संख्या दोगुनी है (इसलिए बाइनरी ):

बाइनरी ट्री

बाइनरी खोज जटिलता के साथ एक उदाहरण है O(log n)। मान लीजिए कि आकृति 1 में पेड़ के निचले स्तर में स्थित नोड्स किसी क्रमबद्ध संग्रह में आइटम का प्रतिनिधित्व करते हैं। बाइनरी खोज एक विभाजन-और-जीत एल्गोरिथ्म है, और ड्राइंग से पता चलता है कि इस 16 आइटम डेटासेट में हम जो रिकॉर्ड खोज रहे हैं, उसे खोजने के लिए हमें (अधिकतम) 4 तुलनाओं की आवश्यकता होगी।

मान लें कि हमारे पास 32 तत्वों के साथ डेटासेट नहीं था। ऊपर दिए गए ड्राइंग को जारी रखें कि हम जो खोज रहे हैं उसे खोजने के लिए अब हमें 5 तुलनाओं की आवश्यकता होगी, क्योंकि जब हम डेटा की मात्रा को गुणा करते हैं तो पेड़ केवल एक स्तर गहरा हो जाता है। नतीजतन, एल्गोरिथ्म की जटिलता को एक लघुगणकीय आदेश के रूप में वर्णित किया जा सकता है।

log(n)कागज के एक सादे टुकड़े पर प्लॉटिंग , एक ग्राफ़ में परिणाम देगा जहां वक्र का nबढ़ना बढ़ जाता है:

O (लॉग एन)


60
"ध्यान दें कि ऊपर के स्तर की तुलना में प्रत्येक स्तर में नोड्स की दोहरी संख्या कैसे होती है (इसलिए बाइनरी)" यह गलत है। आप जो वर्णन कर रहे हैं वह एक संतुलित बाइनरी ट्री है। एक बाइनरी ट्री का मतलब है कि प्रत्येक नोड में अधिकतम दो बच्चे हैं।
ओएनोट्रिया

8
वास्तव में, यह एक बहुत ही विशेष संतुलित बाइनरी ट्री है, जिसे पूर्ण बाइनरी ट्री कहा जाता है। मैंने उत्तर संपादित कर दिया है, लेकिन इसे अनुमोदित करने के लिए किसी की आवश्यकता है।
user21820

5
एक पूर्ण बाइनरी ट्री को पूरी तरह से भरने के लिए अंतिम स्तर की आवश्यकता नहीं है। मैं कहूंगा, एक 'पूर्ण बाइनरी ट्री' अधिक उपयुक्त है।
मि। एजे।

आपका उत्तर ओपी की मूल समस्या पर और अधिक प्रतिक्रिया देने की कोशिश करता है, इसलिए यह वर्तमान स्वीकृत उत्तर (IMO) से बेहतर है, लेकिन यह अभी भी बहुत अधूरा है: आप सिर्फ एक आधा उदाहरण और 2 चित्र देते हैं ...
nbr

2
इस पेड़ में 31 आइटम हैं, 16 नहीं। इसे 16 आइटम डेटा सेट क्यों कहा जाता है? इस पर प्रत्येक नोड एक संख्या का प्रतिनिधित्व करता है, अन्यथा यह एक अयोग्य बाइनरी ट्री होगा: पी
पेरी मोनशचू

245

नीचे दिए गए स्पष्टीकरण आपको पूरी तरह से संतुलित बाइनरी ट्री के मामले का उपयोग कर रहे हैं ताकि आप यह समझ सकें कि हमें लॉगरिदमिक समय जटिलता कैसे मिलती है।

बाइनरी ट्री एक ऐसा मामला है जहां आकार n की समस्या को आकार n / 2 की उप-समस्या में विभाजित किया जाता है जब तक कि हम आकार की समस्या तक नहीं पहुँचते हैं:

एक बाइनरी ट्री की ऊंचाई

और यह है कि आपको ओ (लॉग एन) मिलता है जो एक समाधान तक पहुंचने के लिए उपरोक्त पेड़ पर किए जाने वाले काम की मात्रा है।

O (लॉग एन) समय जटिलता के साथ एक सामान्य एल्गोरिथ्म बाइनरी सर्च है जिसका पुनरावर्ती संबंध टी (एन / 2) + ओ (1) है यानी पेड़ के प्रत्येक बाद के स्तर पर आप समस्या को आधे में विभाजित करते हैं और अतिरिक्त काम की निरंतर मात्रा करते हैं।


2
यहाँ नौसिखिया। तो क्या आप कह सकते हैं कि पेड़ की ऊंचाई पुनरावृत्ति द्वारा विभाजन की दर आकार n = 1 तक पहुंचने के लिए है?
कोडी

@ कोडी, आपके अवलोकन में अधिकांश भाग के लिए हाँ सटीक है। यह उदाहरण दिखाता है / उपयोग करता है log_2। आपका अवलोकन परे खर्च करेगा log_2और किसी भी log_xस्थान के लिए सटीक होगा x > 1। सीधे विभाजन को करने से हालांकि ठीक 1 नहीं हो सकता है, इसलिए आप पुनरावर्ती विभाजन कहना चाह सकते हैं जब तक Ceiling()कि नवीनतम विभाजन 1 के बराबर या कुछ इसी तरह का न हो।
जेम्स ओर्वेक

198

अवलोकन

दूसरों ने अच्छे चित्र उदाहरण दिए हैं, जैसे कि पेड़ के चित्र। मैंने कोई सरल कोड उदाहरण नहीं देखा। इसलिए मेरी व्याख्या के अलावा, मैं अलग-अलग एल्गोरिथ्म श्रेणियों की जटिलता का वर्णन करने के लिए सरल प्रिंट स्टेटमेंट के साथ कुछ एल्गोरिदम प्रदान करूंगा।

सबसे पहले, आप लॉगरिदम का एक सामान्य विचार रखना चाहते हैं, जिसे आप https://en.wikipedia.org/wiki/Logarithm से प्राप्त कर सकते हैं । प्राकृतिक विज्ञान का उपयोग eऔर प्राकृतिक लॉग। इंजीनियरिंग शिष्य log_10 (लॉग बेस 10) का उपयोग करेंगे और कंप्यूटर वैज्ञानिक log_2 (लॉग बेस 2) का बहुत उपयोग करेंगे, क्योंकि कंप्यूटर बाइनरी आधारित हैं। कभी-कभी आपको प्राकृतिक लॉग के संक्षिप्त रूप दिखाई देंगे ln(), इंजीनियर आमतौर पर _10 को छोड़ देते हैं और बस उपयोग करते हैं log()और log_2 को संक्षिप्त रूप में देखा जाता हैlg() । सभी प्रकार के लघुगणक समान रूप से विकसित होते हैं, यही कारण है कि वे उसी श्रेणी को साझा करते हैं log(n)

जब आप नीचे दिए गए कोड उदाहरणों को देखते हैं, तो मैं O (1), फिर O (n), फिर O (n ^ 2) को देखने की सलाह देता हूं। जब आप उन लोगों के साथ अच्छे होते हैं, तो दूसरों को देखें। मैंने स्वच्छ उदाहरणों के साथ-साथ विविधताओं को भी प्रदर्शित किया है कि सूक्ष्म परिवर्तन अभी भी उसी वर्गीकरण में कैसे परिणत हो सकते हैं।

आप O (1), O (n), O (logn) आदि को विकास की श्रेणी या श्रेणी के रूप में सोच सकते हैं। कुछ श्रेणियों को दूसरों की तुलना में अधिक समय लगेगा। ये श्रेणियां हमें एल्गोरिदम के प्रदर्शन का आदेश देने का एक तरीका देती हैं। इनपुट एन के बढ़ते ही कुछ तेजी से बढ़ता है। निम्न तालिका प्रदर्शित करती है कि विकास संख्यात्मक रूप से हुआ है। नीचे दी गई तालिका में log_2 की छत के रूप में लॉग (n) के बारे में सोचें।

यहां छवि विवरण दर्ज करें

विभिन्न बिग ओ श्रेणियों के सरल कोड उदाहरण:

O (1) - लगातार समय उदाहरण:

  • एल्गोरिथम 1:

एल्गोरिथम 1 एक बार हैलो प्रिंट करता है और यह n पर निर्भर नहीं करता है, इसलिए यह हमेशा स्थिर समय में चलेगा, इसलिए यह है O(1)

print "hello";
  • एल्गोरिथम 2:

एल्गोरिथम 2 3 बार हैलो प्रिंट करता है, हालांकि यह एक इनपुट आकार पर निर्भर नहीं करता है। यहां तक ​​कि n बढ़ता है, यह एल्गोरिथ्म हमेशा केवल 3 बार हैलो प्रिंट करेगा। कहा जा रहा है कि 3, एक स्थिर है, इसलिए यह एल्गोरिथम भी है O(1)

print "hello";
print "hello";
print "hello";

O (लॉग (n)) - लॉगरिदमिक उदाहरण:

  • एल्गोरिथम 3 - यह "log_2" की तरह कार्य करता है

एल्गोरिथम 3 एक एल्गोरिथम प्रदर्शित करता है जो log_2 (n) में चलता है। ध्यान दें कि लूप के लिए पोस्ट ऑपरेशन i के वर्तमान मूल्य को 2 से गुणा करता है, इसलिए i1 से 2 से 4 से 8 से 16 से 3 तक चला जाता है ...

for(int i = 1; i <= n; i = i * 2)
  print "hello";
  • एल्गोरिथम 4 - यह "log_3" की तरह कार्य करता है

एल्गोरिथम 4 log_3 प्रदर्शित करता है। नोटिस i1 से 3 से 9 से 27 तक जाता है ...

for(int i = 1; i <= n; i = i * 3)
  print "hello";
  • एल्गोरिथम 5 - यह "log_1.02" की तरह कार्य करता है

एल्गोरिथम 5 महत्वपूर्ण है, क्योंकि यह दर्शाता है कि जब तक संख्या 1 से अधिक है और परिणाम बार-बार खुद के खिलाफ गुणा किया जाता है, कि आप एक लॉगरिदमिक एल्गोरिदम देख रहे हैं।

for(double i = 1; i < n; i = i * 1.02)
  print "hello";

O (n) - रैखिक समय उदाहरण:

  • एल्गोरिथ्म 6

यह एल्गोरिथ्म सरल है, जो हैलो एन बार प्रिंट करता है।

for(int i = 0; i < n; i++)
  print "hello";
  • एल्गोरिथम 7

यह एल्गोरिथ्म एक भिन्नता दिखाता है, जहां यह हैलो n / 2 बार प्रिंट करेगा। n / 2 = 1/2 * n। हम 1/2 निरंतरता को अनदेखा करते हैं और देखते हैं कि यह एल्गोरिथ्म O (n) है।

for(int i = 0; i < n; i = i + 2)
  print "hello";

O (n * log (n)) - nlog (n) उदाहरण:

  • एल्गोरिथ्म 8

का एक संयोजन के रूप में इस के बारे में सोचो O(log(n))और O(n)। छोरों के लिए घोंसले के शिकार हमें प्राप्त करने में मदद करते हैंO(n*log(n))

for(int i = 0; i < n; i++)
  for(int j = 1; j < n; j = j * 2)
    print "hello";
  • एल्गोरिथ्म 9

एल्गोरिथ्म 9 एल्गोरिथ्म 8 की तरह है, लेकिन प्रत्येक लूप में भिन्नताएं हैं, जो अभी भी अंतिम परिणाम है O(n*log(n))

for(int i = 0; i < n; i = i + 2)
  for(int j = 1; j < n; j = j * 3)
    print "hello";

O (n ^ 2) - n चुकता उदाहरण:

  • एल्गोरिथम 10

O(n^2) छोरों के लिए मानक घोंसले के शिकार द्वारा आसानी से प्राप्त किया जाता है।

for(int i = 0; i < n; i++)
  for(int j = 0; j < n; j++)
    print "hello";
  • एल्गोरिथम 11

एल्गोरिथ्म 10 की तरह, लेकिन कुछ बदलावों के साथ।

for(int i = 0; i < n; i++)
  for(int j = 0; j < n; j = j + 2)
    print "hello";

ओ (एन ^ 3) - एन क्यूबेड उदाहरण:

  • एल्गोरिथम 12

यह एल्गोरिथ्म 10 की तरह है, लेकिन 2 के बजाय 3 छोरों के साथ।

for(int i = 0; i < n; i++)
  for(int j = 0; j < n; j++)
    for(int k = 0; k < n; k++)
      print "hello";
  • एल्गोरिथम 13

एल्गोरिथ्म 12 की तरह, लेकिन कुछ बदलावों के साथ जो अभी भी उपज देते हैं O(n^3)

for(int i = 0; i < n; i++)
  for(int j = 0; j < n + 5; j = j + 2)
    for(int k = 0; k < n; k = k + 3)
      print "hello";

सारांश

उपरोक्त कई सीधे आगे के उदाहरण देते हैं, और सूक्ष्म परिवर्तन को प्रदर्शित करने में मदद करने के लिए विविधताएं पेश की जा सकती हैं जो वास्तव में विश्लेषण को नहीं बदलती हैं। उम्मीद है कि यह आपको पर्याप्त जानकारी देता है।


17
बहुत बढ़िया। मेरे लिए सबसे अच्छा स्पष्टीकरण मैंने कभी देखा। यह अगर अच्छे हो जाएगा O(n^2)का एक संयोजन के रूप में विख्यात है O(n)और O(n), इसलिए O(n) * O(n) = O(n * n) = O(n^2)। ऐसा लगता है कि इस समीकरण के बिना थोड़ा कूदना होगा। यह पूर्व स्पष्टीकरण की पुनरावृत्ति है, लेकिन मुझे लगता है कि यह दोहराव पाठकों को समझने के लिए अधिक आत्मविश्वास प्रदान कर सकता है।
Eonil

2
यह बस सबसे अच्छा कभी स्पष्टीकरण है।
एडगर किल्जक

2
@IceTea, आपको आपके प्रश्न के लिए अंतर्दृष्टि / अंतर्ज्ञान देने के लिए। यदि आप nबनाम बाहर निकलते हैं, तो आप n/2देखेंगे कि वे दोनों एक सीधी रेखा बनाते हैं। यह उन्हें उसी कक्षा में रखता है, जब उनके पास समान विकास दर होती है (इसे चार्टिंग के आकार के रूप में सोचें)। इसी तरह, आप बाहर सनदी अगर log_2बनाम log_3आप देखेंगे कि वे "समान आकार" या "समान विकास दर" पर दोनों ले।
जेम्स ओर्वेक

1
@IceTea, @Shai और @James द्वारा दिया गया स्पष्टीकरण अधिक सटीक है, n/2 or 2n or n+2 or nग्राफ़ में अलग-अलग-अलग रेखा होगी लेकिन उनकी समान विकास दर होगी जिसका अर्थ है कि सभी एक रैखिक विकास का पालन करेंगे।
नरेश जोशी

2
ऐसे मामले के बारे में जहां हमारे पास दो नेस्टेड लूप हैं, लेकिन दूसरा पुनरावृत्ति पहले वाले पर निर्भर करता है, क्या यह निर्भरता समय की जटिलता को प्रभावित करती है?
Bionix1441

131

यदि आपके पास एक फ़ंक्शन है जो लेता है:

1 millisecond to complete if you have 2 elements.
2 milliseconds to complete if you have 4 elements.
3 milliseconds to complete if you have 8 elements.
4 milliseconds to complete if you have 16 elements.
...
n milliseconds to complete if you have 2^n elements.

तब यह लॉग 2 लेता है (n) समय लगता है। बिग ओ अंकन , शिथिल शब्दों में, इसका मतलब है कि रिश्ते केवल बड़े n के लिए सच होने की जरूरत है, और कहा कि निरंतर कारकों और छोटे मामले पर ध्यान नहीं दिया जा सकता है।


क्या log2 (n) o (log n) के समान है?
स्वेन वैन डेन बूगार्ट

हां, एक अन्य उत्तर के लिए टिप्पणी यहां देखें: (कॉपी-पेस्टिंग) - प्रोग्रामिंग संदर्भ में, लॉग का आधार 2 है (10 नहीं), इसलिए ओ (लॉग एन) 10 तत्वों के लिए 1 सेकंड की तरह, 2 सेकंड के लिए 20 सेकंड , 40 वगैरह के लिए
बैरन्स

@SvenvandenBoogaart, इस समाधान में उदाहरण दिखाता है log_2, जो कक्षा में है O(log(n))। एक ही वर्ग के कई अन्य हैं जहां O(log(n))अर्थातlog_xx > 1
जेम्स Oravec

@Andrejs, आपकी टिप्पणी so O(log n) scales like 1 sec for 10 elements, 2 sec for 20, 3 for 40 etcगलत है। वह प्रतिमान / वर्ग मिलान / संरेखित करेगा O(n)न कि साथ O(log(n))। अगर किसी को दिलचस्पी थी, log_10तो एक समान उदाहरण 10 तत्वों के लिए 1 सेकंड, 100 के लिए 2 सेकंड, 1000 के लिए 3, आदि होगा
जेम्स ओर्वेक

99

लॉगरिदमिक रनिंग टाइम ( O(log n)) का अनिवार्य रूप से मतलब है कि रनिंग टाइम इनपुट साइज के लॉगरिथम के अनुपात में बढ़ता है - उदाहरण के तौर पर, यदि 10 आइटमों में कुछ समय xसबसे अधिक लगता है, और 100 आइटम अधिकतम, कहते हैं 2x, और 10,000 आइटम ले जाते हैं अधिक से अधिक लेता है 4x, तो यह एक O(log n)समय जटिलता की तरह लग रहा है।


1
+1, लेकिन आपको वास्तव में इंगित करना चाहिए कि यह log2 है, log10 नहीं।
एड्रियानो वरोली पियाज़ा

62
log2 या log10 अप्रासंगिक है। वे केवल एक पैमाने के कारक से भिन्न होते हैं, जो उन्हें एक ही क्रम बनाता है, अर्थात वे अभी भी उसी दर से बढ़ते हैं।
नोल्डोरिन

17
लघुगणक के बारे में मजेदार बात यह है कि जब सापेक्ष ऊंचाइयों की तुलना करते हैं, तो आपके द्वारा उपयोग किए जाने वाले सटीक आधार कोई फर्क नहीं पड़ता। log 10,000 / log 100क्या आप आधार का उपयोग करते हैं, इसकी परवाह किए बिना 2 है।
आनन।

12
Nitpicky हे (एलजी एन) साधन बन जाते हैं कि क्रम है ज्यादा से ज्यादा n lg के लिए आनुपातिक। आप जो वर्णन करते हैं, वह थीटा (lg n) है।

1
@ श्रग: यह सच है। मैंने कुछ "अधिकांश पर" संपादित किया है ताकि बड़े-हे की ऊपरी-बाध्य प्रकृति का संकेत मिल सके।
आनन।

95

लघुगणक

ठीक है चलो कोशिश करते हैं और पूरी तरह से समझते हैं कि वास्तव में एक लघुगणक क्या है।

कल्पना कीजिए कि हमारे पास एक रस्सी है और हमने इसे घोड़े से बांध दिया है। यदि रस्सी को सीधे घोड़े से बांधा जाता है, तो घोड़े को बलपूर्वक खींचने की आवश्यकता होगी (कहते हैं, एक आदमी से) सीधे 1 है।

अब कल्पना कीजिए कि रस्सी को एक पोल से गोल किया जाता है। दूर होने के घोड़े को अब कई बार मुश्किल से निकालना पड़ेगा। समय की मात्रा रस्सी के खुरदरेपन और ध्रुव के आकार पर निर्भर करेगी, लेकिन मान लें कि यह किसी की ताकत को 10 से गुणा कर देगा (जब रस्सी पूरी मोड़ लेती है)।

अब अगर रस्सी को एक बार दबा दिया जाता है, तो घोड़े को 10 गुना अधिक खींचने की आवश्यकता होगी। यदि मानव घोड़े के लिए इसे वास्तव में कठिन बनाने का फैसला करता है, तो वह रस्सी को फिर से एक पोल पर गोल कर सकता है, इससे अतिरिक्त 10 गुना ताकत बढ़ जाती है। एक तीसरा लूप फिर से ताकत को 10 गुना बढ़ा देगा।

यहां छवि विवरण दर्ज करें

हम देख सकते हैं कि प्रत्येक लूप के लिए, मान १० से बढ़ जाता है। किसी भी संख्या को प्राप्त करने के लिए आवश्यक घुमावों की संख्या को संख्या का लघुगणक कहा जाता है। हमें १०० बार गुणा करके अपनी ताकत के लिए ३ पदों की आवश्यकता होती है, अपनी ताकत को गुणा करने के लिए ६ पद 1000000।

3 1,000 का लघुगणक है, और 6 1,000,000 (10 आधार) का लघुगणक है।

तो O (log n) का वास्तव में क्या मतलब है?

ऊपर के उदाहरण में, हमारी 'विकास दर' हे (लॉग एन) है । प्रत्येक अतिरिक्त लूप के लिए, हमारी रस्सी को संभालने वाला बल 10 गुना अधिक है:

Turns | Max Force
  0   |   1
  1   |   10
  2   |   100
  3   |   1000
  4   |   10000
  n   |   10^n

अब ऊपर के उदाहरण ने बेस 10 का उपयोग किया, लेकिन सौभाग्य से लॉग की आधार बड़ी है जब हम बड़े ओ नोटेशन के बारे में बात करते हैं।

अब आइए कल्पना करें कि आप 1-100 के बीच की संख्या का अनुमान लगाने की कोशिश कर रहे हैं।

Your Friend: Guess my number between 1-100! 
Your Guess: 50
Your Friend: Lower!
Your Guess: 25
Your Friend: Lower!
Your Guess: 13
Your Friend: Higher!
Your Guess: 19
Your Friend: Higher!
Your Friend: 22
Your Guess: Lower!
Your Guess: 20
Your Friend: Higher!
Your Guess: 21
Your Friend: YOU GOT IT!  

अब आपको यह अधिकार पाने के लिए 7 अनुमान लग गए। लेकिन यहाँ रिश्ता क्या है? प्रत्येक अतिरिक्त अनुमान से आप कितनी राशि का अनुमान लगा सकते हैं?

Guesses | Items
  1     |   2
  2     |   4
  3     |   8
  4     |   16
  5     |   32
  6     |   64
  7     |   128
  10    |   1024

ग्राफ का उपयोग करते हुए, हम देख सकते हैं कि यदि हम 1-100 के बीच एक संख्या का अनुमान लगाने के लिए एक द्विआधारी खोज का उपयोग करते हैं तो यह हमें सबसे अधिक 7 प्रयासों में ले जाएगा । यदि हमारे पास 128 नंबर हैं, तो हम 7 अटेम्प्स में संख्या का भी अनुमान लगा सकते हैं, लेकिन 129 नंबर हमें सबसे अधिक लगेंगे 8 प्रयासों (लॉगरिदम के संबंध में, यहां हमें 128 मान सीमा के लिए 7 अनुमानों की आवश्यकता होगी, 1024 मान सीमा के लिए 10 अनुमान .7 128 का लघुगणक है, 10 1024 (आधार 2) का लघुगणक है।

गौर करें कि मैंने 'सबसे ज्यादा' बोल्ड किया है। बिग-ओ नोटेशन हमेशा बदतर स्थिति को संदर्भित करता है। यदि आप भाग्यशाली हैं, तो आप एक प्रयास में संख्या का अनुमान लगा सकते हैं और इसलिए सबसे अच्छा मामला ओ (1) है, लेकिन यह एक और कहानी है।

हम देख सकते हैं कि हर अनुमान के लिए हमारा डेटा सेट सिकुड़ रहा है। एक एल्गोरिथ्म में एक लॉगरिदमिक समय है यह देखने के लिए अंगूठे का एक अच्छा नियम है कि क्या डेटा सेट प्रत्येक पुनरावृत्ति के बाद एक निश्चित क्रम से सिकुड़ता है

O (n log n) के बारे में क्या?

आप अंततः एक रैखिक समय ओ (एन लॉग (एन)) एल्गोरिथ्म भर में आ जाएगा । ऊपर अंगूठे का नियम फिर से लागू होता है, लेकिन इस बार लॉगरिदमिक फ़ंक्शन को एक सूची n के आकार को कम करने के लिए n बार चलाना होता है, जो एल्गोरिदम में एक मर्ज की तरह होता है।

आप आसानी से पहचान सकते हैं कि एल्गोरिथम का समय n लॉग एन है या नहीं। एक बाहरी लूप की तलाश करें जो एक सूची (O (n)) के माध्यम से पुनरावृत्त करता है। फिर देखें कि क्या कोई आंतरिक लूप है। यदि आंतरिक लूप प्रत्येक पुनरावृत्ति पर डेटा सेट को काट / कम कर रहा है, तो वह लूप (O (लॉग एन)) है, और इसलिए समग्र एल्गोरिथ्म = O (n लॉग एन) है

अस्वीकरण: रस्सी-लघुगणक उदाहरण W.Sawyer द्वारा उत्कृष्ट गणितज्ञ के डिलाइट पुस्तक से पकड़ा गया था ।


नहीं In our example above, our 'growth rate' is O(log n). For every additional loop, the force our rope can handle is 10 times more, एक चार्ट द्वारा समर्थित है जो n == लूप की संख्या और our 'growth rate'=> 10 ^ n दिखाता है , जो लॉग एन नहीं है। उदाहरण बनाकर सही किया जा सकता है n=# horses, जिसे नियंत्रित करने के लिए लॉग एन लूप की आवश्यकता होती है। गरीब शैक्षणिक उदाहरण ऐसे छात्रों का उत्पादन करते हैं जो केवल वही मानते हैं जो वे समझते हैं।
Psimpson

56

आप ओ (लॉग एन) के बारे में सहज रूप से कह सकते हैं कि समय एन में अंकों की संख्या के लिए आनुपातिक है।

यदि एक ऑपरेशन प्रत्येक अंक या इनपुट के बिट पर निरंतर समय का काम करता है, तो पूरा ऑपरेशन इनपुट में अंकों या बिट्स की संख्या के लिए आनुपातिक समय लेगा, न कि इनपुट का परिमाण; इस प्रकार, O (N) के बजाय O (लॉग एन)।

यदि कोई ऑपरेशन निरंतर समय निर्णयों की एक श्रृंखला बनाता है, जिसमें से प्रत्येक आधा हो जाता है (3, 4, 5 .. के एक कारक द्वारा घटाया जाता है) इनपुट के आकार पर विचार किया जाता है, तो संपूर्ण समय आधार 2 (बेस 3) के लिए आनुपातिक लगेगा , आधार 4, आधार 5 ...) इनपुट N के आकार का, O (N) होने के बजाय।

और इसी तरह।


7
सटीक और अधिक आसानी से सबसे स्पष्टीकरण की तुलना में आसानी से समझा, मुझे लगता है।
टी।

इसका स्पष्टीकरण है log<sub>10</sub> N, क्या यह है?
लियूयान

1
@LiuYan 刘 研 उन्होंने यह नहीं बताया कि अंकों की संख्या किस आधार पर है। किसी भी स्थिति में, log = (n) = log₁₀ (n) / log₁₀ (2) और 1 / log₁₀ (2) इसलिए एक निरंतर गुणक है, एक ही सिद्धांत के साथ सभी अन्य आधारों पर लागू होता है। इससे दो बातें पता चलती हैं। सबसे पहले कि मोनशैडो का सिद्धांत जो भी आधार लागू करता है (हालांकि आधार कम होता है, अनुमान में कम "जग") और यह भी कि हे (लॉग एन) ओ है (लॉग एन) कोई फर्क नहीं पड़ता कि आधार क्या गणना है जो आपको उस निष्कर्ष पर ले गया ।
जॉन हैना

"आनुपातिक" ... "जिनमें से प्रत्येक इनपुट के आकार को आधा कर देता है" ??????
csguy

52

सबसे अच्छा तरीका है कि मैं हमेशा एक एल्गोरिथ्म की कल्पना करता हूं जो ओ में चलता है (लॉग एन) निम्नानुसार है:

यदि आप समस्या का आकार कई गुणा बढ़ाते हैं (अर्थात इसका आकार 10 से गुणा करते हैं), तो कार्य केवल एक जोड़ राशि द्वारा ही बढ़ाया जाता है।

इसे अपने बाइनरी ट्री प्रश्न पर लागू करना ताकि आपके पास एक अच्छा अनुप्रयोग हो: यदि आप एक बाइनरी ट्री में नोड्स की संख्या को दोगुना करते हैं, तो ऊंचाई केवल 1 (एक योजक राशि) बढ़ जाती है। यदि आप इसे फिर से दोगुना करते हैं, तो यह अभी भी केवल 1 से बढ़ा है। (जाहिर है मैं यह मान रहा हूं कि यह संतुलित और ऐसा है)। इस तरह, समस्या का आकार गुणा होने पर अपने काम को दोगुना करने के बजाय, आप केवल बहुत कम काम कर रहे हैं। यही कारण है कि ओ (लॉग एन) एल्गोरिदम कमाल हैं।


52

पहले मैं आपको निम्नलिखित पुस्तक पढ़ने की सलाह देता हूं;

एल्गोरिदम (4 वें संस्करण)

यहाँ कुछ कार्य और उनकी अपेक्षित जटिलताएँ हैं। संख्याएँ कथन निष्पादन की आवृत्तियों का संकेत दे रही हैं ।

यहाँ कुछ कार्य और उनकी अपेक्षित जटिलताएँ हैं

बाद बिग-ओ जटिलता चार्ट भी से लिया bigocheatsheet बिग-ओ जटिलता चार्ट

अंतिम रूप से बहुत सरल शोकेस यह दर्शाता है कि इसकी गणना कैसे की जाती है;

एक कार्यक्रम के बयान निष्पादन आवृत्तियों के एनाटॉमी।

एक कार्यक्रम के चल रहे समय का विश्लेषण (उदाहरण)।

किसी प्रोग्राम के रनिंग टाइम का विश्लेषण करना


5
मैं ओ (एन लॉग एन) को खराब टोकरी में नहीं डालूंगा । यह मेले के अंतर्गत आता है ।
एंड्रे वेर्लंग

बड़े-ओ जटिलता चार्ट (ऊपर) को देखने पर आपको याद रखना होगा कि ओ (एन) वास्तविक रैखिक बिंदु है, न कि गुलाबी / नारंगी बोर्डर। @ और यही कारण है कि O (n log n) को 'खराब' प्रदर्शन ब्रैकेट में सही तरीके से चिह्नित किया गया है, यह रैखिक की तुलना में खराब प्रदर्शन है।
जावाबिट

@JavaBeast सही है, जबकि O (n log n) का प्रदर्शन तकनीकी रूप से O (n) से भी बदतर है, ऊपर दी गई तालिका देखें, जो उनमें से एक अच्छी तुलना प्रस्तुत करता है (दो की वृद्धि देखें)। ओटोह चार्ट, एक अलग स्रोत से, विरोधाभासी है क्योंकि यह ओ (1) और ओ (लॉग एन) को एक ही अच्छे / उत्कृष्ट में डालता है। विकास का उनका सापेक्ष क्रम ओ (एन) और ओ (एन लॉग एन) के बराबर है। tl; डॉ; ओ (एन लॉग एन) उत्कृष्ट नहीं है, लेकिन खराब से बहुत दूर है।
एंड्रे वर्लांग 22

1
यह उत्तर गलत है! यह मानता है कि एन = एन * एन। वास्तव में एन = एन! आपका उदाहरण वास्तव में एन क्यूबेड है। आप अपने ग्राफ में भी ऐसा ही करें। आपका O (n) वास्तव में भयानक और बुरे के बीच का विभाजन होना चाहिए। गणितीय प्रमाण: आप कहते हैं कि लूप ओ (1) के साथ स्थिर है। यही कारण है कि 1 वास्तव में इसका मतलब है, एन पर निर्भर नहीं है। इसका मतलब सिर्फ चर नहीं है। लेकिन यह परिवर्तनशील है क्योंकि यह एन। एन। एन। और आधे समय पर निर्भर है। इसलिए यह अमान्य है। यदि यह उस पुस्तक से है, तो इसे न खरीदें! आपके द्वारा दिखाया गया कोड ग्राफ़िक वास्तविक नहीं है, यह एक मज़ाक है, "शानदार", इसका मतलब है कि तीन लोग एक साथ सेक्स करते हैं! OMG
jgmjgm

1
ओ (एन) विकर्ण पर नहीं होना चाहिए?
gyosifov

46

क्या लॉग बी (एन) है?

यह कई बार है जब आप आकार 1 के एक खंड तक पहुंचने से पहले लंबाई के लॉग को b बराबर भागों में बार-बार काट सकते हैं।


बहुत बढ़िया टिप्पणी! यह संक्षिप्त है और वास्तव में मैं इसके बाद का जवाब हूं।
डेनिसएल

18

एल्गोरिदम को विभाजित और जीतना आमतौर पर lognचलने के समय के लिए एक घटक होता है। यह इनपुट के बार-बार रुकने से आता है।

द्विआधारी खोज के मामले में, प्रत्येक पुनरावृति आप इनपुट के आधे भाग को फेंक देते हैं। यह ध्यान दिया जाना चाहिए कि बिग-ओ संकेतन में, लॉग लॉग बेस 2 है।

संपादित करें: जैसा कि उल्लेख किया गया है, लॉग बेस कोई फर्क नहीं पड़ता, लेकिन जब एक एल्गोरिथ्म के बिग-ओ प्रदर्शन को प्राप्त करते हैं, तो लॉग फ़ैक्टर को रोकने से आएगा, इसलिए मैं इसे आधार 2 के रूप में क्यों सोचता हूं।


2
यह लॉग बेस 2 क्यों है? उदाहरण के लिए रैंडमाइज्ड क्विकर में, मुझे नहीं लगता कि यह बेस 2 है। जहां तक ​​मुझे पता है, बेस कोई फर्क नहीं पड़ता, क्योंकि लॉग बेस ए (एन) = लॉग 2 (एन) / लॉग 2 (ए), इसलिए हर लॉगरिदम एक स्थिरांक से दूसरे से अलग है, और स्थिरांक को बड़े-ओ संकेतन में अनदेखा किया जाता है। वास्तव में, बड़े-ओ संकेतन में एक लॉग का आधार लिखना मेरे विचार में एक गलती है, जैसा कि आप एक निरंतर लिख रहे हैं।
IVlad


बहुत सच है कि इसे किसी भी आधार में बदला जा सकता है और इससे कोई फर्क नहीं पड़ता है, लेकिन यदि आप बिग-ओ प्रदर्शन को प्राप्त करने की कोशिश कर रहे हैं और आप लगातार रुकते हुए देखते हैं, तो यह समझने में मदद करता है कि आप लॉग 10 आधार कोड में परिलक्षित नहीं देखेंगे।
डेविड कनारेक

एक तरफ: बी-ट्री जैसी चीजों में, जहां नोड्स में 2 से अधिक का फैन-आउट होता है (बाइनरी ट्री की तुलना में "व्यापक"), फिर भी आपको O (logn) ग्रोथ दिखाई देगी, क्योंकि यह अभी भी विभाजित है-और -कोन, लेकिन लॉग का आधार फैन-आउट से संबंधित होगा।
रोजर लिप्सकॉम्ब

लॉग 2 पर विषयांतर वास्तव में काफी मददगार था।
दान रोसेनस्टार्क

15

लेकिन वास्तव में O (log n) क्या है? उदाहरण के लिए, यह कहने का क्या मतलब है कि एक> पूर्ण बाइनरी ट्री की ऊँचाई हे (लॉग एन) है?

मैं इसे फिर से परिभाषित करूंगा क्योंकि 'पूर्ण बाइनरी ट्री की ऊँचाई लॉग एन है'। पूर्ण बाइनरी ट्री की ऊँचाई का पता लगाना O (log n) होगा, यदि आप चरण दर चरण नीचे चल रहे थे।

मैं यह नहीं समझ सकता कि लॉगरिदमिक समय के साथ किसी फ़ंक्शन की पहचान कैसे करें।

लघुगणक अनिवार्य रूप से घातांक का विलोम है। इसलिए, यदि आपके फ़ंक्शन का प्रत्येक 'चरण' मूल आइटम सेट से तत्वों के एक कारक को समाप्त कर रहा है , जो कि एक लघुगणकीय समय एल्गोरिथ्म है।

पेड़ के उदाहरण के लिए, आप आसानी से देख सकते हैं कि नोड्स के स्तर को नीचे ले जाने से तत्वों की एक घातीय संख्या में कटौती होती है क्योंकि आप ट्रैपिंग जारी रखते हैं। नाम-सॉर्ट किए गए फोन बुक के माध्यम से देखने का लोकप्रिय उदाहरण अनिवार्य रूप से एक द्विआधारी खोज पेड़ (मध्य पृष्ठ मूल तत्व है, और आप बाएं या दाएं जाने के लिए प्रत्येक चरण में कटौती कर सकते हैं) को पार करने के बराबर है।


3
+1 का उल्लेख करने के लिए "लॉगरिदम अनिवार्य रूप से घातांक का विलोम है"।
टेलोंक्स

12

इन 2 मामलों में O (लॉग एन) समय लगेगा

case 1: f(int n) {
      int i;
      for (i = 1; i < n; i=i*2)
        printf("%d", i);
    }


 case 2  : f(int n) {
      int i;
      for (i = n; i>=1 ; i=i/2)
        printf("%d", i);
    }

मुझे यकीन है कि मुझे कुछ याद आ रहा है, लेकिन क्या मैं हमेशा शून्य नहीं रहूंगा और लूप्स उन दोनों मामलों में हमेशा के लिए चलते हैं, क्योंकि 0 * 2 = 0 और 0/2 = 0 है?
dj_segfault

2
@dj_segfault, यह मेरी गलती थी। मुझे लगता है कि अब यह समझ में आता है .. :)
रवि बिस्ला

@RaviBisla अन्य उत्तर बताते हैं कि 10 का इनपुट 1 बार में 10 लूप्स जितना लेगा, और 100 का इनपुट 1 के इनपुट समय का 3 गुना लेगा, निश्चित रूप से उन उदाहरणों के साथ ऐसा नहीं है। stackoverflow.com/a/2307330/1667868
स्वेन वैन डेन बूगार्ट

12

O (लॉग एन) थोड़ा भ्रामक है, अधिक सटीक रूप से यह O (लॉग 2) है n) है, अर्थात (आधार 2 के साथ लघुगणक)।

एक संतुलित बाइनरी ट्री की ऊंचाई हे (लॉग 2 एन), क्योंकि प्रत्येक नोड में दो होते हैं (लॉग 2 एन में "दो" के रूप में ध्यान दें ) बच्चे के नोड्स। तो, n नोड्स वाले एक पेड़ की लॉग 2 की ऊंचाई है एन है।

एक अन्य उदाहरण द्विआधारी खोज है, जिसमें ओ (लॉग 2 एन) का एक समय चल रहा है क्योंकि हर कदम पर आप खोज स्थान को 2 से विभाजित करते हैं।


4
O (log n) O (ld n) या O (LN n) के समान क्रम है। वे आनुपातिक हैं। मैं समझता हूं कि सीखने के उद्देश्यों के लिए ld का उपयोग करना आसान है।
हेलियो

4
"अधिक सटीक रूप से यह O (ld n)" है - नहीं, यह नहीं है: सभी लॉग एक ही क्रम हैं (प्रत्येक को केवल कुछ निरंतर स्केलिंग कारक द्वारा अलग किया जाता है, जिसे अनदेखा / इग्नोर किया जाता है)।
क्रिस

1
तुम सही क्रिस, बहुत बुरा शब्द हैं। जैसा कि हेलिओस ने कहा था, वैसा ही करना चाहिए था। यह सीखने / समझने में मदद करता है लेकिन अंत में सभी लॉग एक ही क्रम के होते हैं।
स्टैमैक्स

10

O(log n) एक फ़ंक्शन (या एल्गोरिथ्म, या एक एल्गोरिथ्म में कदम) को संदर्भित करता है जो लघुगणक के लिए आनुपातिक समय में काम करता है (आमतौर पर ज्यादातर मामलों में आधार 2, लेकिन हमेशा नहीं, और किसी भी घटना में यह बिग-ओ नोटेशन द्वारा महत्वहीन है *) इनपुट के आकार का।

लॉगरिदमिक फ़ंक्शन घातांक फ़ंक्शन का व्युत्क्रम है। एक और तरीका रखो, यदि आपका इनपुट तेजी से बढ़ता है (रैखिक के बजाय, जैसा कि आप आमतौर पर इस पर विचार करेंगे), तो आपका फ़ंक्शन रैखिक रूप से बढ़ता है।

O(log n)किसी भी तरह के डिवाइड-एंड-कॉनवेयर एप्लिकेशन में रनिंग टाइम बहुत सामान्य है, क्योंकि आप (आदर्श रूप से) काम को हर बार आधे में काट रहे हैं। यदि प्रत्येक डिवीजन में या कदमों पर विजय प्राप्त करते हैं, तो आप निरंतर समय कार्य कर रहे हैं (या कार्य जो निरंतर-समय नहीं है, लेकिन समय के साथ धीरे-धीरे बढ़ रहा है O(log n)), तो आपका पूरा कार्य है O(log n)। इसके बजाय इनपुट पर प्रत्येक चरण को रैखिक समय की आवश्यकता होना काफी सामान्य है; यह कुल समय जटिलता की राशि होगीO(n log n)

बाइनरी सर्च की रनिंग टाइम जटिलता एक उदाहरण है O(log n) । ऐसा इसलिए है क्योंकि द्विआधारी खोज में, आप हमेशा अपने प्रत्येक आधे इनपुट को बाद के चरण में आधे में विभाजित करके और केवल प्रत्येक चरण के साथ एक आधे पर ध्यान केंद्रित करते हुए अनदेखा कर रहे हैं। प्रत्येक चरण निरंतर-समय होता है, क्योंकि बाइनरी खोज में आपको केवल एक तत्व की तुलना करने की आवश्यकता होती है ताकि यह पता लगाया जा सके कि किसी भी बिंदु पर कितना बड़ा सरणी आप पर विचार कर रहे हैं। तो आप लगभग लॉग (n) / लॉग (2) चरण करते हैं।

मर्ज सॉर्ट की रनिंग टाइम जटिलता इसका एक उदाहरण है O(n log n)। ऐसा इसलिए है क्योंकि आप प्रत्येक चरण के साथ सरणी को आधे में विभाजित कर रहे हैं, जिसके परिणामस्वरूप कुल लॉग (n) / लॉग (2) चरण हैं। हालाँकि, प्रत्येक चरण में आपको सभी तत्वों पर मर्ज संचालन करने की आवश्यकता होती है (चाहे वह n / 2 तत्वों के दो उपविभागों पर एक मर्ज कार्रवाई हो, या n / 4 तत्वों के चार उपविभागों पर दो मर्ज संचालन अप्रासंगिक है, क्योंकि यह होने के लिए कहते हैं) प्रत्येक चरण में n तत्वों के लिए ऐसा करें)। इस प्रकार, कुल जटिलता है O(n log n)

* याद रखें कि परिभाषा के अनुसार बिग-ओ नोटेशन, कोई फर्क नहीं पड़ता। इसके अलावा , लघुगणक के लिए आधार नियम के परिवर्तन से , विभिन्न आधारों के लघुगणक के बीच एकमात्र अंतर एक स्थिर कारक है।


अंतिम * नोट ने 2 या 10 पर आधारित लघुगणक के बारे में मेरी उलझन को हल किया :) बहुत बहुत धन्यवाद।
यज्ञ

9

इसका सीधा सा मतलब है कि इस कार्य के लिए आवश्यक समय लॉग (n) के साथ बढ़ता है (उदाहरण: n = 10 के लिए 2 s, n के लिए 4 s = 100, ...)। बाइनरी सर्च एलगोरिदम और बिग ओ नोटेशन पर विकिपीडिया लेखों को और अधिक पूर्वाभासों के लिए पढ़ें।


9

सीधे शब्दों में कहें: अपने एल्गोरिथ्म के प्रत्येक चरण में आप काम को आधे में काट सकते हैं। (Asymptotically तीसरे, चौथे, के बराबर ...)


2
यह जवाब बहुत ही अभेद्य है। सबसे पहले, आप आधार में लघुगणक के मामले में केवल आधे हिस्से में काम काटने के बारे में सोच सकते हैं। यह वास्तव में अविश्वसनीय है कि यह उत्तर (और मूल प्रश्न के अधिकांश उत्तर) कितने अप-वोट प्राप्त हुए। "(Asymptotically तीसरे, चौथे, के बराबर ...)"? यदि आपके पास समय नहीं है तो एक प्रश्न का उत्तर क्यों दें?
नबंर

8

यदि आप एक ग्राफ़िकल कैलकुलेटर या कुछ समान पर एक लॉगरिदमिक फ़ंक्शन को प्लॉट करते हैं, तो आप देखेंगे कि यह वास्तव में धीरे-धीरे बढ़ता है - एक रैखिक फ़ंक्शन की तुलना में और भी धीरे-धीरे।

यही कारण है कि लॉगरिदमिक समय जटिलता के साथ एल्गोरिदम की अत्यधिक मांग की जाती है: यहां तक ​​कि वास्तव में बड़े एन के लिए (चलो उदाहरण के लिए n = 10 ^ 8 कहते हैं), वे स्वीकार्य से अधिक प्रदर्शन करते हैं।


7

लेकिन वास्तव में ओ (लॉग एन) क्या है

क्या यह ठीक अर्थ है "के रूप में है nकी ओर जाता है infinity, timeकी ओर जाता है a*log(n), जहां aएक निरंतर स्केलिंग कारक है।"

या वास्तव में, इसका यह मतलब नहीं है कि; अधिक संभावना यह है की तरह "कुछ का मतलब timeविभाजित द्वारा a*log(n)की ओर जाता है 1"।

"की ओर झुकता है" का सामान्य गणितीय अर्थ है 'विश्लेषण': उदाहरण के लिए, कि "यदि आप कोई भी मनमाने ढंग से छोटे गैर-शून्य स्थिर को चुनते हैं k, तो मैं एक समान मूल्य पा सकता हूं Xजो कि सभी से अधिक मूल्यों के लिए ((time/(a*log(n))) - 1)कम है ।"knX


सामान्य शब्दों में, इसका मतलब है कि समय के लिए समीकरण में कुछ अन्य घटक हो सकते हैं: जैसे कि इसमें कुछ निरंतर स्टार्टअप समय हो सकता है; लेकिन ये अन्य घटक n के बड़े मूल्यों के लिए महत्वहीन हैं, और एक * log (n) बड़े n के लिए हावी शब्द है।

ध्यान दें कि यदि समीकरण थे, उदाहरण के लिए ...

time (n) = a + b log (n) + c n + d n n

... तो यह O (n चुकता) होगा, क्योंकि कोई फर्क नहीं पड़ता कि क्या स्थिरांक का मान ए, बी, सी और गैर-शून्य डी है, d*n*nकिसी भी पर्याप्त बड़े मूल्य के एन के लिए यह शब्द हमेशा दूसरों पर हावी रहेगा।

यही कारण है कि बिट ओ नोटेशन का मतलब है: इसका मतलब है "किसी भी पर्याप्त बड़े एन के लिए प्रमुख शब्द का क्रम क्या है"।



7

मैं कुछ दिलचस्प जोड़ सकता हूं, जिसे मैंने बहुत समय पहले कोरमेन और आदि द्वारा किताब में पढ़ा था। अब, एक समस्या की कल्पना करें, जहां हमें एक समस्या स्थान पर एक समाधान खोजना होगा। यह समस्या स्थान परिमित होना चाहिए।

अब, यदि आप साबित कर सकते हैं, कि आपके एल्गोरिथ्म के प्रत्येक पुनरावृत्ति पर आपने इस स्थान का एक अंश काट दिया, तो यह किसी सीमा से कम नहीं है, इसका मतलब है कि आपका एल्गोरिथ्म O (logN) समय में चल रहा है।

मुझे यह इंगित करना चाहिए, कि हम यहाँ एक सापेक्ष अंश सीमा के बारे में बात कर रहे हैं, पूर्ण नहीं। द्विआधारी खोज एक शास्त्रीय उदाहरण है। प्रत्येक चरण में हम समस्या स्थान का 1/2 भाग निकालते हैं। लेकिन द्विआधारी खोज एकमात्र ऐसा उदाहरण नहीं है। मान लीजिए, आपने किसी तरह साबित किया, कि प्रत्येक चरण में आप कम से कम 1/128 समस्या वाली जगह को फेंक देते हैं। इसका अर्थ है, आपका प्रोग्राम अभी भी O (logN) समय पर चल रहा है, हालाँकि बाइनरी सर्च की तुलना में यह काफी धीमा है। यह पुनरावर्ती एल्गोरिदम के विश्लेषण में एक बहुत अच्छा संकेत है। यह अक्सर साबित किया जा सकता है कि प्रत्येक चरण में रिकर्सन कई वेरिएंट का उपयोग नहीं करेगा, और इससे समस्या स्थान में कुछ अंश का कटऑफ होता है।


6

मैं लूप के लिए एक उदाहरण दे सकता हूं और शायद एक बार अवधारणा को समझ लेने के बाद शायद अलग-अलग संदर्भों में समझना सरल हो जाएगा।

इसका मतलब है कि लूप में कदम तेजी से बढ़ता है। उदाहरण के लिए

for (i=1; i<=n; i=i*2) {;}

इस कार्यक्रम के ओ-नोटेशन में जटिलता ओ (लॉग (एन)) है। चलो हाथ से इसके माध्यम से लूप करने की कोशिश करें (n 512 और 1023 के बीच कहीं हो रहा है (1024 को छोड़कर):

step: 1   2   3   4   5    6    7    8     9     10
   i: 1   2   4   8   16   32   64   128   256   512

हालाँकि n कहीं 512 और 1023 के बीच है, केवल 10 पुनरावृत्तियाँ होती हैं। ऐसा इसलिए है क्योंकि लूप में कदम तेजी से बढ़ता है और इस तरह समाप्ति तक पहुंचने के लिए केवल 10 पुनरावृत्तियों को लेता है।

X का लघुगणक (a के आधार पर) ^ x का उल्टा कार्य है।

यह कहना पसंद है कि लघुगणक घातीय का विलोम है।

अब इसे इस तरह से देखने की कोशिश करें, अगर घातीय बहुत तेजी से बढ़ता है तो लॉगरिथम बढ़ता है (उलटा) बहुत धीमा।

O (n) और O (लॉग (n)) के बीच का अंतर O (n) और O (a ^ n) (एक स्थिर) के बीच अंतर के समान है।


6

दरअसल, यदि आपके पास n तत्वों की सूची है, और उस सूची से एक द्विआधारी वृक्ष बनाते हैं (जैसे विभाजन और विजय एल्गोरिथ्म में), तो आप 2 को तब तक विभाजित करते रहेंगे जब तक आप आकार 1 (पत्तियों) की सूची तक नहीं पहुंच जाते।

पहले चरण में, आप 2 से विभाजित करते हैं। फिर आपके पास 2 सूचियाँ (2 ^ 1) हैं, आप प्रत्येक को 2 से विभाजित करते हैं, इसलिए आपके पास 4 सूचियाँ (2 ^ 2) हैं, आप फिर से विभाजित करते हैं, आपके पास 8 सूचियाँ हैं (2 ^ 3) ) और इसी तरह जब तक आपकी सूची का आकार 1 नहीं है

यह आपको समीकरण देता है:

n/(2^steps)=1 <=> n=2^steps <=> lg(n)=steps

(आप प्रत्येक पक्ष के lg लेते हैं, lg लॉग बेस 2 है)


2
जब तक कुछ मैलवेयर पत्तियों के नोड्स से पहले दो स्तरों पर x लंबाई के साथ एक नई सूची सम्मिलित करना शुरू नहीं करते हैं। तब यह एक अनंत लूप प्रतीत होगा ...
फ्रांसिस कुगलर

1
मुझे आपकी टिप्पणी नहीं मिली। क्या मेरा स्पष्टीकरण गलत है?
दिनाज

1
मैं केवल एक काल्पनिक मजाक बना रहा था। मैं वास्तव में इसके द्वारा कुछ भी अर्थ नहीं था।
फ्रांसिस कूगलर

6

हर बार जब हम एक एल्गोरिथ्म या कोड लिखते हैं तो हम इसकी विषमता की जटिलता का विश्लेषण करने की कोशिश करते हैं। यह अपने समय की जटिलता से अलग है

असममित जटिलता एक एल्गोरिथ्म के निष्पादन समय का व्यवहार है जबकि समय जटिलता वास्तविक निष्पादन समय है। लेकिन कुछ लोग इन शब्दों का परस्पर उपयोग करते हैं।

क्योंकि समय की जटिलता विभिन्न मापदंडों पर निर्भर करती है।
1. भौतिक प्रणाली
2. प्रोग्रामिंग भाषा
3. कोडिंग स्टाइल
4. और भी बहुत कुछ ......

वास्तविक निष्पादन समय विश्लेषण के लिए एक अच्छा उपाय नहीं है।


इसके बजाय हम इनपुट आकार को पैरामीटर के रूप में लेते हैं क्योंकि कोड जो भी है, इनपुट समान है। तो निष्पादन समय इनपुट आकार का एक कार्य है।

निम्नलिखित रैखिक समय एल्गोरिथ्म का एक उदाहरण है


रैखिक खोज
n इनपुट तत्वों को देखते हुए, सरणी में एक तत्व को खोजने के लिए जिसकी आपको सबसे अधिक 'n' तुलना में आवश्यकता है । दूसरे शब्दों में, कोई फर्क नहीं पड़ता कि आप किस प्रोग्रामिंग भाषा का उपयोग करते हैं, आप किस कोडिंग शैली को पसंद करते हैं, आप इसे किस सिस्टम पर निष्पादित करते हैं। सबसे खराब स्थिति में इसे केवल एन तुलना की आवश्यकता होती है। निष्पादन का समय इनपुट आकार के रैखिक रूप से आनुपातिक है।

और इसकी सिर्फ खोज नहीं है, जो कुछ भी काम हो सकता है (वेतन वृद्धि, तुलना या किसी भी ऑपरेशन) इसके इनपुट आकार का एक कार्य है।

इसलिए जब आप कहते हैं कि कोई भी एल्गोरिथ्म हे (लॉग एन) तो इसका मतलब है कि निष्पादन का समय लॉग का समय इनपुट आकार n है।

जैसे-जैसे इनपुट आकार बढ़ता है काम किया जाता है (यहाँ निष्पादन समय) बढ़ता है। (इसलिए आनुपातिकता)

      n      Work
      2     1 units of work
      4     2 units of work
      8     3 units of work

इनपुट आकार में वृद्धि के रूप में देखें कि किया गया कार्य बढ़ा हुआ है और यह किसी भी मशीन से स्वतंत्र है। और अगर आप काम की इकाइयों के मूल्य का पता लगाने की कोशिश करते हैं, तो यह वास्तव में उन निर्दिष्ट मापदंडों पर निर्भर है। यह सिस्टम और सभी के अनुसार बदल जाएगा।


5

पेड़

log x to base b = y का विलोम है b^y = x

यदि आपके पास गहराई डी और आकार n का M-ary ट्री है, तो:

  • पूरे पेड़ का पता लगाना ~ O (M ^ d) = O (n)

  • पेड़ में एक ही रास्ता चल रहा है ~ O (d) = O (बेस n से M तक)


5

सूचना प्रौद्योगिकी में इसका मतलब है कि:

  f(n)=O(g(n)) If there is suitable constant C and N0 independent on N, 
  such that
  for all N>N0  "C*g(n) > f(n) > 0" is true.

चींटी को लगता है कि यह अंकन ज्यादातर गणित से लिया गया था।

इस लेख में एक उद्धरण है: DE Knuth, "BIG OMICRON AND BIG OMEGA AND BIG THETA", 1976 :

यहां चर्चा किए गए मुद्दों के आधार पर, मैं प्रस्ताव करता हूं कि SIGACT के सदस्य, और कंप्यूटर विज्ञान और गणित पत्रिकाओं के संपादक, ऊपर बताए अनुसार अधिसूचनाएं अपनाएं, जब तक कि बेहतर विकल्प को जल्द ही उचित रूप से नहीं पाया जा सके

आज २०१६ है, लेकिन हम आज भी इसका इस्तेमाल करते हैं।


गणितीय विश्लेषण में इसका अर्थ है कि:

  lim (f(n)/g(n))=Constant; where n goes to +infinity

लेकिन गणितीय विश्लेषण में भी कभी-कभी इस प्रतीक का उपयोग "C * g (n)> f (n)> 0" के अर्थ में किया जाता था।

जैसा कि मैं विश्वविद्यालय से जानता हूं कि प्रतीक को जर्मन गणितज्ञ लैंडौ (1877-1938) ने फिर से तैयार किया था


3

पूर्ण बाइनरी उदाहरण ओ (ln n) है क्योंकि खोज इस तरह दिखता है:

1 2 3 4 5 6 7 8 9 10 11 12

4 पैदावार के लिए खोज 3 हिट: 6, 3 फिर 4. और लॉग 2 12 = 3, जो कि कितने हिट जहां आवश्यक हो, के लिए एक अच्छा संकेत है।


उदाहरण के लिए धन्यवाद। यह स्पष्ट रूप से कहता है कि हमारा एल्गोरिथ्म कैसे विभाजित और विजय विधि में लॉगरिदमिक समय का उपयोग कर सकता है।
Abc

तो अगर इसका n / 2 का लूप हमेशा इसकी लॉग (n) है?
गिल बिय्रूथ

3

यदि आप एक अंतर्ज्ञान आधारित उत्तर की तलाश में हैं तो मैं आपके लिए दो व्याख्याएं रखना चाहूंगा।

  1. बहुत व्यापक आधार के साथ-साथ बहुत ऊंची पहाड़ी की कल्पना करें। पहाड़ी की चोटी तक पहुँचने के लिए दो रास्ते हैं: एक तो एक समर्पित मार्ग है जो पहाड़ी के चारों ओर सर्पिल रूप से ऊपर की ओर जा रहा है, दूसरा: सीढ़ी चढ़ाने के लिए नक्काशी जैसी छोटी छत बाहर की ओर है। अब यदि पहला रास्ता रेखीय समय O (n) में पहुंच रहा है, तो दूसरा O (लॉग एन) है।

  2. एक एल्गोरिथ्म की कल्पना करें, जो एक पूर्णांक nको इनपुट के रूप में स्वीकार करता है और nतब आनुपातिक समय में पूरा होता है, यह O (n) या थीटा (n) है लेकिन यदि यह समय के अनुपात में चलता है number of digits or the number of bits in the binary representation on numberतो एल्गोरिथ्म O (लॉग एन) या थीटा में चलता है। (लॉग एन) समय।


कृपया संपादित करें। दोनों परिदृश्यों में "O (n) या थीटा (n)" है ...? इसके अलावा, मैंने इसे बहुत सुना है, आकार बनाम # अंक। क्या हम आकार === 128 के लिए n = 10000000 और अंक === 8 के लिए n = 10000000 कह रहे हैं? कृपया ध्यान दें।
कोडी

2

डिवाइड और कॉनकेड प्रतिमान में एल्गोरिथ्म जटिलता ओ (लॉगन) के हैं। यहां एक उदाहरण, अपने स्वयं के बिजली कार्य की गणना करें,

int power(int x, unsigned int y)
{
    int temp;
    if( y == 0)
        return 1;
    temp = power(x, y/2);
    if (y%2 == 0)
        return temp*temp;
    else
        return x*temp*temp;
}

से http://www.geeksforgeeks.org/write-ac-program-to-calculate-powxn/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.