ज्ञापन और गतिशील प्रोग्रामिंग के बीच अंतर क्या है?


247

ज्ञापन और गतिशील प्रोग्रामिंग के बीच अंतर क्या है? मुझे लगता है कि गतिशील प्रोग्रामिंग ज्ञापन का एक सबसेट है। क्या यह सही है?


8
यहाँ एक लेख है जो इस बारे में अच्छी तरह से वर्णन करता है: डायनेमिक प्रोग्रामिंग बनाम संस्मरण बनाम सारणीकरण
aioobe

जवाबों:


366

प्रोग्रामिंग पर प्रासंगिक लेख। गाइड: गतिशील प्रोग्रामिंग बनाम संस्मरण बनाम सारणीकरण


ज्ञापन और गतिशील प्रोग्रामिंग के बीच अंतर क्या है?

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

डायनेमिक प्रोग्रामिंग पुनरावर्ती प्रकृति की समस्याओं को हल करने के लिए एक तकनीक है, यह पुनरावृत्ति करता है और यह तब लागू होता है जब उप-प्रकल्पों की गणना ओवरलैप होती है।

डायनेमिक प्रोग्रामिंग आमतौर पर सारणीकरण का उपयोग करके कार्यान्वित की जाती है, लेकिन इसे मेमोइज़ेशन का उपयोग करके भी लागू किया जा सकता है। तो जैसा कि आप देख सकते हैं, न तो एक दूसरे का "सबसेट" है।


एक उचित अनुवर्ती प्रश्न है: सारणीकरण (विशिष्ट गतिशील प्रोग्रामिंग तकनीक) और ज्ञापन के बीच अंतर क्या है?

जब आप सारणीयन का उपयोग करके एक गतिशील प्रोग्रामिंग समस्या को हल करते हैं, तो आप समस्या को " नीचे ऊपर " हल करते हैं , अर्थात, पहले सभी संबंधित उप-समस्याओं को हल करके, आमतौर पर एक n- आयामी तालिका को भरकर । तालिका में परिणामों के आधार पर, "शीर्ष" / मूल समस्या का समाधान तब गणना की जाती है।

यदि आप पहले से ही हल की गई उप समस्याओं का एक नक्शा बनाए रखने के द्वारा इसे करने के लिए संस्मरण का उपयोग करते हैं। आप इसे " टॉप डाउन " इस अर्थ में करते हैं कि आप पहले "टॉप" समस्या को हल करते हैं (जो आमतौर पर उप-समस्याओं को हल करने के लिए पुनरावर्ती होता है)।

यहाँ से एक अच्छी स्लाइड (लिंक अब मृत है, स्लाइड अभी भी अच्छा है हालांकि):

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

अतिरिक्त संसाधन:


1
आपने डायनामिक प्रोग्रामिंग और मेमोइज़ेशन स्वैप किया। मूल रूप से संस्मरण एक पुनरावर्ती गतिशील प्रोग्रामिंग है।
user1603602

6
नाह, मुझे लगता है कि आप गलत हैं। उदाहरण के लिए, संस्मरण पर विकिपीडिया लेख में कुछ भी नहीं है कि संस्मरण का उपयोग करते समय पुनरावृत्ति आवश्यक रूप से शामिल है।
एरियोबे

, जवाब पढ़ें यदि आपको लगता है करना चाहते हैं के बाद NZT-48 विषय के बारे में प्रभाव है, तो आप कर सकते हैं पर नज़र लेख और उदाहरण के रूप में अच्छी तरह से
SNR

45

डायनेमिक प्रोग्रामिंग एक एल्गोरिथम प्रतिमान है जो किसी दिए गए जटिल समस्या को हल करता है और इसे उपप्रोलेम्स में तोड़ता है और उपप्रोब्लेम्स के परिणामों को फिर से उसी परिणामों की गणना करने से बचाता है।

http://www.geeksforgeeks.org/dynamic-programming-set-1/

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

इस चर्चा को संस्मरण बनाम सारणीकरण पर देखें ।

इसलिए डायनेमिक प्रोग्रामिंग पुनरावृत्ति संबंधों / पुनरावृत्ति को हल करके और पहले से पाए गए समाधानों को सारणीकरण या संस्मरण के माध्यम से समस्याओं के कुछ वर्गों को हल करने की एक विधि है। संस्मरण पहले से हल की गई समस्याओं के समाधान का ट्रैक रखने की एक विधि है और किसी भी फ़ंक्शन के साथ इसका उपयोग किया जा सकता है जिसमें इनपुट के दिए गए सेट के लिए अद्वितीय निर्धारक समाधान होते हैं।


14

डायनामिक प्रोग्रामिंग को अक्सर मेमोइज़ेशन कहा जाता है!

  1. मेमोएशन टॉप-डाउन तकनीक है (दी गई समस्या को इसे तोड़कर हल करना शुरू करें) और डायनामिक प्रोग्रामिंग एक बॉटम-अप तकनीक है (दिए गए समस्या की ओर तुच्छ उप-समस्या से हल करना शुरू करें)

  2. डीपी बेस केस (एस) से शुरू करके समाधान ढूंढता है और ऊपर की तरफ काम करता है। डीपी सभी उप-समस्याओं को हल करता है, क्योंकि यह नीचे-ऊपर करता है

    संस्मरण के विपरीत, जो केवल आवश्यक उप-समस्याओं को हल करता है

  3. डीपी में घातीय-समय ब्रूट-बल समाधानों को बहुपद-काल एल्गोरिदम में बदलने की क्षमता है।

  4. डीपी अधिक कुशल हो सकता है क्योंकि इसकी पुनरावृत्ति

    इसके विपरीत, पुनरावृत्ति के कारण मेमोइज़ेशन को (अक्सर महत्वपूर्ण) ओवरहेड के लिए भुगतान करना होगा।

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


10

(1) संस्मरण और डीपी, वैचारिक रूप से , वास्तव में एक ही बात है। क्योंकि: डीपी की परिभाषा पर विचार करें: "अतिव्यापी उपप्रकार" और "इष्टतम उपप्रकार"। संस्मरण पूरी तरह से इन 2 के पास है।

(2) मेमोइज़ेशन डीपी है जिसमें स्टैक ओवरफ्लो का खतरा है, रिकर्सन गहरा है। डीपी बॉटम में यह जोखिम नहीं है।

(3) संस्मरण को हैश तालिका की आवश्यकता होती है। इतना अतिरिक्त स्थान, और कुछ देखने का समय।

तो सवाल का जवाब देने के लिए:

- वैचारिक रूप से , (1) का अर्थ है कि वे एक ही चीज हैं।

खाते में (2) को ध्यान में रखते हुए, यदि आप वास्तव में चाहते हैं, तो संस्मरण DP का एक सबसेट है, इस अर्थ में कि संस्मरण द्वारा हल की जाने वाली समस्या DP द्वारा हल हो जाएगी, लेकिन DP द्वारा हल की जाने वाली समस्या संस्मरण द्वारा हल नहीं हो सकती (क्योंकि यह ओवरफ्लो हो सकता है)।

(3) को ध्यान में रखते हुए, उनके प्रदर्शन में मामूली अंतर है।


6

विकिपीडिया से:

Memoization

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

गतिशील प्रोग्रामिंग

गणित और कंप्यूटर विज्ञान में, गतिशील प्रोग्रामिंग जटिल समस्याओं को हल करने के लिए एक सरल उपप्रकारों में तोड़कर एक विधि है।

जब छोटे / सरल सबप्रोब्लेम्स में किसी समस्या को तोड़ते हैं, तो हम अक्सर एक ही सबप्रॉब्लम को एक बार फिर से सामना करते हैं - इसलिए हम पिछले गणना के परिणामों को बचाने के लिए मेमोइज़ेशन का उपयोग करते हैं, इसलिए हमें उन्हें दोहराने की आवश्यकता नहीं है।

डायनेमिक प्रोग्रामिंग अक्सर उन स्थितियों का सामना करती है जहां यह संस्मरण का उपयोग करने के लिए समझ में आता है, लेकिन आप आवश्यक रूप से दूसरे का उपयोग किए बिना तकनीक का उपयोग कर सकते हैं।


जवाब पोस्ट करने के बाद ओपी ने प्रश्न संपादित किया। मूल प्रश्न ने पूछा कि दोनों में क्या अंतर है।
युरिब

4

संस्मरण और डायनामिक प्रोग्रामिंग दोनों ही एक बार में ही अलग-अलग उपप्रोजेम हल करते हैं।

संस्मरण पुनरावृत्ति का उपयोग करता है और शीर्ष-डाउन का काम करता है, जबकि डायनेमिक प्रोग्रामिंग विपरीत दिशा में समस्या को हल करता है।

नीचे एक दिलचस्प सादृश्य है -

टॉप-डाउन - सबसे पहले आप कहते हैं कि मैं दुनिया को संभालूंगा। आप वो कैसे करेंगे? आप कहते हैं कि मैं पहले एशिया को संभालूंगा। आप वो कैसे करेंगे? मैं पहले भारत को संभालूंगा। मैं दिल्ली का मुख्यमंत्री बनूंगा, आदि आदि।

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


3

मैं एक उदाहरण के साथ जाना चाहूंगा ;

संकट:

आप एक सीढ़ी मामले पर चढ़ रहे हैं। यह शीर्ष पर पहुंचने के लिए n कदम उठाता है।

हर बार आप या तो 1 या 2 सीढ़ियां चढ़ सकते हैं। कितने अलग-अलग तरीकों से आप शीर्ष पर चढ़ सकते हैं?

यहां छवि विवरण दर्ज करें

संस्मरण के साथ पुनरावृत्ति

इस तरह हम मेमो एरी की मदद से पुनर्मिलन वृक्ष (एक पेड़ या झाड़ी से अतिरिक्त सामग्री को हटाने) छंटाई कर रहे हैं और nn तक पुनरावृत्ति वृक्ष के आकार को कम कर रहे हैं।

public class Solution {
    public int climbStairs(int n) {
        int memo[] = new int[n + 1];
        return climb_Stairs(0, n, memo);
    }
    public int climb_Stairs(int i, int n, int memo[]) {
        if (i > n) {
            return 0;
        }
        if (i == n) {
            return 1;
        }
        if (memo[i] > 0) {
            return memo[i];
        }
        memo[i] = climb_Stairs(i + 1, n, memo) + climb_Stairs(i + 2, n, memo);
        return memo[i];
    }
}

गतिशील प्रोग्रामिंग

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

public class Solution {
    public int climbStairs(int n) {
        if (n == 1) {
            return 1;
        }
        int[] dp = new int[n + 1];
        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
}

उदाहरण https://leetcode.com/problems/climbing-stairs/ से लेते हैं


2

सिर्फ दो तरीकों से सोचें,

  1. हम बड़ी समस्या को छोटी उप समस्याओं में तोड़ देते हैं - टॉप डाउन अप्रोच।
  2. हम छोटी से छोटी उप समस्या से शुरू करते हैं और बड़ी समस्या तक पहुंचते हैं - बॉटम अप अप्रोच।

में Memoization हम (1.) जहाँ हम वहाँ से एक कैश और कॉल बैक में प्रत्येक कार्य कॉल को बचाने के साथ चलते हैं। यह थोड़ा महंगा है क्योंकि इसमें पुनरावर्ती कॉल शामिल हैं।

में गतिशील प्रोग्रामिंग हम (2.) जहां हम एक मेज को बनाए रखने के साथ जाना, तालिका में सहेजे गए डेटा का उपयोग कर subproblems को हल करके नीचे से ऊपर, आमतौर पर डी पी-तालिका के रूप में जाना जाता है।

ध्यान दें:

  • दोनों ओवरलैपिंग उप-समस्याओं के साथ समस्याओं पर लागू होते हैं।

  • पुनरावर्ती फ़ंक्शन कॉल के दौरान शामिल ओवरहेड्स के कारण डीमो तुलनात्मक रूप से डीपी के लिए खराब प्रदर्शन करता है।

  • स्पर्शोन्मुख समय-जटिलता समान रहती है।

0

में गतिशील प्रोग्रामिंग ,

  • तालिका बनाए रखने के लिए पुनरावृत्ति के लिए कोई ओवरहेड नहीं, कम ओवरहेड।
  • समय या स्थान की आवश्यकताओं को कम करने के लिए टेबल एक्सेस के नियमित पैटर्न का उपयोग किया जा सकता है।

में Memorization ,

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