इसके अलावा समय की जटिलता


11

विकिपीडिया के अतिरिक्त समय की जटिलता को सूचीबद्ध करता है , जहां बिट्स की संख्या है।nnn

क्या यह एक कठोर सैद्धांतिक निम्न सीमा है? या यह सिर्फ वर्तमान सबसे तेजी से ज्ञात एल्गोरिथ्म की जटिलता है। मैं जानना चाहता हूं, क्योंकि इसके अलावा की जटिलता अन्य सभी अंकगणितीय संचालन और उन सभी एल्गोरिदम को रेखांकित करती है जो उनका उपयोग करते हैं।

क्या सैद्धांतिक रूप से असंभव है, एक अतिरिक्त एल्गोरिथ्म प्राप्त करना जो में चलता है ? या हम इसके अलावा रैखिक जटिलता के लिए बाध्य हैं।o(n)

जवाबों:


17

यदि आपका एल्गोरिथ्म से कम समय में asymptotically का उपयोग करता है , तो उसके पास यह पर्याप्त समय नहीं है कि वह जो संख्याएँ जोड़ रहा है, उनके सभी अंक पढ़ें। आपको लगता है कि आप बहुत बड़ी संख्या को संभाल रहे हैं (उदाहरण के लिए 8MB पाठ फ़ाइलों में संग्रहीत)। बेशक, संख्याओं के मूल्य की तुलना में इसके अलावा बहुत जल्दी किया जा सकता है ; यह समय पर चलता है , यदि योग का मान है।O ( लॉग ( N ) ) एनnO(log(N))N

इसका मतलब यह नहीं है कि आप चीजों को थोड़ा गति दे सकते हैं; यदि आपका प्रोसेसर प्रत्येक ऑपरेशन में 32 बिट्स को संभालता है, तो आप समय का उपयोग करते हैं, लेकिन यह अभी भी और । हे(एन)(एन)n32O(n)o(n)


सभी डेटा को सैद्धांतिक रूप से पढ़ना आवश्यक है। किसी भी दो संख्याओं और । गिना जा रहा है , में किया जा सकता , आपरेशन स्थानांतरण के माध्यम से। लगाना । उस पर विचार करे। आपको योग के लिए एक तेज़ अनुमान नहीं मिल सकता है, उस अनुमान को परिष्कृत करें जब तक कि यह सही न हो। संचालन से कम में ? , एक : एक , एक + 2 एक 2 एक हे ( 1 ) 0 एनab,a:ab,a+b2a2aO(1)0n
तोबी अलाफिन

3
हां, यह एक सैद्धांतिक आवश्यकता है, क्योंकि: इनपुट के प्रत्येक बिट का उपयोग आउटपुट में गैर-तुच्छ रूप से किया जाता है , जहां गैर-तुच्छ से मेरा मतलब है कि यह पहचान कार्य नहीं है। आपके उदाहरण में, क्या गणना समय में की जा सकती है, यह कम्प्यूटेशनल मॉडल पर निर्भर करता है: यदि को जोड़ना एक निरंतर-समय ऑपरेशन है, तो हाँ। आप राम पहुँच है, तो आप की जरूरत समय बिट के पते लिखने के लिए अगर आप पहले से जानते हैं की लंबाई , या समय आप सभी को पढ़ने के लिए है, तो पता लगाने के लिए। इस उदाहरण में, कई आउटपुट बिट्स इनपुट बिट्स के तुच्छ कार्य हैं। 2 a O ( 1 ) 0 O ( log ( n ) ) a O ( n ) a 2 a2a2aO(1)0O(log(n))aO(n)a2a
लेउवे विन्खुइजेन

मैं एक एल्गोरिथ्म कि की लंबाई पाता है में । यह बाइनरी सर्च का उपयोग करता है। हे ( लॉग एन )aO(logn)
तोबी अलाफिन

3
@TobiAlafin यदि आपका मॉडल रैम एड्रेसिंग का समर्थन करता है, तो आपकी बाइनरी खोज चरणों में चलती है , सही है। ट्यूरिंग मशीन पर, और मुख्य मेमोरी में लोड नहीं की गई टेक्स्ट फ़ाइल में, यह समय लेता है । या तो मामले में, आपके प्रश्न का उत्तर देने के लिए, लुकअप को तेज करने के लिए RAM के साथ या उसके बिना, आपके एल्गोरिथ्म को इनपुट के सभी बिट्स गणना करने के लिए देखना होगा । मान लीजिए कि यह नहीं था, और बिट्स के इनपुट पर , यह -बिट का निरीक्षण नहीं करता है । तब मैं उस बिट को फ्लिप कर सकता था, और यह गलत उत्तर देगा। O ( n ) a + b 42 6O(logn)O(n)a+b426
लेउवे विन्खुइजेन

1
मूल रूप से सभी ऑपरेशन इस कारण से । एकमात्र अपवाद यह है कि यदि आप किसी तरह से ऑर्डर किए गए डेटा-स्ट्रक्चर के साथ काम कर रहे हैं: उदाहरण के लिए, आपको यह जांचने के लिए पूरे बीएसटी का दौरा नहीं करना है कि क्या इसमें एक निश्चित मूल्य है, लेकिन यह केवल उन बीएसई के साथ आने वाले इनवेरिएंट्स के कारण ही सही है। Ω(n)
बाकुरी

7

किसी भी औपचारिक अर्थ को बनाने के लिए जटिलता विश्लेषण के लिए, आपको एक औपचारिक कम्प्यूटेशनल मॉडल निर्दिष्ट करना होगा जिसके भीतर ऑब्जेक्ट में एल्गोरिथ्म निष्पादित हो रहा है, या, बहुत कम से कम, एक लागत मॉडल , जो निर्दिष्ट करता है कि मूल संचालन क्या हैं और उनकी लागत।

अधिकांश संदर्भों में, अंकगणितीय संचालन को समय लेने के लिए माना जाता है । यह आमतौर पर उचित है, क्योंकि हम एल्गोरिदम की जटिलता में रुचि रखते हैं, भले ही इसमें शामिल संख्याएँ हों। इसे यूनिफ़ॉर्म कॉस्ट मॉडल कहा जाता है ।Θ(1)

यदि संख्या अनबिके बढ़ सकती हैं, या हम स्वयं के संचालन का विश्लेषण करने में रुचि रखते हैं, तो अंकगणित संचालन को लागत के लिए लिया जाता है , इनपुट के आकार के अनुपात में।Θ(|x|)

अब, क्या ऑपरेशंस की लागत कम हो सकती है? संभवतः, हालाँकि आपको एक कम्प्यूटेशनल मॉडल को औपचारिक रूप से परिभाषित करना होगा जिसमें यह हो सकता है।


1
एक अतिरिक्त उदाहरण के रूप में, एक कैरी लुक-फॉरवर्ड योजक लेता है, उचित सरलीकृत मान्यताओं के तहत, दो -bit संख्याओं के योग की गणना करने के लिए समय । एनΘ(logn)n
फेबियो सोमेन्ज़ी

3

इसके अलावा इनपुट दो मनमानी संख्या है। चूंकि वे मनमाने हैं, इसलिए आपको प्रत्येक बिट को पढ़ना चाहिए, और इसलिए एल्गोरिथ्म ।Ω(n)

अपने एल्गोरिथ्म की कल्पना करें कि प्रत्येक बिट को पढ़े बिना 1010100110 और 0010010110 को सफलतापूर्वक जोड़ा जाता है। आपके द्वारा एल्गोरिथ्म को मनमाना इनपुट जोड़ने में सक्षम होने के लिए , मुझे इनमें से किसी एक बिट को बेतरतीब ढंग से फ्लिप करने में सक्षम होना चाहिए, और एल्गोरिथ्म अभी भी एक सही (लेकिन अलग) आउटपुट उत्पन्न करता है। लेकिन अगर आपका एल्गोरिथ्म हर बिट नहीं पढ़ता है, तो यह कैसे बता सकता है कि फ़्लिप किया गया इनपुट मूल इनपुट से अलग था?


n

पूर्ण रूप से। आपको बस अपने एल्गोरिथ्म में "अनुमानित" का अर्थ निर्धारित करना होगा। उस परिभाषा के आधार पर, दो सबसे महत्वपूर्ण बिट्स को जोड़ना एक अनुमानित राशि हो सकती है, जिसे ओ (एन) समय में किया जा सकता है । जब आप "जोड़" एल्गोरिथ्म का उल्लेख करते हैं, तो मुझे लगता है कि हम सभी को इसका मतलब है कि इसका उत्तर सटीक होना चाहिए।
मुरादपिरेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.