क्या एल्गोरिथ्म विश्लेषण के जादू के पीछे एक प्रणाली है?


159

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

दूसरी ओर, एक अन्य सामान्य प्रश्न के उत्तर में कुछ उदाहरणों के साथ बड़ी तस्वीर (विशेष रूप से स्पर्शोन्मुख विश्लेषण के बारे में) की व्याख्या की गई है, लेकिन यह नहीं कि आपके हाथों को कैसे गंदा किया जाए।

क्या एल्गोरिदम की लागत का विश्लेषण करने के लिए एक संरचित, सामान्य विधि है? लागत चलने का समय (समय जटिलता), या लागत के कुछ अन्य उपाय हो सकते हैं, जैसे निष्पादित की गई संख्या, अंतरिक्ष जटिलता, या कुछ और।

इसे एक संदर्भ प्रश्न माना जाता है जिसका उपयोग शुरुआती लोगों को इंगित करने के लिए किया जा सकता है; इसलिए इसका व्यापक-से-सामान्य दायरा है। कृपया सामान्य रूप से ध्यान देने के लिए ध्यान दें, कम से कम एक उदाहरण द्वारा सचित्र उत्तर प्रस्तुत किए गए हैं लेकिन फिर भी कई स्थितियों को कवर करते हैं। धन्यवाद!


3
धन्यवाद के लेखक (ओं) के लिए जाना StackEdit यह इस तरह लंबे समय तक पोस्ट लिखने के लिए सुविधाजनक बनाने के लिए, और मेरे बीटा पाठकों FrankW , Juho , गाइल्स और सेबस्टियन मुझे खामियों के एक नंबर बाहर लौह मदद करने के लिए पहले ड्राफ्ट किया था।
राफेल

1
अरे @ राफेल, यह अद्भुत सामान है। मैंने सोचा कि मैं इसे पीडीएफ के रूप में एक साथ रखने के लिए चारों ओर प्रसारित करने का सुझाव दूंगा? इस तरह की बात वास्तव में उपयोगी संदर्भ बन सकती है।
hadsed

1
@hadsed: धन्यवाद, मुझे खुशी है कि यह आपके लिए उपयोगी है! अभी के लिए, मैं पसंद करता हूं कि इस पोस्ट का लिंक चारों ओर प्रसारित किया जाए। हालांकि, एसई उपयोगकर्ता सामग्री "एसीसी के तहत लाइसेंस द्वारा आवश्यक 3.0 के साथ लाइसेंस प्राप्त करना आवश्यक है" (पृष्ठ पाद देखें) ताकि कोई भी इससे एक पीडीएफ बना सके, जब तक कि एट्रिब्यूशन दिया जाता है।
राफेल

2
मैं इस पर विशेष रूप से सक्षम नहीं हूं, लेकिन क्या यह सामान्य है कि किसी भी एवेन्यू में मास्टर प्रमेय का कोई संदर्भ नहीं है ?
बबौ

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

जवाबों:


134

गणित के लिए कोड का अनुवाद

अधिक (कम या ज्यादा) औपचारिक परिचालन शब्दार्थों को देखते हुए आप एक एल्गोरिथ्म (छद्म) कोड का शाब्दिक रूप से एक गणितीय अभिव्यक्ति में अनुवाद कर सकते हैं जो आपको परिणाम देता है, बशर्ते आप अभिव्यक्ति को एक उपयोगी रूप में हेरफेर कर सकते हैं। इस के लिए अच्छी तरह से काम करता है additive इस तरह की तुलना, अदला-बदली, बयान, स्मृति तक पहुँचता है, चक्र कुछ सार मशीन की जरूरत है, और इतने पर की संख्या के रूप में लागत के उपाय।

उदाहरण: बुलबुले में तुलना

इस एल्गोरिथ्म पर विचार करें जो किसी दिए गए सरणी को क्रमबद्ध करता है A:

 bubblesort(A) do                   1
  n = A.length;                     2
  for ( i = 0 to n-2 ) do           3
    for ( j = 0 to n-i-2 ) do       4
      if ( A[j] > A[j+1] ) then     5
        tmp    = A[j];              6
        A[j]   = A[j+1];            7
        A[j+1] = tmp;               8
      end                           9
    end                             10
  end                               11
end                                 12

मान लें कि हम सामान्य सॉर्टिंग एल्गोरिदम विश्लेषण करना चाहते हैं, जो कि तत्व तुलना (पंक्ति 5) की संख्या की गणना करता है। हम तुरंत ध्यान देते हैं कि यह मात्रा सरणी की सामग्री पर निर्भर नहीं करती है A, केवल इसकी लंबाई । तो हम (नेस्टेड) -लूप का शाब्दिक अनुवाद कर सकते हैं (नेस्टेड) ​​रकम; लूप चर योग चर बन जाता है और सीमा खत्म हो जाती है। हमें मिला:nfor

Ccmp(n)=i=0n2j=0ni21==n(n1)2=(n2) ,

जहां पंक्ति 5 के प्रत्येक निष्पादन के लिए लागत है (जिसे हम गिनते हैं)।1

उदाहरण: बुलबुले में स्वैप

मैं द्वारा कि लाइनों को और इस सबप्रोग्राम (एक बार) को निष्पादित करने के लिए लागतों को । सी आई , जेPi,jijCi,j

अब मान लेते हैं कि हम स्वैप की गिनती करना चाहते हैं , अर्थात को कितनी बार निष्पादित किया जाता है। यह एक "बुनियादी ब्लॉक" है, यह एक उपप्रोग्राम है जिसे हमेशा परमाणु रूप से निष्पादित किया जाता है और इसकी कुछ निरंतर लागत होती है (यहां, )। ऐसे ब्लॉकों को अनुबंधित करना एक उपयोगी सरलीकरण है जिसे हम अक्सर बिना सोचे समझे लागू करते हैं या इसके बारे में बात करते हैं। 1P6,81

इसी तरह के अनुवाद के साथ जैसा कि हम निम्नलिखित सूत्र पर आते हैं:

Cswaps(A)=i=0n2j=0ni2C5,9(A(i,j))

( i , j ) P 5 , 9A(i,j) की -th पुनरावृत्ति से पहले सरणी की स्थिति को दर्शाता है ।(i,j)P5,9

ध्यान दें कि मैं पैरामीटर के रूप में बजाय उपयोग करता हूं ; हम जल्द ही देखेंगे कि क्यों। मैं मापदंडों के रूप में और नहीं जोड़ता क्योंकि लागत उन पर निर्भर नहीं करती है ( समान लागत मॉडल में , वह है); सामान्य तौर पर, वे बस हो सकता है।एन आई जे सी 5 , 9AnijC5,9

स्पष्ट रूप से, की लागत (मूल्यों और विशेष रूप से) की सामग्री पर निर्भर करती है , इसलिए हमें उस पर ध्यान देना होगा। अब हमारे सामने एक चुनौती है: हम " " को कैसे ? ठीक है, हम स्पष्ट की सामग्री पर निर्भरता बना सकते हैं :सी 5 , 9P5,9AA[j]A[j+1]C5,9A

C5,9(A(i,j))=C5(A(i,j))+{1,A(i,j)[j]>A(i,j)[j+1]0,else

किसी भी दिए गए इनपुट ऐरे के लिए, ये लागत अच्छी तरह से परिभाषित हैं, लेकिन हम अधिक सामान्य बयान चाहते हैं; हमें मजबूत धारणाएं बनाने की जरूरत है। आइए हम तीन विशिष्ट मामलों की जांच करें।

  1. सबसे ख़राब मामला

    योग को देखने और उस , हम लागत के लिए एक ऊपरी ऊपरी सीमा पा सकते हैं:C5,9(A(i,j)){0,1}

    Cswaps(A)i=0n2j=0ni21=n(n1)2=(n2)

    लेकिन क्या ऐसा हो सकता है , यानी इस ऊपरी सीमा के लिए है? जैसा कि यह पता चला है, हाँ: यदि हम युग्मक अलग-अलग तत्वों के व्युत्क्रमानुपाती सरणी को इनपुट करते हैं, तो प्रत्येक पुनरावृत्ति को स्वैप करना चाहिए। इसलिए, हमने बुलबुले के स्वैप की सटीक सबसे खराब स्थिति प्राप्त की है ।A

  2. सबसे अच्छा मामला

    इसके विपरीत, एक तुच्छ निचली सीमा है:

    Cswaps(A)i=0n2j=0ni20=0

    यह भी हो सकता है: एक सरणी पर जो पहले से ही सॉर्ट किया गया है, बुलबुले एक एकल स्वैप को निष्पादित नहीं करता है।

  3. औसत मामला

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

    फिर, हम इस तरह से अपनी लागत को फिर से लिख सकते हैं:

    E[Cswaps]=1n!Ai=0n2j=0ni2C5,9(A(i,j))

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

    E[Cswaps]=1n!Ainv(A)

    हमारे लिए भाग्यशाली, आक्रमणों की औसत संख्या होना निर्धारित किया गया है

    E[Cswaps]=12(n2)

    जो हमारा अंतिम परिणाम है। ध्यान दें कि यह बिल्कुल सबसे खराब लागत है।


  1. ध्यान दें कि एल्गोरिथ्म को सावधानीपूर्वक तैयार किया गया था ताकि i = n-1बाहरी लूप के साथ "अंतिम" पुनरावृत्ति हो जो कभी भी कुछ भी निष्पादित नहीं करता है।
  2. " अपेक्षित मूल्य" के लिए " " गणितीय संकेतन है, जो यहां औसत है।E
  3. हम इस तरह से सीखते हैं कि कोई भी एल्गोरिथ्म जो केवल पड़ोसी तत्वों को स्वैप नहीं करता है, बम्स्पोर्ट (यहां तक ​​कि औसत पर) की तुलना में समान रूप से तेज हो सकता है - ऐसे सभी एल्गोरिदम के लिए व्युत्क्रम की संख्या कम बाध्य है। यह उदा सम्मिलन सॉर्ट और चयन सॉर्ट पर लागू होता है ।

सामान्य विधि

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

हम वर्तमान स्थिति में के साथ निरूपित करते हैं (इसे चर असाइनमेंट के एक सेट के रूप में कल्पना करें)। जब हम राज्य में शुरू होने वाले एक कार्यक्रम को निष्पादित करते हैं , तो हम राज्य ( समाप्त ) प्रदान करते हैं ।ψ ψ / पीψPψψ/PP

  • व्यक्तिगत बयान

    केवल एक कथन को देखते हुए S;, आप इसे खर्च । यह आमतौर पर एक स्थिर कार्य होगा।CS(ψ)

  • भाव

    यदि आपके पास Eफ़ॉर्म की अभिव्यक्ति है E1 ∘ E2(कहते हैं, एक अंकगणितीय अभिव्यक्ति जहां इसके अतिरिक्त या गुणन हो सकती है, तो आप लागतों को बढ़ाकर जोड़ते हैं:

    CE(ψ)=c+CE1(ψ)+CE2(ψ)

    ध्यान दें कि

    • संचालन लागत नहीं स्थिर हो लेकिन के मूल्यों पर निर्भर हो सकता और और1 2cE1E2
    • भावों के मूल्यांकन से कई भाषाओं में स्थिति बदल सकती है,

    इसलिए आपको इस नियम के साथ लचीला होना पड़ सकता है।

  • अनुक्रम

    कार्यक्रमों Pके अनुक्रम के रूप में एक कार्यक्रम को देखते हुए Q;R, आप लागत को जोड़ते हैं

    CP(ψ)=CQ(ψ)+CR(ψ/Q)

  • सशर्त,

    Pफॉर्म के एक कार्यक्रम को देखते हुए if A then Q else R end, लागत राज्य पर निर्भर करती है:

    CP(ψ)=CA(ψ)+{CQ(ψ/A),A evaluates to true under ψCR(ψ/A),else

    सामान्य तौर पर, मूल्यांकन Aबहुत अच्छी तरह से राज्य को बदल सकता है, इसलिए व्यक्तिगत शाखाओं की लागत के लिए अद्यतन।

  • -लूप्स के लिए

    Pप्रपत्र के एक कार्यक्रम को देखते हुए for x = [x1, ..., xk] do Q end, लागत निर्दिष्ट करें

    CP(ψ)=cinit_for+i=1kcstep_for+CQ(ψi{x:=xi})

    जहां मान के लिए प्रसंस्करण से पहले राज्य है , अर्थात, के सेट होने के साथ पुनरावृत्ति के बाद ..., ।ψiQxixx1xi-1

    लूप रखरखाव के लिए अतिरिक्त स्थिरांक पर ध्यान दें; लूप चर बनाया जाना है ( ) और इसके मान ( ) को असाइन किया गया है । यह तब से प्रासंगिक हैcinit_forcstep_for

    • अगले गणना xiमहंगा हो सकता है और
    • एक forखाली शरीर के साथ -loop (जैसे एक बेहतरीन मामले कोई निश्चित मूल्य के साथ स्थापित करने में सरल बनाने के बाद) शून्य लागत नहीं है, तो यह पुनरावृत्तियों प्रदर्शन करती है।
  • जबकि-लूप्स

    Pप्रपत्र के एक कार्यक्रम को देखते हुए while A do Q end, लागत निर्दिष्ट करें

    CP(ψ) =CA(ψ)+{0,A evaluates to false under ψCQ(ψ/A)+CP(ψ/A;Q), else

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

    उदाहरण: इस छोटे एल्गोरिथ्म पर विचार करें:

    while x > 0 do    1
      i += 1          2
      x = x/2         3
    end               4
    

    नियम लागू करने से, हम प्राप्त करते हैं

    C1,4({i:=i0;x:=x0}) =c<+{0,x00c+=+c/+C1,4({i:=i0+1;x:=x0/2}), else

    व्यक्तिगत बयानों के लिए कुछ निरंतर लागतों के साथ । हम स्पष्ट रूप से मानते हैं कि ये राज्य ( और ) के मूल्यों पर निर्भर नहीं करते हैं ; यह "वास्तविकता" में सच हो सकता है या नहीं भी हो सकता है: ओवरफ्लो के बारे में सोचो!cix

    अब हमें लिए इस पुनरावृत्ति को हल करना होगा । हम ध्यान दें कि न तो पुनरावृत्तियों की संख्या लूप बॉडी की कीमत पर निर्भर करती है , इसलिए हम इसे छोड़ सकते हैं। हम इस पुनरावृत्ति से बचे हैं:C1,4i

    C1,4(x)={c>,x0c>+c+=+c/+C1,4(x/2), else

    प्राथमिक के साथ इसका मतलब है

    C1,4(ψ)=log2ψ(x)(c>+c+=+c/)+c> ,

    प्रतीकात्मक रूप से पूरे राज्य को फिर से प्रस्तुत करना; अगर , तो ।ψ={,x:=5,}ψ(x)=5

  • प्रक्रिया कॉल

    कुछ पैरामीटर (ओं) के लिए Pफॉर्म के एक कार्यक्रम को देखते हुए जहां (नामित) पैरामीटर के साथ एक प्रक्रिया है , लागतों को असाइन करेंM(x)xMp

    CP(ψ)=ccall+CM(ψglob{p:=x})

    फिर से अतिरिक्त स्थिर ध्यान दें (जो वास्तव में पर निर्भर हो सकता है !)। वास्तविक मशीनों पर लागू होने के कारण प्रक्रिया कॉल महंगे हैं, और कभी-कभी रनटाइम पर भी हावी होते हैं (जैसे कि फिबोनाची संख्या पुनरावृत्ति भोलेपन से मूल्यांकन करना)।ccallψ

    मैं आपके यहाँ राज्य के साथ हो सकने वाले कुछ शब्दार्थ मुद्दों पर चर्चा कर रहा हूँ। आप ग्लोबल स्टेट और ऐसे लोकल को प्रोसीड कॉल्स में अंतर करना चाहेंगे। चलो मान लेते हैं कि हम केवल वैश्विक राज्य से गुजरते हैं और Mएक नया स्थानीय राज्य प्राप्त करते हैं, जिसका मूल्य निर्धारित करके आरंभ किया pगया है x। इसके अलावा, xएक अभिव्यक्ति हो सकती है जिसे हम (आमतौर पर) इसे पारित करने से पहले मूल्यांकित करते हैं।

    उदाहरण: प्रक्रिया पर विचार करें

    fac(n) do                  
      if ( n <= 1 ) do         1
        return 1               2
      else                     3
        return n * fac(n-1)    4
      end                      5
    end                        
    

    नियम के अनुसार, हमें मिलता है:

    Cfac({n:=n0})=C1,5({n:=n0})=c+{C2({n:=n0}),n01C4({n:=n0}), else=c+{creturn,n01creturn+c+ccall+Cfac({n:=n01}), else

    ध्यान दें कि हम वैश्विक स्थिति की अवहेलना करते हैं, क्योंकि facस्पष्ट रूप से कोई भी एक्सेस नहीं करता है। इस विशेष पुनरावृत्ति को हल करना आसान है

    Cfac(ψ)=ψ(n)(c+creturn)+(ψ(n)1)(c+ccall)

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

यदि आप अब सोचते हैं कि यह बहुत जटिल है, तो सलाह दें: यह है ! किसी भी मॉडल में एल्गोरिदम की सटीक लागतों को प्राप्त करना जो वास्तविक मशीनों के करीब है क्योंकि रनटाइम भविष्यवाणियों (यहां तक ​​कि रिश्तेदार भी) को सक्षम करने के लिए एक कठिन प्रयास है। और यह भी वास्तविक मशीनों पर कैशिंग और अन्य बुरा प्रभाव पर विचार नहीं कर रहा है।

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

एसिम्प्टोटिक लागत पर एक नोट

आप आमतौर पर साहित्य में और जाले पर क्या पाएंगे "बिग-ओह विश्लेषण"। उचित शब्द असममित विश्लेषण है जिसका अर्थ है कि सटीक लागतों को प्राप्त करने के बजाय जैसा कि हमने उदाहरणों में किया है, आप केवल एक स्थिर कारक और सीमा में लागत देते हैं (मोटे तौर पर, "बड़े ")।n

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

यहाँ बताया गया है कि कैसे स्पर्शोन्मुख विश्लेषण इस दृष्टिकोण से संबंधित है।

  1. प्रमुख परिचालन (जो लागत को प्रेरित करते हैं) की पहचान करें , यह वह ऑपरेशन है जो अक्सर होता है (स्थिर कारकों तक)। बुलबुले के उदाहरण में, एक संभावित विकल्प लाइन 5 में तुलना है।

    वैकल्पिक रूप से, अपने अधिकतम (ऊपर से) सम्मान के द्वारा प्राथमिक संचालन के लिए सभी स्थिरांक बाध्य करें। उनके न्यूनतम (नीचे से) और सामान्य विश्लेषण करते हैं।

  2. लागत के रूप में इस ऑपरेशन के निष्पादन की गणना का उपयोग करके विश्लेषण करें।
  3. सरलीकरण करते समय, अनुमान लगाने की अनुमति दें। ध्यान रखें कि केवल ऊपर से अनुमान लगाने की अनुमति दें यदि आपका लक्ष्य एक ऊपरी बाध्य ( ) सम्मान है। नीचे से यदि आप कम सीमा ( ) चाहते हैं।OΩ

सुनिश्चित करें कि आप Landau प्रतीकों का अर्थ समझते हैं । याद रखें कि इस तरह की सीमाएं सभी तीन मामलों के लिए मौजूद हैं ; का उपयोग करने से सबसे खराब स्थिति का विश्लेषण नहीं होता है।O

आगे की पढाई

एल्गोरिथम विश्लेषण में कई और चुनौतियां और चालें हैं। यहाँ कुछ पढ़ने की सिफारिश की गई है।

इस तरह की तकनीकों का उपयोग करने वाले आस पास कई प्रश्न टैग किए गए हैं ।


1
शायद कुछ उदाहरण और उदाहरण के लिए सिद्धांत (और उसके विस्तार ) स्पर्शोन्मुख विश्लेषण के लिए
निकोस एम।

@ निकोसम यह यहां के दायरे से बाहर है (ऊपर दिए गए प्रश्न पर टिप्पणी भी देखें)। ध्यान दें कि मैं पुनरावृत्ति को हल करने के बारे में हमारे संदर्भ पोस्ट से लिंक करता हूं जो मास्टर प्रमेय एट अल पेश करता है।
राफेल

@ निकोस एम: मेरी $ 0.02: जबकि मास्टर प्रमेय कई पुनरावृत्ति के लिए काम करता है, यह कई अन्य लोगों के लिए नहीं होगा; पुनरावृत्ति को हल करने के लिए मानक तरीके हैं। और ऐसे एल्गोरिदम हैं जिनके लिए हमें रनिंग टाइम देने की पुनरावृत्ति भी नहीं होगी; कुछ उन्नत गिनती तकनीकें आवश्यक हो सकती हैं। अच्छी गणित पृष्ठभूमि वाले किसी व्यक्ति के लिए, मैं सेडग्विक और फ्लाजोलेट की एक्साइटिंग पुस्तक, "एनालिसिस ऑफ अल्गोरिद्म" का सुझाव देता हूं, जिसमें "पुनरावृत्ति संबंध", "कार्य उत्पन्न करना", और "विषम अलंकारिक विभाजन" जैसे अध्याय हैं। डेटा संरचनाएं कभी-कभी उदाहरण के रूप में दिखाई देती हैं, और विधियों
जय

@Raphael I खिचड़ी भाषा का कोई भी उल्लेख इस शब्द के लिए नहीं हो सकता है "शब्दशः कोडिंग टू मैथमेटिक्स" विधि जो ऑपरेशनल शब्दार्थ पर आधारित है। क्या आप पुस्तक, कागज या लेख के लिए कोई संदर्भ प्रदान कर सकते हैं जो इससे अधिक औपचारिक रूप से संबंधित है। या मामले में यह आपके द्वारा विकसित किया गया था, क्या आपके पास गहराई में कुछ और है?
व्यावर्न ६६६

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

29

बयानों के निष्पादन मायने रखता है

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

प्रक्रिया

यह सिद्धांत में काफी सरल है:

  1. प्रत्येक कथन को एक नाम / संख्या निर्दिष्ट करें।
  2. हर कथन कुछ लागत असाइन करें ।SiCi
  3. प्रत्येक कथन को निष्पादित करने की संख्या निर्धारित करें ।Siei
  4. कुल लागत की गणना करें

    C=ieiCi

आप किसी भी बिंदु पर अनुमान और / या प्रतीकात्मक मात्रा सम्मिलित कर सकते हैं, सम्मान को कमजोर कर सकते हैं। तदनुसार परिणाम को सामान्य बनाना।

ध्यान रखें कि चरण 3 मनमाने ढंग से जटिल हो सकता है। यह आम तौर पर वहाँ होता है कि आपको परिणाम प्राप्त करने के लिए (asymptotic) अनुमानों जैसे कि " " में काम करना होगा।e77O(nlogn)

उदाहरण: गहराई-पहली खोज

निम्नलिखित ग्राफ-ट्रैवर्सल एल्गोरिथ्म पर विचार करें:

dfs(G, s) do
  // assert G.nodes contains s
  visited = new Array[G.nodes.size]     1
  dfs_h(G, s, visited)                  2
end 

dfs_h(G, s, visited) do
  foo(s)                                3
  visited[s] = true                     4

  v = G.neighbours(s)                   5
  while ( v != nil ) do                 6
    if ( !visited[v] ) then             7
      dfs_h(G, v, visited)              8
    end
    v = v.next                          9
  end
end

हम मानते हैं कि (अप्रत्यक्ष) ग्राफ नोड्स पर आसन्न सूचियों द्वारा दिया गया है । चलो किनारों की संख्या हो।{0,,n1}m

बस एल्गोरिथ्म को देखकर, हम देखते हैं कि कुछ बयानों को दूसरों के समान ही निष्पादित किया जाता है। हम कुछ प्लेसहोल्डर्स का परिचय , और के निष्पादन की गणना के लिए करते हैं :ABCei

i123456789eiAABBBB+CCB1C

विशेष रूप से, क्योंकि पंक्ति 8 में प्रत्येक पुनरावर्ती कॉल लाइन 3 में कॉल का कारण बनता है (और एक मूल कॉल के कारण होता है )। इसके अलावा, क्योंकि स्थिति को पुनरावृत्ति के अनुसार एक बार होता है, लेकिन फिर इसे छोड़ने के लिए एक बार और।e8=e31foodfse6=e5+e7while

यह स्पष्ट है कि । अब, एक शुद्धता प्रमाण के दौरान हम दिखाते हैं कि नोड के अनुसार एक बार निष्पादित किया गया है; वह है, । लेकिन फिर, हम प्रत्येक आसन्न सूची पर ठीक एक बार पुनरावृति करते हैं और हर किनारे पर कुल दो प्रविष्टियाँ होती हैं (प्रत्येक घटना नोड के लिए); हमें कुल मिलाकर पुनरावृत्तियों मिलते हैं । इसका उपयोग करते हुए, हम निम्नलिखित तालिका प्राप्त करते हैं:A=1fooB=nC=2m

i123456789ei11nnn2m+n2mn12m

यह हमें वास्तव में कुल लागत की ओर ले जाता है

C(n,m)=(C1+C2C8)+ n(C3+C4+C5+C6+C8)+ 2m(C6+C7+C9).

लिए उपयुक्त मानों को तत्काल करके हम अधिक ठोस लागत प्राप्त कर सकते हैं। उदाहरण के लिए, यदि हम मेमोरी एक्सेस (प्रति शब्द) की गणना करना चाहते हैं, तो हम उपयोग करेंगेCi

i123456789Cin00110101

और पाओ

Cmem(n,m)=3n+4m

आगे की पढाई

मेरे अन्य उत्तर के तल पर देखें ।


8

एल्गोरिथम विश्लेषण, जैसे कि प्रमेय साबित करना, काफी हद तक एक कला है (जैसे कि सरल कार्यक्रम हैं (जैसे Collatz समस्या ) कि हम नहीं जानते कि विश्लेषण कैसे किया जाए)। हम एक एल्गोरिथ्म जटिलता की समस्या को गणितीय रूप में परिवर्तित कर सकते हैं, जैसा कि राफेल द्वारा बड़े पैमाने पर उत्तर दिया गया है , लेकिन तब ज्ञात कार्यों के संदर्भ में एक एल्गोरिथ्म की लागत पर एक बाध्यता व्यक्त करने के लिए, हम निम्नलिखित हैं:

  1. ऐसी तकनीकों का उपयोग करें जिन्हें हम मौजूदा विश्लेषणों से जानते हैं, जैसे कि पुनरावृत्ति के आधार पर सीमाएं जिन्हें हम समझते हैं या योग / अभिन्न हम गणना कर सकते हैं।
  2. एल्गोरिथ्म को ऐसी चीज़ में बदलें जिसे हम जानते हैं कि विश्लेषण कैसे करें।
  3. पूरी तरह से नए दृष्टिकोण के साथ आओ।

1
मुझे लगता है कि मैं यह नहीं देख रहा हूं कि यह कैसे कुछ भी है जो उपयोगी और नया है, अन्य उत्तरों के ऊपर और ऊपर। तकनीकों को पहले से ही अन्य उत्तरों में वर्णित किया गया है। यह मुझे सवाल के जवाब की तुलना में टिप्पणी की तरह लगता है।
डीडब्ल्यू

1
मैं हिम्मत करता हूं कि अन्य उत्तर साबित करते हैं कि यह एक कला नहीं है । आप इसे करने में सक्षम नहीं हो सकते हैं (यानी गणित), और कुछ रचनात्मकता (जैसा कि ज्ञात गणित को कैसे लागू किया जाए) भले ही आप आवश्यक हों, लेकिन यह किसी भी कार्य के लिए सही है । मुझे लगता है कि हम यहां नया गणित बनाने की ख्वाहिश नहीं रखते। (। वास्तव में, इस सवाल का resp इसके जवाब पूरी प्रक्रिया रहस्यमय नहीं रखना चाहती थीं।)
राफेल

4
@ रिपेल अरी "कार्यक्रम द्वारा निष्पादित निर्देशों की संख्या" (जो कि आपके उत्तर के पते है) के बजाय बाध्यता के रूप में एक पहचानने योग्य फ़ंक्शन के साथ आने के बारे में बात कर रहा है। सामान्य स्थिति है एक कला - कोई एल्गोरिथ्म है कि सभी एल्गोरिदम के लिए एक nontrivial बाध्य के साथ आ सकता है। सामान्य मामला, हालांकि, ज्ञात तकनीकों का एक सेट है (जैसे मास्टर प्रमेय)।
गिल्स

@ गिल्स यदि वह सब कुछ जिसके लिए कोई एल्गोरिथ्म मौजूद नहीं है एक कला, शिल्पकार (विशेष रूप से प्रोग्रामर में) को बदतर भुगतान किया जाएगा।
राफेल

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