ডায়নামিক প্রোগ্রামিং (Dynamic Programming)

অ্যাডভান্সড অ্যালগরিদম (Advanced Algorithms) - কম্পিউটার প্রোগ্রামিং ফান্ডামেন্টাল (Computer Programming Fundamentals) - Computer Science

263

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

ডায়নামিক প্রোগ্রামিং সাধারণত দুটি মূল বৈশিষ্ট্যের উপর নির্ভর করে:

  1. অপটিমাল সাবস্ট্রাকচার (Optimal Substructure): একটি সমস্যা ছোট ছোট উপ-সমস্যার সমাধান দ্বারা সমাধানযোগ্য।
  2. ওভারল্যাপিং সাব-প্রবলেমস (Overlapping Sub-problems): একই উপ-সমস্যাগুলির সমাধান বারবার প্রয়োজন হয়।

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

ডায়নামিক প্রোগ্রামিং মূলত দুইভাবে প্রয়োগ করা হয়:

টপ-ডাউন অ্যাপ্রোচ (Top-Down Approach):

  • এই পদ্ধতিতে রিকারশন এবং মেমোইজেশন (Memoization) ব্যবহার করা হয়। প্রথমে বড় সমস্যা সমাধান করতে চেষ্টা করা হয় এবং ছোট ছোট উপ-সমস্যার ফলাফল মেমোরিতে সংরক্ষণ করা হয়, যাতে পুনরায় প্রয়োজন হলে মেমোরি থেকে ফলাফল নেওয়া যায়।

বটম-আপ অ্যাপ্রোচ (Bottom-Up Approach):

  • এই পদ্ধতিতে টেবুলেশন (Tabulation) ব্যবহার করা হয়, যেখানে ছোট ছোট উপ-সমস্যার ফলাফল সরাসরি টেবিলে সংরক্ষণ করা হয় এবং ধাপে ধাপে বড় সমস্যার সমাধান তৈরি করা হয়।

উদাহরণসমূহ

১. ফিবোনাচি সিরিজ (Fibonacci Series)

ফিবোনাচি সিরিজের জন্য ডায়নামিক প্রোগ্রামিং অত্যন্ত কার্যকর।

রিকার্সিভ (টপ-ডাউন) পদ্ধতি ব্যবহার করে মেমোইজেশন:

def fibonacci(n, memo={}):
    if n <= 1:
        return n
    if n not in memo:
        memo[n] = fibonacci(n-1, memo) + fibonacci(n-2, memo)
    return memo[n]

print(fibonacci(10))  # আউটপুট: 55

টেবুলেশন (বটম-আপ) পদ্ধতি:

def fibonacci(n):
    if n <= 1:
        return n
    dp = [0] * (n + 1)
    dp[1] = 1
    for i in range(2, n + 1):
        dp[i] = dp[i - 1] + dp[i - 2]
    return dp[n]

print(fibonacci(10))  # আউটপুট: 55

২. ক্যান ন্যাপস্যাক প্রবলেম (Knapsack Problem)

Knapsack Problem ডায়নামিক প্রোগ্রামিংয়ের জনপ্রিয় একটি সমস্যা, যেখানে নির্দিষ্ট ওজন সীমার মধ্যে সর্বোচ্চ মুনাফা অর্জন করার জন্য বিভিন্ন আইটেম নির্বাচন করতে হয়।

বটম-আপ পদ্ধতির উদাহরণ:

def knapsack(weights, values, W):
    n = len(weights)
    dp = [[0 for x in range(W + 1)] for x in range(n + 1)]

    for i in range(1, n + 1):
        for w in range(1, W + 1):
            if weights[i - 1] <= w:
                dp[i][w] = max(values[i - 1] + dp[i - 1][w - weights[i - 1]], dp[i - 1][w])
            else:
                dp[i][w] = dp[i - 1][w]
    
    return dp[n][W]

weights = [1, 3, 4, 5]
values = [10, 40, 50, 70]
W = 8
print(knapsack(weights, values, W))  # আউটপুট: 110

ডায়নামিক প্রোগ্রামিংয়ের সুবিধা ও অসুবিধা

সুবিধা:

  • টাইম কমপ্লেক্সিটি কমানো: একই উপ-সমস্যার সমাধান পুনরায় ব্যবহার করে কাজ দ্রুত হয়।
  • অপটিমাইজেশন: সর্বোচ্চ বা সর্বনিম্ন ফলাফল বের করতে সাহায্য করে।

অসুবিধা:

  • অতিরিক্ত মেমোরি প্রয়োজন: মেমোইজেশন বা টেবুলেশন করতে অতিরিক্ত মেমোরি ব্যবহার করতে হয়।
  • উপযুক্ত সমস্যা না হলে কার্যকর নয়: ডায়নামিক প্রোগ্রামিং শুধুমাত্র তখনই কার্যকর, যখন সমস্যা অপটিমাল সাবস্ট্রাকচার এবং ওভারল্যাপিং সাব-প্রবলেমস বৈশিষ্ট্য মেনে চলে।

উপসংহার

ডায়নামিক প্রোগ্রামিং এমন একটি পদ্ধতি যা বড় সমস্যাগুলিকে ছোট ছোট উপ-সমস্যায় ভেঙে সমাধান করে এবং পুনরায় ব্যবহারযোগ্য উপ-সমাধান তৈরি করে। এটি টাইম কমপ্লেক্সিটি কমায় এবং বড় সমস্যা সমাধানে কার্যকর ভূমিকা পালন করে।

Promotion

Are you sure to start over?

Loading...