ডিভাইড এবং কনকরার আলগো এবং ডায়নামিক প্রোগ্রামিংয়ের মধ্যে পার্থক্য


140

ডিভাইড এবং কনকয়ের অ্যালগরিদম এবং ডায়নামিক প্রোগ্রামিং অ্যালগরিদমের মধ্যে পার্থক্য কী? কিভাবে দুটি পদ পৃথক? আমি তাদের মধ্যে পার্থক্য বুঝতে পারি না।

দুটির মধ্যে এবং কোন ভিত্তিতে তারা একই রকম বলে মনে হচ্ছে তার মধ্যে কোনও পার্থক্য বোঝাতে দয়া করে একটি সাধারণ উদাহরণ নিন take

উত্তর:


156

ভাগ এবং বিজয়

ডিভাইড এবং কনকয়ের সমস্যাটিকে উপ-সমস্যায় বিভক্ত করে প্রতিটি উপ-সমস্যাটিকে পুনরাবৃত্তভাবে জয়ী করে এই সমাধানগুলি একত্রিত করে।

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

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

আপনি ভাবতে পারেন DP = recursion + re-use

পার্থক্যটি বোঝার একটি সর্বোত্তম উদাহরণ হ'ল নবম ফিবোনাচি নম্বর প্রাপ্তির দিকে এই উভয় পন্থা দেখতে পাওয়া। এমআইটি থেকে এই উপাদান পরীক্ষা করুন ।


ভাগ করুন এবং বিজয়ী পদ্ধতি ভাগ করুন এবং বিজয়ী পদ্ধতি

গতিশীল প্রোগ্রামিং পদ্ধতির এখানে চিত্র বর্ণনা লিখুন


9
আপনি কিভাবে ছবি তৈরি? মাউস ব্যবহার করছেন?
বিহান ভার্মা

34
আমি মনে করি এই পুরো উত্তরের সর্বাধিক গুরুত্বপূর্ণ লাইনটি হ'ল: "ওভারল্যাপিং সাব-সমস্যাগুলি"। ডিপির কাছে এটি রয়েছে, ভাগ করুন এবং জয়ী হন না
হাসান ইকবাল

@ হাসানিক্বালআনিক ওভারল্যাপিং সাব সমস্যাটির অর্থ এমন সমস্যা যা বারবার ঘটে। উপরে বর্ণিত উদাহরণে fn-2 সমাধান করার মতো। সুতরাং ডি অ্যান্ড সি তে এটি আছে এবং এটি কেন এটি ডিপির মতো দক্ষ নয়।
মীনা চৌধুরী চৌধুরী

1
স্ট্রেঞ্জ! 'ওভারল্যাপিং সাব-প্রবলেমস' আপনি সমস্যার কথা বলছেন তবে 'ডায়নামিক প্রোগ্রামিং' এক ধরণের অ্যালগরিদম। আমি মনে করি যে 'সমস্যাগুলি' এবং 'অ্যালগরিদমগুলি' আলাদা করা গুরুত্বপূর্ণ।
জেডএইচইউ

হ্যাঁ, ডিপি বিভাজন এবং বিজয়ীর উপর সুবিধা অর্জন করার জন্য ওভারল্যাপিং অংশগুলিকে স্মরণ করে।
কল্পনাকারী

25

বিভাজন এবং বিজয়ী এবং গতিশীল প্রোগ্রামিংয়ের মধ্যে অন্যান্য পার্থক্য হ'ল:

ভাগ এবং বিজয়:

  1. উপ-সমস্যাগুলিতে আরও কাজ করে এবং তাই বেশি সময় খরচ হয়।
  2. বিভাজন এবং বিজয় উপ-সমস্যা একে অপরের থেকে স্বাধীন।

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

  1. উপ-সমস্যাগুলি কেবল একবার সমাধান করে এবং তারপরে এটি টেবিলে সংরক্ষণ করে।
  2. ডায়নামিক প্রোগ্রামিংয়ে সাব-সমস্যাটি স্বতন্ত্র নয়।

বিভাজন এবং বিজয়ী অ্যালগরিদমগুলি অগত্যা তাদের ডিপি বিকল্পের চেয়ে বেশি কাজ করে না। সর্বাধিক গাণিতিক অগ্রগতি সন্ধানের জন্য এরিকসনের অ্যালগরিদম এর একটি উদাহরণ।
মাইকেল ফৌকারকিস

17

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

বিখ্যাত উদাহরণস্বরূপ ফিবোনাচি সংখ্যা:

           index: 1,2,3,4,5,6...
Fibonacci number: 1,1,2,3,5,8...

function F(n) {
    if (n < 3)
        return 1
    else
        return F(n-1) + F(n-2)
}

চলুন এফ (5) চালান:

F(5) = F(4) + F(3)
     = {F(3)+F(2)} + {F(2)+F(1)}
     = {[F(2)+F(1)]+1} + {1+1}
     = 1+1+1+1+1

সুতরাং আমরা কল করেছি: 1 বার F (4) 2 বার F (3) 3 বার F (2) 2 বার F (1)

ডায়নামিক প্রোগ্রামিং পদ্ধতির: আপনি যদি একই প্যারামিটারের সাথে কোনও ফাংশনটিকে একাধিকবার কল করেন, ফলাফলটি পরের বারে সরাসরি অ্যাক্সেসের জন্য পরিবর্তনকে সংরক্ষণ করুন। পুনরাবৃত্তি পদ্ধতি:

if (n==1 || n==2)
    return 1
else
    f1=1, f2=1
    for i=3 to n
         f = f1 + f2
         f1 = f2
         f2 = f

আসুন আবার এফ (5) কল করুন:

fibo1 = 1
fibo2 = 1 
fibo3 = (fibo1 + fibo2) = 1 + 1 = 2
fibo4 = (fibo2 + fibo3) = 1 + 2 = 3
fibo5 = (fibo3 + fibo4) = 2 + 3 = 5

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

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

// declare and initialize a dictionary
var dict = new Dictionary<int,int>();
for i=1 to n
    dict[i] = -1

function F(n) {
    if (n < 3)
        return 1
    else
    {
        if (dict[n] == -1)
            dict[n] = F(n-1) + F(n-2)

        return dict[n]                
    }
}

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


17

ডায়নামিক প্রোগ্রামিং এবং ডিভাইড-অ্যান্ড-কনকয়ের মিল

আমি এখনই এটি দেখতে পাওয়ায় আমি বলতে পারি যে গতিশীল প্রোগ্রামিং হ'ল বিভাজন এবং বিজয়ের দৃষ্টান্তের একটি বর্ধন

আমি তাদের সাথে সম্পূর্ণ আলাদা কিছু হিসাবে বিবেচনা করব না। কারণ তারা দু'জনই সমস্যাটিকে একই বা সম্পর্কিত ধরণের দুটি বা ততোধিক সাব-সমস্যায় বিচ্ছিন্নভাবে ভেঙে কাজ করে , যতক্ষণ না এগুলি সরাসরি সমাধানের পক্ষে পর্যাপ্ত সরল হয়ে যায়। এরপরে উপ-সমস্যার সমাধানগুলি মিলিত করে মূল সমস্যার সমাধান দেওয়া হয়।

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

আসুন ধাপে ধাপে…

ডায়নামিক প্রোগ্রামিং পূর্বশর্ত / বিধিনিষেধ

যেহেতু আমরা সবেমাত্র আবিষ্কার করেছি যে দুটি মূল বৈশিষ্ট্য রয়েছে যা গতিশীল প্রোগ্রামিংয়ের প্রয়োগের জন্য বিভাজন এবং বিজয়ী সমস্যার অবশ্যই থাকতে হবে:

  • সর্বোত্তম কাঠামো  - সর্বোত্তম সমাধানটি এর সাবপ্রব্লেমগুলির সর্বোত্তম সমাধান থেকে তৈরি করা যেতে পারে

  • ওভারল্যাপিং উপ-সমস্যাগুলি  - সমস্যাটি সাব- প্রবলেমগুলিতে বিভক্ত হয়ে যেতে পারে যা বেশ কয়েকবার পুনরায় ব্যবহার করা হয় বা সমস্যার জন্য পুনরাবৃত্তি হওয়া অ্যালগরিদম সর্বদা নতুন সাবপ্রব্লেমগুলি উত্পন্ন করার পরিবর্তে একই সাবপ্রব্লেমটিকে বারবার সমাধান করে can

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

ভাগ এবং বিজয়ী করার জন্য ডায়নামিক প্রোগ্রামিং এক্সটেনশন

ডায়নামিক প্রোগ্রামিং পদ্ধতির দুটি কৌশল ( স্মৃতিচারণট্যাবুলেশন ) দিয়ে বিভাজন এবং বিজয়ী পদ্ধতির প্রসারিত হয় যার উভয়ই উপ-সমস্যার সমাধানগুলি সংরক্ষণ এবং পুনরায় ব্যবহার করার একটি উদ্দেশ্য রয়েছে যা পারফরম্যান্সকে তীব্রতর উন্নতি করতে পারে। উদাহরণস্বরূপ, ফিবোনাচি ফাংশনটির নিষ্পাপ পুনরাবৃত্তিমূলক প্রয়োগের সময় জটিলতা রয়েছে O(2^n)যেখানে কেবল O(n)সময়ের সাথে ডিপি সলিউশন একই কাজ করে ।

মেমোয়েজেশন (টপ-ডাউন ক্যাশে ফিলিং) বলতে পূর্ববর্তী গণিত ফলাফলগুলি ক্যাশে করার এবং পুনরায় ব্যবহার করার কৌশল বোঝায়। স্মৃতিযুক্ত fibফাংশনটি এভাবে দেখায়:

memFib(n) {
    if (mem[n] is undefined)
        if (n < 2) result = n
        else result = memFib(n-2) + memFib(n-1)

        mem[n] = result
    return mem[n]
}

ট্যাবুলেশন (নীচের অংশে ক্যাশে ভরাট করা) একই রকম তবে ক্যাশের প্রবেশদ্বারগুলি পূরণ করার উপর দৃষ্টি নিবদ্ধ করে। ক্যাশে মানগুলি গণনা করা সহজভাবে পুনরাবৃত্তভাবে সম্পন্ন হয়। এর সারণী সংস্করণটি এর fibমতো দেখতে পাবেন:

tabFib(n) {
    mem[0] = 0
    mem[1] = 1
    for i = 2...n
        mem[i] = mem[i-2] + mem[i-1]
    return mem[n]
}

আপনি এখানে স্মৃতিচারণ ও ট্যাবুলেশন তুলনা সম্পর্কে আরও পড়তে পারেন ।

আপনার মূল ধারণাটি এখানে ধরা উচিত, কারণ আমাদের বিভাজন এবং বিজয় সমস্যা উপ-সমস্যাগুলিকে ওভারল্যাপ করে ফেলেছে কারণ উপ-সমস্যার সমাধানগুলির ক্যাচিং সম্ভব হয় এবং এইভাবে স্মৃতিচারণ / ট্যাবুলেশন ঘটনাস্থলে যায় step

সুতরাং সব পরে ডিপি এবং ডিসি মধ্যে পার্থক্য

যেহেতু আমরা এখন ডিপি পূর্বশর্ত এবং এর পদ্ধতিগুলির সাথে পরিচিত, আমরা উপরে উল্লিখিত সমস্তগুলি একটি ছবিতে রাখতে প্রস্তুত।

ডায়নামিক প্রোগ্রামিং বনাম ডিভাইড-অ্যান্ড-কোঙ্কার

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


1
অফটপিক: আপনি এটি আঁকার জন্য কোনও গ্রাফিক্স ট্যাবলেট ব্যবহার করেছেন?
জিওন জর্জে

1
জিওঞ্জোর নং, আঁকাগুলি কলম দ্বারা তৈরি করা হয়েছিল এবং তারপরে স্ক্যান করা হয়েছিল
ওলেকসেই ট্রেখলেব

এটি ডিপি সংগঠিত করার বিষয়ে আমি যে সেরা উত্তরটি পড়েছি তা হল
রিদ্ধওয়ান শাকিল

8

আমি ধরে নিয়েছি আপনি ইতিমধ্যে উইকিপিডিয়া এবং অন্যান্য একাডেমিক সংস্থানগুলি পড়েছেন, সুতরাং আমি সেই কোনও তথ্য পুনর্ব্যবহার করব না। আমার অবশ্যই সতর্কতা অবলম্বন করা উচিত যে আমি কোনও উপায়ে কম্পিউটার বিজ্ঞান বিশেষজ্ঞ নই, তবে আমি এই বিষয়গুলি সম্পর্কে আমার বোঝার উপর আমার দুটি সেন্ট ভাগ করব ...

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

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

ভাগ এবং বিজয়

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


5

আমি Divide & Conquerএকটি পুনরাবৃত্তি পদ্ধতির Dynamic Programmingহিসাবে এবং টেবিল ভরাট হিসাবে মনে করি ।

উদাহরণস্বরূপ, Merge Sortএকটি Divide & Conquerঅ্যালগরিদম, প্রতিটি পদক্ষেপের মতো, আপনি অ্যারেটিকে দুটি অংশে বিভক্ত করেন, পুনরাবৃত্তভাবে দুটি অর্ধে কল করুন Merge Sortএবং তারপরে সেগুলি মার্জ করুন।

KnapsackDynamic Programmingআপনি সামগ্রিক ন্যাপস্যাকের সাবপ্রবলেমগুলির সর্বোত্তম সমাধানগুলির প্রতিনিধিত্বকারী একটি টেবিলটি পূরণ করায় এটি একটি অ্যালগরিদম। সারণীতে প্রতিটি এন্ট্রি সর্বাধিক মানের সাথে সামঞ্জস্য করে আপনি এক ব্যাগের ওজন ডাবল আইটেম 1-জে বহন করতে পারেন।


1
যদিও এটি অনেক ক্ষেত্রে সত্য, আমরা সর্বদা সমস্যাগুলির ফলাফলগুলি একটি টেবিলের মধ্যে সংরক্ষণ করি তা সর্বদা সত্য নয়।
গোকুল

2

বিভাজন এবং বিজয় পুনরাবৃত্তির প্রতিটি স্তরে তিনটি পদক্ষেপ জড়িত:

  1. বিভক্ত করাসমস্যাটিকে সাব-প্রবলেমে করুন।
  2. সাব সমস্যাগুলি পুনরাবৃত্তভাবে সমাধান করে তাদের জয় করুন।
  3. মূল সমস্যার সমাধানে সাব-প্রবলেমের সমাধানটি একত্রিত করুন।
    • এটি একটি শীর্ষ-ডাউন পদ্ধতির।
    • এটি সাব-প্রবলেমগুলিতে আরও কাজ করে এবং তাই বেশি সময় খরচ হয়।
    • যেমন। ফিবোনাচি সিরিজের এন-তম শব্দকে ও (2 ^ n) সময়ের জটিলতায় গণনা করা যেতে পারে।

ডায়নামিক প্রোগ্রামিং নিম্নলিখিত চারটি ধাপ থাকে:

1. বৈশিষ্ট্য সন্তোষজনক সমাধান কাঠামো।
২. সর্বোত্তম সমাধানগুলির মানগুলি পুনরাবৃত্তভাবে সংজ্ঞায়িত করুন।
৩. সর্বোত্তম সমাধানগুলির মান গণনা করুন।
4. আঁকো একটি সন্তোষজনক সমাধান কম্পিউটেড তথ্য থেকে

  • এটি একটি নীচে আপ পদ্ধতির।
  • বিভাজক এবং বিজয়ের চেয়ে কম সময় ব্যয় করা কারণ আমরা আবার গণনা না করে আগের গণনা করা মানগুলি ব্যবহার করি।
  • যেমন। ফিবোনাচি সিরিজের এন-তম শব্দকে ও (এন) সময়ের জটিলতায় গণনা করা যায়।

আরও সহজ বোঝার জন্য, ব্রুট ফোর্স সলিউশন এবং গতিশীল প্রোগ্রামিং হিসাবে এর অপ্টিমাইজেশন হিসাবে বিভাজন এবং বিজয় দেখতে দিন। ওভারল্যাপিং সাব-প্রবলেমগুলির সাথে

এনবি ডিভাইড এবং বিজয়ী অ্যালগরিদমগুলি কেবলমাত্র ডিপি দিয়ে অনুকূলিত করা যায়।


ডিভাইড এবং
কনকয়ের

0
  • ভাগ এবং বিজয়
    • তারা নন-ওভারল্যাপিং উপ-সমস্যায় পড়ে
    • উদাহরণ: ফ্যাকটোরিয়াল সংখ্যাগুলি যেমন তথ্য (এন) = এন * ফ্যাক্ট (এন -১)
fact(5) = 5* fact(4) = 5 * (4 * fact(3))= 5 * 4 * (3 *fact(2))= 5 * 4 * 3 * 2 * (fact(1))

আমরা উপরের দেখতে পাচ্ছি, কোনও ফ্যাক্ট (এক্স) পুনরাবৃত্তি করা হয়নি তাই ফ্যাক্টরিয়ালটিতে অ ওভারল্যাপিংয়ের সমস্যা নেই।

  • ডায়নামিক প্রোগ্রামিং
    • তারা ওভারল্যাপিং উপ-সমস্যায় পড়েছে
    • উদাহরণ: ফিবোনাচি সংখ্যাগুলি যেমন ফাইব (এন) = ফাইব (এন -1) + ফাইব (এন -2)
fib(5) = fib(4) + fib(3) = (fib(3)+fib(2)) + (fib(2)+fib(1))

আমরা উপরে দেখতে পাচ্ছি, ফাইব (4) এবং ফাইব (3) উভয়ই ফাইব (2) ব্যবহার করে। একইভাবে অনেকগুলি fib (x) পুনরাবৃত্তি হয়। যে কারণে ফিবোনাচি উপ-সমস্যাগুলি ওভারল্যাপ করে।

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