Pehle se, "finish times" ya "value-per-weight" ya "sibling leaves at maximum depth" ke baare mein koi proof padhne se pehle, tumhe jaanna hoga ki ye har piece kya hai aur kaisa dikhta hai. Hum inhe order mein banate hain, taaki koi bhi symbol use hone se pehle draw kiya ja sake.
Poora khel yeh hai: feasible solutions ke us bade cloud mein se, ek optimal par land karo bina sab check kiye. Greedy isko ek seedhi sweep mein karne ki koshish karta hai.
Activity selection poori tarah ek number line par hoti hai — ek seedhi horizontal axis jahan har point time ka ek moment hota hai.
Figure s01 (neeche): ek labelled time axis par do horizontal bars. Kali bar activity i hai jo si=1 se fi=4 tak chalti hai; laal bar activity j hai jo sj=5 se fj=8 tak chalti hai. Unke beech ka gap (4 se 5 tak) visual proof hai ki woh kabhi ek moment share nahi karte — woh compatible hain.
Figure dekho. Do bars overlap karte hain agar woh line ke kisi bhi point ko ek saath share karte hain. Do bars compatible (non-overlapping) hain agar ek doosre ke shuru hone se pehle ya theek usi waqt khatam ho jaaye — laal bar kaali ke khatam hone ke baad shuru hoti hai, toh dono schedule ki ja sakti hain.
Parent note ki line "woh next activity chuno jiska start ≥ last picked finish ho" kuch nahi hai, bas yahi ek inequality hai, baar baar apply ki gayi.
Ab parent ki cryptic line plain English mein padhti hai:
maximise ∑ixivisubject to∑ixiwi≤W,0≤xi≤1.
"Items ke fractions chuno taaki paisa jitna ho sake utna ho, lekin packed weight bag se kabhi zyada na ho."
Ab wi, vi, xi aur W sab ka matlab clear hai, hum ek bhara hua bag padh sakte hain.
Figure s02 (upar): tall rectangle capacity W=50 ka knapsack hai. Isme neeche se teen slabs bhari hain jinki heights actually packed weights hain (xiwi):
item A poora liya, xA=1: weight wA=10, value vA=60;
item B poora liya, xB=1: weight wB=20, value vB=100;
item C fraction xC=32 mein liya (laal slab): weight used xCwC=32⋅30=20, value xCvC=32⋅120=80.
Teen packed weights hain 10+20+20=50=W, toh bag bilkul full hai — laal slab "last slot" idea hai, final gap ko agle item ke fraction se bharta hai. Annotation total value note karta hai ∑ixivi=60+100+80=240.
Huffman coding ek binary tree ke roop mein draw ki jaati hai. Algorithm samajhne se pehle tree pictures mein fluent hona zaroori hai.
Figure s03 (upar): ek chhota binary tree. Sabse upar wala dot root hai (depth 0). Har edge ko 0 (left) ya 1 (right) label kiya gaya hai. Same parent se latke do kaale leaves ko siblings mark kiya gaya hai. Ek leaf depth 2 par laal mein draw ki gayi hai; uske tak neeche jaate do edge-labels padhne par uska codeword 01 milta hai. Yahi woh picture hai jo "depth" ko "number of bits" mein badal deti hai.
Huffman ko baar baar chahiye "abhi do sabse chhoti frequencies do abhi". Yeh kaam fast karne ke liye ek data structure chahiye.
Har round mein re-sort kyun nahi karte? Kyunki har merge ke baad tum ek nayi combined frequency insert karte ho; heap use logn time mein absorb karta hai, scratch se re-sort karne ki jagah. Isliye Huffman ka core loop heap par tikta hai, sort par nahi.
Parent note mein har correctness proof same trick hai, toh ise ek baar seekh lo.
Tum usi swap ke teen flavours miloge:
Activities. Pehle ek indexing convention fix karo: sab activities ko finish time se sort karo aur unhe rename karo taaki f1≤f2≤⋯≤fn ho. Is convention ke under, a1 woh activity denote karta hai jiska finish time overall sabse pehla hai (sorting ke baad index 1). Swap: kisi bhi optimal schedule mein, uske earliest finisher ko a1 se replace karo. Kyunki a1 utni hi ya pehle khatam hoti hai, jo kuch purani choice ke baad fit hua woh abhi bhi fit hoga — feasible, same count.
Knapsack.ε (Greek "epsilon") ko ek bahut chhota positive amount of weight hone do — itna chhota ki dono items involved abhi bhi dene aur lene ki room rakhen. ε kilograms kisi low-density item j se nikalao aur high-density item i mein daalo (jahan di>dj). Value lost =εdj; value gained =εdi; net change =ε(di−dj)>0. Toh swap strictly value improve karta hai, matlab jo solution densest item pehle nahi liya usse optimal nahi ho sakta.
Huffman. Yahan hume do alag symbols use karne honge taaki kuch overloaded na ho:
(Dhyaan do humne depth dep(⋅) likha, na kid: symbol di §2 mein knapsack density par already use ho chuka tha, aur ℓi finished code length hai — teen alag ideas, teen alag names.)
Neeche har arrow ka matlab hai "right wali cheez samajhne ke liye left wali chahiye". Raw ideas se upar se teeno greedy problems mein neeche padho, jo sab parent topic mein merge hote hain.
Number line + intervals → tumhe compatibility test fi≤sj deta hai → jo Activity Selection ko power karta hai.
Page band karo aur har cheez answer karo; agar atak jao toh apna section dobara padho.
fi≤sj ka kya matlab hai, aur yeh kin do activities ke baare mein bata sakta hai?
Activity i activity j ke shuru hone se pehle ya theek usi waqt khatam hoti hai, toh woh compatible hain (non-overlapping) — yeh fi≤fj label karne ke baad.
wi ke baare mein kya true hona chahiye, aur knapsack item ki density di words mein kya hai?
Value divided by weight, vi/wi — money per kilogram; wi>0 chahiye taaki division defined ho.
xi=0, xi=1, aur xi=0.5 har ek ka kya matlab hai?
Item skip karo, poora lo, aadha lo.
Huffman objective jo hum minimize karte hain, formula mein kya hai?
Total cost ∑ifi⋅ℓi=∑ifi⋅dep(i) bits, sab symbols i ke upar.
dep(u) ka kya matlab hai?
Root se node u tak neeche edges ki sankhya (root ka dep=0 hai).
Code tree mein leaf ki depth uski codeword length ℓi ke barabar kyun hoti hai?
Root se leaf tak har edge ek bit (0 ya 1) add karta hai, toh depth = bits ki sankhya = ℓi.
Code ko prefix-free kya banata hai, aur leaves ise kyun guarantee karte hain?
Koi codeword doosre ki shuruwat nahi hoti; symbols sirf leaves par hote hain, toh koi path doosre ka prefix nahi ho sakta.
Jab do leaves ek parent share karte hain toh unhe kya kehte hain?
Siblings.
Ek min-heap tumhe kaunsa ek operation sasta deta hai, aur us par kya cost hai?
Sabse chhota element pop karo (aur naya daalo), dono kaafi logn time mein.
Huffman apne core loop ke liye sort ki jagah min-heap kyun use karta hai?
Har merge ek nayi combined frequency insert karta hai; heap use logn time mein re-insert karta hai, scratch se re-sort karne ki jagah.
Activity-selection exchange argument mein a1 kya denote karta hai?
f1≤⋯≤fn sort karne ke baad, a1 woh activity hai jiska finish time overall sabse pehla hai.