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


33

এই প্রশ্নটি বোবা লাগলে আগেই দুঃখিত!

যতদূর আমি জানি, ডায়নামিক প্রোগ্রামিং ব্যবহার করে একটি অ্যালগরিদম তৈরি করা এইভাবে কাজ করে:

  1. পুনরাবৃত্তি সম্পর্ক হিসাবে সমস্যাটি প্রকাশ করুন;
  2. স্মৃতিচারণের মাধ্যমে বা নীচে আপ পদ্ধতির মাধ্যমে পুনরাবৃত্তির সম্পর্কটি বাস্তবায়ন করুন।

আমি যতদূর জানি, ডায়নামিক প্রোগ্রামিং সম্পর্কে আমি সমস্ত কিছু বলেছি। আমার অর্থ: ডায়নামিক প্রোগ্রামিং পুনরাবৃত্তি সম্পর্ক প্রকাশ করার জন্য বা কোডগুলিতে রূপান্তরিত করার জন্য সরঞ্জাম / বিধি / পদ্ধতি / উপপাদ্য দেয় না।

সুতরাং, ডায়নামিক প্রোগ্রামিং সম্পর্কে বিশেষ কী? নির্দিষ্ট ধরণের সমস্যাগুলির কাছে যাওয়ার জন্য একটি অস্পষ্ট পদ্ধতি ছাড়া এটি আপনাকে কী দেয়?


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

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

"ডায়নামিক প্রোগ্রামিং" প্রধানত একটি বাজওয়ার্ড বলে মনে হচ্ছে (এটি তার বাজ হারিয়েছে)। এর অর্থ এই নয় যে এটি অবশ্যই কার্যকর নয়।
ব্যবহারকারী 253751

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

@ হোবস: হুবহু, তবে সময় নষ্ট করার প্রাথমিক
উপায়টি

উত্তর:


27

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

স্মৃতিচারণ এবং নীচের অংশগুলি পুনরাবৃত্তি সম্পর্কগুলিকে কোডে পরিণত করার জন্য আপনাকে একটি বিধি / পদ্ধতি দেয়। স্মৃতিচারণ একটি তুলনামূলক সহজ ধারণা, তবে সেরা ধারণাটি প্রায়শই হয়!

ডায়নামিক প্রোগ্রামিং আপনাকে আপনার অ্যালগোরিদমের চলমান সময় সম্পর্কে চিন্তা করার একটি কাঠামোগত উপায় দেয়। চলমান সময়টি মূলত দুটি সংখ্যার দ্বারা নির্ধারিত হয়: আপনাকে সমাধান করতে হবে এমন সাব-সমস্যাগুলির সংখ্যা এবং প্রতিটি উপ-সমস্যা সমাধান করতে যে সময় লাগে তা takes এটি অ্যালগোরিদম ডিজাইন সমস্যা সম্পর্কে ভাবার জন্য একটি সুবিধাজনক সহজ উপায় সরবরাহ করে। আপনার যখন প্রার্থীর পুনরাবৃত্তির সম্পর্ক রয়েছে, আপনি এটি দেখতে পারবেন এবং চলমান সময়টি কী হতে পারে তা খুব দ্রুত উপলব্ধি করতে পারবেন (উদাহরণস্বরূপ, আপনি প্রায়শই খুব তাড়াতাড়ি বলতে পারবেন যে সেখানে কতগুলি সাব-প্রবলেমস থাকবে যা নীচের দিকে আবদ্ধ থাকে) চলমান সময়; যদি আপনার খুব দ্রুত সমস্যা সমাধান করতে হয়, তবে পুনরাবৃত্তি সম্ভবত ভাল পদ্ধতির হবে না)। এটি আপনাকে প্রার্থী সাব-প্রবলেম পচে যাওয়া থেকে বিরত করতে সহায়তা করে। উদাহরণস্বরূপ, যদি আমাদের কাছে স্ট্রিং , একটি উপ-সমস্যা সংজ্ঞা দিয়ে একটি উপসর্গ এস [ 1 .. i ] বা প্রত্যয় এস [ জে n ] বা এস স্ট্রিং এস [ i j ] যুক্তিসঙ্গত হতে পারে (সাব-প্রব্লেমগুলির সংখ্যা এন-এ বহুবর্ষীয়), তবে এস এর সাবকোয়েন্সেস দ্বারা একটি সাব-প্রব্লেম সংজ্ঞা দেওয়াভাল পন্থা হওয়ার সম্ভাবনা নেই (সাব-প্রব্লেমগুলির সংখ্যা এন-তে ক্ষতিকারক)। এটি আপনাকে সম্ভাব্য পুনরাবৃত্তির "অনুসন্ধানের স্থান" ছাঁটাই করতে দেয়।S[1..n]S[1..i]S[j..n]S[i..j]nSn

ডায়নামিক প্রোগ্রামিং আপনাকে প্রার্থীদের পুনরাবৃত্ত সম্পর্কের সন্ধানের জন্য একটি কাঠামোগত পদ্ধতির দেয়। বৌদ্ধিকভাবে, এই পদ্ধতির প্রায়শই কার্যকর। বিশেষত, ইনপুটটির ধরণের উপর নির্ভর করে সাব-প্রবলেমগুলি সংজ্ঞায়নের সাধারণ উপায়গুলির জন্য আপনি স্বীকৃতি দিতে পারেন এমন কিছু হিউরিস্টিক্স / সাধারণ প্যাটার্ন রয়েছে। এই ক্ষেত্রে:

  • ইনপুট একটি হলে ধনাত্মক পূর্ণসংখ্যা , এক প্রার্থী উপায় subproblem সংজ্ঞায়িত করতে প্রতিস্থাপন হয় এন একটি ছোট পূর্ণসংখ্যা সঙ্গে এন ' (St 0 এন 'এন )।nnn0nn

  • যদি ইনপুটটি স্ট্রিং সাব-প্রব্লেম সংজ্ঞায়িত করার কয়েকটি প্রার্থীর মধ্যে অন্তর্ভুক্ত রয়েছে: এস [ 1 .. n ] কে একটি উপসর্গ এস [ 1 .. i ] দিয়ে প্রতিস্থাপন করুন ; S [ 1 .. n ] কে একটি প্রত্যয় S [ j ] দিয়ে প্রতিস্থাপন করুন n ] ; এস [ 1 .. n ] কে একটি স্ট্রিং এস এর সাথে প্রতিস্থাপন করুন [ i জে ]S[1..n]S[1..n]S[1..i]S[1..n]S[j..n]S[1..n]S[i..j]। (এখানে সাব-প্রব্লেম এর পছন্দ অনুসারে নির্ধারিত হয় )i,j

  • যদি ইনপুটটি কোনও তালিকা থাকে তবে স্ট্রিংয়ের জন্য আপনি যেমনটি করেন তেমনই করুন।

  • ইনপুট একটি হয়, তাহলে গাছ , এক প্রার্থী উপায় subproblem সংজ্ঞায়িত করতে প্রতিস্থাপন করতে হয় টি কোন subtree সঙ্গে টি (অর্থাত, একটি নোড বাছাই এক্স এবং প্রতিস্থাপন টি সাবট্রি এ রুট দিয়ে এক্স ; subproblem পছন্দমত দ্বারা নির্ধারিত হয় এক্স )।TTTxTxx

  • যদি ইনপুটটি একটি জোড় , তবে প্রতিটিটির জন্য সাব-প্রব্লেম চয়ন করার কোনও উপায় সনাক্ত করতে এক্সের ধরণ এবং y এর ধরণটি বারবার দেখুন। অন্য কথায়, প্রার্থী উপায় subproblem সংজ্ঞায়িত করতে প্রতিস্থাপন করতে হয় ( এক্স , Y ) দ্বারা ( এক্স ' , Y ' ) যেখানে এক্স ' এর জন্য একটি subproblem হয় এক্স এবং ওয়াই ' একটি subproblem হয় Y । (আপনি ফর্মের সাব-সমস্যাগুলিও বিবেচনা করতে পারেন ( x , y)(x,y)xy(x,y)(x,y)xxyy বা ( x , y ) )(x,y)(x,y)

ইত্যাদি। এটি আপনাকে একটি খুব দরকারী .শ্বর্যবাদী দেয়: কেবল পদ্ধতির স্বাক্ষরটি দেখে আপনি সাব-প্রবলেমগুলি সংজ্ঞায়িত করার জন্য প্রার্থীদের উপায়গুলির একটি তালিকা নিয়ে আসতে পারেন। অন্য কথায়, শুধু সমস্যা বিবৃতি দিকে তাকিয়ে - শুধুমাত্র দিকে তাকিয়ে ধরনের ইনপুট - আপনি প্রার্থী টি উপায় subproblem সংজ্ঞায়িত করতে একটি থাবা দিয়ে আসতে পারেন।

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


সুতরাং আপনি নিশ্চিত করেছেন যে ডায়নামিক প্রোগ্রামিং অনুসরণ করার জন্য কংক্রিট "পদ্ধতি" সরবরাহ করে না। আপনি যেমন বলেছিলেন এটি কেবল "চিন্তা করার উপায়"। নোট করুন যে আমি যুক্তি দিচ্ছি না যে ডিপি অকেজো (বিপরীতে!), আমি কেবল অনুপস্থিত কিছু আছে বা আমার আরও অনুশীলন করা উচিত কিনা তা বোঝার চেষ্টা করছি।
আরে হি

@ ওহে, ভাল, হ্যাঁ ... এবং না। আরও বিশদ জন্য আমার সংশোধিত উত্তর দেখুন। এটি কোনও রূপালী বুলেট নয়, তবে এটি এমন কিছু আধা-কংক্রিট প্রক্রিয়া সরবরাহ করে যা প্রায়শই সহায়ক (কাজের গ্যারান্টিযুক্ত নয়, তবে প্রায়শই সহায়ক হিসাবে প্রমাণিত হয়)।
DW

অনেক ধন্যবাদ! অনুশীলন করার মাধ্যমে আপনি যে কয়েকটি "আধা-কংক্রিট পদ্ধতি" বর্ণনা করছেন তার সাথে আমি আরও বেশি করে পরিচিত হয়ে উঠছি।
আরে হি

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

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

9

ডায়নামিক প্রোগ্রামিং সম্পর্কে আপনার বোঝা সঠিক ( আফাইক ), এবং আপনার প্রশ্নটি ন্যায়সঙ্গত।

আমি মনে করি যে আমরা "গতিশীল প্রোগ্রামিং" বলি সেই ধরণের পুনরাবৃত্তির থেকে অতিরিক্ত নকশার স্থানটি পুনরাবৃত্ত পদ্ধতির অন্যান্য স্কিমিটার তুলনায় সেরাভাবে দেখা যায়।

আসুন ধারণাটি হাইলাইট করার জন্য আমাদের ইনপুটগুলি অ্যারে হিসাবে দেখান।A[1..n]

  1. ইন্ডাকটিভ অ্যাপ্রোচ

    এখানে ধারণাটি হ'ল আপনার সমস্যাটিকে আরও ছোট করা, আরও ছোট সংস্করণটি সমাধান করা এবং আসলটির জন্য একটি সমাধান নেওয়া। Schematically,

    f(A)=g(f(A[1..nc]),A)

    সঙ্গে ফাংশন / অ্যালগরিদম যে সমাধান অনুবাদ।g

    উদাহরণ: রৈখিক সময়ে সুপারস্টার খুঁজে পাওয়া

  2. ভাগ করুন এবং বিজয়ী করুন

    বেশ কয়েকটি ছোট অংশে ইনপুট ভাগ করুন, প্রতিটিটির জন্য সমস্যাটি সমাধান করুন এবং একত্রিত করুন। স্কিম্যাটিকভাবে (দুটি অংশের জন্য),

    f(A)=g(f(A[1..c]),f(A[c+1..n]),A).

    Examples: Merge-/Quicksort, Shortest pairwise distance in the plane

  3. Dynamic Programming

    Consider all ways of partitioning the problem into smaller problems and pick the best. Schematically (for two parts),

    f(A)=best{g(f(A[1..c]),f(A[c+1..n]))|1cn1}.

    Examples: Edit distance, Change-making problem

    Important side note: dynamic programming is not brute force! The application of best in every step reduces the search space considerably.

In a sense, you know less and less statically going from top to bottom, and have to make more and more decisions dynamically.

The lesson from learning about dynamic programming is that it is okay to try all possible partitionings (well, it's required for correctness) because it can still be efficient using memoization.


"Pruned Dynamic Programming" (when it applies) proves that trying all possibilities is NOT required for correctness.
Ben Voigt

@BenVoigt Of course. I remained deliberately vague about what "all ways to partition" means; you want to rule out as many as possible, of course! (However, even if you try all ways of partitioning you don't get brute force since you only ever investigate combinations of optimal solutions to subproblems, whereas brute-force would investigate all combinations of all solutions.)
Raphael


5

Dynamic Programming allows you to trade memory for computation time. Consider the classic example, Fibonacci.

Fibonacci is defined by the recurrence Fib(n)=Fib(n1)+Fib(n2). If you solve using this recursion, you end up doing O(2n) calls to Fib(), since the recursion tree is a binary tree with height n.

Instead, you want to calculate Fib(2), then use this to find Fib(3), use that to find Fib(4), etc. This only takes O(n) time.

DP also provides us with basic techniques for translating a recurrence relation into a bottom-up solution, but these are relatively straightforward (and generally involve using an m dimensional matrix, or a frontier of such a matrix, where m is the number of parameters in the recurrence relation). These are well explained in any text about DP.


1
You talk only about the memoization part, which misses the point of the question.
Raphael

1
"Dynamic Programming allows you to trade memory for computation time" is not something I heard when doing undergrad, and it's a great way to look at this subject. This is an intuitive answer with a succinct example.
trueshot

@trueshot: Except that sometimes dynamic programming (and particularly, "Pruned Dynamic Programming") is able to reduce both time and space requirements.
Ben Voigt

@Ben I didn't say it was a one-to-one trade. You can prune a recurrence tree as well. I posit that I did answer the question, which was, "What does DP get us?" It gets us faster algorithms by trading space for time. I agree that the accepted answer is more thorough, but this is valid as well.
Kittsil

2

Here is another slightly different way of phrasing what dynamic programming gives you. Dynamic programming collapses an exponential number of candidate solutions into a polynomial number of equivalence classes, such that the candidate solutions in each class are indistinguishable in some sense.

Let me take as an example the problem of finding the number of increasing subsequences of length k in an array A of lenght n. It is useful to partition the set of all subsequences into equivalence classes such that two subsequences belong to the same class if and only if they have the same length and end in the same index. All of the 2n possible subsequences belong to exactly one of the O(n2) equivalence classes. This partitioning preserves enough information so that we can define a recurrence relation for the sizes of the classes. If f(i,) gives the number of subsequences which end in index i and have length , then we have:

f(i,)=j<i such thatA[j]<A[i]f(j,1)
f(i,1)=1 for all i=1n

This recurrence solves the problem in time O(n2k).

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