Searching & Divide and Conquer

পাঁচ লাইনের কোড, চল্লিশ বছরের বাগ

~40 min Advanced 22 practice problems Live code

1. Binary Search — Classic

binsearch.c
#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;
}
Classic bug (lo + hi) / 2 — দুটিই বড় হলে overflow। lo + (hi - lo) / 2 ব্যবহার করুন।

2. Lower Bound / Upper Bound

bounds.c
#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

  1. Divide — একই ধরনের subproblem-এ ভাগ করুন।
  2. Conquer — subproblem recursively সমাধান।
  3. 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

  1. 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);
    }
  2. First occurrence of a value.
    প্রথম occurrence।
    ✨ Show Answer

    lower_bound(a, n, key)-ই index; a[index] == key check করুন।

  3. Last occurrence.
    শেষ occurrence।
    ✨ Show Answer

    upper_bound(a, n, key) - 1।

  4. Count occurrences.
    Occurrence সংখ্যা।
    ✨ Show Answer

    upper_bound - lower_bound — Section 2-এর bounds.c-ই উত্তর।

  5. Search in a rotated sorted array.
    Rotated sorted array-এ search।
    ✨ Show Answer

    mid বের করুন; left half বা right half sorted কি না দেখুন — যেদিকে sorted সেদিকে key থাকলে সেখানে যান, নতুবা অন্যদিকে। O(log n)।

  6. Find minimum in a rotated sorted array.
    Rotated array-এর minimum।
    ✨ Show Answer

    a[mid] > a[hi] হলে min-টা right-এ (lo = mid + 1); নতুবা left-এ (hi = mid)।

  7. Peak element.
    Peak element।
    ✨ Show Answer

    mid-এ দেখুন: a[mid] > a[mid+1] হলে peak left-এ; নতুবা right-এ। O(log n)।

  8. 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;
    }
  9. 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)))।

  10. Aggressive cows (binary search on answer).
    Aggressive cows।
    ✨ Show Answer

    Minimum distance d-এর উপর binary search; greedy check: d-গ্যাপ রেখে k-টি গরু বসানো যায় কি না।

  11. Painter's partition.
    Painter's partition।
    ✨ Show Answer

    Binary search on time T; check: T সময়ে k painters সব বোর্ড শেষ করতে পারে কি না (greedy)।

  12. Minimum in a bitonic array.
    Bitonic array-এর minimum।
    ✨ Show Answer

    Bitonic-এ increase তারপর decrease — binary search: mid-এর পরের element ছোট হলে min right-এ, নতুবা left-এ।

  13. Kth element of two sorted arrays.
    দুই array-এর Kth element।
    ✨ Show Answer

    Median problem-এর generalization। Binary search with partition।

  14. Search a 2D sorted matrix.
    2D sorted matrix-এ search।
    ✨ Show Answer

    Top-right থেকে start: target বড় হলে নিচে, ছোট হলে বামে। O(m + n)। বিকল্প: flattened binary search O(log(mn))।

  15. Allocate minimum pages (students & books).
    Book allocation।
    ✨ Show Answer

    Max page-এর উপর binary search; check: সেই max-এর মধ্যে k-টি student-এ ভাগ সম্ভব কি না।

  16. Koko eating bananas.
    Koko bananas।
    ✨ Show Answer

    Eating speed k-এর উপর binary search; check: সেই গতিতে H ঘণ্টায় সব শেষ কি না।

  17. 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।

  18. Count inversions (modified merge sort).
    Inversion গণনা।
    ✨ Show Answer

    Merge sort-এর merge step-এ left-এর অবশিষ্ট count-এ inversion যোগ করুন। O(n log n)।

  19. 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)।

  20. 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 দ্রুত।

  21. 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)।

  22. 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 (শব্দকোষ)

TermMeaningবাংলায়
Linear SearchScan one by one — O(n).এক এক করে খোঁজা — O(n)।
Binary SearchHalve the search space each step — O(log n).প্রতি ধাপে অর্ধেক — O(log n)।
Binary Search on AnswerSearch for the smallest x satisfying a monotone predicate.Monotone predicate-এ x-এর জন্য binary search।
Lower / Upper BoundFirst index ≥ / > target in a sorted array.Sorted array-এ ≥/> target-এর প্রথম index।
Divide and ConquerBreak into similar subproblems, solve, combine.একই ধাঁচের subproblem-এ ভাগ করে সমাধান।
Recurrence RelationEquation expressing T(n) in terms of smaller T's.ছোট T(n)-এ T(n) প্রকাশকারী সমীকরণ।
Master TheoremClosed-form solution for common D&C recurrences.সাধারণ D&C recurrence-এর সরাসরি সমাধান।
Merge SortClassic D&C sort — O(n log n).Classic D&C sort — O(n log n)।
QuickselectD&C algorithm to find the k-th smallest in O(n) avg.K-তম ছোট element O(n) গড়ে খুঁজে বের করা।
Strassen's AlgorithmD&C matrix multiplication — Θ(n^2.807).D&C matrix multiplication — Θ(n^2.807)।
Closest PairD&C geometry algorithm in O(n log n).D&C জ্যামিতিক অ্যালগরিদম O(n log n)।
Karatsuba MultiplicationD&C integer multiplication in O(n^1.585).D&C integer multiplication — O(n^1.585)।
Search SpaceThe 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 বিশ্লেষণ করে।

Next Module → Dynamic Programming।