Searching & Divide and Conquer
পাঁচ লাইনের কোড, চল্লিশ বছরের বাগ
1. Binary Search — Classic
#include <stdio.h>
int binsearch(const int *a, int n, int key) {
int lo = 0, hi = n - 1;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2; // avoid overflow
if (a[mid] == key) return mid;
if (a[mid] < key) lo = mid + 1;
else hi = mid - 1;
}
return -1;
}
int main(void) {
int a[] = {1, 3, 5, 7, 9, 11, 13, 15};
printf("find 9 → %d\n", binsearch(a, 8, 9));
printf("find 10 → %d\n", binsearch(a, 8, 10));
return 0;
}
(lo + hi) / 2 — দুটিই বড় হলে overflow। lo + (hi - lo) / 2 ব্যবহার করুন।
2. Lower Bound / Upper Bound
#include <stdio.h>
// smallest index i with a[i] >= key
int lower_bound(const int *a, int n, int key) {
int lo = 0, hi = n;
while (lo < hi) {
int m = lo + (hi - lo) / 2;
if (a[m] < key) lo = m + 1;
else hi = m;
}
return lo;
}
// smallest index i with a[i] > key
int upper_bound(const int *a, int n, int key) {
int lo = 0, hi = n;
while (lo < hi) {
int m = lo + (hi - lo) / 2;
if (a[m] <= key) lo = m + 1;
else hi = m;
}
return lo;
}
int main(void) {
int a[] = {1, 2, 2, 2, 3, 5, 7};
printf("lower_bound(2) = %d\n", lower_bound(a, 7, 2)); // 1
printf("upper_bound(2) = %d\n", upper_bound(a, 7, 2)); // 4
printf("count of 2 = %d\n", upper_bound(a, 7, 2) - lower_bound(a, 7, 2));
return 0;
}
3. Binary Search on Answers (Parametric Search)
যদি একটি monotone predicate can(x) থাকে (false → false → true → true), তাহলে binary search x-এর উপর।
Classic: "capacity k দিয়ে D দিনে সব ship করা কি সম্ভব?" — minimum k বের করতে binary search।
4. Divide & Conquer Template
- Divide — একই ধরনের subproblem-এ ভাগ করুন।
- Conquer — subproblem recursively সমাধান।
- Combine — answer merge করুন।
উদাহরণ: merge sort, quicksort, Karatsuba multiplication, closest pair, FFT।
5. Master Theorem Recap
T(n) = a T(n/b) + f(n)
Case 1: f < n^log_b(a) → T = Θ(n^log_b(a))
Case 2: f = Θ(n^log_b(a)) → T = Θ(n^log_b(a) log n)
Case 3: f > n^log_b(a) → T = Θ(f(n))
6. Practice Problems
- Binary search iterative + recursive.Iterative + recursive binary search।
✨ Show Answer
Iterative Section 1। Recursive:
int bs(int *a, int lo, int hi, int k) { if (lo > hi) return -1; int m = lo + (hi - lo) / 2; if (a[m] == k) return m; return k < a[m] ? bs(a, lo, m-1, k) : bs(a, m+1, hi, k); } - First occurrence of a value.প্রথম occurrence।
✨ Show Answer
lower_bound(a, n, key)-ই index;a[index] == keycheck করুন। - Last occurrence.শেষ occurrence।
✨ Show Answer
upper_bound(a, n, key) - 1। - Count occurrences.Occurrence সংখ্যা।
✨ Show Answer
upper_bound - lower_bound— Section 2-এরbounds.c-ই উত্তর। - Search in a rotated sorted array.Rotated sorted array-এ search।
✨ Show Answer
mid বের করুন; left half বা right half sorted কি না দেখুন — যেদিকে sorted সেদিকে key থাকলে সেখানে যান, নতুবা অন্যদিকে। O(log n)।
- Find minimum in a rotated sorted array.Rotated array-এর minimum।
✨ Show Answer
a[mid] > a[hi]হলে min-টা right-এ (lo = mid + 1); নতুবা left-এ (hi = mid)। - Peak element.Peak element।
✨ Show Answer
mid-এ দেখুন:
a[mid] > a[mid+1]হলে peak left-এ; নতুবা right-এ। O(log n)। - Integer square root.Integer sqrt।
✨ Show Answer
int isqrt(int n) { int lo = 0, hi = n, ans = 0; while (lo <= hi) { long m = lo + (hi - lo) / 2; if (m * m <= n) { ans = m; lo = m + 1; } else hi = m - 1; } return ans; } - Median of two sorted arrays in O(log(n+m)).দুটি sorted array-এর median।
✨ Show Answer
ছোট array-এ binary search: partition point i (A), j (B)। Check A[i-1] ≤ B[j] && B[j-1] ≤ A[i]। O(log(min(n, m)))।
- Aggressive cows (binary search on answer).Aggressive cows।
✨ Show Answer
Minimum distance
d-এর উপর binary search; greedy check:d-গ্যাপ রেখে k-টি গরু বসানো যায় কি না। - Painter's partition.Painter's partition।
✨ Show Answer
Binary search on time T; check: T সময়ে k painters সব বোর্ড শেষ করতে পারে কি না (greedy)।
- Minimum in a bitonic array.Bitonic array-এর minimum।
✨ Show Answer
Bitonic-এ increase তারপর decrease — binary search: mid-এর পরের element ছোট হলে min right-এ, নতুবা left-এ।
- Kth element of two sorted arrays.দুই array-এর Kth element।
✨ Show Answer
Median problem-এর generalization। Binary search with partition।
- Search a 2D sorted matrix.2D sorted matrix-এ search।
✨ Show Answer
Top-right থেকে start: target বড় হলে নিচে, ছোট হলে বামে। O(m + n)। বিকল্প: flattened binary search O(log(mn))।
- Allocate minimum pages (students & books).Book allocation।
✨ Show Answer
Max page-এর উপর binary search; check: সেই max-এর মধ্যে k-টি student-এ ভাগ সম্ভব কি না।
- Koko eating bananas.Koko bananas।
✨ Show Answer
Eating speed k-এর উপর binary search; check: সেই গতিতে H ঘণ্টায় সব শেষ কি না।
- Merge K sorted arrays using D&C.K sorted array merge।
✨ Show Answer
Pair-wise merge: (0,1), (2,3), ... তারপর তাদের merge — log K level। O(Nk log k)। বিকল্প: min-heap।
- Count inversions (modified merge sort).Inversion গণনা।
✨ Show Answer
Merge sort-এর merge step-এ left-এর অবশিষ্ট count-এ inversion যোগ করুন। O(n log n)।
- Closest pair of points in 2D (D&C).Closest pair।
✨ Show Answer
X-sorted points; vertically ভাগ করুন; recursively min বের করুন; strip-এ y-order-এ linear check। O(n log n)।
- Maximum subarray (Kadane's vs D&C).Max subarray।
✨ Show Answer
Kadane's O(n) — সবচেয়ে practical। D&C O(n log n) — left/right/cross max। একই answer, Kadane দ্রুত।
- Solve T(n) = 2T(n/2) + n using Master Theorem.Master Theorem সমাধান।
✨ Show Answer
log_2(2) = 1, f(n) = n — Case 2 → Θ(n log n)।
- Solve T(n) = 7T(n/2) + n² (Strassen's-like).T(n) = 7T(n/2) + n²।
✨ Show Answer
log_2(7) ≈ 2.807 > 2 = deg of n² — Case 1 → Θ(n^log_2(7)) ≈ Θ(n^2.807)। এটাই Strassen matrix multiplication-এর time।
Glossary (শব্দকোষ)
| Term | Meaning | বাংলায় |
|---|---|---|
| Linear Search | Scan one by one — O(n). | এক এক করে খোঁজা — O(n)। |
| Binary Search | Halve the search space each step — O(log n). | প্রতি ধাপে অর্ধেক — O(log n)। |
| Binary Search on Answer | Search for the smallest x satisfying a monotone predicate. | Monotone predicate-এ x-এর জন্য binary search। |
| Lower / Upper Bound | First index ≥ / > target in a sorted array. | Sorted array-এ ≥/> target-এর প্রথম index। |
| Divide and Conquer | Break into similar subproblems, solve, combine. | একই ধাঁচের subproblem-এ ভাগ করে সমাধান। |
| Recurrence Relation | Equation expressing T(n) in terms of smaller T's. | ছোট T(n)-এ T(n) প্রকাশকারী সমীকরণ। |
| Master Theorem | Closed-form solution for common D&C recurrences. | সাধারণ D&C recurrence-এর সরাসরি সমাধান। |
| Merge Sort | Classic D&C sort — O(n log n). | Classic D&C sort — O(n log n)। |
| Quickselect | D&C algorithm to find the k-th smallest in O(n) avg. | K-তম ছোট element O(n) গড়ে খুঁজে বের করা। |
| Strassen's Algorithm | D&C matrix multiplication — Θ(n^2.807). | D&C matrix multiplication — Θ(n^2.807)। |
| Closest Pair | D&C geometry algorithm in O(n log n). | D&C জ্যামিতিক অ্যালগরিদম O(n log n)। |
| Karatsuba Multiplication | D&C integer multiplication in O(n^1.585). | D&C integer multiplication — O(n^1.585)। |
| Search Space | The set of candidates being explored. | যাচাই-করা candidate-এর সমষ্টি। |
Summary — Module 32
Binary search on sorted data O(log n); on answers এটি অসংখ্য সমস্যার সমাধান। D&C একই ধরনের subproblem-এ ভাগ করে সমাধান। Master Theorem recurrence বিশ্লেষণ করে।