सैद्धांतिक कंप्यूटर विज्ञान में एक तेज एल्गोरिथम का क्या अर्थ है?


18

यदि किसी समस्या A के लिए समय O(f(n)) एक एल्गोरिथ्म चल रहा है, और कोई व्यक्ति समय पर चल रहे एल्गोरिथम के साथ आता है, O(f(n)/g(n)) , जहाँ g(n)=o(f(n)) , क्या इसे पिछले एल्गोरिथ्म में सुधार माना जाता है?

क्या यह समझ में आता है, सैद्धांतिक कंप्यूटर विज्ञान के संदर्भ में, इस तरह के एक एल्गोरिथ्म के साथ आने के लिए?


4
"तेज़ एल्गोरिथम" से हमारा तात्पर्य है "विषम एल्गोरिथम"।
युवल फिल्मस

@YuvalFilmus "asymptotically" से आपका क्या तात्पर्य है
अपरिभाषित

1
समय में चल रहा है । o(f(n))
युवल फिल्मस 13

जवाबों:


26

नहीं, समय , जहाँ g ( n ) = o ( f ( n ) ) में चल रहा एक एल्गोरिथ्म , आवश्यक रूप से सुधार नहीं माना जाता है। उदाहरण के लिए, मान लीजिए कि f ( n ) = n और g ( n ) = 1 / n है । फिर ( एफ ( एन ) / जी ( )O(f(n)/g(n))g(n)=o(f(n))f(n)=ng(n)=1/nO ( f ( n ) ) = O ( n ) से अधिक खराब समय है।O(f(n)/g(n))=O(n2)O(f(n))=O(n)

एक एल्गोरिथ्म समय में चल रहे सुधार करने के लिए आदेश में , आप एक एल्गोरिथ्म समय में चल रहे के साथ आने की जरूरत है ( ( एन ) ) , यह है कि, समय में जी ( एन ) कुछ समारोह के लिए जी ( एन ) = ( एफ ( एन ) )f(n)o(f(n))g(n)g(n)=o(f(n))

यदि आप सभी जानते हैं कि एक एल्गोरिथ्म में चलता है, तो यह स्पष्ट नहीं है कि O ( g ( n ) ) में चल रहा एल्गोरिथ्म एक सुधार है, जो भी f ( n ) , g (O(f(n))O(g(n)) हैं। ऐसा इसलिए है क्योंकि बड़ा ओ केवल चलने के समय पर एक ऊपरी सीमा है। इसके बजाय, यह बुरी से बुरी हालत समय जटिलता पर विचार करना है, और एक बड़ा के रूप में यह अनुमान लगाने के लिए आम बात है Θ बल्कि सिर्फ एक बड़ा के रूप में की तुलना में हेf(n),g(n)ΘO


21
अपने पहले पैराग्राफ में लेना बेहतर हो सकता है । घटते हुए फंक्शन का उपयोग करने से थोड़ा-बहुत धोखा-वाई महसूस होता है। g(n)=1
डेविड रिचरबी

1
@DavidRicherby: शायद थोड़ा सा, लेकिन ओपी ने कभी नहीं कहा कि उनके पास में चलने वाला एक एल्गोरिथ्म था, इसलिए एकरसता को ग्रहण नहीं किया जा सकता है। O(g(n))
केविन

7
@ केविन ज़रूर लेकिन संदर्भ कंप्यूटर विज्ञान है और कंप्यूटर विज्ञान में, बड़े-ओ संकेतन का उपयोग आमतौर पर गैर-जिम्मेदार कार्यों के लिए किया जाता है। संभवतः पूछने वाला उन शब्दों में सोच रहा था।
डेविड रिचीर्बी

11

याद रखें कि अंकन विश्लेषण के लिए है कैसे कार्य इनपुट के विभिन्न आकारों, और विशेष रूप से बाहर गुणक कारकों पत्तियों के लिए बढ़ता है, निचले क्रम अवधि, और स्थिरांक।O(...)

मान लें कि आपके पास एक एल्गोरिथम है जिसका वास्तविक रनटाइम 1 n 2 + 2 n + 1 है (यह मानते हुए कि आप वास्तव में निर्देशों को गिन सकते हैं और सटीक समय और इतने पर जान सकते हैं, जो कि आधुनिक प्रणालियों में एक बड़ी धारणा है)। फिर मान लीजिए कि आप एक नए एल्गोरिदम के साथ आते हैं जो O ( n ) होता है , लेकिन वास्तविक रनटाइम 1000 n + 5000 है । यह भी मान लीजिए कि आप जानते हैं कि इस एल्गोरिदम का उपयोग करने के लिए सॉफ़्टवेयर को n > 10 का समस्या आकार कभी नहीं दिखाई देगा ।O(n2)1n2+2n+1O(n)1000n+5000n>10

तो, आपने कौन सा चुना होगा - एल्गोरिदम जो 15000 यूनिट समय लेने वाला है, या O ( n 2 ) वह है जो केवल 121 यूनिट लेने जा रहा है? अब यदि आपका सॉफ्टवेयर n > 100000 की समस्या के आकार को संभालने के लिए विकसित हुआ है , तो आप कौन सा विकल्प चुनेंगे ? यदि आपकी समस्या का आकार बहुत भिन्न होता है तो आप क्या करेंगे?O(n)O(n2)n>100000


2
"कभी भी n> 10 का एक समस्या आकार नहीं देखता" - तो हम ओ नोटेशन का उपयोग बिल्कुल नहीं करेंगे, हम करेंगे ...
AnoE

5
@ कोई तर्क के लिए सरल संख्या। एक ही तर्क लागू होता है कि आप 10 बनाम 1e5 की समस्या के आकार का विश्लेषण कर रहे हैं या 1e6 बनाम 1e9 का विश्लेषण कर रहे हैं।
ट्वेलबर्ग

1
@ सभी कंप्यूटर प्रोग्राम एक असीम रूप से बढ़ती समस्या के आकार को संभालने की कोशिश नहीं करते हैं। तो एक व्यापार बंद हो जाएगा। यही कारण है कि बड़ा-ओ सैद्धांतिक कंप्यूटर विज्ञान के लिए है, और वास्तविक कार्यक्रमों को बेहतर बनाने के लिए अवधारणाओं को लागू किया जा सकता है
mbomb007

बिल्कुल, @ mbomb007। प्रश्न का शीर्षक " सैद्धांतिक कंप्यूटर विज्ञान में एक तेज एल्गोरिथम का क्या अर्थ है ?" और उसके पास शरीर में यह है: "क्या यह समझ में आता है, सैद्धांतिक कंप्यूटर विज्ञान के संदर्भ में ..."।
एनोइ

@ अनुभव से, ओ नोटेशन का उपयोग तब किया जाता है जब n <10 हर समय! ऐसा नहीं है कि यह एक अच्छा विचार है ... लेकिन यह पूरी तरह से कुछ है जो किया है!
कॉर्ट अमोन -

5

आम तौर पर, इसका मतलब यह है कि इनपुट के किसी भी आकार के लिए यह काफी बड़ा है, पुराने एल्गोरिथ्म का सबसे खराब चलने वाला समय नए की तुलना में धीमा है। यही कारण है कि रीतिवाद के बराबर है है, जहां ग्राम नई एल्गोरिथ्म और के समय जटिलता है g(n)o(f(n))gf वर्ष का समय जटिलता।

कभी-कभी, हालांकि, कंप्यूटर वैज्ञानिक औसत-मामले के प्रदर्शन के बारे में परवाह करते हैं। क्लासिक उदाहरण quicksort है: इसकी बुरी से बुरी हालत क्रम है जबकि हम दूसरों कि में चला पता Θ ( n लॉग इन करें n )Θ(n2)Θ(nlogn) समय है, लेकिन यह अपनी अच्छी औसत दर-मामला चल रहा है समय की वजह से व्यवहार में व्यापक रूप से इस्तेमाल कर रहा है। यह अतिरिक्त रूप से उन मामलों में बहुत तेज़ी से चलाने के लिए दिया जा सकता है जो जंगली में सबसे अधिक बार होते हैं, जैसे कि सरणियाँ जो कि ज्यादातर सही क्रम में होती हैं।

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


1

"तेज़ एल्गोरिथम" क्या है, इसकी एक एकीकृत परिभाषा नहीं है। एक शासी निकाय नहीं है जो यह तय करता है कि एक एल्गोरिथ्म दूसरे की तुलना में तेज़ है या नहीं।

यह इंगित करने के लिए कि यह क्यों है, मैं दो अलग-अलग परिदृश्यों की पेशकश करना चाहता हूं जो इस नकली अवधारणा को प्रदर्शित करते हैं।

पहला उदाहरण एक एल्गोरिथ्म है जो अनियोजित डेटा की एक लिंक की गई सूची को खोजता है। यदि मैं एक सरणी के साथ एक ही ऑपरेशन कर सकता हूं, तो मुझे प्रदर्शन के बड़े ओह माप पर कोई बदलाव नहीं है। दोनों खोजें O (n) हैं। अगर मैं सिर्फ बड़े ओह मूल्यों को देखता हूं, तो मैं कह सकता हूं कि मैंने कोई सुधार नहीं किया। हालांकि, यह ज्ञात है कि सरणी लुकअप अधिकांश मामलों में लिंक की गई सूची को चलाने की तुलना में तेज़ है, इसलिए कोई यह तय कर सकता है कि एक एल्गोरिथ्म "तेज" बना, भले ही बड़ा ओह नहीं बदला।

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

Pick up the jar
Grab the lid
Unscrew the lid

बनाम

Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Grab the lid
Unscrew the lid

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

इसके विपरीत, हम RSA एन्क्रिप्शन को तोड़ने के लिए एक एल्गोरिथ्म पर विचार कर सकते हैं। फिलहाल, यह माना जाता है कि यह प्रक्रिया संभवतः O (2 ^ n) है, जहां n बिट्स की संख्या है। एक नए एल्गोरिथ्म पर विचार करें जो n ^ 100 तेजी से चलता है इसका मतलब है कि मेरी नई प्रक्रिया O (2 ^ n / n ^ 100) में चलती है। हालांकि, क्रिप्टोग्राफी की दुनिया में, बहुपद एल्गोरिथ्म के लिए एक बहुपद स्पीडअप पारंपरिक रूप से एक सैद्धांतिक गति के रूप में बिल्कुल नहीं सोचा गया है। सुरक्षा प्रमाणों को करते समय, यह माना जाता है कि एक हमलावर इनमें से एक गति अप की खोज कर सकता है, और इसका कोई प्रभाव नहीं होगा।

तो एक परिस्थिति में, हम O (n) को O (n) में बदल सकते हैं, और इसे तेज़ी से कॉल कर सकते हैं। एक अलग परिस्थिति में, हम एक O (2 ^ n) को O (2 ^ n / n ^ 100) में बदल सकते हैं, और दावा करते हैं कि कोई सार्थक गति नहीं थी। यही कारण है कि मैं कहता हूं कि "तेज एल्गोरिथ्म" के लिए कोई एकीकृत परिभाषा नहीं है। यह हमेशा प्रासंगिक रूप से निर्भर होता है।


1

मैं अभी तक टिप्पणी नहीं कर सकता, लेकिन मुझे लगता है कि वर्तमान उत्तर की तरह, सही और सूचनात्मक होने पर, इस प्रश्न का हिस्सा नहीं है। सबसे पहले, हमें एक अभिव्यक्ति बराबर बारे में जाने A(n)O(f(n))

 0cf< lim supnA(n)f(n)=cf

अब, हम मानते हैं कि हम एक के बारे में बात कर रहे हैं मनमाने ढंग से बढ़ रही है समारोह जहां लिम sup n जी ( एन ) = और हमें समारोह बनाने ( एन ) = ( एन )g(n)lim supng(n)=h(n)=f(n)g(n)

हमें दिया गया है कि "बेहतर" एल्गोरिदम का रन-टाइम ( एच ( एन ) ) में है । मान लीजिए कि मूल एल्गोरिथ्म A ( n ) का रन-टाइम O ( h ( n ) ) में भी है । इसे इस प्रकार लिखा जा सकता है।A(n)O(h(n))A(n)O(h(n))

 0ch< lim supnA(n)h(n)=ch

सीमाओं के नियमों का उपयोग करते हुए, हम यह भी लिख सकते हैं:

ch=lim supnA(n)h(n)=lim supnA(n)g(n)f(n)=cflim supng(n)

ch<cf=0

cf0A(n)O(h(n)).

In words, A(n) is an "improvement" on A(n) under the additional conditions that A(n)Θ(f(n)) and g(n) is arbitrarily increasing.

Additionally, this should show why the statement that A(n)O(f(n)) is not strong enough to draw a conclusion about whether A(n) is an "improvement." In short, A(n) could already be in O(h(n)).


1
Your limit should be limit superior.
Yuval Filmus

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