मुझे इस बात से सहमत होना होगा कि जब आप O (log n) एल्गोरिथम देखते हैं तो यह बहुत अजीब होता है ... पृथ्वी पर वह लघुगणक कहाँ से आता है? हालाँकि, यह पता चला है कि कई अलग-अलग तरीके हैं जिनसे आप बिग-ओ नोटेशन में दिखा सकते हैं। यहाँ कुछ है:
एक निरंतर द्वारा विभाजित
कोई भी संख्या n लें; कहते हैं, 16. इससे पहले कि आप संख्या को एक से कम या एक के बराबर कितनी बार विभाजित कर सकते हैं? 16 के लिए, हमारे पास वह है
16 / 2 = 8
8 / 2 = 4
4 / 2 = 2
2 / 2 = 1
ध्यान दें कि यह पूरा होने के लिए चार कदम उठाता है। दिलचस्प बात यह है कि हमारे पास वह लॉग 2 16 = 4. हम्म् ... 128 क्या है?
128 / 2 = 64
64 / 2 = 32
32 / 2 = 16
16 / 2 = 8
8 / 2 = 4
4 / 2 = 2
2 / 2 = 1
इसने सात कदम उठाए, और लॉग 2 128 = 7. क्या यह एक संयोग है? नहीं! इसके लिए एक अच्छा कारण है। मान लीजिए कि हम एक संख्या n को 2 i बार से विभाजित करते हैं। फिर हम संख्या n / 2 मिलता है मैं । यदि हम i के मूल्य के लिए हल करना चाहते हैं, जहां यह मान अधिकतम 1 पर है, तो हम प्राप्त करते हैं
n / 2 i। 1
एन i 2 मैं
2 n ≤ i लॉग करें
दूसरे शब्दों में, यदि हम एक पूर्णांक को ऐसे लेते हैं जैसे कि मैं n लॉग 2 एन, तो n को आधे i समय में विभाजित करने के बाद हमारा मान 1 होगा जो कि सबसे अधिक है। सबसे छोटा i जिसके लिए यह गारंटी है वह लगभग 2 लॉग है n, इसलिए यदि हमारे पास एक एल्गोरिथ्म है जो 2 तक विभाजित होता है जब तक कि संख्या पर्याप्त रूप से छोटा नहीं हो जाती है, तो हम कह सकते हैं कि यह O (लॉग एन) चरणों में समाप्त हो जाता है।
एक महत्वपूर्ण विवरण यह है कि इससे कोई फर्क नहीं पड़ता कि आप किस एन को विभाजित कर रहे हैं (जब तक कि यह एक से अधिक हो); यदि आप निरंतर k से विभाजित करते हैं, तो यह 1. तक पहुँचने के लिए लॉग k n कदम उठाएगा। इस प्रकार किसी भी एल्गोरिथ्म को बार-बार कुछ अंश द्वारा इनपुट आकार को विभाजित करने पर O (लॉग एन) पुनरावृत्तियों को समाप्त करने की आवश्यकता होगी। उन पुनरावृत्तियों में बहुत समय लग सकता है और इसलिए शुद्ध रनटाइम को O (log n) की आवश्यकता नहीं होगी, लेकिन चरणों की संख्या लघुगणक होगी।
तो यह कहां से आता है? एक क्लासिक उदाहरण द्विआधारी खोज है , एक मूल्य के लिए एक क्रमबद्ध सरणी की खोज के लिए एक तेज एल्गोरिथ्म। एल्गोरिथ्म इस तरह काम करता है:
- यदि सरणी खाली है, तो वापस लौटें जो तत्व सरणी में मौजूद नहीं है।
- अन्यथा:
- सरणी के मध्य तत्व को देखें।
- यदि यह उस तत्व के बराबर है जिसे हम खोज रहे हैं, तो सफलता लौटें।
- यदि यह उस तत्व से अधिक है जिसे हम खोज रहे हैं:
- सरणी के दूसरे भाग को फेंक दें।
- दोहराना
- यदि यह उस तत्व से कम है जिसे हम खोज रहे हैं:
- सरणी के पहले भाग को फेंक दें।
- दोहराना
उदाहरण के लिए, सरणी में 5 को खोजने के लिए
1 3 5 7 9 11 13
हम पहले मध्य तत्व को देखेंगे:
1 3 5 7 9 11 13
^
चूंकि Since> ५, और चूंकि सरणी को क्रमबद्ध किया गया है, इसलिए हम एक तथ्य के लिए जानते हैं कि संख्या ५ सरणी के पिछले भाग में नहीं हो सकती है, इसलिए हम इसे छोड़ सकते हैं। यह छोड़ देता है
1 3 5
तो अब हम यहां मध्य तत्व को देखते हैं:
1 3 5
^
3 <5 के बाद से, हम जानते हैं कि 5 सरणी की पहली छमाही में दिखाई नहीं दे सकते हैं, इसलिए हम छोड़ने के लिए पहले आधे सरणी को फेंक सकते हैं
5
फिर से हम इस सरणी के मध्य को देखते हैं:
5
^
चूंकि यह ठीक वह संख्या है जिसकी हम तलाश कर रहे हैं, हम रिपोर्ट कर सकते हैं कि 5 वास्तव में सरणी में है।
तो यह कितना कुशल है? खैर, प्रत्येक पुनरावृत्ति पर हम शेष सरणी तत्वों के कम से कम आधे भाग को फेंक रहे हैं। सरणी खाली होते ही एल्गोरिथ्म बंद हो जाता है या हमें वह मूल्य मिल जाता है जो हम चाहते हैं। सबसे खराब स्थिति में, तत्व नहीं है, इसलिए हम सरणी के आकार को तब तक रोकते रहते हैं जब तक हम तत्वों से बाहर नहीं निकल जाते। इसमें कितना समय लग जाता है? अच्छी तरह से, जब से हम बार-बार सरणी को आधे से अधिक काटते रहते हैं, तो हम सबसे अधिक हे (लॉग एन) पुनरावृत्तियों में करेंगे, क्योंकि हम चलने से पहले सरणी को ओ (लॉग एन) से आधे से अधिक नहीं काट सकते हैं। सरणी तत्वों से बाहर।
डिवाइड-एंड-कॉनकेयर की सामान्य तकनीक का पालन करते हुए एल्गोरिदम (टुकड़ों में समस्या को काटते हुए, उन टुकड़ों को हल करते हुए, फिर समस्या को एक साथ रखकर) इस कारण से उनमें लॉगरिदमिक शब्द होते हैं - आप किसी वस्तु को काटते नहीं रह सकते O से अधिक (लॉग एन) बार। आप इस के एक महान उदाहरण के रूप में मर्ज प्रकार को देखना चाह सकते हैं ।
प्रोसेसिंग का मान एक बार में एक अंक होता है
आधार -10 नंबर n में कितने अंक हैं? ठीक है, अगर संख्या में k अंक हैं, तो हमारे पास सबसे बड़ा अंक 10 k का कुछ गुणन होगा । सबसे बड़ा k- अंकों की संख्या 999 ... 9, k समय है, और यह 10 k + 1 - 1 के बराबर है । नतीजतन, अगर हम जानते हैं कि n में k अंक हैं, तो हम जानते हैं कि n का मान है अधिकतम 10 k + 1 - 1. यदि हम n के संदर्भ में k को हल करना चाहते हैं, तो हम प्राप्त करते हैं
n + 10 k + 1 - 1
n + 1 ≤ 10 k + 1
लॉग 10 (n + 1) + k + 1
(लॉग 10 (n + 1)) - 1 + k
जिससे हमें पता चलता है कि k लगभग n का आधार -10 लघुगणक है। दूसरे शब्दों में, n में अंकों की संख्या O (लॉग एन) है।
उदाहरण के लिए, आइए दो बड़ी संख्याओं को जोड़ने की जटिलता के बारे में सोचें जो मशीन शब्द में फिट होने के लिए बहुत बड़ी हैं। मान लीजिए कि हमारे पास आधार संख्या 10 में प्रतिनिधित्व किए गए नंबर हैं, और हम संख्याओं को m और n कहेंगे। उन्हें जोड़ने का एक तरीका ग्रेड-स्कूल विधि के माध्यम से है - एक बार में अंकों को एक अंक से लिखें, फिर दाईं से बाईं ओर काम करें। उदाहरण के लिए, 1337 और 2065 को जोड़ने के लिए, हम संख्याओं को लिखकर शुरू करेंगे
1 3 3 7
+ 2 0 6 5
==============
हम अंतिम अंक जोड़ते हैं और 1 ले जाते हैं:
1
1 3 3 7
+ 2 0 6 5
==============
2
फिर हम दूसरे-से-अंतिम ("पारंगत") अंकों को जोड़ते हैं और 1 ले जाते हैं:
1 1
1 3 3 7
+ 2 0 6 5
==============
0 2
अगला, हम तीसरे-से-अंतिम ("एंटीपेनल्टीमेट") अंक जोड़ते हैं:
1 1
1 3 3 7
+ 2 0 6 5
==============
4 0 2
अंत में, हम चौथे-से-अंतिम ("उपदेशात्मक" ... I love English) अंक जोड़ते हैं:
1 1
1 3 3 7
+ 2 0 6 5
==============
3 4 0 2
अब, हमने कितना काम किया? हम कुल O (1) कार्य प्रति अंक (जो कि एक स्थिर राशि है) करते हैं, और O (अधिकतम {log n, log m}) कुल अंक हैं जिन्हें संसाधित करने की आवश्यकता है। यह कुल ओ (अधिकतम {लॉग एन, लॉग एम}) जटिलता देता है, क्योंकि हमें दो अंकों में प्रत्येक अंक पर जाने की आवश्यकता है।
कई एल्गोरिदम को एक ओ (लॉग एन) शब्द मिलता है जिसमें कुछ आधार में एक समय में एक अंक काम कर रहा है। एक क्लासिक उदाहरण मूलांक है , जो एक बार में एक अंक को पूर्णांक बनाता है। मूलांक सॉर्ट के कई स्वाद हैं, लेकिन वे आमतौर पर ओ (एन लॉग यू) में चलते हैं, जहां यू सबसे बड़ा संभव पूर्णांक है जिसे छांटा जा रहा है। इसका कारण यह है कि सॉर्ट का प्रत्येक पास O (n) समय लेता है, और सबसे बड़ी संख्या के O (लॉग U) अंकों को संसाधित करने के लिए कुल O (लॉग यू) पुनरावृत्तियों की आवश्यकता होती है। कई उन्नत एल्गोरिदम, जैसे कि गैबो का सबसे छोटा-पथ एल्गोरिथ्म या फोर्ड-फुलकर्ण अधिकतम-प्रवाह एल्गोरिथ्म का स्केलिंग संस्करण , उनकी जटिलता में लॉग टर्म है क्योंकि वे एक समय में एक अंक का काम करते हैं।
जैसा कि आप उस समस्या को कैसे हल करते हैं, इस बारे में आपके दूसरे प्रश्न के रूप में, आप इस संबंधित प्रश्न को देखना चाहते हैं जो एक अधिक उन्नत अनुप्रयोग की खोज करता है। यहां बताई गई समस्याओं की सामान्य संरचना को देखते हुए, आप अब बेहतर तरीके से जान सकते हैं कि जब आप जानते हैं कि समस्याओं के बारे में कैसे सोचना है, तो परिणाम में एक लॉग टर्म है, इसलिए जब तक आपने इसे नहीं दिया है, मैं इसका जवाब देखने की सलाह दूंगा। कुछ सोचा।
उम्मीद है की यह मदद करेगा!
O(log n)
के रूप में देखा जा सकता है: यदि आप समस्या का आकार दोगुना करते हैंn
, तो आपके एल्गोरिथ्म को केवल निरंतर चरणों की आवश्यकता होती है।