3.6.11 · HinglishSorting & Searching

Binary search — iterative, recursive; O(log n); searching in sorted - rotated arrays

1,949 words9 min readRead in English

3.6.11 · Coding › Sorting & Searching


WHY binary search exists

Socho 1 se 1000 ke beech ek number guess karna ho. 500 guess karo: "higher/lower" ka reply 500 numbers maar deta hai. Das guesses () kaafi hain. Yahi poora trick hai.


WHAT it is


HOW — loop ko first principles se derive karna

Hum ek window [lo, hi] maintain karte hain jo guaranteed hai ki target ko contain karegi agar woh exist karta hai. Yeh invariant hai — baaki sab kuch isko protect karne se aata hai.

  1. Start: lo = 0, hi = n-1 (poora array).
  2. Unke beech mid pick karo. Mid kyun? Yeh window ko as evenly as possible split karta hai, toh worst half as small as possible hota hai → worst case mein kam steps.
  3. arr[mid] ko target se compare karo:
    • equal → mila, mid return karo.
    • arr[mid] < target → target (agar present hai) right mein hai, toh lo = mid + 1. +1 kyun? mid khud abhi rule out ho gaya; isko rakhne se infinite loop ka risk hai.
    • arr[mid] > target → usi wajah se hi = mid - 1.
  4. Ruko jab lo > hi (empty window) → not found.

Iterative code

def bsearch(arr, target):
    lo, hi = 0, len(arr) - 1
    while lo <= hi:                 # window non-empty
        mid = lo + (hi - lo) // 2   # overflow-safe
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            lo = mid + 1            # discard left half incl. mid
        else:
            hi = mid - 1            # discard right half incl. mid
    return -1

lo <= hi kyun, lo < hi nahi? Jab lo == hi ho toh window mein abhi bhi ek element hai jise humne check nahi kiya — isko drop karna single-element matches miss kar deta.

Recursive code

def bsearch_rec(arr, target, lo, hi):
    if lo > hi:                     # base case: empty
        return -1
    mid = lo + (hi - lo) // 2
    if arr[mid] == target:
        return mid
    if arr[mid] < target:
        return bsearch_rec(arr, target, mid + 1, hi)   # right
    return bsearch_rec(arr, target, lo, mid - 1)       # left

Same logic; call stack loop ki jagah le leta hai. Recursion depth hai, isliye memory hai iterative ke ke muqable.


WHY it is — derived

Maano = elements ke liye worst case mein comparisons. Har step kaam karta hai phir half pe recurse karta hai: Unrolling: jab tak shrink hokar na ho jaaye. Halvings ki count satisfy karti hai . Toh Space: iterative , recursive (stack).

Figure — Binary search — iterative, recursive; O(log n); searching in sorted - rotated arrays

Searching in a ROTATED sorted array

Ek sorted array jo pivot pe rotate hui ho, jaise [4,5,6,7,0,1,2]. Yeh globally sorted nahi rahi, lekin mid ke around kam se kam ek half hamesha sorted hoti hai. Hum iska faayda uthate hain.

def search_rotated(arr, target):
    lo, hi = 0, len(arr) - 1
    while lo <= hi:
        mid = lo + (hi - lo) // 2
        if arr[mid] == target:
            return mid
        if arr[lo] <= arr[mid]:                 # left half sorted
            if arr[lo] <= target < arr[mid]:    # target in left
                hi = mid - 1
            else:
                lo = mid + 1
        else:                                   # right half sorted
            if arr[mid] < target <= arr[hi]:    # target in right
                lo = mid + 1
            else:
                hi = mid - 1
    return -1

arr[lo] <= arr[mid] mein <= kyun? Jab lo == mid ho (window size 1–2) toh "left half" ek single element hai, trivially sorted; <= us case ko sahi rakhta hai. Phir bhi — har step ek half discard karta hai.


Worked examples


Common mistakes (steel-manned)


Recall Feynman: ek 12-saal ke bacche ko samjhao

Tum ek phone book mein ek naam dhundh rahe ho. Tum har naam nahi padhte! Tum beech mein flip karte ho. Jo naam chahiye woh middle se pehle aata hai? Doosra aadha kaat ke ignore karo. Baad mein aata hai? Pehla aadha ignore karo. Jo bacha hai uska middle kholo, repeat karo. Kuch flips mein tum exact page pe pahunch jaate ho. Har flip aadhi book phenkta hai — isliye badi se badi book bhi sirf mutthi bhar flips mein cover ho jaati hai. "Rotated" book woh hai jisme kisi ne pages kaatke swap kar diye; lekin jo piece tum kholte ho woh abhi bhi alphabetical hai, toh tum phir bhi bata sakte ho kaunsa side rakhna hai.


Flashcards

Binary search precondition kya hai?
Array sorted hona chahiye (ya rotated variant ke liye sorted-then-rotated).
Binary search ki time complexity kya hai aur kyun?
; recurrence har step pe search half kar deta hai, steps.
Overflow-safe mid formula kya hai?
mid = lo + (hi - lo) // 2, ke barabar lekin integer overflow se bachata hai.
lo = mid + 1 kyun, lo = mid nahi?
mid already compare aur exclude ho chuka hai; ke bina window shrink nahi hogi → infinite loop.
Sahi loop condition kya hai aur kyun?
while lo <= hi; < se tum single remaining element miss kar doge jab lo == hi ho.
Space complexity: iterative vs recursive?
Iterative ; recursive call stack depth ki wajah se.
Rotated array mein sorted half kaise dhundhen?
Agar arr[lo] <= arr[mid] toh left half sorted hai; warna right half sorted hai.
Jab sorted half pata chale toh aage kahan jaana hai kaise decide karo?
Range-check: agar target us sorted half ki bounds ke andar hai, wahan search karo; warna doosra half search karo.
Binary search not found hone pe kya return karta hai?
Conventionally , tab milta hai jab lo > hi ho (empty window).
Worst case comparisons kyun hote hain?
Har comparison candidate set aadha kar deta hai; halvings ke baad sirf bachte hain, pe 1 milta hai.

Connections

  • Linear Search baseline; binary search isko tabhi beat karta hai jab data sorted ho.
  • Sorting Algorithms — pehle sort karna padta hai ( ek baar) binary search enable karne ke liye.
  • Logarithms — halving-ka-inverse jo complexity deta hai.
  • Recurrence Relations analysis.
  • Time Complexity & Big-O ko aur ke beech place karta hai.
  • Lower & Upper Bound (bisect) — variants jo first/last position dhundhte hain.
  • Binary Search Tree — same divide idea ek data structure ke roop mein.

Concept Map

enables

compares target to

leads to

maintains

halving gives

implemented as

implemented as

computed by

then rotated for

beats

Sorted array precondition

Binary search

Middle element compare

Discard half of window

Invariant window lo..hi

O log n time

Iterative loop

Recursive calls

Overflow-safe mid formula

Rotated array variant

Linear search O n