मैं अपने पुनरावर्ती एल्गोरिथ्म की समय जटिलता को कम करने के लिए गतिशील प्रोग्रामिंग का उपयोग कब कर सकता हूं?


13

डायनेमिक प्रोग्रामिंग एक पुनरावर्ती एल्गोरिदम को निष्पादित करने के लिए आवश्यक समय को कम कर सकता है। मुझे पता है कि गतिशील प्रोग्रामिंग एल्गोरिदम के समय की जटिलता को कम करने में मदद कर सकता है। क्या सामान्य स्थितियां ऐसी हैं कि अगर एक पुनरावर्ती एल्गोरिथ्म से संतुष्ट है कि गतिशील प्रोग्रामिंग का उपयोग एल्गोरिथ्म की समय जटिलता को कम करेगा? मुझे गतिशील प्रोग्रामिंग का उपयोग कब करना चाहिए?


जवाबों:


9

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

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


तब काउंटर यह होगा कि किसी भी समय संस्मरण का स्थान जटिलता इनपुट डेटा (शायद सिर्फ> ओ (एन)) से अधिक है, संभावना है कि गतिशील प्रोग्रामिंग मदद करने वाली नहीं है। यही है, जब आप समान रूप से समान स्थिति का सामना करते हैं।
edA-qa मोर्ट-ओर-वाई

1
संस्मरण! = गतिशील प्रोग्रामिंग!
राफेल

1
मुझे नहीं लगता कि हम ऐसा कह रहे हैं, लेकिन सवाल समय की जटिलता को कम करने का संकेत देता है। गतिशील प्रोग्रामिंग अपने आप ही समस्या का विभाजन कर देती है। गतिशील प्रोग्रामिंग + संस्मरण जहां संभव हो, समय की जटिलता में सुधार करने का एक सामान्य तरीका है
edA-qa मोर्ट-ओर-वाई

@ edA-qamort-ora-y: सही है। मुझे लगता है कि यह स्पष्ट रूप से इंगित करना महत्वपूर्ण है, क्योंकि ओपी स्पष्ट रूप से अवधारणाओं को भ्रमित / मिश्रित करता है।
राफेल

8

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

  • साइड इफेक्ट नहीं है और
  • केवल इसके मापदंडों पर निर्भर करता है (अर्थात कुछ राज्य पर नहीं)।

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

(0)=0(1)=1(n+2)=(n+1)+(n), n0

जब भोलेपन से मूल्यांकन किया जाता है, (n)(n+1)

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

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


डायनेमिक प्रोग्रामिंग एक पूरी तरह से अन्य जानवर है। यह संपत्ति के साथ समस्याओं पर लागू होता है

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

यह आमतौर पर (स्पष्ट रूप से) निहित है जब लोग बेलमैन के सिद्धांत को इष्टतमता का आह्वान करते हैं ।

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


क्या आप कह रहे हैं कि ऐसे मामले हैं जहाँ डायनेमिक प्रोग्रामिंग बेहतर समय जटिलता का कारण बनेगी, लेकिन मेमोएज़ेशन मदद नहीं करेगा (या कम से कम उतना नहीं)? क्या आपके पास कोई उदाहरण है? या आप सिर्फ इतना कह रहे हैं कि डायनामिक प्रोग्रामिंग केवल समस्याओं के सबसेट के लिए उपयोगी है जहां ज्ञापन है?
svick

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

यदि आपके पास कई प्रोसेसर उपलब्ध हैं तो गतिशील प्रोग्रामिंग वास्तविक-दुनिया के प्रदर्शन को बेहतर बनाता है क्योंकि आप भागों को समानांतर कर सकते हैं। हालांकि यह वास्तव में समय की जटिलता को नहीं बदलता है।
eda-qa मोर्ट-ओर-वाई

@ edA-qamort-ora-y: यह किसी भी पुनरावृत्ति के लिए सही है । हालांकि, यह स्पष्ट नहीं है कि यह अच्छा स्पीडअप बनाता है, क्योंकि प्रोसेसर प्रोसेसर की सीमाओं पर मेमॉज़ेशन कम कुशल है।
राफेल

सुधार: निष्कासन डीपी-पुनरावृत्ति भोलेपन की तुलना में तेजी से (बहुत) अभी भी हो सकता है; सीएफ यहाँ
राफेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.