आप गतिशील प्रोग्रामिंग के लिए उपयुक्त होने के रूप में एक समस्या की पहचान कैसे करते हैं?


19

मैं हाल ही में गतिशील प्रोग्रामिंग पर पढ़ रहा हूं। किसी ऐसे व्यक्ति से सुनना चाहते हैं जो खरोंच से शुरू हुआ था और अब डीपी समस्याओं को पहचानने और हल करने में बहुत अच्छा है। मैं इन समस्याओं को डीपी के रूप में पहचानने और संक्षिप्त समाधान तैयार करने में संघर्ष कर रहा हूं।

मैं ज्यादातर शुरुआत डीपी समस्याओं और एमआईटी संसाधनों आदि से गुजरा हूं

जवाबों:


17

मैं एक भौतिकी पृष्ठभूमि से आता हूं, और इस प्रकार, बहुत सारे गणित। मैं समस्याओं को अच्छी तरह से पुनरावर्ती / गतिशील प्रोग्रामिंग समाधानों के लिए अनुकूलता के साथ प्रेरण द्वारा समानताएं ढूंढना आसान समझता हूं ।

प्रेरण के प्रमाण में आपके दो भाग हैं:

  • आप यह साबित करते हैं कि अगर कुछ iteration N के लिए सही है, तो यह iteration N + 1 के लिए भी सही है
  • आप साबित करते हैं कि यह 1 पुनरावृत्ति के लिए सच है

पुनरावर्ती प्रोग्रामिंग / गतिशील प्रोग्रामिंग में:

  • आप एक बाहर निकलने की स्थिति की पहचान करते हैं (उदाहरण के लिए, आप 1 पुनरावृत्ति के लिए हार्ड वायर को हल करते हैं)
  • आप पुनरावृत्ति N के लिए समाधान की गणना करते हैं

इसलिए, जैसा कि अन्य ने उत्तर दिया है, यह अनुभव और संकेत लेने का विषय है, लेकिन आप मार्गदर्शन करने के लिए अन्य कौशल का फिर से उपयोग कर सकते हैं। उसके बाद, आपको हमेशा उन दो हिस्सों की आवश्यकता होती है जिनका मैंने उल्लेख किया था: यदि आप नहीं करते हैं, तो यह काम नहीं करेगा।

उदाहरण के लिए, एक सेट के सभी क्रमपरिवर्तन उत्पन्न करने के लिए:

  • बाहर निकलने की स्थिति: यदि आपके पास केवल एक ही तत्व है, तो उसे वापस कर दें
  • पुनरावर्तन: एन आइटम के एक सेट के क्रमपरिवर्तन वे तत्व हैं जिन्हें आप प्रत्येक तत्व को चुनकर प्राप्त करते हैं और तत्व को हटाकर आपके द्वारा प्राप्त किए गए सबसेट के सभी एन -1 सेटों के कई एन -1 सेटों के साथ संयोजन करते हैं।

8

अधिकांश गतिशील प्रोग्रामिंग समस्याओं को संस्मरण के माध्यम से हल किया जा सकता है। संस्मरण आम तौर पर दोनों अधिक सहज और कोड के लिए आसान है। आपको डीपी के बजाय संस्मरण के संदर्भ में सोचने में मदद मिल सकती है।

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

टी एल; डॉ; संस्करण: आपको संस्मरण के संदर्भ में गतिशील प्रोग्रामिंग को समझना आसान हो सकता है।

StackOverflow भी देखें : डायनेमिक प्रोग्रामिंग और मेमोइज़ेशन: बॉटम-अप बनाम टॉप-डाउन एप्रोच


4

गतिशील प्रोग्रामिंग दो चीजों के बारे में है:

  1. इष्टतम सबस्ट्रक्चर
    बड़े समाधान छोटे समाधानों से प्राप्त किए जा सकते हैं; हल करना द्विदिश नहीं है।

  2. अतिप्रोफ़ेल्स को ओवरलैप करना
    छोटे समाधान कई बार पुन: उपयोग किए जाएंगे। यदि उपप्रकार सभी ओवरलैप नहीं करते हैं, तो आपको डीपी / मेमॉज़ेशन से लाभ नहीं होता है; आपके पास क्या है इसके बजाय विभाजित और जीतना है

डीपी समस्याओं के लिए सामान्य दृष्टिकोण है:

  • एक भोले पुनरावर्ती या पुनरावृत्त संस्करण लिखें जो काम करता है।

  • ध्यान दें कि फ़ंक्शन अनावश्यक कार्य कर रहा है।

  • उस निरर्थक कार्य को करने से बचने का एक तरीका खोजें, जो अक्सर स्मरण द्वारा किया जाता है।


ये सभी एक सैद्धांतिक दृष्टिकोण से सच हैं। त्वरित पहचान पर अधिक परिचित होने के लिए IMO को थोड़ा और अभ्यास करने की आवश्यकता है :)
user110036

2

मैंने एक भी डायनेमिक प्रोग्रामिंग सॉल्वर लागू नहीं किया था - मेरी पृष्ठभूमि को गणित / भौतिकी / संख्यात्मक कंप्यूटिंग लागू किया गया है, सीएस नहीं - कुछ साल पहले तक जब मैंने प्रोजेक्ट यूलर समस्याएं करना शुरू किया था । DP- सॉल्व करने योग्य समस्याएँ (जैसे 76 , 158 , 161 , 242), लेकिन वहाँ बहुत अधिक हैं) मेरी पसंदीदा तरह से बहुत अधिक निकला। जब आप एक उपयोगी तकनीक होगी तो आप निश्चित रूप से बेहतर हो जाएंगे: मूल रूप से उन चीजों की तलाश करें जो ऐसा लगता है कि वे किसी प्रकार के पुनरावर्ती, विभाजित-और-जीत के दृष्टिकोण से हल हो सकते हैं, जहां आवश्यक रास्ते के विस्फोट को रोकना संभव है आवर्ती उपप्रकारों को पहचानकर और पहले गणना किए गए परिणामों का पुन: उपयोग करके पता लगाया जाएगा; याद रखने के लिए न्यूनतम राज्य वेक्टर की पहचान करने में सक्षम होना - और क्या "अप्रासंगिक" इतिहास मिटाया जा सकता है - महत्वपूर्ण कदम है।

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