3.8.5 · D5 · HinglishString Algorithms
Question bank — Boyer-Moore — bad character, good suffix heuristics
3.8.5 · D5· Coding › String Algorithms › Boyer-Moore — bad character, good suffix heuristics
Quick symbol refresher taaki kuch bhi unexplained na rahe:
Recall Symbols jo is page mein reuse hote hain
- ::: woh text jisme search kar rahe hain, length .
- ::: woh pattern jise hum dhundhte hain, length , indexed .
- ::: current alignment (kitna ko right mein shift kiya gaya hai ke neeche).
- ::: pattern index jahan right-to-left scan ne mismatch hit kiya.
- ::: bad character , woh text char jo match todta hai.
- ::: mein rakhne wala rightmost index, ya agar mein kabhi appear nahi hota.
- good suffix ::: block jo mismatch se pehle already match ho chuka tha.
- border ::: ek proper substring jo ek saath kisi string ka prefix bhi hai aur suffix bhi.
True ya false — justify karo
Boyer-Moore hamesha text ka har character kam se kam ek baar padta hai.
False. Large alphabets par yeh aksar sublinear hota hai: pattern ke end ke paas ek single mismatch ka jump force kar sakta hai, to text ke poore runs kabhi inspect hi nahi hote — yahi to poora point hai.
Bad-character rule akela algorithm ko naively code karne par forever loop kara sakta hai.
True. Jab ho to raw formula hota hai, ek zero ya backward shift; clamp ke bina alignment kabhi aage nahi badhti.
Dono heuristic shifts ka maximum lene se ek genuine match skip ho sakta hai.
False. Har rule independently ek safe lower bound hai — koi bhi kabhi match skip nahi karta — to do safe shifts mein se bada bhi safe hai, bas faster.
Agar mismatch hota hai aur mein bilkul appear nahi hota, to poore pattern ko position se aage slide kiya ja sakta hai.
True. ke saath shift hai , ko offending text char se thoda aage slide karta hai, kyunki ko overlap karne wala koi alignment kabhi match nahi kar sakta.
Left-to-right compare karne se right-to-left jaisi hi skips milti.
False. Right-to-left scanning hi ek matched suffix produce karta hai; good-suffix rule aur "rightmost bad char" logic dono suffix jaanne par depend karte hain, prefix par nahi — ise ulta karo aur skipping logic collapse ho jata hai.
Good-suffix rule sirf isliye chahiye kyunki bad-character rule compute karna slow hai.
False. Dono cheap hain. Good suffix isliye exist karta hai kyunki adversarial cases mein (jaise bad char kisi late occurrence ke barabar ho) bad-character shift degenerate ho ke ho jaata hai; good suffix wahan bada legal jump provide karta hai.
Ek full match report hone ke baad, algorithm ko se shift karna chahiye.
False. Yeh se shift karta hai, poore pattern ke liye good-suffix jump — border ki width batati hai ki agli baar earliest kahan ho sakta hai, jo usually se zyada hota hai.
Large alphabet ke liye, worst-case Boyer-Moore search time hai.
False. best case hai. Basic BM ka worst case hai (jaise , ); Galil Rule ise guaranteed mein repair karta hai.
legitimately se bada value return kar sakta hai.
True. mein rightmost mismatch index ke right mein ho sakta hai; yahi exactly "would move backward" case hai jise clamp handle karta hai.
Good-suffix rule matched suffix ki length jitna shift guarantee karta hai.
False. Yeh ek safe shift guarantee karta hai, lekin Case 1 mein ko sirf itna slide kiya ja sakta hai ki suffix ki ek internal copy align ho, jo ek chhoti move ho sakti hai; suffix ki length shift par lower bound nahi hai.
Error pakdo
"Shift bad-character shift hai."
Error clamp drop karna hai. Jab ho to yeh hai; correct rule hai taaki pattern hamesha aage badhta rahe.
"Good suffix rule sirf check karta hai ki matched suffix mein kahin pehle reappear hoti hai ya nahi."
Yeh sirf Case 1 hai. Yeh Case 2 bhool jaata hai: jab koi full copy exist nahi karti, to aapko ka woh prefix align karna hoga jo good suffix ke suffix ke barabar ho. Case 2 skip karne se over-shift hota hai aur real matches miss ho jaate hain.
"Jab hum good suffix ki internal copy dhundhen, koi bhi copy chalegi."
Nahi — internal copy se pehle wala character differ karna chahiye se. Agar woh equal hota, to agla comparison wohi mismatch reproduce karta, shift waste ho jaati.
"Full match par hum simply par move kar sakte hain kyunki poora pattern consume ho gaya."
Overlapping matches ke liye galat. se jump karna ek aisi occurrence se aage nikal sakta hai jo current se overlap karti ho; aapko se shift karna chahiye, jo pattern ki self-overlap (uski border) respect karta hai. ::: bad character ke liye table extra space bhi cost karta hai, lekin yeh ek memory note hai, is error se alag.
"Boyer-Moore pattern ko left to right scan karta hai, jaise human padta hai."
Defining feature iska opposite hai: inner loop se start hota hai aur decrease hota hai. Left-to-right scanning woh suffix knowledge remove kar deti hai jis par har skip rely karta hai.
"Good-suffix array ko preprocess karne ke liye text chahiye."
Nahi. Dono heuristics sirf pattern (aur alphabet) ko preprocess karte hain. search phase tak bilkul untouched rehta hai — yahi reason hai ki BM ek ko kai texts par efficiently handle karta hai.
Why questions
Boyer-Moore pattern ko right to left kyun scan karta hai?
Taaki ek mismatch peeche ek matched suffix chhhode, jo good-suffix jump unlock karta hai aur bad text char ko mein uski rightmost copy ke saath align hone deta hai — dono large-skip mechanisms ko suffix information chahiye.
Hum bad char ko uski rightmost copy ke saath mein baayi taraf align kyun karte hain, leftmost ke saath nahi?
Leftmost copy ke saath align karna ko itna dur shift kar sakta hai ki woh alignment leap over ho jaye jahan rightmost copy match hoti — woh ek possible match skip kar deta. Leftmost ki taraf rightmost copy sabse bada safe jump hai.
lena unhe add karne se zyada correct kyun hai?
Add karne se over-shift ho sakta hai aur match skip ho sakta hai. Har shift apne reason ke liye separately sabse bada guaranteed-safe move hai; sach mein safe move woh hai jo dono safe reasons mein zyada permit kare, yaani maximum.
Bad-character rule kabhi kabhi sirf ka shift kyun deta hai?
Jab bad char mein late appear hone wale character ke barabar hota hai (to ), formula par clamp ho jaata hai. Yahi exactly woh scenario hai jahan good-suffix rule ko shift rescue karna padta hai.
Large alphabet Boyer-Moore ko faster kyun banata hai?
Kai distinct symbols ke saath, ek random text char ka mein appear hona unlikely hai, to mismatches frequently "not in " case hit karte hain aur poori pattern width jump karte hain — kai characters unread skip ho jaate hain.
Hum clamp discard kyun nahi kar sakte yeh "guarantee" karke ki hoga?
Hum ise guarantee nahi kar sakte. Mismatched text char kisi aisi pattern char ke barabar ho sakta hai jo ke right mein ho, ordinary inputs par perfectly possible hai, isliye clamp mandatory hai, defensive fluff nahi.
BM ka worst case kyun hai clever skips ke bawajood?
Jab aur ek single repeated symbol share karte hain (jaise sab
a), har alignment almost fully match hoti hai phir mismatch hoti hai, ke tiny shifts aur near-full re-scans dete hain — skips ghaib ho jaate hain. Galil Rule ise fix karta hai.Edge cases
Agar ho (pattern ek single character hai), to good-suffix rule kya contribute karta hai?
Almost kuch nahi — sole character se pehle koi non-empty matched suffix nahi hai, to shifts poori tarah bad-character rule se aate hain; BM ek simple "jump to next occurrence" scan mein degenerate ho jaata hai.
Agar ke sab characters distinct hain, to kya bad-character rule kaafi hai?
Nearly. Distinct characters bad-character shifts ko consistently large banate hain aur degenerate clamp-to- case rare hota hai, isliye good suffix rarely dominate karta hai — lekin aap dono ko correctness ke liye rakhte hain thode overlap cases mein.
Kya hota hai jab mismatch par ho (bilkul pehla comparison)?
Matched suffix empty hai, to good-suffix rule koi help nahi karta (, iska default); shift purely us pehle char par bad-character rule se aata hai.
Kya hoga agar alphabet mein aisi characters hon jo mein kabhi present hi nahi?
Har aisi char ke liye hai, to unpar koi bhi mismatch ka maximal bad-character jump trigger karta hai — yahi "foreign" characters hain jo BM ko sublinear banate hain.
Agar mein ki do occurrences overlap karti hain, to kya BM dono dhundh lega?
Haan, provided post-match shift use kare (whole-pattern border), jo kabhi overlapping start se aage nahi jump karta; yahi exactly reason hai ki hum blindly se shift nahi karte.
Jab good suffix ki koi internal reoccurrence nahi aur ka koi prefix uski suffix se match nahi karta to shift kya hota hai?
Good-suffix array apne default par fall back karta hai, pattern ko matched region se poori tarah aage slide karta hai — safe hai kyunki mein kuch bhi iske saath realign nahi ho sakta.
Kya Boyer-Moore sahi behave karta hai jab ho (text pattern se chhoti ho)?
Search loop condition immediately false ho jaati hai, to yeh ek bhi comparison ke bina no matches report karta hai — sahi jawab, kyunki fit hi nahi ho sakta.
Related ideas se connections
Recall Yeh traps kahan doosre algorithms se overlap karte hain
- Good suffix ko drive karne wala border concept wohi object hai jo Borders and Prefix Function banata hai aur Knuth-Morris-Pratt (KMP) mein reuse hota hai.
- array essentially ek reversed Z-Algorithm computation hai.
- Ek saath multiple patterns ke liye, Aho-Corasick prefer karo; hashing-based matching ke liye, Rabin-Karp.
- Worst-case cure Galil Rule par rehti hai.