Rev4: ব্যবহারকারী সামারনের একটি খুব স্পষ্ট মন্তব্য মন্তব্য করেছে যে সম্ভবত, এই উত্তরটি আগে বিভ্রান্ত করে শীর্ষ-ডাউন এবং নীচে আপ। মূলত এই উত্তর (রেভা 3) এবং অন্যান্য উত্তরগুলি বলেছিল যে "বটম-আপ হ'ল মেমোয়াইজেশন" ("সাব-প্রব্লেমগুলি অনুমান করুন"), এটি বিপরীত হতে পারে (যা, "শীর্ষ-ডাউন" হতে পারে "সাব-সমস্যাগুলি ধরে" এবং " নীচে আপ "" সাবপ্রব্লেমগুলি রচনা "হতে পারে)। পূর্বে, আমি মেমোয়াইজেশনটি ডায়নামিক প্রোগ্রামিংয়ের একটি সাব-টাইপের বিপরীতে ভিন্ন ধরণের গতিশীল প্রোগ্রামিং হিসাবে পড়েছি। আমি সেই মতামতটি সাবস্ক্রাইব না করেও উদ্ধৃত করেছিলাম। সাহিত্যে যথাযথ উল্লেখ পাওয়া না যাওয়া পর্যন্ত আমি এই উত্তরটিকে পরিভাষার অজ্ঞেয়বাদী হিসাবে পুনরায় লিখেছি। আমি এই উত্তরটিকে একটি সম্প্রদায় উইকিতে রূপান্তর করেছি। একাডেমিক উত্স পছন্দ করুন। রেফারেন্স এর তালিকা:} {সাহিত্য: 5 }
সংক্ষিপ্তবৃত্তি
ডায়নামিক প্রোগ্রামিং হ'ল ডুপ্লিকেট কাজকে পুনরায় গণনা এড়ানো এমন উপায়ে আপনার গণনাগুলিকে অর্ডার দেওয়ার মতো। আপনার একটি প্রধান সমস্যা রয়েছে (আপনার সাবপ্রব্লেমগুলির গাছের মূল), এবং সাবপ্রব্লেমস (সাবট্রিজ)। সাব-প্রবলেমগুলি সাধারণত পুনরাবৃত্তি হয় এবং ওভারল্যাপ হয় ।
উদাহরণস্বরূপ, আপনার প্রিয় ফিবোনাচির উদাহরণ বিবেচনা করুন। এটি হ'ল সাব-প্রবলেমগুলির সম্পূর্ণ গাছ, যদি আমরা একটি নিষ্পাপ পুনরাবৃত্তি কল করি:
TOP of the tree
fib(4)
fib(3)...................... + fib(2)
fib(2)......... + fib(1) fib(1)........... + fib(0)
fib(1) + fib(0) fib(1) fib(1) fib(0)
fib(1) fib(0)
BOTTOM of the tree
(অন্য কোনও বিরল সমস্যার ক্ষেত্রে, এই গাছটি কয়েকটি শাখায় অসীম হতে পারে, এটি অবসানহীনতার প্রতিনিধিত্ব করে এবং এভাবে গাছের নীচে অসীম আকার ধারণ করতে পারে Furthermore আরও কিছু সমস্যাতে আপনি হয়ত জানেন না যে পুরো গাছটি সামনে কী দেখায় like সময়। সুতরাং, আপনার কোন কৌশল বা অ্যালগরিদম প্রয়োজন হতে পারে কোন সাব-সমস্যাগুলি প্রকাশ করা উচিত decide
স্মৃতিচারণ, ট্যাবুলেশন
গতিশীল প্রোগ্রামিংয়ের কমপক্ষে দুটি প্রধান কৌশল রয়েছে যা পারস্পরিক একচেটিয়া নয়:
স্মৃতিচারণ - এটি একটি ল্যাসেজ-ফায়ার পদ্ধতির: আপনি ধরে নিয়েছেন যে আপনি ইতিমধ্যে সমস্ত সাব-প্রবলেমগুলি গণনা করেছেন এবং অনুকূল মূল্যায়ন আদেশ কী তা আপনার কোনও ধারণা নেই। সাধারণত, আপনি মূল থেকে একটি পুনরাবৃত্ত কল (বা কিছু পুনরাবৃত্ত সমতুল্য) সঞ্চালন করবেন, এবং হয় আশা করেন যে আপনি সর্বোত্তম মূল্যায়ন আদেশের কাছাকাছি চলে যাবেন, বা এমন একটি প্রমাণ পাবেন যা আপনাকে অনুকূল মূল্যায়ন আদেশে পৌঁছাতে সহায়তা করবে। আপনি নিশ্চিত করবেন যে পুনরাবৃত্ত কলটি কখনই কোনও সাব-সমস্যাকে পুনরুদ্ধার করে না কারণ আপনি ফলাফলগুলি ক্যাশে করেন এবং এভাবে ডুপ্লিকেট উপ-গাছগুলি পুনরায় সংশোধন করা হয় না।
- উদাহরণস্বরূপ: আপনি যদি ফিবোনাচি ক্রমটি গণনা করেন তবে
fib(100)
আপনি কেবল এটি কল করবেন এবং এটি কল করবে fib(100)=fib(99)+fib(98)
, যা কল করবে fib(99)=fib(98)+fib(97)
, ... ইত্যাদি ... যা কল করবে fib(2)=fib(1)+fib(0)=1+0=1
। এরপরে এটি শেষ হয়ে যাবে fib(3)=fib(2)+fib(1)
, তবে এটি পুনরায় গণনা করার দরকার নেই fib(2)
, কারণ আমরা এটি ক্যাশে করেছি।
- এটি গাছের শীর্ষে শুরু হয় এবং পাতা / সাবট্রিজ থেকে মূলের দিকে ফিরে সাব-সমস্যাগুলি মূল্যায়ন করে।
সারণী - আপনি গতিশীল প্রোগ্রামিংটিকে "টেবিল-ভর্তি" অ্যালগরিদম হিসাবে ভাবতেও পারেন (যদিও সাধারণত বহুমাত্রিক, এই 'টেবিল'-এ খুব বিরল ক্ষেত্রে * ইউক্লিডিয়ান জ্যামিতি থাকতে পারে *)। এটি স্মৃতিচারণের মতো তবে আরও সক্রিয়, এবং এতে আরও একটি পদক্ষেপ জড়িত: আপনাকে অবশ্যই সময়কালের আগে সঠিক গতিপথটি বেছে নিতে হবে যা আপনি আপনার গণনাগুলি করবেন। এটি বোঝানো উচিত নয় যে অর্ডারটি অবশ্যই স্থির হবে, তবে স্মৃতিচারণের চেয়ে আপনার আরও অনেক নমনীয়তা রয়েছে।
- উদাহরণ: আপনি Fibonacci সম্পাদন করা হয়, আপনি এই অনুক্রমে সংখ্যার গণনা করতে চয়ন করতে পারে:
fib(2)
, fib(3)
, fib(4)
... যে মান ক্যাশে তাই আপনি পরবর্তী বেশী আরো সহজে গনা পারবেন না। আপনি এটিকে কোনও টেবিল (ক্যাশিংয়ের অন্য একটি রূপ) পূরণ হিসাবেও ভাবতে পারেন।
- আমি ব্যক্তিগতভাবে 'ট্যাবুলেশন' শব্দটি খুব বেশি শুনতে পাই না, তবে এটি খুব শালীন শব্দ। কিছু লোক এই "গতিশীল প্রোগ্রামিং" বিবেচনা করে।
- অ্যালগরিদম চালানোর আগে প্রোগ্রামার পুরো গাছটিকে বিবেচনা করে, তারপরে মূলের দিকে একটি নির্দিষ্ট ক্রমে সাব-প্রবলেমগুলি মূল্যায়নের জন্য একটি অ্যালগরিদম লেখেন, সাধারণত একটি টেবিল পূরণ করে।
- * পাদটীকা: কখনও কখনও 'টেবিল' গ্রিডের মতো সংযোগ সহ কোনও আয়তক্ষেত্রাকার টেবিল নয় se বরং এর আরও জটিল কাঠামো থাকতে পারে যেমন গাছ বা সমস্যা কাঠামোর সাথে নির্দিষ্ট কাঠামো (যেমন মানচিত্রে বিমানের দূরত্বের মধ্যে শহরগুলি), এমনকি গ্রিডের মতো একটি ট্রেলিস ডায়াগ্রামও নেই have একটি আপ-ডাউন-বাম-ডান সংযোগের কাঠামো ইত্যাদির উদাহরণস্বরূপ, ব্যবহারকারীর 3290797 একটি গাছে সর্বাধিক স্বতন্ত্র সেট সন্ধানের একটি গতিশীল প্রোগ্রামিং উদাহরণের সাথে সংযুক্ত করেছে , যা একটি গাছের ফাঁকা অংশ পূরণ করার সাথে মিলে যায়।
(এটা একটি "গতিশীল প্রোগ্রামিং" দৃষ্টান্ত সবচেয়ে সাধারণ হয়, আমি বলতে হবে প্রোগ্রামার পুরো গাছ বলে মনে করে তারপরএকটি অ্যালগরিদম লিখেছেন যা সাব-প্রব্লেমগুলি মূল্যায়নের জন্য একটি কৌশল প্রয়োগ করে যা আপনি যা চান তার বৈশিষ্ট্যগুলি (সাধারণত সময়-জটিলতা এবং স্পেস-জটিলতার সংমিশ্রণ) অনুকূল করতে পারে। আপনার কৌশলটি অবশ্যই কোনও নির্দিষ্ট সাব-প্রব্লেম সহ কোথাও শুরু হওয়া উচিত এবং সম্ভবত সেগুলি মূল্যায়নের ফলাফলের উপর ভিত্তি করে নিজেকে খাপ খাইয়ে নিতে পারে। "ডায়নামিক প্রোগ্রামিং" এর সাধারণ অর্থে, আপনি এই সাব-প্রবলেমগুলি ক্যাশে করার চেষ্টা করতে পারেন এবং আরও সাধারণভাবে, বিভিন্ন ডেটা স্ট্রাকচারের গ্রাফের ক্ষেত্রে সম্ভবত একটি সূক্ষ্ম পার্থক্য সহ সাব-প্রবলেমগুলি পুনরায় দেখা এড়াতে চেষ্টা করুন। খুব প্রায়ই, এই ডেটা স্ট্রাকচারগুলি অ্যারে বা টেবিলের মতো তাদের মূল অংশে থাকে। সাব-সমস্যাগুলির সমাধানগুলি যদি আমাদের আর প্রয়োজন না হয় তবে তা ফেলে দেওয়া যেতে পারে))
[পূর্বে, এই উত্তরটি শীর্ষ-বনাম বনাম নীচের অংশের পরিভাষা সম্পর্কে একটি বিবৃতি দিয়েছে; মেমোয়েজেশন এবং ট্যাবুলেশন নামক দুটি মূল পদ্ধতির স্পষ্টভাবে রয়েছে যা এই শর্তাদি (যদিও পুরোপুরি নয়) এর সাথে সম্মতিযুক্ত হতে পারে। বেশিরভাগ লোকেরা সাধারণত যে শব্দটি ব্যবহার করেন তা হ'ল "ডায়নামিক প্রোগ্রামিং" এবং কিছু লোক "ডায়নামিক প্রোগ্রামিং" এর সেই বিশেষ উপ টাইপটিকে বোঝাতে "মেমোইজেশন" বলে। সম্প্রদায়টি একাডেমিক গবেষণাপত্রগুলিতে যথাযথ উল্লেখ খুঁজে না পাওয়া পর্যন্ত এই উত্তরটি শীর্ষ-ডাউন এবং নীচের অংশে কী বলে তা অস্বীকার করে। পরিশেষে, এটি পরিভাষার চেয়ে পার্থক্যটি বোঝা গুরুত্বপূর্ণ।]
সুবিধা - অসুবিধা
কোডিংয়ের সহজতা
মেমোয়েজেশন কোড করা খুব সহজ (আপনি সাধারণত * একটি "মেমোজার" টিকা বা র্যাপার ফাংশন লিখতে পারেন যা এটি স্বয়ংক্রিয়ভাবে এটি আপনার জন্য করে), এবং আপনার পদ্ধতির প্রথম লাইন হওয়া উচিত। সারণীর অবক্ষয়টি হ'ল আপনাকে একটি অর্ডার নিয়ে আসতে হবে।
* (এটি আসলে কেবল তখনই সহজ তবে যদি আপনি নিজেই ফাংশনটি লিখছেন, এবং / অথবা একটি অপরিষ্কার / অ-কার্যকরী প্রোগ্রামিং ভাষায় কোডিং করছেন ... উদাহরণস্বরূপ যদি কেউ ইতিমধ্যে একটি প্রাকম্পম্পিল্ড fib
ফাংশন লিখে থাকে তবে তা অগত্যা নিজেই পুনরাবৃত্তি কল করে এবং এই পুনরাবৃত্ত কলগুলি আপনার নতুন মেমোজাইজড ফাংশনটিকে কল করে (এবং মূল স্মৃতিবিহীন ফাংশন নয়) সুনিশ্চিত না করে আপনি যাদুতে ফাংশনটি স্মরণ করতে পারবেন না)
Recursiveness
নোট করুন যে শীর্ষ-ডাউন এবং নীচের অংশ উভয়ই পুনরাবৃত্তি বা পুনরাবৃত্তি টেবিল ভরাটের সাথে প্রয়োগ করা যেতে পারে, যদিও এটি প্রাকৃতিক নয়।
ব্যবহারিক উদ্বেগ
স্মৃতিচারণের সাহায্যে, গাছটি খুব গভীর (উদাঃ fib(10^6)
) হলে আপনার স্ট্যাকের স্থান শেষ হয়ে যাবে, কারণ প্রতিটি বিলম্বিত গণনা অবশ্যই স্ট্যাকের উপরে রাখা উচিত এবং এর মধ্যে আপনার 10 ^ 6 থাকবে।
Optimality
যদি আপনি সাবপ্রব্লেমগুলি দেখার (বা চেষ্টা করার) আদেশটি যথাযথ না হন তবে পদ্ধতির সময়-অনুকূল হতে পারে না, বিশেষত যদি একটি সাবপ্রব্লেম গণনা করার একাধিক উপায় থাকে (সাধারণত ক্যাশে এটি সমাধান করবে তবে তাত্ত্বিকভাবে সম্ভব যে ক্যাশিং হতে পারে কিছু বিদেশী ক্ষেত্রে নয়)। স্মৃতিচারণ সাধারণত আপনার স্পেস-জটিলতায় আপনার সময়-জটিলতায় যোগ করবে (যেমন ট্যাবুলেশনের সাথে আপনার গণনা ছুঁড়ে দেওয়ার মতো আরও স্বাধীনতা আছে, যেমন ফিবের সাথে ট্যাবুলেশন ব্যবহারের ফলে আপনাকে ও (1) স্থান ব্যবহার করতে দেওয়া হয় তবে ফাইব সহ স্মৃতিচারণ ও (এন) ব্যবহার করে স্ট্যাক স্পেস)।
উন্নত অনুকূলিতকরণ
আপনি যদি খুব জটিল সমস্যাও করে থাকেন তবে আপনার ট্যাবুলেশন করা ছাড়া কোনও উপায় নেই (বা কমপক্ষে আপনি যেখানে যেতে চান সেখানে স্মৃতিচারণের ক্ষেত্রে আরও সক্রিয় ভূমিকা নিতে হবে)। এছাড়াও আপনি যদি এমন পরিস্থিতিতে থাকেন যেখানে অপ্টিমাইজেশন একেবারে সমালোচনামূলক এবং আপনার অবশ্যই অপ্টিমাইজ করতে হবে, ট্যাবুলেশন আপনাকে অপ্টিমাইজেশন করতে দেয় যা স্মৃতিচারণ অন্যথায় আপনাকে বুদ্ধিমানভাবে করতে দেয় না। আমার নম্র মতে, সাধারণ সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ে, এই দুটি ক্ষেত্রে দুটির কোনওই সামনে আসে না, সুতরাং আমি কেবল স্মৃতি ("একটি ফাংশন যা এর উত্তরগুলিকে ক্যাশে করে") ব্যবহার না করে যদি কিছু (যেমন স্ট্যাক স্পেস) ট্যাবুলেশনকে প্রয়োজনীয় না করে ... তবে প্রযুক্তিগতভাবে স্ট্যাক ব্লাউট এড়াতে আপনি 1) ভাষাগুলিতে স্ট্যাকের আকার সীমা বৃদ্ধি করতে পারেন যা এটি অনুমতি দেয়, বা 2) আপনার স্ট্যাকটি ভার্চুয়ালাইজ করার জন্য অতিরিক্ত কাজের ধ্রুবক উপাদান খান (আইক),
আরও জটিল উদাহরণ
এখানে আমরা বিশেষ আগ্রহের উদাহরণগুলি তালিকাভুক্ত করি, এটি কেবলমাত্র সাধারণ ডিপি সমস্যা নয়, মেমোয়াইজেশন এবং ট্যাবুলেশনকে আকর্ষণীয়ভাবে পৃথক করে। উদাহরণস্বরূপ, একটি গঠন অন্যের চেয়ে অনেক সহজ হতে পারে, বা এমন একটি অপ্টিমাইজেশন হতে পারে যা মূলত ট্যাবুলেশনের প্রয়োজন:
- দ্বি-মাত্রিক টেবিল ভর্তি অ্যালগরিদমের অ-তুচ্ছ উদাহরণ হিসাবে আকর্ষণীয় [ 4 ] সম্পাদনা-দূরত্ব গণনা করার জন্য অ্যালগরিদম