3.8.5 · D1 · Coding › String Algorithms › Boyer-Moore — bad character, good suffix heuristics
Boyer-Moore ek chhote pattern ko ek bade text mein dhundhta hai — pattern ko text ke neeche align karke characters ko right end se left ki taraf compare karta hai. Jaadu yeh hai ki right side ke paas ek akela mismatch itna kuch bata deta hai ki pattern kahan fit nahi ho sakta , ki tum ek baar mein kaafi positions aage kood sakte ho — aksar text ka zyaadatar hissa padhe bina hi.
Pehle tum do clever "skip" rules (bad character aur good suffix) ko parent note mein samajhne se pehle, tumhe kuch symbols aur pictures par pakki pakad chahiye. Yeh page har ek cheez ko scratch se banata hai. Ise upar se neeche padho; har item apne upar wale par tika hua hai.
Definition String, character, index
Ek string bas boxes ki ek row hai, aur har box mein ek character hota hai (ek letter, digit, ya symbol). Index woh label hai jo har box ke neeche likha hota hai, aur — yeh woh rule hai jo beginners ko trip karta hai — counting 0 se shuru hoti hai , 1 se nahi.
Figure dekho. ABCAB word ko paanch boxes mein draw kiya gaya hai. Har box ke neeche uska index hai: 0, 1, 2, 3, 4. Toh:
The pehla box index 0 par hai.
The aakhiri box index 4 par hai.
Intuition Index-from-zero kyun matter karta hai yahan
Boyer-Moore baar baar "the character at index j " aur "the last character" ki baat karta hai. Agar ek string ki length m hai (boxes ki sankhya), toh last box index m − 1 par hai, m par nahi . Boyer-Moore literally har comparison m − 1 par shuru karta hai, isliye tumhe yeh apni rooh mein mehsoos karna chahiye.
Definition Text aur pattern
T = the text : woh lambi string jiske andar hum search kar rahe hain. Iski length n kehlati hai.
P = the pattern : woh chhoti string jise hum dhundh rahe hain. Iski length m kehlati hai.
Ek single box padhna: T [ k ] ka matlab hai "text ke box number k mein character", aur P [ i ] ka matlab hai "pattern ke box number i mein character". Square brackets bas ek box ko point karne ka tarika hain.
Intuition Inhe kaagaz ki do strips ki tarah socho
Socho T ek lambi strip hai jo tumhare desk par lagi hai. P ek chhoti strip hai jo tum uske upar slide karte ho. Matching = har woh jagah dhundhna jahan chhoti strip ke letters neeche wali lambi strip ke letters se agree karein.
Kyunki P chhota wala hai, m ≤ n jab bhi match possible ho. Aur pattern sirf positions 0 se n − m tak hi shuru ho sakta hai — uske aage, chhoti strip desk ke right edge se bahar nikal jaayegi.
Definition Alignment / shift
s
Shift s woh index hai text mein jahan pattern ka left edge abhi baitha hai. Toh jab pattern shift s par hai, box P [ i ] seedha box T [ s + i ] ke upar hai.
Figure mein pattern strip CCTTTTGC ko text strip par s = 2 par left edge ke saath dikhaya gaya hai. Ek vertical line trace karo: P [ 0 ] T [ 2 ] ke upar baitha hai, P [ 1 ] T [ 3 ] ke upar, aur generally:
P [ i ] is above T [ s + i ] .
Intuition Yeh "+s" bookkeeping kyun matter karta hai
Boyer-Moore mein har comparison actually "kya pattern box P [ i ] seedha neeche wale text box se match karta hai?" hai — woh under-box T [ s + i ] hai. Jab hum baad mein "pattern ko right mein k positions shift karein", hum simply s ← s + k karte hain: strip k boxes right slide ho jaati hai.
Definition Right-to-left comparison
Boyer-Moore comparison left se (P [ 0 ] ) shuru nahi karta. Yeh rightmost box P [ m − 1 ] se shuru karta hai aur leftward (m − 1 , m − 2 , m − 3 , … ) walk karta hai jab tak boxes agree karte hain.
WHAT karte hain: P [ m − 1 ] par aur T [ s + m − 1 ] par ek finger rakho, check karo ki match hai, phir dono fingers ek box left step karo.
WHY karte hain: agar hume mismatch milta hai last teen boxes match karne ke baad, toh hum ab jaante hain ki text un teen pattern characters se khatam hoti hai. Woh "known suffix" exactly woh fuel hai jo big-skip rules ke liye kaam aata hai. Left-to-right compare karna (naive search ki tarah) sirf matched prefix ke baare mein batayega, jo skip rules use nahi kar sakte.
WHAT IT LOOKS LIKE : figure mein right side par green ticks matched boxes dikhate hain; red cross woh pehla mismatch dikhata hai jab hum left move karte hain.
Definition Mismatch index
j , bad character c
Jab hum leftward walk karte hain, pehla box jahan pattern aur text disagree karte hain woh pattern index j par hai. Toh P [ j ] = T [ s + j ] . Woh offending text character jo us box ke neeche baitha hai, c = T [ s + j ] , bad character kehlata hai.
j ke right mein sab already match ho gaya hai: P [ j + 1 … m − 1 ] text se agree karta hai. j par aur uske left mein abhi check nahi hua (sirf j ko chhodkar, jo abhi fail hua).
Figure mein: matched suffix coloured hai, index j par box crossed out hai, aur uske neeche text character circled hai aur c label kiya gaya hai. Aage le jaane ke liye do facts:
Matched suffix P [ j + 1 … m − 1 ] ki length m − 1 − j hai. (Boxes count karo: j + 1 se m − 1 tak.)
Bad character c ek text character hai — yeh P ke andar kahi appear ho sakta hai ya nahi bhi.
j is a text index."
Kyun sahi lagta hai: mismatch text mein bhi hota hai.
Fix: j ek pattern index hai. Matching text box shift add karke milta hai: T [ s + j ] . Inhe mix karna Boyer-Moore ka sabse common bug hai.
Intuition Picture: front-chunks aur back-chunks
ABCAB lo. Iske prefixes hain A, AB, ABC, ABCA, ABCAB. Iske suffixes hain B, AB, CAB, BCAB, ABCAB. Notice karo AB dono prefix aur suffix ke roop mein aata hai — is special coincidence ka apna naam hai (agla section), aur yeh good-suffix rule ka poora dil hai.
Ek string ka border ek proper substring (poori string se chhota) hota hai jo simultaneously prefix aur suffix dono hai. "Proper" bas matlab hai yeh poori string nahi hai.
Worked example Ek word ke borders
ANPANMAN (length 8) mein:
AN ek prefix hai (front ke do boxes) aur ek suffix bhi hai (back ke do boxes) → AN ek border hai.
Empty string hamesha ek trivial border hai.
Borders is sawaal ka jawab dete hain: "agar maine yeh back-chunk already match kar liya, toh pattern mein aur kahan yahi chunk aata hai taaki main match reuse kar sakun?" Yeh precisely good-suffix rule ka Case 2 hai jo tumhe parent note mein milega. Agar tum borders ke peeche general machinery chahte ho, toh Borders and Prefix Function aur iske cousins Knuth-Morris-Pratt (KMP) aur Z-Algorithm dekho.
Definition Last-occurrence function
Kisi bhi character c ke liye, last ( c ) P mein woh sabse bada index hai jahan c appear karta hai. Agar c kabhi P mein appear nahi hota, toh hum last ( c ) = − 1 set karte hain.
last ( c ) = { max { i : P [ i ] = c } − 1 c occurs in P c does not occur in P
Intuition "-1" kyun, "0" kyun nahi absent characters ke liye
− 1 ek deliberate "string shuru hone se pehle" marker hai. Jab bad-character rule ek shift compute karta hai j − last ( c ) se, − 1 plug in karne par j − ( − 1 ) = j + 1 milta hai, jo poore pattern ko bad spot se aage slide kar deta hai. Agar hum 0 use karte toh under-shift hota aur kaam waste hota. − 1 ka choice hi "character pattern mein bilkul nahi hai" ko sabse bada, clean jump banata hai.
Worked example Ek word se last() padhna
P = ABCAB . Toh:
last ( A ) = 3 (rightmost A box 3 hai),
last ( B ) = 4 ,
last ( C ) = 2 ,
last ( Z ) = − 1 (koi Z nahi).
max symbol
max ( a , b ) simply do numbers mein se bada pick karta hai. max ( 1 , x ) ka matlab hai "x use karo, lekin use kabhi 1 se neeche mat girne do" — ise clamping kehte hain.
1 par clamp kyun karein, aur do rules ka max kyun lein
1 par clamp: 0 ya negative shift pattern ko left move kar dega ya wahi rakhega — search forever loop karta rahega. Kam se kam 1 force karna forward progress guarantee karta hai.
Do rules ka max: bad-character rule aur good-suffix rule dono independently promise karte hain "agar tum itna jump karo toh real match miss nahi hoga." Jab do promises dono safe hain, toh bada jump bhi safe hai (aur faster). Isliye Boyer-Moore max ( shift b c , shift g s ) leta hai.
Yeh "har rule ek safe lower bound hai, bada lo" idea poore algorithm ka logical glue hai — jab tum parent note ka boxed final formula padho toh ise pakde raho.
Σ
Σ (Greek capital "sigma") possible characters ka set hai, aur ∣Σ∣ batata hai kitne hain. Plain English text ke liye ∣Σ∣ ≈ 26 ; DNA ke liye 4 (A,C,G,T); bytes ke liye 256 .
Intuition Alphabet size speed kyun decide karti hai
Bada alphabet matlab bad character c usually chhote pattern mein appear nahi karta , toh last ( c ) = − 1 aur hum poore m boxes jump karte hain — m text characters bina padhe skip kar lete hain. Total n se kam characters padhna hi "sublinear " kehlata hai. DNA jaisi chhoti alphabets par pattern text ke saath bahut characters share karta hai, jumps chhote ho jaate hain, aur advantage fade hota hai. Isliye Boyer-Moore bade alphabets par chamakta hai aur isliye Rabin-Karp , Aho-Corasick , aur Galil Rule jaisi relatives doosre regimes ke liye exist karti hain.
Text T length n, Pattern P length m
Slice notation prefix and suffix
Alignment shift s and T of s plus i
Mismatch index j and bad char c
Border prefix equals suffix
Alphabet size and sublinear
Is page par har foundation box do skip rules mein se ek ko feed karta hai, aur dono rules final search loop ko feed karte hain — exactly wahi structure jo parent note mein hai.
Khud test karo — har line question ::: answer hai.
Agar ek string ki length m hai, toh uske last box ka index kya hai? m − 1 (indices 0 se m − 1 tak run karte hain).
Jab pattern shift s par hai, P [ i ] ke neeche kaun sa text box baitha hai? T [ s + i ] .
Boyer-Moore characters kis direction mein compare karta hai, aur kyun? Right se left, taaki ek mismatch ek matched suffix reveal kare jo big-skip rules ko power deta hai.
Mismatch par j aur c kya hain? j woh pattern index hai jahan pehla (rightmost-first) mismatch hota hai; c = T [ s + j ] uske neeche wala bad text character hai.
Ek string ka border kya hota hai? Ek proper substring jo prefix aur suffix dono ho.
last ( c ) kya hota hai jab c P mein appear nahi karta?− 1 .
Shift ko max ( 1 , ⋅ ) se clamp kyun karte hain? Forward progress guarantee karne ke liye — zero ya negative shift forever loop karega.
Boyer-Moore do rules ke shifts ka max kyun leta hai? Har rule ek independently safe jump hai; do safe jumps mein se bada bhi safe aur faster hota hai.
"Sublinear" yahan kya matlab hai aur yeh kab hota hai? n se kam text characters padhna; bade alphabets par hota hai jahan bad character aksar P mein nahi hota, isliye size m ke jumps common hain.
🇮🇳 Prefer Hinglish? See 3.8.05 Boyer-Moore — bad character, good suffix heuristics (Hinglish) .