স্মৃতিচারণ ও গতিশীল প্রোগ্রামিংয়ের মধ্যে পার্থক্য কী?


247

স্মৃতিচারণ ও গতিশীল প্রোগ্রামিংয়ের মধ্যে পার্থক্য কী? আমি মনে করি ডায়নামিক প্রোগ্রামিং মেমোয়াইজের একটি উপসেট set এটা কি ঠিক?


8
এখানে একটি নিবন্ধ যা এটি বেশ ভালভাবে বর্ণনা করে: ডায়নামিক প্রোগ্রামিং বনাম মেমোয়েজেশন বনাম ট্যাবুলেশন
আইয়ুব

উত্তর:


366

প্রোগ্রামিং সম্পর্কিত সম্পর্কিত প্রবন্ধ.গুইড : গতিশীল প্রোগ্রামিং বনাম মেমোয়েজেশন বনাম ট্যাবুলেশন


স্মৃতিচারণ ও গতিশীল প্রোগ্রামিংয়ের মধ্যে পার্থক্য কী?

মেমোয়াইজেশন এমন একটি শব্দ যা একটি অপ্টিমাইজেশন কৌশল বর্ণনা করে যেখানে আপনি পূর্বে গণিত ফলাফলগুলি ক্যাশে করেন এবং যখন একই গণনার পুনরায় প্রয়োজন হয় তখন ক্যাশেড ফলাফলটি ফিরিয়ে দেন।

ডায়নামিক প্রোগ্রামিং পুনরাবৃত্ত প্রকৃতির সমস্যাগুলি সমাধানের জন্য একটি কৌশল এবং এটি যখন সাবপ্রব্লেমগুলির গণনা ওভারল্যাপ হয় তখন প্রযোজ্য।

ডায়নামিক প্রোগ্রামিং সাধারণত টেবুলেশন ব্যবহার করে প্রয়োগ করা হয় তবে মেমোয়েজেশন ব্যবহার করে প্রয়োগ করা যেতে পারে। সুতরাং আপনি যেমন দেখতে পাচ্ছেন, দু'জনই অপরটির "উপসেট" নয়।


একটি যুক্তিসঙ্গত ফলো-আপ প্রশ্ন হ'ল ট্যাবুলেশন (টিপিকাল ডায়নামিক প্রোগ্রামিং কৌশল) এবং স্মৃতিচারণের মধ্যে পার্থক্য কী?

আপনি যখন টেবুলেশন ব্যবহার করে একটি গতিশীল প্রোগ্রামিংয়ের সমস্যা সমাধান করেন আপনি সমস্যাটি " ডাউন আপ " সমাধান করেন , অর্থাত্ প্রথমে সম্পর্কিত সমস্ত উপ-সমস্যাগুলি সমাধান করে, সাধারণত একটি এন- ডাইমেনশনাল সারণী পূরণ করে । সারণীতে প্রাপ্ত ফলাফলের ভিত্তিতে, "শীর্ষ" / মূল সমস্যার সমাধানটি গণনা করা হয়।

আপনি যদি সমস্যার সমাধান করতে মেমোইজেশন ব্যবহার করেন তবে আপনি ইতিমধ্যে সমাধান করা সাব সমস্যার মানচিত্র বজায় রেখে এটি করেন। আপনি প্রথমে "শীর্ষ" সমস্যাটি সমাধান করেন এমন অর্থে আপনি এটি " টপ ডাউন " করেন (যা সাধারণত উপ-সমস্যাগুলি সমাধান করার জন্য পুনরাবৃত্তি করে)।

এখান থেকে একটি ভাল স্লাইড (লিঙ্কটি এখন মারা গেছে, স্লাইড যদিও এখনও ভাল):

  • যদি সমস্ত সাব-প্রবলেমগুলি অন্তত একবার সমাধান করা যায় তবে একটি নীচের অংশে ডায়নামিক-প্রোগ্রামিং অ্যালগরিদম সাধারণত একটি ধ্রুবক ফ্যাক্টর দ্বারা একটি শীর্ষ-ডাউন মেমোজাইজড অ্যালগরিদমকে ছাড়িয়ে যায়
    • পুনরাবৃত্তির জন্য কোনও ওভারহেড নেই এবং টেবিল বজায় রাখার জন্য কম ওভারহেড নেই
    • কিছু সমস্যা রয়েছে যার জন্য ডায়নামিক-প্রোগ্রামিং অ্যালগরিদমের টেবিল অ্যাক্সেসের নিয়মিত প্যাটার্নটি আরও সময় বা স্থানের প্রয়োজনীয়তা আরও কমাতে কাজে লাগানো যেতে পারে
  • যদি সাব-প্রব্লেম স্পেসের কিছু সাব-সমস্যাগুলি একেবারে সমাধান করার প্রয়োজন না হয় তবে মেমোজাইজড সমাধানটিতে কেবলমাত্র সেই সাব-সমস্যাগুলি সমাধান করার সুবিধা রয়েছে যা অবশ্যই স্পষ্টভাবে প্রয়োজনীয়

অতিরিক্ত সম্পদ:


1
আপনি ডায়নামিক প্রোগ্রামিং এবং মেমোয়েজেশন অদলবদল করেছেন। মূলত মেমোইজেশন একটি পুনরাবৃত্ত গতিশীল প্রোগ্রামিং।
ব্যবহারকারীর 603602

6
নাহ, আমি মনে করি আপনি ভুল করে ফেলেছেন। উদাহরণস্বরূপ, মেমোইজেশন সম্পর্কিত উইকিপিডিয়া নিবন্ধের কিছুই বলে না যে স্মারক ব্যবহারের সময় পুনরাবৃত্তি অবশ্যই জড়িত।
আইয়ুব

, উত্তর পড়তে যদি আপনি মনে করেন করতে ইচ্ছুক রয়ে NZT-48 বিষয় সম্পর্কে প্রভাব, আপনি যা করতে পারেন এ নজরে নিবন্ধ এবং উদাহরণ হিসাবে ভাল
SNR

45

ডায়নামিক প্রোগ্রামিং একটি আলগোরিদিমিক দৃষ্টান্ত যা একটি প্রদত্ত জটিল সমস্যাটিকে সাব-প্রবলেমগুলিতে ভেঙে সমাধান করে এবং একই ফলাফলগুলির পুনরায় কম্পিউটিং এড়াতে সাব-প্রবলেমের ফলাফলগুলি সঞ্চয় করে।

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

মেমোয়েজেশন হ'ল পূর্বে সমাধান হওয়া সমাধানগুলি ট্র্যাক করার একটি সহজ পদ্ধতি (প্রায়শই হ্যাশ কী মান জুটি হিসাবে প্রয়োগ করা হয়, টেবুলেশনের বিপরীতে যা প্রায়শই অ্যারেগুলির উপর ভিত্তি করে থাকে) যাতে তারা আবার যখন মুখোমুখি হয় তখন তাদের পুনরায় গণনা করা হয় না। এটি নীচে বা উপরে উভয় পদ্ধতিতে ব্যবহার করা যেতে পারে।

মেমোয়েজেশন বনাম সারণীতে এই আলোচনাটি দেখুন ।

ডায়নামিক প্রোগ্রামিং হ'ল পুনরাবৃত্তি সম্পর্ক / পুনরাবৃত্তি সমাধান করে এবং টেবিলেশন বা মেমোজাইজেশনের মাধ্যমে পূর্বে পাওয়া সমাধানগুলি সংরক্ষণ করে সমস্যার কয়েকটি শ্রেণির সমস্যার সমাধান করার একটি পদ্ধতি। মেমোয়েজেশন হ'ল একটি সমাধান যা পূর্বে সমাধান হওয়া সমস্যার সমাধানগুলি ট্র্যাক করে রাখে এবং প্রদত্ত ইনপুটগুলির একটি সেট জন্য অনন্য নির্বিচার সমাধান রয়েছে এমন কোনও ফাংশনের সাথে ব্যবহার করা যেতে পারে।


14

ডায়নামিক প্রোগ্রামিংকে প্রায়শই মেমোইজেশন বলা হয়!

  1. মেমোয়েজেশন হ'ল টপ-ডাউন কৌশল (প্রদত্ত সমস্যাটিকে ভেঙে দিয়ে সমাধান করা শুরু করুন) এবং গতিশীল প্রোগ্রামিং হ'ল নীচের কৌশল (তুচ্ছ সাব-সমস্যা থেকে সমাধান দেওয়া শুরু করা, প্রদত্ত সমস্যার দিকে এগিয়ে যাওয়া)

  2. ডিপি বেস কেস (গুলি) থেকে শুরু করে সমাধানটি সন্ধান করে এবং উপরের দিকে কাজ করে। ডিপি সমস্ত উপ-সমস্যা সমাধান করে, কারণ এটি নীচে-আপ করে

    স্মৃতিচারণের বিপরীতে যা কেবলমাত্র প্রয়োজনীয় সাব-সমস্যা সমাধান করে

  3. ডিপি-র ক্ষতিকারক-সময় ব্রুট-ফোর্স সমাধানগুলি বহু-কালীন অ্যালগরিদমে রূপান্তরিত করার সম্ভাবনা রয়েছে।

  4. ডিপি অনেক বেশি দক্ষ হতে পারে কারণ এর পুনরাবৃত্তি

    বিপরীতে, মেমোয়েজেশন অবশ্যই পুনরাবৃত্তির কারণে (প্রায়শই তাৎপর্যপূর্ণ) ওভারহেডের জন্য দিতে হবে।

আরও সাধারণ বিষয় হ'ল, মেমোয়েজেশন সমস্যাটি সমাধানের জন্য টপ-ডাউন পদ্ধতির ব্যবহার করে অর্থাৎ এটি মূল (মূল) সমস্যার সাথে শুরু হয় তারপরে এটিকে সাব-সমস্যায় বিভক্ত করে এবং একইভাবে এই উপ-সমস্যাগুলি সমাধান করে। এই পদ্ধতির ক্ষেত্রে একই উপ-সমস্যাটি একাধিকবার ঘটতে পারে এবং আরও সিপিইউ চক্র গ্রহণ করতে পারে, তাই সময়ের জটিলতা বাড়িয়ে তোলে। ডায়নামিক প্রোগ্রামিংয়ে একই উপ-সমস্যাটি একাধিকবার সমাধান করা হবে না তবে পূর্ববর্তী ফলাফলটি সমাধানটি অনুকূল করতে ব্যবহৃত হবে।


10

(1) স্মৃতিচারণ ও ডিপি, ধারণাগতভাবে সত্যই একই জিনিস। কারণ: ডিপির সংজ্ঞা বিবেচনা করুন: "ওভারল্যাপিং সাবপ্রব্লেমগুলি" "এবং সর্বোত্তম কাঠামো"। স্মৃতিচারণ পুরোপুরি এই 2 আছে।

(২) মেমোয়েজেশন হ'ল ডিপি হ'ল স্ট্যাক ওভারফ্লো হওয়ার ঝুঁকিটি পুনরাবৃত্তি গভীর। ডিপি ডাউন আপ এই ঝুঁকি নেই।

(3) স্মৃতিচারণের জন্য একটি হ্যাশ টেবিল দরকার। তাই অতিরিক্ত স্থান এবং কিছু দেখার সময়।

সুতরাং প্রশ্নের উত্তর দিতে:

- ধারণা হিসাবে , (1) এর অর্থ তারা একই জিনিস।

অ্যাকাউন্টে গ্রহণ (২), যদি আপনি সত্যিই চান, মেমোয়েজেশন হ'ল ডিপির একটি উপসেট, এমন এক অর্থে যে স্মৃতিচারণের মাধ্যমে সমাধানযোগ্য একটি সমস্যা ডিপি দ্বারা সমাধানযোগ্য হবে, তবে ডিপি দ্বারা সমাধানযোগ্য কোনও সমস্যা মেমোয়েজেশন দ্বারা সমাধানযোগ্য হতে পারে না কারণ (কারণ এটি) ওভারফ্লো স্ট্যাক হতে পারে)।

অ্যাকাউন্টে নেওয়া (3), তাদের পারফরম্যান্সে সামান্য পার্থক্য রয়েছে।


6

উইকিপিডিয়া থেকে:

Memoization

কম্পিউটিংয়ে, মেমোয়েজেশন হ'ল একটি অপ্টিমাইজেশন কৌশল যা মূলত কম্পিউটার প্রোগ্রামগুলিকে গতিযুক্ত করার জন্য ব্যবহৃত হয়েছিল ফাংশন কলগুলি পূর্বে প্রক্রিয়াজাত ইনপুটগুলির জন্য ফলাফলের গণনা পুনরাবৃত্তি করা এড়াতে।

ডায়নামিক প্রোগ্রামিং

গণিত এবং কম্পিউটার বিজ্ঞানের ক্ষেত্রে ডায়নামিক প্রোগ্রামিং জটিল সমস্যাগুলিকে সহজ সাব-প্রবলেমগুলিতে ভেঙে সমাধানের একটি পদ্ধতি।

ছোট / সরল সাব-প্রবলেমগুলিতে কোনও সমস্যা ভাঙার সময়, আমরা প্রায়শই একবার একই সাব-প্রব্লেমটির মুখোমুখি হয়েছি - সুতরাং আমরা আগের গণনার ফলাফলগুলি সংরক্ষণ করতে মেমোয়েজেশন ব্যবহার করি যাতে সেগুলি পুনরাবৃত্তি করার প্রয়োজন হয় না।

ডায়নামিক প্রোগ্রামিং প্রায়শই এমন পরিস্থিতিগুলির মুখোমুখি হয় যেখানে মেমোয়েজেশনটি ব্যবহার করা বোধগম্য হয় তবে আপনি অন্যটি ব্যবহার না করেই কৌশলটি ব্যবহার করতে পারেন।


উত্তর পোস্ট করার পরে ওপি প্রশ্নটি সম্পাদনা করেছে। মূল প্রশ্নটি জিজ্ঞাসা করেছিল যে উভয়ের মধ্যে পার্থক্য কী।
ইয়ুরিব

4

মেমোইজেশন এবং ডায়নামিক প্রোগ্রামিং উভয়ই পৃথক সাবপ্রব্লেম কেবল একবার সমাধান করে।

মেমোয়েজেশন পুনরাবৃত্তি ব্যবহার করে এবং টপ-ডাউন কাজ করে, অন্যদিকে ডায়নামিক প্রোগ্রামিং বিপরীত দিকে এগিয়ে যায় সমস্যাটি নীচের অংশে সমাধান করে।

নীচে একটি আকর্ষণীয় উপমা -

শীর্ষ-ডাউন - প্রথমে আপনি বলেছেন আমি বিশ্বকে দখল করব। কিভাবে যে কি হবে? আপনি বলছেন আমি প্রথমে এশিয়া দখল করব। কিভাবে যে কি হবে? আমি প্রথমে ভারতের দায়িত্ব নেব। আমি দিল্লি ইত্যাদির মুখ্যমন্ত্রী হব ইত্যাদি etc.

নীচে আপ - আপনি বলেছিলেন আমি দিল্লির মুখ্যমন্ত্রী হব। তারপরে ভারত, তারপরে এশিয়ার অন্যান্য সমস্ত দেশ এবং শেষ পর্যন্ত আমি বিশ্বকে দখল করব।


3

আমি উদাহরণ দিয়ে যেতে চাই ;

সমস্যা:

আপনি একটি সিঁড়ি মামলা আরোহণ করছেন। এটি শীর্ষে পৌঁছাতে n পদক্ষেপ নেয়।

প্রতিবার আপনি হয় 1 বা 2 পদক্ষেপে উঠতে পারেন। আপনি কতগুলি স্বতন্ত্র উপায়ে শীর্ষে উঠতে পারেন?

এখানে চিত্র বর্ণনা লিখুন

স্মৃতিচারণ সহ পুনরাবৃত্তি

এইভাবে আমরা মেমো অ্যারের সাহায্যে পুনরবৃদ্ধি গাছ (গাছ বা ঝোপঝাড় থেকে অতিরিক্ত উপাদান অপসারণ) ছাঁটাই করছি এবং এনএন পর্যন্ত পুনরাবৃত্তি গাছের আকার হ্রাস করছি।

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 সমাধান করে নীচে আপ, সাধারণভাবে DP-টেবিল হিসাবে পরিচিত।

বিঃদ্রঃ:

  • উভয়ই ওভারল্যাপিং উপ-সমস্যাগুলির সাথে সমস্যাগুলির জন্য প্রযোজ্য।

  • পুনরাবৃত্তি ফাংশন কল চলাকালীন ওভারহেডের কারণে মেমোয়েজেশন ডিপি থেকে তুলনামূলকভাবে দুর্বল সম্পাদন করে।

  • অ্যাসিপটোটিক সময়-জটিলতা একই থাকে।

0

ইন ডাইনামিক প্রোগ্রামিং ,

  • পুনরাবৃত্তির জন্য কোনও ওভারহেড নেই, টেবিলটি বজায় রাখার জন্য কম ওভারহেড।
  • সারণী অ্যাক্সেসের নিয়মিত প্যাটার্নটি সময় বা স্থানের প্রয়োজনীয়তা হ্রাস করতে ব্যবহৃত হতে পারে।

ইন কবিতাগুলি মুখস্ত ,

  • কিছু সাব-প্রবলেমগুলি সমাধান করার দরকার নেই।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.