অ্যালগরিদম
সর্টিং থেকে ডায়নামিক প্রোগ্রামিং — ইন্টারেক্টিভ উদাহরণ সহ ধাপে ধাপে গাইড।
জটিলতা ও বিশ্লেষণ
অ্যালগরিদম কেন শিখবেন?
যেকোনো সার্চ রেজাল্ট, জিপিএস রুট বা রেকমেন্ডেশনের পেছনের জাদুকরী রেসিপি→
বিগ-ও, থিটা, ওমেগা (Big-O, Theta, Omega)
অতিথির সংখ্যা বাড়লে আপনার রান্নার রেসিপি কতটা ধীর হয়ে যায়?→
অ্যামোর্টাইজড অ্যানালাইসিস (Amortized Analysis)
একটি বড় বিল, ছোট ছোট কিস্তিতে পরিশোধ করা→
রিকারেন্স রিলেশন (Recurrence Relations)
নিজে নিজেকে ডাকা একটি রেসিপি — সমাধান করতে পারার মতো সহজ না হওয়া পর্যন্ত→
সর্টিং
বেসিক সোর্টস (Basic Sorts)
হাতের তাসগুলো সাজানো — তিনটি উপায়, একটি গতিপথ→
মার্জ সর্ট (Merge Sort)
ভাগ করুন, প্রতি অর্ধেক সাজান, তারপর একত্রিত (merge) করুন — প্রতিবারই \(O(n \log n)\) এর নিশ্চয়তা→
কুইক সর্ট (Quick Sort)
একটি পিভট (pivot) বেছে নিন, জনতাকে ভাগ করুন — ছোটরা বাঁয়ে, বড়রা ডানে→
হিপ সর্ট (Heap Sort)
এমন একটি টুর্নামেন্ট ব্র্যাকেট যেখানে চ্যাম্পিয়ন সবসময় সবার ওপরে উঠে আসে→
লিনিয়ার-টাইম সর্টিং (Linear-Time Sorting)
তুলনা ছাড়াই সর্ট করুন — \(O(n \log n)\) এর দেয়াল ভেঙে ফেলার কৌশল→
কম্পারিজন লোয়ার বাউন্ড (Comparison Lower Bound)
কেন কোনো কম্পারিজন সর্ট (comparison sort) কখনোই \(O(n \log n)\)-কে হারাতে পারে না — তার একটি গাণিতিক প্রমাণ (mathematical proof)→
সার্চিং ও সিলেকশন
বাইনারি সার্চ (Binary Search)
সমস্যাটিকে অর্ধেক করে ফেলুন — এবং তা প্রতিবারই→
উত্তরের ওপর বাইনারি সার্চ (Binary Search on Answer)
যখন আপনি অ্যারেতে সার্চ করতে পারেন না — তখন সরাসরি উত্তরের ওপরই সার্চ করুন→
এক্সপোনেনশিয়াল এবং ইন্টারপোলেশন সার্চ (Exponential & Interpolation Search)
প্রথমে পরিসীমা বা রেঞ্জ খুঁজে বের করুন, তারপর সেটিতে বাইনারি সার্চ চালান→
কুইক-সিলেক্ট (QuickSelect)
পুরোপুরি না সাজিয়েই k-তম ছোট উপাদানটি খুঁজে বের করুন→
মিডিয়ান অফ মিডিয়ানস (Median of Medians)
একটি নিশ্চিতভাবে ভালো পিভট — একদম প্রতিবার→
ডিভাইড অ্যান্ড কঙ্কার
ডিভাইড অ্যান্ড কঙ্কার (D&C) প্যাটার্ন (Divide and Conquer Pattern)
সমস্যাটিকে ছোট ছোট টুকরাতে বিভক্ত করুন, টুকরোগুলোকে সমাধান করুন এবং তারপর সব ফলাফলগুলোকে একত্রিত করুন→
ইনভার্সন গণনা (Count Inversions)
একটি সিকোয়েন্স (sequence) বা ক্রম ঠিক কতটা এলোমেলো অবস্থায় আছে তা পরিমাপ করুন — \(O(n \log n)\) সময়ে→
ফাস্ট পাওয়ার বা দ্রুত ঘাত (Fast Power)
\(x^n\) গণনা করুন \(O(\log n)\) সময়ে — \(O(n)\) সংখ্যক গুণফল বা মাল্টিপ্লিকেশন নয়→
কারাতসুবা গুণন (Karatsuba Multiplication)
প্রতিটি রিকার্সিভ লেভেলে ৪টির বদলে ৩টি গুণ — বড় সংখ্যার গুণের আধুনিক পদ্ধতি→
ক্লোজেস্ট পেয়ার অফ পয়েন্টস (Closest Pair of Points)
একটি মানচিত্রে সবচেয়ে কাছের দুটি শহর খুঁজে বের করুন — প্রতিটি জোড়া পরিমাপ না করেই বা না মেপেই→
গ্রিডি অ্যালগরিদম
গ্রিডি প্যাটার্ন বা লোভী পদ্ধতি (Greedy Pattern)
দাওয়াতের মাংসের সবচেয়ে বড় টুকরোটি সবসময় তুলে নিন — কখনো এটি সেরা সমাধান দেয়, আবার কখনো দেয় না→
ইন্টারভাল শিডিউলিং (Interval Scheduling)
সর্বোচ্চ সংখ্যক মিটিং সিডিউল করুন — সবসময় সেই মিটিংটি আগে বেছে নিন যা সবচেয়ে আগে শেষ হয়→
ফ্র্যাকশনাল ন্যাপস্যাক বা ভগ্নাংশ ন্যাপস্যাক (Fractional Knapsack)
একটি ব্যাকপ্যাক সোনার ধুলো দিয়ে ভরছেন — প্রতি গ্রামের সর্বোচ্চ মূল্যের বস্তু আগে নিন→
হাফম্যান এনকোডিং (Huffman Encoding)
যে অক্ষরগুলো আপনি সবচেয়ে বেশি ব্যবহার করেন সেগুলোকে ছোট কোড দিন — ফাইলে জায়গা সাশ্রয় করুন→
টাস্ক শিডিউলিং (Task Scheduling)
কাছের ডেডলাইন অনুযায়ী আগে কাজ করুন — কোনো কাজ মিস হবে না, সবচেয়ে বেশি লাভ হবে→
এমএসটি (MST) — গ্রিডি দৃষ্টিভঙ্গি (Greedy Lens)
সবচেয়ে কম রাস্তা ব্যবহার করে সব শহর সংযুক্ত করুন — সবসময় সবচেয়ে সস্তা রাস্তাটি নিন যা কোনো লুপ তৈরি করে না→
ডায়নামিক প্রোগ্রামিং
ডিপি প্যাটার্ন (DP Pattern)
একই পাজলের (puzzle) টুকরো বা সমস্যার সমাধান কখনোই দু'বার করবেন না — বরং সেটিকে লিখে রাখুন এবং দরকার হলে পরের বার সেখান থেকেই দেখে নিন→
মেমোইজেশন বনাম ট্যাবুলেশন (Memoization vs Tabulation)
টপ-ডাউন (Top-down) হলো এমন এক বন্ধুর কাছে কল করা যে আবার অন্য এক বন্ধুকে কল করে। আর বটম-আপ (Bottom-up) হলো সারি ধরে ধরে একটি স্প্রেডশিট পূরণ করার মতো ব্যাপার।→
1D ডিপি (1D DP)
সিঁড়ি বেয়ে ওপরে ওঠার মতোই — ধাপে ধাপে নিজের উত্তর তৈরি বা নির্মাণ করুন→
0/1 ন্যাপস্যাক (0/1 Knapsack)
সর্বোচ্চ মূল্যের (value) জন্য একটি ব্যাগ বা স্যুটকেস প্যাক করুন — যেখানে প্রতিটি জিনিস বা আইটেম হয় পুরোপুরি নিতে হবে নতুবা একদমই নেওয়া যাবে না (all-or-nothing)→
আনবাউন্ডেড ন্যাপস্যাক (Unbounded Knapsack)
প্রতিটি আইটেম যত খুশি ততবার নিতে পারেন — অনেকটা অফুরন্ত স্টকের কোনো বিশাল মুদি দোকানের মতো→
লংগেস্ট কমন সাবসিকোয়েন্স বা দীর্ঘতম সাধারণ উপক্রম (Longest Common Subsequence)
দুটি সিকোয়েন্সের বা অনুক্রমের মধ্যে থাকা দীর্ঘতম একই অংশ বা গল্পটি খুঁজে বের করুন — যেখানে মাঝখানের কিছু অংশ এড়িয়ে যাওয়া বা স্কিপ (skip) করা সম্ভব→
লংগেস্ট ইনক্রিজিং সাবসিকোয়েন্স বা দীর্ঘতম ক্রমবর্ধমান উপক্রম (Longest Increasing Subsequence)
একটি এলোমেলো অনুক্রমের বা সিকোয়েন্সের ভেতর লুকিয়ে থাকা দীর্ঘতম সিঁড়িটিকে খুঁজে বের করুন→
এডিট ডিসট্যান্স (Edit Distance)
একটি শব্দকে অন্য শব্দে রূপান্তর করতে কতগুলো টাইপো-ফিক্স বা সংশোধনের প্রয়োজন হয়?→
ম্যাট্রিক্স চেইন মাল্টিপ্লিকেশন (Matrix Chain Multiplication)
যে ক্রমে আপনি ম্যাট্রিক্স গুণ করেন তা অত্যন্ত গুরুত্বপূর্ণ — সবচেয়ে কম খরচের বা চিপেস্ট (cheapest) ক্রমটি খুঁজে বের করুন→
ইন্টারভালের উপর ডিপি (DP on Intervals)
প্রথমে ছোট ছোট অংশগুলোকে সমাধান করুন, তারপর সেগুলোকে বড় অংশে একত্রিত করে ফেলুন বা মার্জ (merge) করুন→
গাছে বা ট্রি-তে ডিপি (DP on Trees)
প্রতিটি নোডের উত্তর তার চাইল্ড বা সন্তানদের ওপর নির্ভর করে — নিচ থেকে ওপরে বা বটম-আপ পদ্ধতিতে হিসেব করুন→
বিটমাস্ক ডিপি (Bitmask DP)
মাত্র একটি সিঙ্গেল পূর্ণসংখ্যায় বা ইনটিজারে সমস্ত সম্ভাব্য সাবসেটের পছন্দগুলো ট্র্যাক করুন→
ডিজিট ডিপি (Digit DP)
ডিজিট বা অঙ্কের ক্ষেত্রে কোনো বাধা বা সীমাবদ্ধতা যুক্ত থাকলে সেই সংখ্যাগুলোকে গণনা করুন — প্রতিটিকে একে একে চেক না করেই→
গ্রাফ অ্যালগরিদম
বিএফএস এবং ডিএফএস পুনর্বিবেচনা (BFS & DFS Revisited)
গ্রাফ অন্বেষণের দুটি উপায় — স্তর অনুযায়ী, অথবা একদম গভীরে গিয়ে→
টপোলজিক্যাল সর্ট (Topological Sort)
কাজগুলোকে তাদের নির্ভরতা অনুযায়ী সাজান — ডিম আগে না মুরগি আগে, এমন দ্বন্দ্ব থাকবে না→
ডাইকস্ট্রার অ্যালগরিদম (Dijkstra's Algorithm)
সর্বদা প্রথমে সবচেয়ে সস্তা রাস্তাটি বেছে নিন — গ্রাফের জন্য জিপিএস নেভিগেশন→
বেলম্যান-ফোর্ড এবং এসপিএফএ (Bellman-Ford & SPFA)
নেগেটিভ ওয়েটগুলো হ্যান্ডেল করুন এবং নেগেটিভ সাইকেল ধরে ফেলুন→
ফ্লয়েড-ওয়ার্শল অ্যালগরিদম (Floyd-Warshall)
এক চক্করে প্রতিটি শহরের জোড়ার মধ্যে সবচেয়ে ছোট পথ খুঁজে বের করুন→
এ* (A*) সার্চ
ডাইকস্ট্রার চেয়ে বুদ্ধিমান — সঠিক দিকে এগোতে একটি ইঙ্গিত ব্যবহার করুন→
টারজানের অ্যালগরিদম (Tarjan's Algorithm)
একটি ডিরেক্টেড গ্রাফের (directed graph) সমস্ত ঘনিষ্ঠভাবে যুক্ত গ্রুপকে (tightly-knit groups) একবার অতিক্রম করেই (one pass) খুঁজে বের করুন→
কোসারাজু অ্যালগরিদম (Kosaraju's Algorithm)
দুটি চমৎকার গ্রাফ সার্চের মাধ্যমে পরস্পর সংযুক্ত বা 'mutual-follow' গ্রুপ খুঁজে বের করুন→
অয়লারীয় পথ ও সার্কিট (Eulerian Path & Circuit)
আপনি কি প্রতিটি সেতু বা ব্রিজ ঠিক একবার করে পার হতে পারবেন? ১৭৩৬ সালে অয়লার এই প্রশ্নের উত্তর দিয়েছিলেন→
হ্যামিল্টোনীয় পথ (Hamiltonian Path)
প্রতিটি ঘর ঠিক একবার করে ভ্রমণ করুন — এটি প্রতিটি সেতু ভ্রমণের চেয়ে অনেক বেশি কঠিন→
নেটওয়ার্ক ফ্লো
ম্যাক্স ফ্লো / মিন কাট (Max Flow / Min Cut)
আপনার পাইপের নেটওয়ার্ক দিয়ে কতটুকু পানি যেতে পারবে? সেটির সিদ্ধান্ত নেবে বটলনেক (bottleneck) বা সরু পথটি→
এডমন্ডস-কার্প (Edmonds-Karp)
BFS সহকারে ফোর্ড-ফুলকারসন (Ford-Fulkerson) — গ্যারান্টিযুক্ত পলিনোমিয়াল টাইম বা বহুপদী সময় (polynomial time), যেখানে কোনো অসীম চক্র বা ইনফিনিট লুপ (infinite loops) থাকে না→
ডিনিকের অ্যালগরিদম (Dinic's Algorithm)
এক ধাপে সমস্ত ক্ষুদ্রতম অগমেন্টিং পাথগুলো (augmenting paths) একসাথে বা ব্যাচে (batch) সম্পন্ন করে — যা একটি একটি করে বের করার চেয়ে নাটকীয়ভাবে দ্রুতগতির→
বাইপার্টাইট ম্যাচিং (Bipartite Matching)
ইন্টার্নশিপগুলোর সাথে শিক্ষার্থীদের মেলান — সুখী জুটির সর্বোচ্চ সংখ্যা খুঁজে বের করুন→
হাঙ্গেরিয়ান অ্যালগরিদম (Hungarian Algorithm)
সর্বনিম্ন খরচে কর্মীদের কাজ বরাদ্দ করুন — নিখুঁত সমন্বয় বা পারফেক্ট ম্যাচ→
স্ট্রিং অ্যালগরিদম
কেএমপি অ্যালগরিদম (KMP Algorithm)
স্ট্রিং বা লেখা খোঁজার সময় কখনোই পিছনে ফিরবেন না — পুরনো জ্ঞান কাজে লাগিয়ে এগিয়ে যান→
রবিন-কার্প (Rabin-Karp)
ফিঙ্গারপ্রিন্ট দিয়ে বইয়ের ভেতর শব্দ খুঁজুন — কেবল ফিঙ্গারপ্রিন্ট মিললেই অক্ষর ধরে ধরে মিলিয়ে দেখুন→
জেড-অ্যালগরিদম (Z-Algorithm)
জেড-অ্যারে (Z-array): প্রতিটি অবস্থানে হিসাব মেলানোর দৈর্ঘ্য — লিনিয়ার প্যাটার্ন ম্যাচিং→
বয়ার-মুর (Boyer-Moore)
প্যাটার্নটি পিছন থেকে পড়ুন, এবং বড় বড় অংশ বাদ দিয়ে যান — বাস্তবে সাবলিনিয়ার (sublinear) পারফরম্যান্স→
সাফিক্স অ্যারে কনস্ট্রাকশন (Suffix Array Construction)
সমস্ত সাফিক্স বা প্রত্যয় সাজানো — O(m log n) সাবস্ট্রিং সার্চ→
আহো-কোরাসিক (Aho-Corasick)
একসাথে সব প্যাটার্ন খুঁজুন — এক পাস, O(n + matches)→
র্যান্ডমাইজড অ্যালগরিদম
লাস ভেগাস বনাম মন্টি কার্লো (Las Vegas vs Monte Carlo)
সর্বদা-সঠিক বনাম সম্ভাব্য-সঠিক — র্যান্ডমাইজড অ্যালগরিদমের (randomized algorithms) দুটি ভিন্ন স্বাদ→
র্যান্ডমাইজড কুইক সর্ট (Randomized Quick Sort)
একটি র্যান্ডম পিভট প্রতিকূল সবচেয়ে খারাপ ক্ষেত্রের ইনপুটগুলো ধ্বংস করে দেয়→
রিজার্ভার স্যাম্পলিং (Reservoir Sampling)
এমন একটি স্ট্রিম থেকে ন্যায্যভাবে k টি আইটেমের নমুনা নিন যা আপনি কেবল একবারই দেখেন→
স্কিপ লিস্ট (Skip List)
প্রোবাবিলিস্টিক বিএসটি-র বিকল্প — প্রত্যাশিত সময় O(log n)→
ব্লুম ফিল্টার (Bloom Filter)
সম্ভবত হ্যাঁ, নিশ্চিতভাবে না — একটি মেমরি-সাশ্রয়ী মেম্বারশিপ পরীক্ষক→
অ্যাডভান্সড টপিক
ব্যাকট্র্যাকিং (Backtracking)
প্রতিটি সম্ভাব্য পথ ঘুরে দেখুন, তবে ডেড এন্ড বা অন্ধগলি পেলেই পেছনে ফিরে আসুন→
ব্রাঞ্চ অ্যান্ড বাউন্ড (Branch & Bound)
ভবিষ্যত দেখার ক্ষমতাসহ ব্যাকট্র্যাকিং (Backtracking) — যে শাখাগুলো বা ব্রাঞ্চ কোনোভাবেই জিততে পারবে না, সেগুলোকে কেটে ছেঁটে ফেলুন (prune)→
অ্যাপ্রক্সিমেশন অ্যালগরিদম (Approximation Algorithms)
১% সময়ে ৯০% কাছাকাছি পৌঁছানো — সাথে গাণিতিক প্রমাণ→
এনপি (NP), এনপি-কমপ্লিট (NP-Complete), এনপি-হার্ড (NP-Hard)
দ্য মিলিয়ন-ডলার প্রশ্ন: কোনো উত্তর খুঁজে বের করা কি কখনো তা যাচাই করার মতো সহজ হতে পারে?→
বিট ম্যানিপুলেশন (Bit Manipulation)
বিদ্যুতের গতিতে সুইচ উল্টান বা ফ্লিপ (flip) করুন — এবং তা করুন \(O(1)\) সময়ে→
মো-এর অ্যালগরিদম (Mo's Algorithm)
রেঞ্জ কুয়েরিগুলোকে (range queries) ক্রমানুসারে উত্তর দেওয়ার বদলে সেগুলোকে বুদ্ধিমানের মতো সাজিয়ে হাজার হাজার কুয়েরির উত্তর দিন→
স্কয়ার রুট ডিকম্পোজিশন (Sqrt Decomposition)
অ্যারেকে √n আকারে ভাগ করুন — প্রতিটা উপাদান চেক করার জন্য খুব বড়, আবার জটিল ট্রি বানানোর জন্য খুব ছোট→