আমার পুনরাবৃত্তাকার অ্যালগোরিদমের সময়ের জটিলতা কমাতে আমি কখন ডায়নামিক প্রোগ্রামিং ব্যবহার করতে পারি?


13

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


উত্তর:


9

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

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


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

1
স্মৃতিচারণ! = গতিশীল প্রোগ্রামিং!
রাফেল

1
আমি মনে করি না আমরা এটি বলছি, তবে প্রশ্নটি সময়ের জটিলতা হ্রাস করার ইঙ্গিত দেয়। ডায়নামিক প্রোগ্রামিং নিজে থেকে সহজেই সমস্যাটিকে পার্টিশন করে। ডায়নামিক প্রোগ্রামিং + + memoization সময় জটিলতা উন্নত করতে একটি জেনেরিক উপায় যেখানে সম্ভব
এডিএ-কিএ মার্ট-ওরা-ওয়াই

@ এডিএ-কামোর্ট-ওরা-ওয়াই: ঠিক। আমি মনে করি এটি স্পষ্টভাবে উল্লেখ করা জরুরী, স্পষ্টতই ওপি ধারণাগুলি বিভ্রান্ত করে / মিশিয়ে দেয়।
রাফেল

8

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

  • এর পার্শ্ব প্রতিক্রিয়া নেই এবং
  • এটি কেবলমাত্র তার পরামিতিগুলির উপর নির্ভর করে (অর্থাত্ কোনও রাজ্যে নয়)।

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

f(0)=0f(1)=1f(n+2)=f(n+1)+f(n), n0

ff(n)f(n+1)

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

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


ডায়নামিক প্রোগ্রামিং সম্পূর্ণ অন্য একটি জন্তু। সম্পত্তি যে সমস্যা সঙ্গে এটি প্রযোজ্য

  • এটি সাব-সমস্যায় বিভক্ত হতে পারে (সম্ভবত একাধিক উপায়ে),
  • এই সাব-সমস্যাগুলি স্বাধীনভাবে সমাধান করা যেতে পারে,
  • (সর্বোত্তম) সমাধানগুলিকে মূল সমস্যাটির সমাধান (সর্বোত্তম) এবং একত্রিত করা যেতে পারে
  • সাব-সমস্যাগুলির একই সম্পত্তি রয়েছে (বা তুচ্ছ)।

বেলম্যানের অনুকূলতার নীতিটি লোকেদের ডাকলে এটি সাধারণত (স্পষ্টভাবে) বোঝানো হয় ।

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


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

@svick: ডায়নামিক প্রোগ্রামিং গতি বাড়াতে না কিছু SE প্রতি (কেস যা সাধারণত আছে ()!), শুধুমাত্র যদি ডিপি পুনরাবৃত্তির memoisation সঙ্গে মূল্যায়ন করা হয়। আবার: ডিপি হ'ল পুনরাবৃত্তির ক্ষেত্রে সমস্যাগুলির মডেল করার একটি উপায় , স্মৃতিচারণ একটি উপযুক্ত recursive অ্যালগরিদম (ডিপি কিনা তা বিবেচনা না করে) গতি বাড়ানোর কৌশল । দুটোকেই সরাসরি তুলনা করে বোঝা যায় না। অবশ্যই আপনি কোনও সমস্যাটিকে ডিপি হিসাবে মডেল করার চেষ্টা করেছেন কারণ আপনি স্মৃতিচারণ প্রয়োগ করার প্রত্যাশা করছেন এবং তাই নিষ্পাপ (আর) পদ্ধতির তুলনায় এটি আরও দ্রুত সমাধান করতে পারেন। তবে একটি ডিপি দৃষ্টিকোণ সর্বদা সবচেয়ে কার্যকর অ্যালগরিদমের দিকে পরিচালিত করে না, হয়।
রাফেল

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

@ এডিএ-কামোর্ট-ওরা-ওয়াই: এটি কোনও পুনরাবৃত্তির জন্য সত্য । তবে এটি পরিষ্কার নয় যে এটি ভাল গতিরোধ তৈরি করে, কারণ প্রসেসরের সীমানার চেয়ে স্মৃতিচারণ কম দক্ষ।
রাফেল

সংশোধন: উদ্বোধন ডিপি-পুনরাবৃত্তি নির্লজ্জভাবে এখনও ব্রুট ফোর্সের চেয়ে দ্রুত (অনেক) দ্রুততর হতে পারে; cf. এখানে
রাফেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.