Worked examples — Brute force — exhaustive search, when acceptable
3.7.1 · D3· Coding › Algorithm Paradigms › Brute force — exhaustive search, when acceptable
Scenario matrix
Har brute-force problem exactly ek search-space shape mein fit hoti hai, aur har shape ka ek size formula hota hai (sab parent note mein derive kiye gaye hain). Neeche ki matrix har case class list karti hai jo is topic mein aa sakti hai, aur batati hai ki konsa worked example use cover karta hai.
| Cell | Search-space shape | Size formula | Danger case to cover | Example |
|---|---|---|---|---|
| A | Unordered pairs | double-counting vs | Ex 1 | |
| B | Sab subsets | → empty set case | Ex 2 | |
| C | Sab permutations | kya itna chota hai? | Ex 3 | |
| D | -tuples over alphabet | short code = weak | Ex 4 | |
| E | Feasibility limit (bahut slow?) | plug into | brute force reject karo | Ex 5 |
| F | Degenerate / empty input | size or | koi valid answer exist nahi karta | Ex 6 |
| G | Word problem (real world) | model then count | words → count mein translate karo | Ex 7 |
| H | Exam trap (growth vs bound) | compare two formulas | "exponential = bad" myth | Ex 8 |
Danger case column ka yahi poora point hai: koi case tab tak covered nahi hai jab tak tune dikhaya nahi ki uski edge par kya hota hai.

Ex 1 — Cell A: unordered pairs (aur double-count edge)
-
Candidates count karo. Yeh step kyun? Brute force hamesha space ko size karke shuru hoti hai. Ek candidate = positions ki ek unordered pair. ke saath yeh hai nahi — kyunki aur ek hi pair hain, aur koi number khud se pair nahi kar sakta.
-
Bina double-counting ke enumerate karo. Yeh step kyun? Agar hum inner loop ko se chalayein toh hum har pair ko do baar visit karenge, aadha kaam waste hoga (aur possibly ek element ki khud se "pair" report hogi, distance , jo galat hai). Fix: inner loop
i+1se start karo.
def closest_pair(a):
n = len(a); best = None
for i in range(n):
for j in range(i+1, n): # j > i -> distinct, no double count
d = abs(a[i]-a[j])
if best is None or d < best[0]:
best = (d, i, j)
return best- Closest region ko haath se run karo. Sorted values hain ; sabse tight gap aur ke beech hai (distance ), positions (value ) aur (value ) par. Baaki sab adjacent gaps bhi check karo ( bhi!) — check: bhi hai. Toh distance par do pairs hain; brute force loop order mein jo pehle milti hai wo return karta hai.
Verify: pairs ki sankhya . Sab pairs mein minimum distance ( aur se). ✔
Ex 2 — Cell B: sab subsets, empty set sameta
-
Count karo. Kyun? items mein se har ek independently andar ya bahar hai → subsets. Aur yahan khaas baat: isme empty set bhi shamil hai (mask , sum ).
-
Bitmasks se enumerate karo. Bitmasks kyun? se tak ek number
maskmein har item ke liye ek bit hota hai; bit set ⇔ item choose kiya gaya. Yeh sabse clean tarika hai subsets ko exactly ek baar hit karne ka (dekho Bitmasking).
def has_subset_sum(vals, target):
n = len(vals)
for mask in range(1 << n): # 0 .. 2^n - 1 (includes mask=0)
s = sum(vals[i] for i in range(n) if mask & (1 << i))
if s == target:
return True
return False-
Winning mask haath se walk karo. Kyun? Hum answer dekhna chahte hain, sirf trust nahi karna. Mask items aur select karta hai → values (nahi). Mask items select karta hai → ✔. Toh answer hai True.
-
edge. Yeh kyun cover karein? Empty input naive code ko tod deta hai. Yahan : loop ek baar
mask=0ke saath chalta hai, sum . Toh empty item list sirftarget = 0se match kar sakti hai.
Verify: subsets ki sankhya . Subset ka sum hai → answer True. Empty-list on target → True; on target → False. ✔
Ex 3 — Cell C: sab permutations (kya itna chota hai?)
-
Count karo. Kyun? Tour non-start cities ka ek permutation hai. Orderings ki sankhya . (Agar hum start fix karein, to sab ko permute karne se rotations over-count honge — city ko fix karne se yeh hat jata hai.)
-
Pehle feasibility check karo. Kyun? Permutation brute force sirf chhote ke liye safe hai. Rule of thumb: ko se kam rehna chahiye. Yahan — trivially fine. cities ke liye (abhi bhi theek hai); cities ke liye — bahut slow, Dynamic Programming par switch karo (Held–Karp).
from itertools import permutations
def best_tour(cost):
n = len(cost); best = None
for perm in permutations(range(1, n)): # (n-1)! orders
route = [0] + list(perm) + [0]
d = sum(cost[route[k]][route[k+1]] for k in range(len(route)-1))
best = d if best is None else min(best, d)
return best- Ek chote case ko haath se check karo. Maano costs hain . Route . Route . Sab mein best 6 hai.
Verify: tours ki sankhya . Di gayi matrix ke liye minimum tour length . ✔
Ex 4 — Cell D: -tuples over an alphabet (short code = weak)
-
Tuples count karo. Kyun? positions mein se har ek independently symbols mein se ek pick karta hai → candidates. se kam, toh yeh instantly crack ho jata hai.
-
PIN se compare karo. Kyun? Yeh dekhne ke liye ki alphabet size aur length ka trade-off kya hai. -digit PIN hai : . Toh -digit PIN mein actually -letter password se zyada candidates hain — length soochte se zyada matter karti hai.
-
Lesson kya hai. Kyun? Isi liye short codes weak hote hain (parent note, Ex 3): tabhi attacker-proof banta hai jab bada ho. lowercase letters dete hain — ab brute force fail hoti hai, jaisa hona chahiye.
Verify: ; ; toh PIN space factor se bada hai. ✔
Ex 5 — Cell E: feasibility limit (brute force reject karo)
-
Kaam estimate karo. Kyun? Parent ka feasibility test: . Yahan
-
Line in the sand se compare karo. Kyun? ops/sec roughly ek second compute hota hai. , toh brute force ko ~50 seconds chahiye — yeh time out hogi. Ise reject karo; hash set () ya sort + two pointers use karo (dekho Time Complexity & Big-O).
-
Boundary kahan hai? Kyun? Solve karo . Toh brute force tak theek hai aur se bahut pehle hopeless hai — parent ke table row ": maybe" se match karta hai.
Verify: (reject). Break-even . ✔
Ex 6 — Cell F: degenerate / empty input (koi valid answer nahi)
-
Har ek ke liye candidates count karo. Kyun? Ek pair ke liye do distinct positions chahiye.
- (a) : pairs → loop body kabhi nahi chalta →
Nonereturn karta hai. - (b) : pairs →
Nonebhi. Ek akela element khud se pair nahi kar sakta. - (c) : pair → check karta hai ✔ → return karta hai.
- (a) : pairs → loop body kabhi nahi chalta →
-
Yeh kyun matter karta hai. Kyun? Dangerous case hai : naive code jo assume karta hai ki "hamesha ek pair hogi" wo crash ya garbage return karta hai. Sahi brute force simply zero candidates enumerate karta hai aur "no answer" report karta hai — jo correct behaviour hai.
-
General rule. Kyun? Empty enumeration ⇒ empty answer. Brute force degenerate inputs par automatically correct hoti hai jab tak tum galat tarike se special-case nahi karte.
Verify: ke liye pairs hain; sirf case (c) succeed karta hai, indices return karta hai jahan . ✔
Ex 7 — Cell G: ek real-world word problem
- Ise tuples ki tarah model karo. Kyun? " types mein se at most coins" → hum counts try karte hain jahan ho.
def fewest_coins(target, coins=(1,3,4), cap=3):
best = None
for c1 in range(cap+1):
for c3 in range(cap+1):
for c4 in range(cap+1):
if c1+c3+c4 <= cap:
if 1*c1 + 3*c3 + 4*c4 == target:
used = c1+c3+c4
best = used if best is None else min(best, used)
return best-
Total ke liye search karo. Enumerate kyun? Arbitrary coin sets ke liye koi guaranteed greedy shortcut nahi hai (greedy fail kar sakta hai — dekho Greedy Algorithms). Brute force safe baseline hai. hit karne wale candidates: (do coins), (teen coins), ... Minimum 2 coins hai ().
-
Real-world caveat. Cap kyun? " coins" cap ke bina space infinite hoga, toh brute force ko ek bound chahiye. Unbounded change ke liye yeh Dynamic Programming problem ban jata hai.
Verify: using coins; koi single coin ke equal nahi, toh minimum hai. ✔
Ex 8 — Cell H: exam trap (growth rate vs input bound)
-
Bounds plug in karo. Kyun? Constraint ke bina Big-O ka matlab nahi. Actual operation counts compute karo:
-
Compare karo. Kyun? hai jo se ~38000 guna chota hai. Toh "exponential" P almost instantly khatam hoga jabki "polynomial" Q time out hogi. Exam ka claim galat hai.
-
Takeaway. Kyun? Growth rate algorithms ko ek hi input par ke saath rank karta hai, alag bounds par nahi. Brute force discard karne se pehle hamesha given constraint substitute karo. Yahi parent note ki steel-man mistake hai.
Verify: , toh P kam operations karta hai. ✔
Recall Konsa cell? (self-test)
"Sab pairs dhundo jo sum karte hain" — konsi shape? ::: Cell A, unordered pairs, . "Jobs ka har ordering try karo" — konsi shape? ::: Cell C, permutations, . "Har subset jo knapsack mein fit ho" — konsi shape? ::: Cell B, subsets, . "Guess a PIN of length " — konsi shape? ::: Cell D, -tuples, . Break-even for under ops? ::: about ().
Dekho bhi: Backtracking (brute force jo dead branches ko pehle prune karta hai), NP-Hard Problems (jahan brute force + pruning aksar sabse zyada hai jo hum kar sakte hain), aur Hinglish version.