3.7.15 · D2 · HinglishAlgorithm Paradigms

Visual walkthroughBitmask DP — TSP intro

2,481 words11 min read↑ Read in English

3.7.15 · D2 · Coding › Algorithm Paradigms › Bitmask DP — TSP intro

Hum poore walkthrough mein ek hi running example use karte hain. Plane par chaar cities:

symmetric distances ke saath (edge ka cost ke barabar hai):

Yahan ka matlab sirf yeh hai ki "city aur city ke beech ki road par likha number." Bas itna hi.


Step 1 — Wo duniya draw karo jise hum optimise kar rahe hain

DRAW kyun karte hain pehle? Kyunki neeche har abstract symbol (, , "current city") is map ke baare mein ek fact hai. Agar tum use map par point kar sakte ho, tum samajh rahe ho. Agar nahi kar sakte, nahi samajh rahe.

PICTURE. Chaar cities dots hain; das roads gray hain apne costs ke saath. Ek tour ek loop hai jo har dot ko exactly ek baar touch karta hai. Yahan genuinely alag loops hain — itne kam ki baad mein haath se check kar sako, aur exactly yahi wajah hai ki 4 cities ek achha teaching size hai.

Figure — Bitmask DP — TSP intro

Step 2 — "Kaun si cities ho gayi" ko ek single integer mein badlo

Integers kyun aur Python set kyun nahi? Kyunki hamari table ko ek index chahiye — ek slot number. Ek integer sabse sasta slot number hai jo exist karta hai. Set switch row 0011 ban jata hai, jo ek ordinary number ke roop mein hai. Toh "visited cities ka set" aur "number " ek hi object hain — do alag nazariye se dekhe gaye.

PICTURE. Chaar switches ki ek strip. Har switch ke neeche hum uski value likhte hain. Visited set switches aur ko light karta hai, deta hai 0101 .

Figure — Bitmask DP — TSP intro

Bit Manipulation dekho agar in teen lines mein se koi bhi shaky lage — yahi poori vocabulary hai jo hamein chahiye.


Step 3 — Table cell ka naam: dp[mask][i]

KYA. Ek number har (switch-row, current-city) pair ke liye. Ek grid: rows hain switch-rows, columns hain possible "current city" values.

Yeh shape kyun? Yahi parent note ka poora magic hai. Ek path ek lambi kahani hai (). Lekin woh sirf do facts jo affect karte hain kya hoga aage hain — SET jo already ho gayi aur SPOT jahan tum ho. Har kahani jisका same (SET, SPOT) hai woh yahan se interchangeable hai — toh hum sirf sabse sasta rakhte hain aur baaki bhool jaate hain. Wahi bhoolna ko size ke grid mein shrink karta hai.

PICTURE. Ek blank grid. Zyaadatar cells impossible hain aur gray painted hain: dp[mask][i] sirf tab sense karta hai jab city ka switch mein ON ho (tum "end at " nahi ho sakte agar tumne visit hi nahi kiya). Dekho — grid ka exactly aadha-ish hissa legal hai.

Figure — Bitmask DP — TSP intro

Step 4 — Seed lagao: base case

KYA. Exactly ek legal cell ko set karo; baaki sab rehne do.

kyun? Tum city par shuru ho rahe ho, kuch kharch kiye bina aur kisi ko visit kiye bina siwaaye apne aap ke. Switch row hai 0001 (sirf switch lit) . Cost abhi tak: roads chale .

PICTURE. Step 3 ka grid jisme ek akela green row 0001, column mein drop kiya gaya hai. Har doosri cell abhi bhi hai. Yeh akela seed un sab numbers ka ancestor hai jo hum baad mein compute karte hain.

Figure — Bitmask DP — TSP intro

Step 5 — Ek rule: path ko uski last edge se grow karo

Ab engine. Cell dp[mask][i] fill karne ke liye, poochho: se pehle main kise visit kiya tha?

Yeh allowed kyun hai? Optimal substructure. par khatam hone wale kisi bhi cheapest path mein koi last-visited city hoti hai. Woh final road kaato; bacha hua prefix khud hi tak ka cheapest path hona chahiye — agar ek sasta prefix exist karta toh hum use jodte aur apna minimum beat karte, jo ek contradiction hai. Yahi logic sabhi Dynamic Programming ko legal banata hai.

PICTURE. Ek target cell (orange), ek switch chhote cells se arrows se fed hai. Hum literally last edge peel kar rahe hain aur already-filled predecessors padh rahe hain. Yeh Held-Karp Algorithm ek single frame mein hai.

Figure — Bitmask DP — TSP intro

Step 6 — Engine ko apne map par chalao, layer by layer

KYA. Cells fill karo kitne switches lit hain ke order mein — kyunki ek cell sirf kam switches wali cells par depend karti hai. Toh process karo popcount , phir , phir , phir . (popcount = kitne switches ON hain.)

Yeh order kyun? Yeh guarantee karta hai ki right-hand side par jo bhi hum padhte hain woh pehle hi finalize ho chuka tha ek previous layer par. Koi cell use-hone se pehle ready na ho, aisa nahi hoga.

PICTURE — numbers appear ho rahe hain. Dekho har layer light up hoti hai (yaad raho dist: ):

  • Layer 1 (seed): dp[0001][0]=0.
  • Layer 2 se ek hop bahar:

  • Layer 3 ke ilawa do cities, e.g. set , par khatam:

Yahan sirf legal hai (hamein aur chahiye; ko dp[0101][0] chahiye hoga jo se nahi guzarta... dhyan se: , toh ):

Lekin dp[0011][0] hai (tum par khade nahi ho sakte jab visited ho is DP ke forward growth mein tak pahunchte hue), toh live term hai . ✓

Figure — Bitmask DP — TSP intro

Step 7 — Poori layer fill karo, phir tour close karo

KYA. Teen cells dp[1111][1], dp[1111][2], dp[1111][3] compute karo, ghar ki road jodo, sabse chota lo.

Hamare numbers ke liye optimal closed tour hai :

kyun jodte hain? Ek tour ek cycle hai (dekho Hamiltonian Path and Cycle). DP sirf bahar chala sab tak; woh kabhi wapas aane ke liye nahi bola. Yeh return road bhoolna parent mein trap #3 hai. Agar Hamiltonian path chahiye cycle ki jagah, toh yeh term drop karo aur answer do.

PICTURE. Teen full-layer cells apne home-roads ke saath dashed arrows ke roop mein par wapas; winning highlighted, uska actual loop map par traced.

Figure — Bitmask DP — TSP intro

Step 8 — Edge aur degenerate cases (koi hole mat chhodna)

PICTURE. Chaar tiny grids side by side: (single seed = answer), (two-cell chain), ek asymmetric arrow pair, aur ek broken road red ke roop mein jo skip karta hai.

Figure — Bitmask DP — TSP intro

Ek-picture summary

Upar sab kuch, compressed: seed neeche, arrows upar layers mein flow karte hain jaise switches ek ek karke on hote hain (har arrow = ", min rakhna"), aur dashed home-roads upar cycle close karti hain. Poora Held-Karp Algorithm hai paani switch-rows ki lattice mein upar bahna, phir ghar girna.

Figure — Bitmask DP — TSP intro
Recall Feynman: poora walkthrough simple shabdon mein

Maine chaar ghar draw kiye aur unke beech ki roads (Step 1). Poore walks yaad rakhne ki jagah, maine ek sticky note par chaar light switches lagaye — ek har ghar ke liye — aur switch on kiya jab maine woh ghar visit kiya; switches ki poori row ek single number ke roop mein padhi jaati hai jo "mask" hai (Step 2). Meri scratch grid mein ek box hai har (switch-row, ghar-jisme-main-abhi-hoon) pair ke liye, aur jo boxes claim karte hain ki main ek aisi ghar par khatam hua jiska switch off hai woh nonsense hain, toh maine unhe gray kar diya (Step 3). Maine ek akela drop kiya "sirf-ghar-switch-on, ghar-par-khada" wale box mein — sab kuch ka seed (Step 4). Mera ek rule: koi bhi box fill karne ke liye, maine woh aakhri road peel ki jo main chala, pehle se filled box lookup kiya "ek ghar pehle" ke liye, aur us road ki cost jodi, sirf sabse saste predecessor ko rakhte hue (Step 5). Maine boxes waves mein fill kiye — ek switch on, phir do, phir teen, phir charon — taaki jo bhi box main padh raha tha woh already done ho (Steps 6–7). Jab sab switches on ho gaye toh maine ek aakhri road ghar wapas pay ki aur sabse chota total liya: (Step 7). Finally maine weird cases check kiye — ek city, do cities, ek-taraf ki roads, tooti roads — taaki kuch bhi mujhe surprise na kar sake (Step 8).

Recall

dp[mask][i] mein mask physically kya hai aur integer kyun? ::: Pehle se visit ki gayi cities ka set, light switches ki tarah store kiya gaya (bit i on ⟺ city i visited). Yeh integer isliye hai kyunki DP table ko ek sasta index chahiye. Cells increasing popcount order mein kyun fill karte hain? ::: Har cell sirf ek kam switch wali cells par depend karti hai, toh switches-ki-sankhya ke order mein process karne se guarantee milti hai ki predecessors ready hain. Final +dist[i][0] kyun? ::: Ek tour ek cycle hai; DP sirf bahar chala, toh hum ek aakhri road ghar pay karte hain. Hamiltonian path ke liye ise drop karo. Running example mein optimal tour cost kya hai? ::: 18, 0→1→3→2→0 ke zariye.


Connections