Visual walkthrough — Boyer-Moore — bad character, good suffix heuristics
3.8.5 · D2· Coding › String Algorithms › Boyer-Moore — bad character, good suffix heuristics
Step 1 — Hum kar kya rahe hain? Text, pattern, alignment
KYA HAI. Hum ko ke neeche slide karte hain aur check karte hain "kya pattern yahan baithta hai?"
KYUN. Har string-matching algorithm yahi same sliding game hai — Knuth-Morris-Pratt (KMP), Rabin-Karp, sab ke sab. Fark sirf isme hai ki woh har baar kitna slide karte hain. Boyer-Moore ki poori trick hai zyada slide karna.
PICTURE. Green row hai, blue row hai jo shift par rakhi hai (matlab ke neeche baitha hai). Choti arrow dikhati hai ki ke saath line up hoti hai.

Step 2 — Right se compare kyun karein?
KYA HAI. Ek insaan ki tarah pehle check karne ke bajaye, hum aakhri character se shuru karte hain aur backwards chalte hain.
KYUN. Right end ke paas discover hua mismatch prove karta hai ki poori tail pehle se match ho chuki hai. Ek matched tail (ek suffix) ko jaanna hi humein huge distances skip karne deta hai. Agar hum left-to-right compare karte to hum sirf ek matched head ke baare mein jaante, jo jump ke liye bahut kam useful hai.
PICTURE. Red pointer right se shuru hota hai aur left move karta hai. Green cells equal hain (); pehla red cell mismatch hai.

Step 3 — Bad character ka ek sawaal
KYA HAI. Hum pattern ke andar ek dhundhte hain jo text ke se line up ho sake.
KYUN. Agar hum ek matching ko ke neeche align kar sakein, to woh slot ab guaranteed fail nahi hoga. Koi bhi alignment jo pattern ka non- letter text ke ke upar rakhti hai woh fail hogi, isliye hum unhe skip kar sakte hain.
PICTURE. Text ka fixed hai (yellow). ke andar hum har woh position highlight karte hain jismein bhi hai; arrows candidate slides dikhate hain.

Step 4 — mein kaunsa ? Sabse rightmost wala jo left mein ho
KYA HAI. ke saare 's mein se, hum woh choose karte hain jo sabse rightmost ho aur jiska index se kam ho.
KYUN. Aisa sabse rightmost chunna sabse chota safe slide deta hai — hum kisi aisi alignment ko kabhi nahi laanghte jo match ho sakti thi. (Koi aur left se choose karna zyada slide karega, shayad ek real match ke upar se kood jayega. Hum sabse bada jump chahte hain jo abhi bhi safe ho, aur rightmost-to-the-left copy exactly woh boundary hai.)
PICTURE. mein ke do copies; green arrow ke left mein sabse rightmost wala chunti hai, use text ke neeche slide karti hai. Greyed-out arrow ( ke right ki copy) illegal hai — woh pattern ko backwards le jaayega.

Step 5 — Picture ko shift number mein badalna
KYA HAI. Hum derive karte hain kitna right slide karein taaki ke neeche aa jaaye.
KYUN. Mismatch pattern index par hai; target copy index par hai. Pattern ko se right slide karna index ko wahan le jaata hai jahan index tha.
PICTURE. Bracket gap naap raha hai — exactly utne columns blue pattern right jump karta hai.

Step 6 — Teen signs: positive, zero-or-negative, aur clamp
Yeh case-coverage step hai. Raw shift positive, zero, ya negative ho sakta hai — humein teeno handle karne honge.
Case A — (copy left mein hai). To : ek genuine forward jump. Safe, ho gaya.
Case B — (koi copy nahi). To shift : maximum jump, Step 5 mein cover kiya.
Case C — (sabse rightmost copy mismatch ke right mein hai). To — formula pattern ko backwards ya bilkul nahi slide karna chahta hai. Yeh illegal hai: yeh same columns ko baar baar examine karega, ek infinite loop.
KYUN clamp. Backwards ya zero shift kabhi progress nahi karta. Sabse chota legal forward move hai, isliye hum raw shift aur mein se bada lete hain.
PICTURE. Teen mini-panels, ek per sign. Panel C mein backwards arrow crossed out hai aur exactly ke shift se replace kiya gaya hai.

Step 7 — Ek fully worked bad-character jump
Step 8 — Doosra, independent jump: good suffix (sketch)
KYA HAI. Matched tail (good suffix ) jaani mani hai ki sahi baitha hai. Hum ko slide karte hain taaki ya to ki ek aur internal copy, ya ka ek matching prefix, us pehle se matched text par wapas land kare.
KYUN. Bad-character matched tail ko bilkul ignore karta hai. Good-suffix rule use karta hai, aur weak cases mein (jaise Step 7 ka shift of ) woh bahut bada legal jump deta hai. Kisi string ki ek border woh proper substring hai jo prefix bhi hai aur suffix bhi — dekho Borders and Prefix Function; wahi idea hai jo good-suffix table ko computable banata hai.
PICTURE. Top: good suffix (green) matched. Middle: Case 1 — ki ek internal copy jiske preceding character se alag hai text ke neeche slide hoti hai. Bottom: Case 2 — koi full internal copy nahi, isliye ka ek prefix jo ke suffix ke barabar hai align hota hai.

Ek-picture summary

Final figure poori derivation compress karta hai: right-to-left scan par bad character ke saath mismatch dhundh leta hai; bad-character rule sabse rightmost ko (clamped to ) forward kheenchta hai; good-suffix rule matched tail ko re-align karta hai; actual jump donon ka max hota hai.
Recall Feynman retelling — plain words mein kaho
Chote pattern ko lambe text ke neeche line karo. Right end se checking shuru karo aur left chalte jao. Jis moment do letters disagree karein, us text letter ko dekho jisne use toda — use kaho. Poochho: "kya mere pattern mein pehle kahin ek hai jise main slide karke yahan la sakta hoon?" Sabse rightmost aisa jagah par le aao — yeh columns hain. Agar koi hi nahi hai, poore pattern ko uske past jump karo. Agar akela break ke right mein baitha hai, to woh slide backwards jaayega, isliye sirf ek se nudge karo. Saath hi, woh tail jo tumne pehle se match ki hai woh precious information bhi hai: slide karo taaki us tail ki ek repeat (ya pattern ka matching front) uske upar wapas land kare. Tumhare paas do honest jump numbers hain; bada wala lo. Kyunki right par ek akela failed comparison kai unread letters skip karne ki permission de sakta hai, bade alphabets par tum often se kaafi kam characters padhte ho — yahi sublinear win hai. Isse compare karo Knuth-Morris-Pratt (KMP) aur Z-Algorithm se, jo text kabhi skip nahi karte lekin linear time guarantee karte hain; Galil Rule Boyer-Moore ke worst case ko bhi tak patch karta hai.
Recall Quick self-test
Mismatch index par raw bad-character shift? ::: se clamp kyun karein? ::: zero/backward shift (infinite loop) rokne ke liye jab ho Shift jab ho? ::: (via ) Final combined Boyer-Moore shift? :::