3.1.9 · Coding › Complexity Analysis
Jab tum ek recursive algorithm likhte ho, to uska total work bas har ek recursive call mein kiye gaye kaam ka sum hota hai. Ek recursion tree ek tarika hai un sab calls ko draw karne aur unke costs ko level by level add karne ka. Recurrence ka answer guess karne ki jagah, tum literally dekhte ho ki kaam kahan zyada pile up ho raha hai.
YE KAAM KYUN KARTA HAI: Ek recurrence jaise T ( n ) = a T ( n / b ) + f ( n ) self-referential hota hai. Ise unfold karne ke liye tum T ko baar baar khud mein substitute karte rehte ho. Tree uss substitution ke liye ek bookkeeping device hai — har node ek subproblem hai, har node ka label us subproblem size par non-recursive cost f hai.
Definition Recursion tree
Ek recursion tree ek aisa tree hota hai jahan:
root top-level call ka cost f ( n ) hota hai (recursive calls ko chhodkar),
size m wale har node ke ==a children== hote hain (branching factor), har ek ki size == m / b == (subproblem size),
node mein likhi value us call par kiya gaya non-recursive work f ( m ) hoti hai.
Total runtime T ( n ) = poore tree ke saare node values ka sum .
Kisi bhi tree ke liye teen sawaal jo tumhe zaroor poochne chahiye:
KITNA DEEP hai ye? (levels ki sankhya) — ye is baat se control hoti hai ki n kitni tezi se shrink hota hai.
HAR LEVEL KITNA WIDE hai? (depth i par nodes ki sankhya) — ye branching a se control hota hai.
HAR LEVEL MEIN KITNA KAAM? (depth i par node values ka sum).
Phir T ( n ) = ∑ levels i ( work at level i ) .
Standard divide-and-conquer recurrence lo:
T ( n ) = a T ( n / b ) + f ( n ) , a ≥ 1 , b > 1.
Intuition "Teen cases" free mein milte hain
Level sums W ( i ) dekho:
Agar ye neeche jaate jaate shrink karein → root dominate karta hai → T ( n ) = Θ ( f ( n )) .
Agar ye har level par roughly equal hon → ek level ka kaam × levels ki sankhya → extra log factor.
Agar ye neeche jaate jaate grow karein → leaves dominate karti hain → T ( n ) = Θ ( n l o g b a ) .
Ye hi Master Theorem hai, lekin derived hai, memorize nahi kiya gaya.
Yahan a = 2 , b = 2 , f ( n ) = n .
Step
Hum kya karte hain
Ye step kyun?
Depth
log 2 n levels
Size har level halve hoti hai: n / 2 i = 1 ⇒ i = log 2 n .
Level i par nodes
2 i
Branching factor a = 2 .
Level i par node size
n / 2 i
Size b = 2 se shrink hoti hai.
Har level par kaam
2 i ⋅ 2 i n = n
2 i cancel ho jaata hai — har level n cost karti hai .
Total
n × ( log 2 n + 1 ) = Θ ( n log n )
Har level barabar kaam × levels ki sankhya.
Worked example Tree padhna
Level 0: ek node, cost n . Level 1: do nodes, har ek n /2 → total n . Level 2: chaar nodes, har ek n /4 → total n . Kaam balanced hai, to bas levels ginlo.
Yahan a = 3 , b = 4 , f ( n ) = n 2 .
Step
Result
Ye step kyun?
Level i par kaam
3 i ( 4 i n ) 2 = n 2 ( 16 3 ) i
a i f ( n / b i ) mein plug karo; i ki powers group karo.
Ratio
16 3 < 1
Ratio < 1 wali geometric series → decreasing .
Sum
n 2 ∑ i ( 3/16 ) i ≤ n 2 ⋅ 1 − 3/16 1 = Θ ( n 2 )
Convergent geometric series → constant factor.
Total
Θ ( n 2 )
Root dominate karta hai — top level ka kaam jeet jaata hai.
Intuition Root kyun dominate karta hai
Jab per-level kaam ek decreasing geometric series banata hai, to poora infinite sum first term ka zyada se zyada ek constant times hota hai. To root ka f ( n ) = n 2 answer set karta hai.
Subproblems alag alag rates se shrink karte hain, isliye hum directly b use nahi kar sakte. Hum height ko bound karte hain.
Step
Result
Ye step kyun?
Har level par kaam
≤ n (ek level par sizes ≤ n tak sum hoti hain)
n /3 + 2 n /3 = n ; cost f linear hai, to har level lagbhag n tak sum hoti hai.
Sabse chhota path
log 3 n (3 se divide)
1/3 wali branch sabse tezi se shrink karti hai.
Sabse lamba path
log 3/2 n (2/3 se multiply)
2/3 wali branch sabse dheere shrink karti hai → sabse gehra.
Total
n log 3 n aur n log 3/2 n ke beech → Θ ( n log n )
Levels × per-level kaam n , saare logs constants se alag hain.
Lopsided trees ke liye, recursion tree use karo height range aur per-level upper bound dhundhne ke liye, phir combine karo. Sabse lamba branch depth set karti hai.
Common mistake Classic blunders ko steel-man karna
Mistake A: "Har level f ( n ) cost karti hai, to total = f ( n ) ⋅ log n ."
Kyun sahi lagta hai: Merge sort mein har level sach mein n cost karti hai, to log iske baad overgeneralize karte hain. Fix: Level cost a i f ( n / b i ) hai, f ( n ) nahi . Ye tabhi constant rehta hai jab a i exactly f ki shrink ko cancel kare. Hamesha per-level sum calculate karo.
Mistake B: "Leaves ki sankhya n hai."
Kyun sahi lagta hai: Merge sort ke liye leaves sach mein n hain (kyunki n l o g 2 2 = n ). Fix: Leaves = a l o g b n = n l o g b a . a = 3 , b = 2 ke liye ye n 1.58 hai, n nahi.
Mistake C: Geometric ratio ki direction bhool jaana.
Kyun sahi lagta hai: Log bina growth check kiye "log n levels of something" sum kar lete hain. Fix: Ratio r = a / b d compute karo (jahan f = n d ). r < 1 →root, r = 1 →log factor, r > 1 →leaves.
Recall Woh 20% jo 80% problems solve karta hai
T ( n ) = a T ( n / b ) + Θ ( n d ) ke liye, a vs b d compare karo:
a < b d → Θ ( n d ) (root jeet jaata hai)
a = b d → Θ ( n d log n ) (balanced)
a > b d → Θ ( n l o g b a ) (leaves jeet jaati hain)
Ise har baar level sum n d ( a / b d ) i se derive karo.
Recall Feynman: ek 12-saal ke bachche ko explain karo
Ek boss ko ek bada kaam socho. Wo ise chote chote kaamon mein todta hai aur helpers ko deta hai. Har helper apna kaam aur todta hai, aur aisa tab tak chalta hai jab tak kaam bahut chota na ho jaaye. Ise jobs ki ek family tree ki tarah draw karo. Ye jaanne ke liye ki poori company ne kitna kul effort kiya, har insaan ke paas effort likh do aur sab ko add karo — row by row karna aasaan hai. Kabhi kabhi boss sabse zyada kaam karta hai (tree ka top), kabhi bottom par chote workers (kyunki wo BAHUT ZYADA hain), aur kabhi sabhi barabar kaam karte hain. Recursion tree bas ye dekhne mein madad karta hai ki heavy lifting kaun kar raha hai.
Mnemonic Teen knobs yaad rakho
"DWW" — D epth = log b n , W idth = a i nodes, W ork = a i f ( n / b i ) .
Aur verdict: "Root, Repeat, Riot" — Root dominates / Repeat equally / Riot of leaves.
Kisi bhi recursion tree ke liye teenon kaunsi quantities dhundni chahiye? Depth (log b n ), nodes per level (a i ), aur work per level (a i f ( n / b i ) ).
T ( n ) = a T ( n / b ) + f ( n ) ke liye recursion tree se total-work formula?T ( n ) = ∑ i = 0 l o g b n a i f ( n / b i ) .
Tree mein kitne leaves hote hain? a l o g b n = n l o g b a , har ek ka cost Θ ( 1 ) .
Merge sort 2 T ( n /2 ) + n ke liye per-level kaam aur kyun constant hai? 2 i ⋅ ( n / 2 i ) = n ; branching 2 i shrink ko cancel kar deta hai, to har level n cost karti hai → total Θ ( n log n ) .
T ( n ) = 3 T ( n /4 ) + n 2 ke liye level-i kaam aur answer kya hai?n 2 ( 3/16 ) i ; ratio < 1 → root dominate karta hai → Θ ( n 2 ) .
Root kab dominate karta hai vs leaves? Root dominate karta hai jab per-level kaam decreasing geometric series hoti hai (a < b d ); leaves dominate karti hain jab growing hoti hai (a > b d ).
Ek unbalanced tree jaise T ( n /3 ) + T ( 2 n /3 ) + n Θ ( n log n ) kyun deta hai? Har level ≤ n tak sum hoti hai aur height log 3 n aur log 3/2 n ke beech hai, ye sab Θ ( log n ) hain.
Galat leaf count aur uska fix? "n leaves" bolna; sahi hai n l o g b a (sirf n ke barabar hota hai jab a = b ).
Recurrence T(n)=aT(n/b)+f(n)
Work per level a^i f(n/b^i)