हम यह कैसे मान सकते हैं कि संख्याओं पर बुनियादी संचालन निरंतर समय लेता है?


73

आम तौर पर एल्गोरिदम में हम संख्याओं की तुलना, जोड़ या घटाव के बारे में परवाह नहीं करते हैं - हम मानते हैं कि वे समय में चलते हैं । उदाहरण के लिए, हम यह मानते हैं कि जब हम कहते हैं कि तुलना-आधारित छँटाई , लेकिन जब संख्याएँ रजिस्टर में फिट होने के लिए बहुत बड़ी होती हैं, तो हम सामान्यतः उनका प्रतिनिधित्व करते हैं, क्योंकि सरणियों के लिए मूल संचालन में प्रति तत्व अतिरिक्त गणना की आवश्यकता होती है।O(1)O(nlogn)

क्या कोई प्रमाण दिखा रहा है कि दो संख्याओं (या अन्य आदिम अंकगणितीय कार्यों) की तुलना O (1) में की जा सकती है O(1)? यदि नहीं, तो हम क्यों कह रहे हैं कि तुलना आधारित छँटाई O(nlogn) ?


मुझे इस समस्या का सामना करना पड़ा जब मैंने एक एसओ प्रश्न का उत्तर दिया और मुझे एहसास हुआ कि मेरा एल्गोरिथ्म O(n) क्योंकि जल्दी या बाद में मुझे बड़े-इंट से निपटना चाहिए, यह भी छद्म बहुपद समय एल्गोरिथ्म नहीं था, यह पी था P


3
यदि आप संख्याओं की तुलना करने की जटिलता को गिनने जा रहे हैं, तो आपको इनपुट के बिट आकार के संदर्भ में अपनी जटिलता सीमाएं भी लिखनी चाहिए। तो दिए गए N w -bit संख्या, इनपुट का बिट आकार n=Nw और छँटाई O(NwlogN)=O(nlogn) समय में की जा सकती है।
साशो निकोलेव

2
जटिलता अध्ययन के मूल रूप से दो "अहसास" या "शासन" हैं। आम तौर पर संचालन "निश्चित-चौड़ाई" संचालन के लिए माना जाता है, जो अधिकांश कंप्यूटर भाषाओं के लिए एक उचित अनुमान है, जिसमें फ़्लोटिंग पॉइंट जैसे 2-4 बाइट्स के लिए निश्चित-चौड़ाई संख्या प्रतिनिधित्व हैं (उदाहरण के लिए IEEE मानक)। फिर "मनमाना परिशुद्धता अंकगणित" होता है जहाँ संख्याओं का मनमाना आकार होता है और संचालन की जटिलता का अधिक सावधान / सटीक अध्ययन होता है। पूर्व संदर्भ लागू विश्लेषण में अधिक है और बाद के सैद्धांतिक / सार विश्लेषण में अधिक है। O(1)
vzn

जवाबों:


75

मेरे जैसे लोगों के लिए जो जीवित रहने के लिए एल्गोरिदम का अध्ययन करते हैं, गणना की 21 वीं सदी का मानक मॉडल पूर्णांक रैम है । मॉडल का उद्देश्य ट्यूरिंग मशीन मॉडल की तुलना में वास्तविक कंप्यूटर के व्यवहार को अधिक सटीक रूप से प्रतिबिंबित करना है। वास्तविक दुनिया के कंप्यूटर समानांतर हार्डवेयर का उपयोग करके निरंतर समय में कई-बिट पूर्णांक संसाधित करते हैं; मनमाने ढंग से पूर्णांक नहीं , लेकिन (क्योंकि शब्द आकार समय के साथ लगातार बढ़ता है) निश्चित आकार पूर्णांक नहीं, या तो।

मॉडल एक एकल पैरामीटर पर निर्भर करता है , जिसे शब्द आकार कहा जाता है । प्रत्येक मेमोरी एड्रेस में एक ही -bit पूर्णांक, या शब्द होता है । इस मॉडल में, इनपुट आकार इनपुट में शब्दों की संख्या है , और एल्गोरिथ्म के चलने का समय शब्दों पर संचालन की संख्या है । शब्दों पर मानक अंकगणितीय संचालन (जोड़, घटाव, गुणा, पूर्णांक विभाजन, शेष, तुलना) और बूलियन संचालन (बिटवाइड और, या, एक्सोर, शिफ्ट, रोटेट) को परिभाषा द्वारा समय की आवश्यकता होती है ।wwnO(1)

औपचारिक रूप से, शब्द आकारw इस मॉडल में एल्गोरिदम के विश्लेषण के प्रयोजनों के लिए एक स्थिर नहीं है । मॉडल को अंतर्ज्ञान के अनुरूप बनाने के लिए, हमें आवश्यकता होती है , अन्यथा हम पूर्णांक को एक शब्द में भी संग्रहीत नहीं कर सकते हैं । फिर भी, अधिकांश गैर-संख्यात्मक एल्गोरिदम के लिए, चलने का समय वास्तव में स्वतंत्र है , क्योंकि उन एल्गोरिदम अपने इनपुट के अंतर्निहित द्विआधारी प्रतिनिधित्व के बारे में परवाह नहीं करते हैं। मर्जेसट और हेप्सोर्ट दोनों समय में चलते हैं ; सबसे खराब स्थिति में ओ- समय में औसत दर्जे का 3-रन होता है। एक उल्लेखनीय अपवाद बाइनरी रेडिक्स सॉर्ट है, जो समय में चलता है ।wlog2nnwO(nlogn)O(n2)O(nw)

स्थापना हमें पारंपरिक लघुगणक लागत वाली रैम मॉडल देता है। लेकिन कुछ पूर्णांक रैम एल्गोरिदम बड़े शब्द आकारों के लिए डिज़ाइन किए गए हैं, जैसे कि एंडरसन एट अल के रैखिक-समय पूर्णांक छँटाई एल्गोरिथ्म , जिसके लिए ।w=Θ(logn)w=Ω(log2+εn)

व्यवहार में उत्पन्न होने वाले कई एल्गोरिदम के लिए, शब्द आकार केवल एक मुद्दा नहीं है, और हम (और कर सकते हैं) दूर सरल वर्दी-लागत रैम मॉडल पर वापस आते हैं। केवल गंभीर कठिनाई नेस्टेड गुणा से आती है, जिसका उपयोग बहुत बड़ी पूर्णांक बनाने के लिए बहुत जल्दी किया जा सकता है । यदि हम लगातार समय में मनमाने ढंग से पूर्णांकों पर अंकगणित कर सकते हैं , तो हम बहुवचन समय में PSPACE में किसी भी समस्या को हल कर सकते हैं ।w

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

हाँ, यह कीड़े का एक कैन है।


3
मुझे पता है कि मैं सिर्फ वोट करने वाला हूं, लेकिन खुद को यह कहने से नहीं रोक सकता: यह सबसे अच्छा जवाब है। चाल यह है कि (1) अंकगणितीय संचालन परिभाषा के अनुसार निरंतर समय है और यह ठीक है क्योंकि सिद्धांत में आप किसी भी मॉडल को चुन सकते हैं, और (2) आपके पास एक निश्चित मॉडल चुनने के लिए कुछ कारण होने चाहिए , और यह उत्तर बताता है कि वे क्या हैं।
rgrig

मैं rgig से सहमत हूं, (इसके अलावा मैं सिर्फ वोट देने वाला हूं), लेकिन एक छोटी सी समस्या है इनपुट का आकार इनपुट नंबरों से संबंधित नहीं है, उदाहरण के लिए यदि मेरे पास एक इनपुट है तो मेरी सबसे बड़ी संख्या , और यदि मैं गणना मॉडल का चयन करता हूं जिस तरह से मुझे पसंद है, यह छद्म बहुपद समय एल्गोरिथ्म का कारण बनता है , क्या मैं सही हूं? nmP

1
यदि आपके इनपुट में बिट्स से अधिक संख्याएँ हैं , तो मॉडल को फिट करने के लिए आपको उन्हें वास्तविक जीवन की तरह ही -bit chunks में विभाजित करना होगा । उदाहरण के लिए, यदि आपके इनपुट में और बीच पूर्णांक हैं , तो आपका वास्तविक इनपुट आकार । इस प्रकार, छद्म-बहुपद चलने का समय जैसे समय अभी भी इनपुट आकार में घातीय है जब बड़ा है। wwN0MNlogwM=(NlgM)/(lgw)O(NM)M
जेफ़े

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

1
@ लुईस: हाँ, बहुत: वोरोनोई आरेख, यूक्लिडियन सबसे छोटे रास्ते, पुनरावर्ती कटिंग, सरल विभाजन पेड़, .... लेकिन सबसे अच्छा उदाहरण गाऊसी उन्मूलन है, जो वास्तविक रैम मॉडल पर समय में चलता है (या) इकाई-लागत पूर्णांक रैम, लेकिन पूर्णांक RAM पर समय की आवश्यकता है ।O ( n 4 )O(n3)O(n4)
जेफ

24

यह सिर्फ संदर्भ पर निर्भर करता है। एल्गोरिदम की बिट स्तर की जटिलता से निपटने के दौरान , हम यह नहीं कहते हैं कि दो बिट्स संख्याओं का जोड़ , हम कहते हैं कि यह । इसी प्रकार गुणन आदि के लिए ।O ( 1 ) O ( n )nO(1)O(n)


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

1
@ सईदअमीर: यह सिर्फ इस्तेमाल की गई एन्कोडिंग पर निर्भर करता है। लेख में, उदाहरण के लिए, यदि इनपुट एक पूर्णांक है एकल एन्कोडिंग का उपयोग निर्दिष्ट, परीक्षण विभाजन केवल आवश्यकता होगी । यह इनपुट के आकार में बहुपद है! इसका मतलब यह है कि परीक्षण डिवीजन द्वारा फैक्टरिंग ? नहीं, एल्गोरिथ्म छद्म-बहुपद है । सामान्य बाइनरी एन्कोडिंग का उपयोग करके, आपको एक घातीय एल्गोरिथ्म मिलता है, फिर से इनपुट के आकार में। जैसा कि कहा गया है, ऐसा इसलिए होता है क्योंकि इनपुट में बिट्स की संख्या तेजी से इसकी एन्कोडिंग को बदलने में छोटी हो गई है। θ ( एन 1 / 2 ) पी एनnθ(n1/2)Pn
मासिमो काफ़ारो

वैसे, छद्म-बहुपद एल्गोरिदम वास्तव में उपयोगी हो सकता है, अगर वास्तविक उदाहरणों में उनके मापदंडों के परिमाण का क्रम यथोचित कम है। सबसे प्रसिद्ध उदाहरण संभवत: छद्म समस्या को हल करने के लिए छद्म-बहुपद एल्गोरिथ्म है।
मासिमो काफ़ारो

पहले मुझे यह उल्लेख करना चाहिए कि आपका संदर्भित विकी पृष्ठ अच्छा नहीं है क्योंकि इसका कोई अच्छा संदर्भ नहीं है, इसके अलावा मुझे नहीं पता कि आपको क्यों लगता है कि मैं छद्म-बहुपद समय एल्गोरिदम के बारे में बात कर रहा हूं, क्योंकि हो सकता है कि इनपुट आकार सामान्य रूप से नितंब हो। इस मामले में लेकिन मैं उनके बारे में बात नहीं कर रहा हूं, मैं ज्यादातर समस्याओं के बारे में बात कर रहा हूं जो आकार में हैं, यहां तक ​​कि इनपुट आकार की तरह, छंटाई की तरह, वैसे भी क्योंकि हम धोखा नहीं दे सकते हैं और कह सकते हैं कि एनपीसी समस्या मुझे लगता है कि हमें नहीं करना चाहिए सॉर्टिंग सिवाय इसके कि हमारे पास तुलना को नजरअंदाज करने के लिए कोई औपचारिक सबूत हो। पी ( एन लॉग एन )PPO(nlogn)

मैं इनपुट के आकार पर आपका ध्यान केंद्रित करने के लिए छद्म-बहुपद एल्गोरिदम पर चर्चा कर रहा हूं, ताकि आप यह दिखा सकें कि यह भ्रामक हो सकता है। यहाँ एक और उदाहरण है। आप इनपुट के रूप में एक प्राकृतिक संख्या दी जाती है, का कहना है कि , और कलन विधि एक पाश, जिसमें यह होता है चलाता के लिए समय आपरेशन पुनरावृत्तियों। इनपुट आकार के कार्य के रूप में मापा जाने वाला इस सरल लूप एल्गोरिथ्म की जटिलता । चूंकि इनपुट आकार है, इसलिए एल्गोरिथ्म इनपुट आकार में घातीय है! इसके बारे में सोचें। अब आप समझ सकते हैं कि "मैं सिर्फ संदर्भ पर निर्भर करता हूं" से मेरा क्या मतलब है। O ( 1 ) n O ( n ) = O ( 2 l g n ) l g nnO(1)nO(n)=O(2lgn)lgn
मास्सिमो कैफरो

16

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

वे ऐसा क्यों करते हैं, इसके बारे में अंतर्निहित प्रश्न का उत्तर देने के लिए : मैं कहूंगा कि इस मॉडल में कुछ प्रकार के कॉम्बिनेटरियल एल्गोरिदम के लिए बहुत अच्छी भविष्य कहनेवाला शक्ति है, जिसमें संख्या सभी "छोटे" हैं और, असली मशीनों पर, रजिस्टरों में फिट होते हैं।

संख्यात्मक एल्गोरिदम के बारे में निहित अनुवर्ती का जवाब देने के लिए: नहीं, सादे पुराने रैम मॉडल यहां मानक नहीं है। यहां तक ​​कि गाऊसी उन्मूलन के लिए कुछ देखभाल की आवश्यकता हो सकती है। आमतौर पर, रैंक अभिकलन के लिए, श्वार्ट्ज लेम्मा दर्ज करेगा (उदाहरण के लिए, यहां धारा 5 )। एक और विहित उदाहरण एलिपोसिड एल्गोरिथम का विश्लेषण है, जिसे विश्लेषण करने के लिए कुछ देखभाल की आवश्यकता होती है ।

और अंत में: लोगों ने पहले भी, हाल ही में स्ट्रिंग छँटाई के बारे में सोचा है

अद्यतन: इस प्रश्न के साथ समस्या यह है कि "हम" और "मान" इतने सटीक रूप से निर्दिष्ट नहीं हैं। मैं कहूंगा कि रैम मॉडल में काम करने वाले लोग संख्यात्मक एल्गोरिदम या जटिलता सिद्धांत नहीं कर रहे हैं (जहां विभाजन की जटिलता का निर्धारण एक मनाया गया परिणाम था )।


हम्म, लगता है कि यह एक दिलचस्प जवाब है ....

वहाँ एक कारण यह पूरी तरह से सवाल का जवाब नहीं है?
लुई

7

मुझे इसका कोई अध्ययन नहीं मिला, लेकिन कोज़ेन ने "एल्गोरिदम के डिजाइन और विश्लेषण" के परिचय में कहा है कि मॉडल प्रयोगात्मक अवलोकन को अधिक सटीक रूप से दर्शाता है [लॉग-कॉस्ट मॉडल की तुलना में] मध्यम डेटा के लिए आकार (क्योंकि गुणा वास्तव में समय की एक इकाई लेता है)। " वह इस पत्र का एक उदाहरण भी देता है कि मॉडल का दुरुपयोग कैसे किया जा सकता है।O ( 1 )O(1)O(1)

यह पूरी तरह से एक कानूनी मूल्यांकन (कम से कम नहीं है क्योंकि यह अजगर है) नहीं है, लेकिन यहां चलने से कुछ संख्या है python -mtimeit "$a * $b"के लिए $aमें और । (मैं 66 पर रुक गया क्योंकि जब पायथन सिंटैक्स पूर्णांक शाब्दिक स्वीकार करना बंद कर देता है और मुझे अपना मूल्यांकन कोड थोड़ा बदलना होगा, इसलिए मैंने नहीं किया: पी)।10{1,2,...,66}$b = 2*$a

प्रत्येक संख्या 10,000,000 छोरों का मतलब है, जहां यह प्रत्येक लूप में 3 रन का सबसे अच्छा समय लगता है। मैं त्रुटि बार या कुछ और करूँगा, लेकिन यह अधिक प्रयास होगा। : पी किसी भी मामले में, यह मेरे लिए बहुत स्थिर लग रहा है, यहां तक ​​कि - थोड़ा आश्चर्य की बात है, क्योंकि 43 है, जो मेरे संदेह को पुष्ट करता है कि शायद यह मूल्यांकन विशेष रूप से फर्जी है और मुझे इसे सी में करना चाहिए। लॉग 10 (1050log10(sys.maxint)


इस कार्य अनुभव में हो सकता है आप सही हैं (लेकिन मुझे यकीन नहीं है :), लेकिन उदाहरण के लिए इस पर एक नज़र डालें , ऐसा लगता है कि यह लेकिन यह नहीं है, यह एक व्यावहारिक समस्या भी है। क्या आपने कोई ऐसा पेपर देखा है जो कह रहा हो कि ? O(n)O(nlognlogm)

7

आप सही हैं, सामान्य तौर पर हम यह नहीं मान सकते कि वे ।O(1)

कड़ाई से बोलते हुए, यदि हम तुलनाओं का उपयोग करके एन संख्याओं के साथ एक सरणी को सॉर्ट करना चाहते हैं, और सबसे बड़ी संख्या एम है, तो सबसे खराब स्थिति में, प्रत्येक तुलना में बिट स्तर पर तुलना शामिल हो सकती है। और अगर हमारा एल्गोरिथ्म तुलना करता है, तो इसकी कुल जटिलता ।O(logM)O(NlogN)O(NlogNlogM)

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


O(logm) not , मेरा मतलब है कि सेट में सबसे बड़ी संख्या । O(logn)m

हां, लेकिन अगर छांटने के लिए N DIFFERENT नंबर हैं, तो सबसे बड़ा का आकार बिट्स है। O(logN)
इरेल सहगल-हलेवी

नहीं, यह इनपुट की संख्या से संबंधित नहीं है, अगर आप इसे इनपुट की संख्या से संबंधित चाहते हैं, तो मेरे पास इनपुट संख्या है और सबसे बड़ा हैn n nnnnn

आप सही हैं, मैंने अपना जवाब सही किया।
इरेल सहगल-हलेवी

4

मैं कहूंगा कि हम आमतौर पर O (1) अंकगणितीय ऑपरेशन को मानते हैं क्योंकि हम आमतौर पर 32-बिट पूर्णांक या 64-बिट पूर्णांक या IEEE 754 फ़्लोटिंग पॉइंट संख्या के संदर्भ में काम कर रहे हैं। ओ (1) शायद उस तरह के अंकगणित के लिए एक बहुत अच्छा सन्निकटन है।

लेकिन सामान्य तौर पर, यह सच नहीं है। सामान्य तौर पर आपको जोड़, घटाव, गुणा और भाग करने के लिए एक एल्गोरिथ्म की आवश्यकता होती है। बूलोस, बर्गेस और जेफ़रीज़ की संगणना और तर्क अलग-अलग औपचारिक प्रणालियों, रिकर्सिव फ़ंक्शंस और एबाकस मशीनों के एक जोड़े के संदर्भ में, कम से कम, मेरी 4 वीं संस्करण की प्रतिलिपि में समझने का एक तरीका है।

आप चर्च अंक के साथ घटाव और विभाजन के लिए लैम्ब्डा-कैलकुलस शर्तों को आसानी से देख सकते हैं कि उन दो कार्यों के लिए ओ (1) क्यों नहीं है। जोड़ और गुणा और घातांक के लिए यह देखना थोड़ा कठिन है, लेकिन यह वहां है यदि आप स्वयं चर्च न्यूमर्स के रूप पर विचार करते हैं।

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