3.8.3 · D5 · HinglishString Algorithms

Question bankRabin-Karp — rolling hash, O(n+m) expected

2,127 words10 min read↑ Read in English

3.8.3 · D5 · Coding › String Algorithms › Rabin-Karp — rolling hash, O(n+m) expected

Ye bank parent topic ke ideas drill karta hai. Neeche kuch bhi heavy arithmetic nahi hai — woh D3/D4 mein hain.


Is page par use hone wala Notation

Traps se pehle, har symbol ko pin down karte hain taaki neeche koi line kuch undefined use na kare. Picture yeh hai: text boxes ki ek row hai, aur ek window width ka ek lal frame hai jo ek box ek time rightward slide karta hai.

Agla figure un teeno moves ko dikhata hai jo frame par act karte hain jab woh box se box par step karta hai.


True ya false — justify karo

Hash match prove karta hai ki pattern us window par occur karta hai
False. Hash ek filter hai, proof nahi — do alag strings collide hokar same value de sakti hain, isliye match ka matlab sirf "probably equal hai, ja ke verify karo" hota hai.
Hash mismatch prove karta hai ki pattern wahan occur nahi karta
True. Equal strings hamesha equal hash karti hain, isliye unequal hashes guarantee karte hain ki strings differ karti hain — yahi wajah hai ki hum instantly skip kar sakte hain aur koi real match kabhi miss nahi hota.
Rabin-Karp worst case mein hai
False. Yeh expected hai; worst case hai jab har window ka hash pattern se collide karta hai, har baar full verification force karta hai.
Bada prime use karna sirf correctness ke liye help kar sakta hai, kabhi hurt nahi karta
Correctness ke liye True (verification hamesha correctness guarantee karta hai). Lekin practice mein yeh free nahi hai: itna bada ki hashes machine word se overflow ho jaayein, slower big-integer ya 128-bit arithmetic force karta hai, isliye har operation zyada costly ho jaati hai chahe collisions girain — ek large prime chuno jo comfortably machine word mein fit ho.
Rolling update har slide par poora hash recompute karta hai
False. Poora point yahi hai ki woh nahi karta — woh se "drop, slide, add" karta hai mein, modular operations ke zariye pichhle window ke hash ko reuse karta hai.
Agar prime hai, toh collisions impossible ho jaate hain
False. Prime sirf collisions reduce karta hai; finite hash values hain ( jinke) aur infinite strings hain, isliye collisions phir bhi exist karni chahiye (pigeonhole).
Base ko alphabet size se chhota choose karna theek hai
False. Agar distinct characters ki sankhya se chhota hai, toh do alag characters "same digit" ki tarah act kar sakte hain aur systematic collisions cause kar sakte hain — alphabet size chuno.
Rabin-Karp ko shuru hone se pehle pattern length chahiye
True. Window size par fixed hai, aur aur pattern hash dono par depend karte hain; known length ke bina koi meaningful rolling window nahi hai.
Knuth-Morris-Pratt aur Rabin-Karp ka same guarantee hai
False. KMP guaranteed hai (koi randomness nahi, koi collision nahi), jabki Rabin-Karp sirf expected hai aur adversarially tak degrade ho sakta hai.

Error dhundho

"Kyunki hashes match hue, hum match report karte hain aur aage badhte hain — verification time ki barbaadi hai."
Error verification skip karna hai: alag strings collide ho sakti hain, isliye yeh false positives report karta hai. Verification woh safety net hai jo algorithm ko correct rakhta hai.
"Hum compute karte hain aur mod lete hain; result mein hai."
Subtraction mod se pehle negative ho sakta hai, aur kai languages mein negative number par % negative hota hai. Fix: ((H - x) % q + q) % q taaki yeh mein force ho.
"Numbers ko chhota aur fast rakhne ke liye, hum choose karte hain."
Chhota frequent collisions produce karta hai, isliye verification almost har window par fire karta hai, running time ko ki taraf le jaata hai. Ek large prime jaise use karo.
"Loop ke andar hum har step par pow(b, m-1) % q compute karte hain taaki code simple rahe."
Har iteration mein recompute karna har roll ko ya bana deta hai, update ko destroy kar deta hai. Loop se pehle ek baar precompute karo.
"Hamara hash hai — character codes ka sum. Simple aur collision-free."
Plain sum position-blind hai: "ab" aur "ba" identically hash hote hain, isliye yeh massively collide karta hai. Polynomial base- weighting isi liye exist karta hai taaki position matter kare.
"Hum ke saath single hash use karte hain, isliye hum safely character check skip kar sakte hain."
Bada prime bhi nonzero collision chance (~) chhodta hai; kai windows par ek false positive ho sakta hai. Correctness requires verification regardless of ki size — Birthday Paradox dekho.
"Rolling right add karta hai aur drop karta hai, isliye operations ka order matter nahi karta."
Order matter karta hai: pehle tumhe leading term ki current weight drop karni hai (, jahaan ) phir se multiply karo, phir naya low digit add karo. Inhe galat order mein karne se digit positions corrupt ho jaate hain.

Why questions

Roll ke dauran hum sirf do characters swap karne ki jagah se multiply kyun karte hain?
Kyunki har character ka contribution uski position se weighted hota hai ( se lekar tak); window slide karna har remaining character ko ek jagah upar shift karta hai, aur poore hash ko se multiply karna woh saari shifts ek saath perform karta hai.
Hash ko kisi bhi large number ki jagah prime modulo kyun lete hain?
Prime hash values ko zyada uniformly spread karta hai aur ke saath common factors avoid karta hai jo kai strings ko same residue mein collapse kar dete, collision rate ko ke aas paas rakhta hai.
Hash mismatch trustworthy kyun hai lekin hash match nahi?
Equal strings equal hashes produce karne par forced hoti hain (function deterministic hai), isliye mismatch conclusive hai; lekin kai strings har hash value par map hoti hain, isliye match sirf suggestive hai aur check karna zaroori hai.
Rabin-Karp sirf "expected" linear kyun hai guaranteed nahi?
Verification cost depend karta hai kitne spurious hash matches hote hain, jo ek probabilistic quantity hai (har window par ); ek adversary jo collisions engineer karta hai woh ise bana sakta hai.
Rabin-Karp naturally multiple patterns of same length search karne ke liye kyun extend hota hai?
Tum har pattern ke liye hash precompute kar sakte ho aur unhe ek set mein store kar sakte ho; har text window ka hash ek baar mein lookup hota hai, isliye kai patterns ek se thoda zyada cost karte hain — kuch aisa jo Knuth-Morris-Pratt utne cheaply share nahi karta.
String Hashing for Substring Comparison same rolling idea kyun reuse karta hai?
Dono base- polynomial hash par rely karte hain taaki kisi bhi substring ka hash prefix hashes se derive kiya ja sake, jisse tum do ranges ko mein compare kar sako — rolling window sirf sliding special case hai.
Agar chhota hai toh hum sirf naive compare kyun nahi use kar sakte?
Tum kar sakte ho, aur yeh aksar theek hota hai — Rabin-Karp ka advantage ke saath aur patterns ki sankhya ke saath badhta hai; ek single short pattern ke liye hashing ke constant factors payoff nahi de sakte.

Edge cases

Jab pattern text se lamba ho () toh kya hota hai?
Test karne ke liye koi length- windows nahi hain, isliye algorithm immediately zero matches report karta hai — windows ka loop simply run nahi hota.
Agar pattern aur text equal length ke hain ()?
Exactly ek window hai (poora text); hum do hashes ek baar compare karte hain aur match hone par verify karte hain — bilkul bhi rolling nahi hoti.
Empty pattern () ka hash kya hai?
Polynomial sum empty hai, hash deta hai; conventionally empty string har position par "match" karti hai, isliye yeh case usually roll ke bajaye special guard ke roop mein handle hota hai.
Single-character pattern () ke saath kya hota hai?
aur har hash sirf character ka code mod hai; roll degenerate ho jaata hai ek character compare karne mein, essentially naive scan.
Algorithm kaise behave karta hai jab ka har character identical ho (jaise "aaaa") aur "aa" ho?
Har window ka same hash hai aur genuinely match karta hai, isliye verification har baar succeed karta hai — yeh legitimate work hai, collision nahi, aur yeh tabhi hai jab answer set itself itna bada ho.
Agar do alag strings collide karein lekin koi bhi pattern nahi hai?
Koi farak nahi padta — hum sirf har window ke hash ko pattern ke hash se compare karte hain, isliye do non-pattern strings ke beech collisions kabhi observe nahi hote aur kuch cost nahi karte.
Kya hash of matlab hai ki string empty hai?
Nahi. Zero ek non-empty string ke liye perfectly valid hash hai (jaise "aa" code ke saath hash karta hai); numeric value apne aap mein koi "emptiness" meaning nahi carry karta.

Recall Har trap ka one-sentence summary

Baar-baar milne wala lesson: hash filter karta hai, verification decide karta hai — mismatches conclusive hain, matches nahi, correctness nahi speed tune karta hai, aur har degenerate length (, , , ) ko rolling loop par trust karne se pehle handle karna zaroori hai.


Connections

  • Parent topic — full derivation
  • Hashing — collisions isliye hain ki matches ko verify karna kyun zaroori hai
  • Modular Arithmetic — negative-value trap yahan rehta hai
  • Knuth-Morris-Pratt — guaranteed vs expected linearity
  • Z-Algorithm — comparison ke liye ek aur linear matcher
  • String Hashing for Substring Comparison — same rolling idea generalized
  • Birthday Paradox — kyun collisions tumhare guess se pehle appear hote hain