डायनेमिक प्रोग्रामिंग आपको एल्गोरिथम डिज़ाइन के बारे में सोचने का एक तरीका देता है। यह अक्सर बहुत मददगार होता है।
संस्मरण संबंधों को कोड में बदलने के लिए संस्मरण और नीचे-ऊपर के तरीके आपको एक नियम / विधि प्रदान करते हैं। संस्मरण एक अपेक्षाकृत सरल विचार है, लेकिन सबसे अच्छे विचार अक्सर होते हैं!
डायनेमिक प्रोग्रामिंग आपको अपने एल्गोरिथ्म के चलने के समय के बारे में सोचने का एक संरचित तरीका देता है। चलने का समय मूल रूप से दो संख्याओं द्वारा निर्धारित किया जाता है: आपके द्वारा हल किए जाने वाले उपप्रोब्लेम्स की संख्या और प्रत्येक उपप्रोजेम को हल करने में लगने वाला समय। यह एल्गोरिदम डिजाइन समस्या के बारे में सोचने का एक आसान आसान तरीका प्रदान करता है। जब आपके पास एक उम्मीदवार पुनरावृत्ति संबंध होता है, तो आप इसे देख सकते हैं और बहुत जल्दी समझ सकते हैं कि दौड़ने का समय क्या हो सकता है (उदाहरण के लिए, आप अक्सर बहुत जल्दी बता सकते हैं कि कितने उपप्रकार होंगे, जो एक कम बाध्य है समय चल रहा है, अगर वहाँ तेजी से कई उपप्रकार आप को हल करने के लिए है, तो पुनरावृत्ति शायद एक अच्छा दृष्टिकोण नहीं होगा)। इससे आपको उम्मीदवार सबप्रॉब्लम डिकम्पोजिशन को नियंत्रित करने में भी मदद मिलती है। उदाहरण के लिए, यदि हमारे पास एक स्ट्रिंग है , उपसर्ग को परिभाषित करना उपसर्ग को परिभाषित करता है S [ 1 .. i ] या प्रत्ययया विकल्पउचित हो सकता है (की संख्यामें बहुपद है) , लेकिनकी एक अनुवर्ती द्वारा एक उपप्रकार को परिभाषितकरना एक अच्छा दृष्टिकोण होने की संभावना नहीं है (उपप्रकार की संख्यामें घातीय है)। यह आपको संभावित पुनरावृत्ति के "खोज स्थान" को चुभाने देता है।S[1..n]S[1..i]एस [ मैं । । j ] एन एस एनS[j..n]S[i..j]nSn
गतिशील प्रोग्रामिंग आपको उम्मीदवार पुनरावृत्ति संबंधों की तलाश के लिए एक संरचित दृष्टिकोण प्रदान करता है। व्यावहारिक रूप से, यह दृष्टिकोण अक्सर प्रभावी होता है। विशेष रूप से, ऐसे कुछ आंकड़े / सामान्य प्रतिमान हैं जिन्हें आप इनपुट के प्रकार के आधार पर उप-प्रकारों को परिभाषित करने के सामान्य तरीकों के लिए पहचान सकते हैं। उदाहरण के लिए:
इनपुट एक है सकारात्मक पूर्णांक , एक उम्मीदवार रास्ता एक subproblem परिभाषित करने के लिए की जगह है n एक छोटे पूर्णांक के साथ n ' (सेंट 0 ≤ n ' ≤ n )।nnn′0≤n′≤n
यदि इनपुट एक स्ट्रिंग , तो उपप्रोब्लेम को परिभाषित करने के लिए कुछ उम्मीदवार तरीके शामिल हैं: S [ 1 .. n ] को उपसर्ग S [ 1 .. i ] से बदलें ; एक प्रत्यय S [ j के साथ S [ 1 .. n ] को बदलें । । एन ] ; की जगह एस [ 1 .. n ] सबस्ट्रिंग साथ एस [ मैं । । जे ]S[1..n]S[1..n]S[1..i]S[1..n]S[j..n]S[1..n]S[i..j]। (यहाँ उपप्रकार की पसंद से निर्धारित होता है ।)i,j
यदि इनपुट एक सूची है , तो वही करें जो आप स्ट्रिंग के लिए करेंगे।
इनपुट एक है पेड़ , एक उम्मीदवार रास्ता एक subproblem परिभाषित करने के लिए बदलने के लिए है टी के किसी भी सबट्री साथ टी (यानी, एक नोड लेने एक्स और की जगह टी सबट्री में निहित के साथ एक्स ; subproblem की पसंद से निर्धारित होता है एक्स )।TTTxTxx
यदि इनपुट एक युग्म , तो प्रत्येक के लिए एक उपप्रकार चुनने के तरीके की पहचान करने के लिए पुन: X के प्रकार और y के प्रकार को पुन: देखें । दूसरे शब्दों में, एक उम्मीदवार रास्ता एक subproblem परिभाषित करने के लिए बदलने के लिए है ( एक्स , वाई ) द्वारा ( एक्स ' , y ' ) जहां एक्स ' के लिए एक subproblem है एक्स और वाई ' के लिए एक subproblem है y । (आप फॉर्म ( x , y) के सबप्रोब्लेम्स पर भी विचार कर सकते हैं(x,y)xy(x,y)(x′,y′)x′xy′y या ( एक्स ' , y ) ।)(x,y′)(x′,y)
और इसी तरह। यह आपको एक बहुत उपयोगी उत्तराधिकार देता है: सिर्फ विधि के प्रकार पर हस्ताक्षर करके, आप उप-प्रकारों को परिभाषित करने के लिए उम्मीदवार तरीकों की एक सूची के साथ आ सकते हैं। दूसरे शब्दों में, सिर्फ समस्या कथन को देखते हुए - केवल इनपुट के प्रकारों को देखते हुए - आप एक उप-उम्मीदवार को परिभाषित करने के लिए मुट्ठी भर उम्मीदवार तरीकों के साथ आ सकते हैं।
यह अक्सर बहुत मददगार होता है। यह आपको नहीं बताता है कि पुनरावृत्ति संबंध क्या है, लेकिन जब आपके पास उपप्रकार को परिभाषित करने के लिए एक विशेष विकल्प है, तो अक्सर एक संबंधित पुनरावृत्ति संबंध को काम करना बहुत मुश्किल नहीं है। इसलिए, यह अक्सर एक गतिशील प्रोग्रामिंग एल्गोरिथ्म के डिजाइन को एक संरचित अनुभव में बदल देता है। आप स्क्रैप पेपर पर उपप्रोब्लेम्स को परिभाषित करने के लिए उम्मीदवार तरीकों की एक सूची लिखते हैं (ऊपर दिए गए अनुमान का उपयोग करके)। फिर, प्रत्येक उम्मीदवार के लिए, आप एक पुनरावृत्ति संबंध को लिखने की कोशिश करते हैं, और उप-प्रकारों की संख्या और प्रति उप-समय बिताए गए समय की गणना करके इसके चलने के समय का मूल्यांकन करते हैं। प्रत्येक उम्मीदवार की कोशिश करने के बाद, आप उस सर्वोत्तम को बनाए रखते हैं जिसे आप ढूंढने में सक्षम थे। एल्गोरिथ्म डिजाइन प्रक्रिया में कुछ संरचना प्रदान करना एक बड़ी मदद है, अन्यथा एल्गोरिथ्म डिजाइन को डराना हो सकता है (वहाँ)