জটিলতা ও বিশ্লেষণপড়তে ৫ মিনিট লাগবে

অ্যালগরিদম কেন শিখবেন?

যেকোনো সার্চ রেজাল্ট, জিপিএস রুট বা রেকমেন্ডেশনের পেছনের জাদুকরী রেসিপি
scope:প্রাথমিক ধারণা

সমস্যা সমাধানের রেসিপি

অ্যালগরিদম হলো সমস্যা সমাধানের জন্য ধাপে ধাপে তৈরি একটি রেসিপি। আপনি প্রতিদিন অ্যালগরিদম ব্যবহার করেন — শুধু তাকে এই নামে ডাকেন না। এক ডেক তাস সাজানো? অ্যালগরিদম। অফিসে যাওয়ার সবচেয়ে দ্রুত রাস্তা খোঁজা? অ্যালগরিদম। ফোনের কন্টাক্ট লিস্টে একটি নাম খোঁজা? অ্যালগরিদম।

একটি ভালো ও খারাপ অ্যালগরিদমের পার্থক্য হলো, লাইব্রেরির ক্যাটালগ সিস্টেম ব্যবহার করে একটি বই খোঁজা আর বিল্ডিংয়ের প্রতিটি তাক তন্ন তন্ন করে খোঁজার মধ্যে যে পার্থক্য, ঠিক ততটাই। দুটোতেই কাজ হয়। একটিতে লাগে কয়েক সেকেন্ড, অন্যটিতে কয়েক ঘণ্টা।

কেন এটি শেখা জরুরি?

সত্যি করে বলতে, দৈনন্দিন কোডিংয়ে আপনাকে একদম শূন্য থেকে শর্টিং (sorting) অ্যালগরিদম লিখতে হবে না। লাইব্রেরিগুলো আপনার জন্য সেই কাজ করে দেয়। তাহলে কেন এগুলো শিখবেন?

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

  • বাইনারি সার্চ (Binary search) — সবকিছু চেক করার দরকার নেই। প্রতিবার সমস্যাকে অর্ধেক করে ফেলুন।
  • ডিভাইড অ্যান্ড কনকার (Divide and conquer) — একটি বড় সমস্যাকে একই রকম ছোট ছোট সমস্যায় ভাগ করে ফেলুন।
  • ডায়নামিক প্রোগ্রামিং (Dynamic programming) — যদি কোনো ছোট সমস্যার সমাধান আগে করে থাকেন, তবে সেটি আর দ্বিতীয়বার করার প্রয়োজন নেই।
  • গ্রিডি অ্যালগরিদম (Greedy algorithms) — প্রতিটি পদক্ষেপে সেরা অপশনটি বেছে নিন এবং আশা করুন যে শেষ পর্যন্ত এটি দারুণ কাজ করবে।
  • গ্রাফ ট্রাভার্সাল (Graph traversal) — নিয়মতান্ত্রিক উপায়ে সমস্ত সম্ভাবনা যাচাই করুন।

এগুলো কেবলমাত্র শিক্ষাগত কসরত নয়। এগুলো হলো মানসিক টুল বা হাতিয়ার, যা যেকোনো প্রযুক্তিগত সিদ্ধান্ত নিতে আপনার কাজে আসবে।

লিনিয়ার সার্চ বনাম বাইনারি সার্চ

# ১ মিলিয়ন আইটেমের একটি সাজানো (sorted) লিস্ট থেকে নির্দিষ্ট সংখ্যা খোঁজা
import time
sorted_data = list(range(1_000_000))
target = 876_543
# লিনিয়ার সার্চ: প্রতিটি উপাদান চেক করা → O(n)
def linear_search(data, target):
for i, val in enumerate(data):
if val == target:
return i
return -1
# বাইনারি সার্চ: প্রতিবার অর্ধেক করে ফেলা → O(log n)
def binary_search(data, target):
lo, hi = 0, len(data) - 1
while lo <= hi:
mid = (lo + hi) // 2
if data[mid] == target:
return mid
elif data[mid] < target:
lo = mid + 1
else:
hi = mid - 1
return -1
start = time.time()
linear_search(sorted_data, target)
linear_time = time.time() - start
start = time.time()
binary_search(sorted_data, target)
binary_time = time.time() - start
print(f"লিনিয়ার সার্চে সময়: {linear_time:.6f}s (প্রায় ৮৭৬ হাজার আইটেম চেক করেছে)")
print(f"বাইনারি সার্চে সময়: {binary_time:.6f}s (প্রায় ২০টি আইটেম চেক করেছে)")
print(f"বাইনারি সার্চ {linear_time / max(binary_time, 0.000001):.0f} গুণ বেশি দ্রুত!")
Output
লিনিয়ার সার্চে সময়: 0.045000s (প্রায় ৮৭৬ হাজার আইটেম চেক করেছে)
বাইনারি সার্চে সময়: 0.000003s (প্রায় ২০টি আইটেম চেক করেছে)
বাইনারি সার্চ 15000 গুণ বেশি দ্রুত!

একই ডেটা, একই উত্তর। কিন্তু বাইনারি সার্চে ৮,৭৬,০০০ বার চেক করার বদলে মাত্র ২০ বার চেক করতে হয়েছে। এটাই হলো O(n) এবং O(log n) এর মধ্যে তফাৎ — এবং ডেটার পরিমাণ যত বাড়ে, এই পার্থক্য তত নাটকীয় হতে থাকে।

অ্যালগরিদম আছে সবখানে

আপনার ব্যবহার করা প্রতিটি প্রযুক্তিই অ্যালগরিদম দ্বারা পরিচালিত:

  • গুগল সার্চ — পেজর‍্যাংক (PageRank), গ্রাফ থিওরি ব্যবহার করে ওয়েব পেজগুলোর গুরুত্ব অনুসারে র‍্যাংক করার একটি অ্যালগরিদম।
  • জিপিএস / গুগল ম্যাপস — ডাইকস্ট্রার অ্যালগরিদম (Dijkstra's algorithm) এবং এর অন্যান্য রূপ লাখ লাখ রাস্তার মধ্যে সবচেয়ে ছোট পথটি খুঁজে বের করে।
  • নেটফ্লিক্স / স্পটিফাই — রেকমেন্ডেশন অ্যালগরিদম আপনার স্বভাব বিশ্লেষণ করে এবং আপনি এরপর কী পছন্দ করবেন সেই প্যাটার্ন খুঁজে বের করে।
  • কমপ্রেশন (Compression) — আপনি যখন কোনো ফাইল জিপ (zip) করেন বা ভিডিও স্ট্রিম করেন, তখন হাফম্যান কোডিং (Huffman coding) এবং LZ77 এর মতো অ্যালগরিদমগুলো ডেটা সংকুচিত করে।
  • এনক্রিপশন (Encryption) — RSA, AES — এমন অ্যালগরিদমগুলো যা আপনার পাসওয়ার্ড এবং ক্রেডিট কার্ড নিরাপদ রাখে।
  • সোশ্যাল মিডিয়া ফিড — সর্টিং এবং র‍্যাংকিং অ্যালগরিদমগুলো ঠিক করে যে আপনি প্রথমেই কী দেখতে পাবেন।

বিগ-ও (Big-O) এর ধারণা

অ্যালগরিদমকে সাধারণত কতটা স্কেল করতে পারে তার ওপর ভিত্তি করে পরিমাপ করা হয়। যদি আপনার ডেটাসেটের আকার দ্বিগুণ হয়, তবে অ্যালগরিদম কি দ্বিগুণ সময় নেবে? নাকি সে প্রায় বুঝতেই পারবে না? ঠিক এই জিনিসটাই বিগ-ও নোটেশন (Big-O notation) দিয়ে প্রকাশ করা হয়:

  • O(1) — একদম নির্দিষ্ট সময় (Constant time)। ডেটা ১০টি হোক বা ১০ বিলিয়ন, তাতে কিছুই যায় আসে না। এটি তাৎক্ষণিক কাজ করে।
  • O(log n) — লগারিদমিক (Logarithmic)। ডেটা দ্বিগুণ করলেও এটি মাত্র একটি অতিরিক্ত ধাপ যোগ করে। বাইনারি সার্চ এভাবে কাজ করে।
  • O(n) — লিনিয়ার (Linear)। ডেটা দ্বিগুণ মানে সময়ও দ্বিগুণ। একটি লিস্ট স্ক্যান করা এভাবেই কাজ করে।
  • O(n log n) — ডেটা সাজানোর জন্য সবচেয়ে আদর্শ। মার্জ সর্ট (Merge sort) এবং কুইক সর্ট (quick sort) এই শ্রেণিতে পড়ে।
  • O(n²) — কোয়াড্রাটিক (Quadratic)। ডেটা দ্বিগুণ হলে সময় ৪ গুণ লাগে। একই ডেটার মধ্যে নেস্টেড লুপগুলো এভাবেই কাজ করে।
  • O(2ⁿ) — এক্সপোনেনশিয়াল (Exponential)। একটি নতুন আইটেম যোগ করলে সময় দ্বিগুণ হয়ে যায়। ব্রুট-ফোর্স (Brute-force) বা জোরাজুরির সমাধানগুলো এখানে এসে মুখ থুবড়ে পড়ে।

Complexity

🔑 হ্যাশ টেবিল লুকআপ
সবচেয়ে ভালো অবস্থা — সরাসরি ডেটা এক্সেস করা যায়
তাৎক্ষণিক O(1)
🔍 বাইনারি সার্চ
১ মিলিয়ন আইটেম খুঁজতে মাত্র ২০টি ধাপ লাগে
খুব দ্রুত O(log n)
📋 লিস্ট স্ক্যান
প্রতিটি আইটেম একবার করে চেক করে
মাঝারি O(n)
🔄 মার্জ সর্ট / কুইক সর্ট
সবচেয়ে ভালো তুলনামূলক সর্টিং পদ্ধতি
ডেটা সাজাতে দ্রুত O(n log n)
🐌 নেস্টেড লুপ তুলনা
বাবল সর্ট, ব্রুট-ফোর্স জোড় মেলানো
ধীরগতির O(n²)
💥 ব্রুট-ফোর্স (সবগুলো সাবসেট)
১০টি আইটেমে = ১,০২৪টি সাবসেট। ৩০টি আইটেমে = ১ বিলিয়ন।
বিশ্লেষণ করতে পারে না O(2ⁿ)
দ্রষ্টব্য: আপনাকে সব অ্যালগরিদম মুখস্থ করতে হবে না। প্যাটার্ন বা ধরন বোঝার ওপর জোর দিন — যেমন, ডিভাইড অ্যান্ড কনকার, ডায়নামিক প্রোগ্রামিং, গ্রিডি, বা গ্রাফ ট্রাভার্সাল। একবার প্যাটার্নটি চিনে গেলে, যেকোনো নতুন সমস্যার ক্ষেত্রেই তা প্রয়োগ করতে পারবেন। এটি অনেকটা দাবা খেলার পেঁচ শেখার মতো: সুনির্দিষ্ট চালের চেয়ে এর পেছনের কৌশলমূলক চিন্তাভাবনা বেশি গুরুত্বপূর্ণ।

ইন্টারভিউয়ের বাস্তবতা

চলুন এমন এক বিষয়ের কথা বলি যা সবাই এড়িয়ে যেতে চায়: কোডিং ইন্টারভিউ। গুগল, মেটা, অ্যামাজন, অ্যাপল এবং বেশির ভাগ টেক কোম্পানিই তাদের ইন্টারভিউতে অ্যালগরিদম নলেজ পরীক্ষা করে। আপনি পছন্দ করেন বা না-ই করেন, বাস্তবতা এটাই।

তবে মজার বিষয় হলো — কোম্পানিগুলো আপনার অ্যালগরিদম মুখস্থ করার ক্ষমতা পরীক্ষা করে না। তারা পরীক্ষা করে আপনার সমস্যা বিশ্লেষণ করার, প্যাটার্ন চেনার এবং এর কাজের গতি নিয়ে যুক্তি দেওয়ার ক্ষমতা। এগুলো রিয়েল-গেম ইঞ্জিনিয়ারিংয়ের জন্য আসলেই দারুণ সব দক্ষতা যা যেকোনো কাজেই ব্যবহার করা যায়।

সবচেয়ে ভালো ব্যাপার কী জানেন? এই অ্যালগরিদমিক চিন্তাগুলো কখনই পুরোনো হয় না বা হারিয়ে যায় না। ফ্রেমওয়ার্ক প্রতি বছর বদলায়। প্রোগ্রামিং ল্যাঙ্গুয়েজ আসে এবং যায়। কিন্তু অ্যালগরিদম দিয়ে চিন্তা করার এই ক্ষমতাটি রিয়েল লাইফ প্রব্লেম সলভের ক্ষেত্রে আপনাকে স্থায়ীভাবে আপগ্রেড করে দেবে।

ছোট কুইজ

উদাহরণের মতো বাইনারি সার্চ কেন লিনিয়ার সার্চের চেয়ে 15,000x দ্রুততর ছিল?

পড়া চালিয়ে যান

বিগ-ও, থিটা, ওমেগা (Big-O, Theta, Omega)
অতিথির সংখ্যা বাড়লে আপনার রান্নার রেসিপি কতটা ধীর হয়ে যায়?
বেসিক সোর্টস (Basic Sorts)
হাতের তাসগুলো সাজানো — তিনটি উপায়, একটি গতিপথ
বাইনারি সার্চ (Binary Search)
সমস্যাটিকে অর্ধেক করে ফেলুন — এবং তা প্রতিবারই
ডিপি প্যাটার্ন (DP Pattern)
একই পাজলের (puzzle) টুকরো বা সমস্যার সমাধান কখনোই দু'বার করবেন না — বরং সেটিকে লিখে রাখুন এবং দরকার হলে পরের বার সেখান থেকেই দেখে নিন