3.1.6 · Coding › Complexity Analysis
Intuition Ek sentence mein picture
Agar O kehta hai "tera algorithm itne se zyada slow nahi hoga," toh Ω kehta hai "tera algorithm itne se zyada fast nahi hoga," aur Θ tab aata hai jab dono agree karte hain — growth ek hi function ki do copies ke beech trap ho jaati hai.
Akela Big-O ek ceiling ka promise hai. Yeh kehna ki "yeh sort O ( n 2 ) hai" use slower hone se rokta hai, lekin yeh nahi rokta ki woh secretly faster ho (har O ( n ) algorithm trivially O ( n 2 ) bhi hota hai!). Toh O loose ho sakta hai. Yeh kehne ke liye ki "yeh growth exactly n 2 hai, aur koi looseness nahi," hume ek matching floor (Ω ) plus ceiling (O ) chahiye. Jab floor aur ceiling ka shape same ho, tab hume tight bound Θ milta hai.
Toh yeh family hai:
O — upper bound (≤ wali statement)
Ω — lower bound (≥ wali statement)
Θ — tight, dono ek saath (= wali statement)
Hum functions f ( n ) (teri cost) aur g ( n ) (ek clean reference jaise n , n 2 , n log n ) ko n → ∞ par compare karte hain. Hume chhote n ya constant factors ki parwah nahi — sirf growth ki shape maayane rakhti hai.
Hum chahte hain "f , g se zyada fast nahi badhta." Growth "no faster" ka matlab hai ki kisi point ke baad , f ek scaled copy of g ke neeche rehta hai:
f ( n ) = O ( g ( n )) ⟺ ∃ c > 0 , n 0 > 0 : 0 ≤ f ( n ) ≤ c g ( n ) ∀ n ≥ n 0
c aur threshold n 0 kyun?
c constant factors ko khatam karta hai (2× slow machine se class nahi badlni chahiye). n 0 small-n noise ko khatam karta hai (startup overhead, pehla slow iteration). Hum sirf eventual trend judge karte hain.
"f , g se zyada slow nahi badhta" — inequality ko flip karo:
Ω ) — lower bound
f ( n ) = Ω ( g ( n )) ⟺ ∃ c > 0 , n 0 > 0 : 0 ≤== c g ( n ) ≤ f ( n ) == ∀ n ≥ n 0
Padho: eventually f , g ki ek scaled copy ke upar rehta hai. Toh g , f ki growth ka ek floor hai.
Agar g dono hai — ceiling bhi aur floor bhi (possibly alag constants ke saath) — toh growth pin ho jaati hai:
Θ ) — tight bound
f ( n ) = Θ ( g ( n )) ⟺ ∃ c 1 , c 2 > 0 , n 0 > 0 : == 0 ≤ c 1 g ( n ) ≤ f ( n ) ≤ c 2 g ( n ) == ∀ n ≥ n 0
Equivalently: f = Θ ( g ) ⟺ f = O ( g ) AND f = Ω ( g ) .
Worked example 1) Dikhao ki
3 n 2 + 5 n + 7 = Θ ( n 2 )
Upper: n ≥ 1 ke liye, 3 n 2 + 5 n + 7 ≤ 3 n 2 + 5 n 2 + 7 n 2 = 15 n 2 . Toh c 2 = 15 . Yeh step kyun? Humne lower-order terms 5 n , 7 ko bade n 2 terms se replace kiya — legal hai kyunki isse right side sirf bada hota hai, jo ≤ prove karta hai.
Lower: 3 n 2 + 5 n + 7 ≥ 3 n 2 sab n ≥ 0 ke liye (extra terms positive hain). Toh c 1 = 3 . Kyun? Positive terms drop karne se expression sirf chhota hota hai, jo ek clean floor deta hai.
Conclude: 3 n 2 ≤ f ( n ) ≤ 15 n 2 for n ≥ 1 ⇒ f = Θ ( n 2 ) with c 1 = 3 , c 2 = 15 , n 0 = 1 . ∎
Worked example 2) Dikhao ki
n 2 = O ( n ) — yaani n 2 = Ω ( n ) hai lekin Θ ( n ) nahi
Maano n 2 ≤ c n . n > 0 se divide karo: n ≤ c . Yeh step kyun? Sab bade n ke liye hold karne ke liye constant c ko har n se bada hona padega — jo impossible hai. Toh koi constant kaam nahi karta → O ( n ) nahi.
Lekin n 2 ≥ 1 ⋅ n for n ≥ 1 , toh n 2 = Ω ( n ) . Floor haan, ceiling nahi ⇒ tight nahi . ∎
Worked example 3) Ek problem ka lower bound vs ek algorithm
Comparison-based sorting ko Ω ( n log n ) comparisons chahiye — yeh problem ke liye har possible algorithm par bound hai (decision-tree height log 2 ( n !) = Θ ( n log n ) se prove hota hai). Merge sort O ( n log n ) mein run karta hai. Kyunki algorithm-upper, problem-lower se milta hai, merge sort optimal hai: Θ ( n log n ) . Yeh kyun important hai: Problem par Ω batata hai ki koi bhi cleverness better nahi kar sakti.
Ω best case describe karta hai."
Kyun sahi lagta hai: "lower" sun ke lagta hai "fastest/easiest input." Sach: O , Ω , Θ is baare mein hain ki function T ( n ) kaise grow karta hai; best/worst/average ek alag axis hai (kaun sa input choose kiya). Tum keh sakte ho "worst-case time Ω ( n log n ) hai" — yeh worst case ka lower bound hai. Fix: decide karo (1) kaun sa case analyze kar rahe ho, phir (2) us case ke function ko O /Ω /Θ se bound karo.
O worst case hai, Big-Ω best case hai."
Kyun sahi lagta hai: worst "highest" hai, best "lowest" hai, words se match karta hai. Fix: Wahi upar wala — bound symbols ≠ case selection. Ek algorithm worst case mein Θ ( n 2 ) aur best case mein Θ ( n ) ek saath ho sakta hai.
Common mistake "Har algorithm ka ek
Θ hota hai."
Kyun sahi lagta hai: functions ka usually ek clean shape hota hai. Sach: agar best aur worst order mein differ karte hain, toh poore runtime ke liye koi single Θ exist nahi karta. E.g. insertion sort: best Θ ( n ) , worst Θ ( n 2 ) — overall runtime O ( n 2 ) aur Ω ( n ) hai, lekin kisi ek cheez ka Θ nahi . Fix: Θ per case batao, ya spread ke liye O /Ω use karo.
f = O ( g ) ka matlab hai dono almost equal hain, toh O ( g ) = f likho."
Kyun sahi lagta hai: "=" symmetric lagta hai. Fix: "=" ek one-way "is a member of" hai. Θ sirf symmetric hai (f = Θ ( g ) ⟺ g = Θ ( f ) ).
Recall Feynman: 12-saal ke bachche ko samjhao
Socho ek bachche ki height guess kar rahe ho. Big-O woh parent hai jo kehta hai "yeh 6 feet se lamba nahi hoga" (ceiling). Big-Ω hai "yeh 5 feet se chhota nahi hoga" (floor). Big-Θ tab hai jab dono squeeze ho jaate hain — "yeh roughly 5'6" ke aas-paas hoga, thoda upar neeche" — toh tumhe uski height kaafi exactly pata hai. Hum baby photos (small n ) ignore karte hain aur isko inches mein napo ya cm mein (constants) fark nahi karta; hume bas itna chahiye ki woh akhir mein kitna lamba hoga.
Mnemonic Shapes yaad rakho
O verhead = O = ceiling (≤). Ω ek ulte cup jaisa dikhta hai jo cheezein upar pakde = floor (≥). Θ ke beech mein bar hai = beech mein pin hua = th eta = tight .
f = Ω ( g ) ki definition?∃ c > 0 , n 0 > 0 : 0 ≤ c g ( n ) ≤ f ( n ) for all n ≥ n 0 (eventual floor).
f = Θ ( g ) ki definition?∃ c 1 , c 2 , n 0 > 0 : 0 ≤ c 1 g ( n ) ≤ f ( n ) ≤ c 2 g ( n ) for all n ≥ n 0 .
Θ ko O aur Ω mein kaise likhein?f = Θ ( g ) ⟺ f = O ( g ) and f = Ω ( g ) .
Limit test: agar lim f / g = 0 ho toh? f = O ( g ) lekin Ω ( g ) nahi → strictly smaller order (o ( g ) ).
Limit test: agar lim f / g = ∞ ho toh? f = Ω ( g ) lekin O ( g ) nahi → strictly larger order (ω ( g ) ).
Limit test: agar 0 < lim f / g < ∞ ho toh? f = Θ ( g ) — same growth shape.
Kya n 2 = O ( n ) hai? Nahi; n ≤ c sab bade n ke liye hold nahi kar sakta. Lekin n 2 = Ω ( n ) hai.
Ω ≠ "best case" kyun?Bound symbols ek function ki growth measure karte hain; best/worst/average ek alag axis hai (kaun sa input).
Comparison sorting ka lower bound kya hai, aur kyun? Ω ( n log n ) , decision-tree height log 2 ( n !) = Θ ( n log n ) se.
Kaun si Big-notation relation symmetric hai? Θ : f = Θ ( g ) ⟺ g = Θ ( f ) .
Insertion sort: runtime ka ek single Θ hai? Nahi — best Θ ( n ) , worst Θ ( n 2 ) , toh overall sirf O ( n 2 ) , Ω ( n ) .
c aur n 0 ke roles kya hain?c constant factors ignore karta hai; n 0 small-n behavior ignore karta hai.
kills constants and small-n noise
f n cost vs g n reference
constant c and threshold n0