Array ও hash map: interview-এর অবশ্যজ্ঞাতব্য প্যাটার্ন

Interview-এর বড় অংশের প্রশ্ন array আর hash map দিয়ে মেটে। প্যাটার্নগুলো শিখে দ্রুত চিনুন।

hash map lookup table সহ সংখ্যার array

অনেক coding সমস্যা আলাদা দেখালেও কয়েকটি প্যাটার্নে নেমে আসে। প্রথম ও সবচেয়ে কাজের হলো hash map (dictionary, object বা map-ও বলে)। এটি key-value জোড়া রাখে এবং গড়ে একটি key খোঁজা, যোগ ও সরানো O(1) সময়ে করে। Hash set শুধু key রাখে এবং "এটি কি আগে দেখেছি?" প্রশ্নের উত্তর O(1)-এ দেয়।

নিচের উদাহরণ JavaScript ধাঁচের, তবে ধারণা যেকোনো ভাষায় খাটে।

প্যাটার্ন ১: "আগে কি দেখেছি?" (set)

সমস্যা: array-তে কি ডুপ্লিকেট আছে?

Brute force প্রতিটি জোড়া তুলনা করে: O(n²)। Set দিয়ে এক পাসে হয়:

function hasDuplicate(nums) {
  const seen = new Set();
  for (const n of nums) {
    if (seen.has(n)) return true;
    seen.add(n);
  }
  return false;
}
// সময় O(n), space O(n)

এটি space দিয়ে সময় কেনা, খুব প্রচলিত কৌশল।

প্যাটার্ন ২: পরিপূরক খোঁজা (Two Sum)

সমস্যা: সংখ্যা ও একটি target দেওয়া, যাদের মান যোগ করলে target হয় এমন দুটি index খুঁজুন।

Brute force O(n²)। প্রতিটি সংখ্যার জন্য শুধু জানা দরকার target - number আগে দেখা গেছে কি না:

function twoSum(nums, target) {
  const indexOf = new Map();          // value -> index
  for (let i = 0; i < nums.length; i++) {
    const need = target - nums[i];
    if (indexOf.has(need)) return [indexOf.get(need), i];
    indexOf.set(nums[i], i);
  }
  return [];
}
// সময় O(n), space O(n)

বসানোর আগে যাচাই করুন, যাতে একটি element নিজের সাথে জোড়া না হয়।

প্যাটার্ন ৩: frequency গণনা

সমস্যা: দুটি string কি anagram? কোন element সবচেয়ে বেশি আসে?

Map দিয়ে সংখ্যা গুনুন:

function isAnagram(a, b) {
  if (a.length !== b.length) return false;
  const count = {};
  for (const ch of a) count[ch] = (count[ch] || 0) + 1;
  for (const ch of b) {
    if (!count[ch]) return false;
    count[ch]--;
  }
  return true;
}
// সময় O(n), space O(k), k হলো বর্ণমালার আকার

শুধু ছোট হাতের অক্ষর হলে ২৬টি counter-এর নির্দিষ্ট array আরও সরল এবং O(1) space দেয়।

প্যাটার্ন ৪: key দিয়ে দল করা

সমস্যা: পরস্পরের anagram এমন শব্দ দল করুন।

একটি canonical key (যেমন সাজানো অক্ষর) ব্যবহার করে প্রতিটি শব্দ সেই key-র তালিকায় রাখুন:

function groupAnagrams(words) {
  const groups = new Map();
  for (const w of words) {
    const key = [...w].sort().join("");
    if (!groups.has(key)) groups.set(key, []);
    groups.get(key).push(w);
  }
  return [...groups.values()];
}

Item দল বা ডুপ্লিকেট-মুক্ত করতে হলে জিজ্ঞেস করুন: কোন key সমান জিনিসকে একই দেখায়?

প্যাটার্ন ৫: prefix sum

সমস্যা: "index i থেকে j পর্যন্ত element-এর যোগফল" ধরনের অনেক প্রশ্নের দ্রুত উত্তর, বা নির্দিষ্ট যোগফলের subarray গোনা।

আগে হিসাব করুন prefix[k] = প্রথম k টি element-এর যোগফল। তখন i থেকে j পর্যন্ত যোগফল O(1)-এ prefix[j + 1] - prefix[i]।

"যোগফল K এমন subarray গোনা"-তে প্রতিটি prefix sum কতবার এসেছে তার map রাখুন:

function subarraySum(nums, k) {
  const seen = new Map([[0, 1]]);     // prefix sum -> count
  let sum = 0, count = 0;
  for (const n of nums) {
    sum += n;
    count += seen.get(sum - k) || 0;
    seen.set(sum, (seen.get(sum) || 0) + 1);
  }
  return count;
}
// সময় O(n), space O(n)

এটি ঋণাত্মক সংখ্যাতেও কাজ করে, যেখানে sliding window করে না।

প্যাটার্ন ৬: in-place array কৌশল

কখনো memory সীমিত, বা array নিজেই স্টোরেজ হিসেবে পুনর্ব্যবহার করা যায়:

  • অনুমতি থাকলে array-কেই চিহ্ন হিসেবে ব্যবহার করুন (যেমন মান ঋণাত্মক করে visited index চিহ্নিত)।
  • Read ও write pointer দিয়ে scan করার সময় element swap বা overwrite করুন।

Input বদলালে এবং তা গ্রহণযোগ্য কি না স্পষ্ট বলুন।

এই সমস্যা কীভাবে চিনবেন

যখন দেখবেন, hash map ভাবুন:

  • "জোড়া/পরিপূরক খুঁজুন", "গুনুন", "সবচেয়ে ঘন ঘন", "প্রথম অ-পুনরাবৃত্ত"।
  • "ডুপ্লিকেট", "অনন্য", "anagram", "group by"।
  • কিছু খোঁজার জন্য nested loop-সহ brute force। Map ভেতরের খোঁজাকে O(1) করে।

সাধারণ ভুল

  • Loop-এর ভেতরে array খোঁজা (includes, indexOf), যা O(n²) লুকায়।
  • ফাঁকা ইনপুট বা একক-element ক্ষেত্র ভুলে যাওয়া।
  • ভুলে mutable object বা array-কে map key বানানো।
  • মান ঋণাত্মক, পুনরাবৃত্ত বা অতি বড় হতে পারে কি না স্পষ্ট না করা।
  • সবচেয়ে খারাপ ক্ষেত্রে hash collision উপেক্ষা। গড় O(1) সাধারণত গ্রহণযোগ্য, তবে উল্লেখ করতে পারেন।

অনুশীলনের সমস্যা

Contains Duplicate, Valid Anagram, Two Sum, Group Anagrams, Top K Frequent Elements, Longest Consecutive Sequence, Subarray Sum Equals K, Product of Array Except Self।

মূল কথা: দ্রুত খোঁজা, গোনা বা দল করা দরকার হলে hash map বা set নিন। সামান্য memory দিয়ে O(n²) থেকে O(n)-এ নামুন, এবং range-sum প্রশ্নে prefix sum ব্যবহার করুন।


Interview প্রস্তুতি ও DSA সিরিজ, পর্ব ১ (মূল প্যাটার্ন): 2 নম্বর (মোট 5)। আগের লেখা: Big-O সহজ ভাষায়: time ও space complexity.

আরও পড়ুন

Recursion ও backtracking সহজ উদাহরণে

Recursion সমস্যার ছোট কপি সমাধান করে সমাধান করে। অনেক interview সমস্যায় ব্যবহৃত চিন্তার ধাপ ও backtracking টেমপ্লেট শিখুন।

Interview ও DSA•৩ মিনিটে পড়া