Kadane's Algorithm
Kadane's Algorithm হলো একটি ডাইনামিক প্রোগ্রামিং (DP) ভিত্তিক পদ্ধতি যার মাধ্যমে কোনো অ্যারের মধ্যে সর্বোচ্চ যোগফল বিশিষ্ট সাব-অ্যারে (Maximum Subarray Sum) খুঁজে বের করা হয়।
১. সর্বোচ্চ সাব-অ্যারে সাম (Maximum Subarray Sum)
এই সমস্যায় আমাদের এমন একটি সাব-অ্যারে খুঁজতে হয় যার এলিমেন্টগুলোর যোগফল সর্বোচ্চ হয়।
Time Complexity: $O(n)$ Space Complexity: $O(1)$
🛠 কর্মপদ্ধতি (Step-by-Step Logic)
- দুটি ভ্যারিয়েবল নিন:
max_so_far(পুরো অ্যারের মধ্যে এখন পর্যন্ত পাওয়া সর্বোচ্চ যোগফল) এবংcurrent_max(বর্তমান ইনডেক্স পর্যন্ত সর্বোচ্চ যোগফল)। - উভয় ভ্যারিয়েবলকে অ্যারের প্রথম এলিমেন্ট দিয়ে ইনিশিয়ালাইজ করুন।
- দ্বিতীয় এলিমেন্ট থেকে লুপ চালান:
- প্রতিটি এলিমেন্ট
nums[i]-এর ক্ষেত্রে চেক করুন: এটি কি আগের যোগফলের সাথে যুক্ত হবে, নাকি এখান থেকেই নতুন করে যোগ শুরু হবে? (current_max = max(nums[i], current_max + nums[i])) - যদি
current_max,max_so_far-এর চেয়ে বড় হয়, তবেmax_so_farআপডেট করুন।
- প্রতিটি এলিমেন্ট
- লুপ শেষে
max_so_farরিটার্ন করুন।
java
public int maxSubArray(int[] nums) {
int maxSoFar = nums[0];
int currentMax = nums[0];
for (int i = 1; i < nums.length; i++) {
currentMax = Math.max(nums[i], currentMax + nums[i]);
maxSoFar = Math.max(maxSoFar, currentMax);
}
return maxSoFar;
}python
def max_subarray(nums):
max_so_far = nums[0]
current_max = nums[0]
for i in range(1, len(nums)):
current_max = max(nums[i], current_max + nums[i])
max_so_far = max(max_so_far, current_max)
return max_so_far২. অ্যালগরিদম ব্যাখ্যা (Algorithm Explanation)
কাদানে'স অ্যালগরিদম প্রতিটি ইনডেক্সে দাঁড়িয়ে দুটি সিদ্ধান্ত নেয়:
- আগের সাব-অ্যারের যোগফলের সাথে বর্তমান এলিমেন্ট যুক্ত করবে।
- অথবা বর্তমান এলিমেন্ট থেকেই নতুন সাব-অ্যারে শুরু করবে।
সূত্র: currentMax = max(arr[i], currentMax + arr[i])
৩. সার্কুলার অ্যারে ভ্যারিয়েশন (Variations - Circular Array)
সার্কুলার অ্যারের ক্ষেত্রে সর্বোচ্চ যোগফল বের করার জন্য আমাদের দুটি কেস চেক করতে হয়:
- Case 1: স্বাভাবিক সর্বোচ্চ যোগফল (Standard Kadane's)।
- Case 2: সার্কুলার সর্বোচ্চ যোগফল (Total Sum - Minimum Subarray Sum)।
৪. সর্বোচ্চ প্রোডাক্ট সাব-অ্যারে (Maximum Product Subarray)
যোগফলের পরিবর্তে গুণফলের ক্ষেত্রে আমাদের পজিটিভ এবং নেগেটিভ উভয় ভ্যালু ট্র্যাক করতে হয় (কারণ দুটি নেগেটিভ সংখ্যা মিলে পজিটিভ হতে পারে)।
🛠 কর্মপদ্ধতি (Step-by-Step Logic)
- একটি ম্যাক্সিমাম এবং মিনিমাম প্রোডাক্ট ভ্যারিয়েবল (
curMax,curMin) ১ এ সেট করুন। - প্রতিটি সংখ্যা
nএর জন্য:- যদি
n০ হয়, তবে ম্যাক্স এবং মিন পুনরায় ১ এ সেট করুন। - অন্যথায়,
curMax,curMinএবং বর্তমান সংখ্যার গুণফলের মধ্যে থেকে নতুন ম্যাক্স এবং মিন ভ্যালু বের করুন। - নেগেটিভ সংখ্যার গুণফল পজিটিভ হতে পারে বলেই আমরা মিনিমাম ভ্যালু ট্র্যাকিং করি।
- যদি
- প্রতিটি ধাপে বর্তমান পর্যন্ত পাওয়া সর্বোচ্চ প্রোডাক্টটি স্টোর করুন।
python
def maxProduct(nums):
res = max(nums)
curMin, curMax = 1, 1
for n in nums:
if n == 0:
curMin, curMax = 1, 1
continue
tmp = curMax * n
curMax = max(n * curMax, n * curMin, n)
curMin = min(tmp, n * curMin, n)
res = max(res, curMax)
return res৫. অ্যাপ্লিকেশনস (Applications)
- Stock Market Analysis: কোনো নির্দিষ্ট সময়ে সর্বোচ্চ লাভ খুঁজে বের করতে।
- Computer Vision: ইমেজের নির্দিষ্ট অংশ (Maximum Intensity) শনাক্ত করতে।
- Data Mining: বিশাল ডেটাসেট থেকে গুরুত্বপূর্ণ প্যাটার্ন আইডেন্টিফাই করতে।
- Genomic Sequence Analysis: ডিএনএ সিকুয়েন্সে গুরুত্বপূর্ণ সেগমেন্ট খুঁজতে।