3.8.3 · D2 · HinglishString Algorithms

Visual walkthroughRabin-Karp — rolling hash, O(n+m) expected

2,114 words10 min read↑ Read in English

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

Hum ek hi sawaal ka jawab dhundhenge: jab letters ki ek window ek step right slide karti hai, toh kya hum bina har letter ko dobara add kiye uska naya "number" purane se nikaal sakte hain?


Step 1 — String ko ek single number mein badlo

KYA. String lo aur uske letters ko ek ordinary number ke digits ki tarah line up karo.

KYU. Do poore numbers compare karna ek single operation hai; do strings ko letter-by-letter compare karna hai. Agar hum kisi string ko fairly ek number mein squeeze kar sakein, toh matching fast ho jaati hai. ==== ka matlab hai "ek fixed amount of work, chahe string kitni bhi lambi ho."

PICTURE. Neeche diye figure mein string cab upar hai; uske neeche, har letter apne code mein drop hota hai. Dhyan do ki abhi tak hum unhe combine nahi kiya hai — yeh Step 2 mein hoga.

Figure — Rabin-Karp — rolling hash, O(n+m) expected

Codes ko simply add () kyun nahi kar dete? Kyunki tab cab, bca, abc teeno denge — order kho jaayega. Hume position ka matter karna zaroori hai. Aur yahi kaam ek base karta hai.


Step 2 — Har position ko ek weight do (base )

KYA. Sabse left wale code ko sabse bada weight do aur right ki taraf tak step down karo.

Base kyun, addition kyun nahi? Weights sab alag hain, isliye do letters ki positions swap hone se number badal jaata hai. Order ab encoded hai. Hum ko kam se kam alphabet size ke barabar choose karte hain taaki koi do "digit patterns" sasti jagah accidentally match na kar sakein.

PICTURE. Step 1 ke har code ko ab height ke labelled pedestal par rakha gaya hai. Sabse uncha pedestal pehle letter ke neeche hai — leftmost letter "high digit" hai.

Figure — Rabin-Karp — rolling hash, O(n+m) expected

Step 3 — Number ko se chhota rakho

KYA. compute karne ke baad, isse se modulo leke uske remainder se replace karo.

KYU. Lambi string ke liye astronomically bada hota hai — machine word ke liye bahut bada. Sab kuch lena number ko par cap kar deta hai aur saath hi +, −, × structure preserve karta hai (yeh modular arithmetic ki magic property hai: tum har step par reduce kar sakte ho). prime choose karna remainders ko evenly spread karta hai, taaki do alag strings ke ek hi remainder share karne ki probability lagbhag ho (collisions ke liye Birthday Paradox ka intuition).

PICTURE. Ek tall bar (raw value) baar baar ek chhote box of width mein fold hoti hai; jo bacha woh remainder hai — wahi hash hum store karte hain.

Figure — Rabin-Karp — rolling hash, O(n+m) expected

Step 4 — Do paas-paas wali windows lagbhag poori overlap karti hain

KYA. Window ka number (letters ) aur window ka number (letters ) ek ke upar ek likho aur un letters ko align karo jo share hote hain.

KYU. Poori speed-up ek single observation par tiki hai: do windows exactly ek letter each end par differ karti hain. Beech ka sab kuch identical hai — sirf uska weight badla hai. Agar hum us weight change ko sasti tarah express kar sakein, toh hum jeet jaate hain.

PICTURE. Overlapping block cyan mein shaded hai; dropped letter left par amber hai, incoming letter right par amber hai. Cyan block same letters hain — bas ek pedestal upar shift ho gaye.

Figure — Rabin-Karp — rolling hash, O(n+m) expected

Kuch derive karne se pehle dono numbers ko naam dete hain:


Step 5 — Drop, Slide, Add (derivation)

Hum ko teen moves mein mein convert karte hain. Har move ek arithmetic operation hai, isliye total hai.

Move 1 — DROP. Leading letter ka contribution hata do. Kyun: purana high digit sirf purani window ka tha. Yahan woh code hai jo hum evict kar rahe hain aur woh pedestal hai jis par yeh khada tha.

Move 2 — SLIDE. Baaki bache ko se multiply karo. Kyun: se multiply karna har weight ko kar deta hai — exactly wahi "weights ek upar gaye" wali baat Step 4 se. Yeh shift hai, ek single multiply se saare shared letters par ek saath.

Move 3 — ADD. Naye trailing letter ko weight par daalo. Kyun: incoming letter naya low digit hai; hai isliye yeh simply add ho jaata hai.

PICTURE. Teen panels, left→right: amber leading pedestal knock off hoti hai (Drop); cyan block ek level upar uthti hai (Slide); right par ground level par ek naya amber block aata hai (Add).

Figure — Rabin-Karp — rolling hash, O(n+m) expected

Step 6 — Degenerate cases (reader ko edge se girne mat do)

Case A — (single-letter pattern). Tab . Drop hata deta hai, slide se multiply karta hai, add deta hai; algebra collapse hokar ban jaata hai, jo sirf ek visible letter ka code hai. Sahi hai.

Case B — subtraction negative ho jaaye. negative ho sakta hai reductions ke baad, kyunki ek remainder us cheez se chhota ho sakta hai jo hum subtract kar rahe hain. kyun: final se pehle ek pura add karna kisi bhi negative ko mein wapas le aata hai bina residue badlaye.

Case C — collision (hashes equal, letters differ). Number ek fingerprint hai, proof nahi. Jab do windows ek hash share karein tab bhi hum letters compare karte hain. Verification cost karti hai lekin sirf lagbhag baar hoti hai — filter-then-check discipline ke liye String Hashing for Substring Comparison dekho.

PICTURE. Left: window ek single pedestal tak shrink ho gayi. Middle: ek negative bar arrow se valid box mein push ho rahi hai. Right: ek equal fingerprint share karte do alag words, beech mein amber "VERIFY" stamp.

Figure — Rabin-Karp — rolling hash, O(n+m) expected

Step 7 — Ek number jo actually roll karta hai (worked check)

ko mein search karo, base , prime , codes .

  • .
  • Window 0 "aa": . Kyunki , skip — ek comparison, koi letter check nahi.
  • Precompute .
  • Window 1 "ab" par roll karo:
  • verify"ab" == "ab" ✓ → index par match.

PICTURE. Tape a a b jisme window positions se par jump karti hai; upar hash labels , aur doosri window par amber "MATCH @1" flag.

Figure — Rabin-Karp — rolling hash, O(n+m) expected

Ek-picture summary

Upar ki poori cheez ek single diagram mein: string → codes → weighted sum → fold mod → aur Drop/Slide/Add loop jo har agla window free bana deta hai.

Figure — Rabin-Karp — rolling hash, O(n+m) expected
Recall Feynman: poora walkthrough apne words mein batao

Socho ek word digits ki tarah likha hai, jaise cab ko mein badalna. Un digits se ek number banana ke liye, main unhe ek real number ki tarah stack karta hoon: left digit sabse unche tower par (sabse bada weight) aur right digit ground floor par. Bade numbers bahut bade ho jaate hain, isliye main value ko baar baar size ke chhote box mein fold karta hoon aur sirf jo bacha — woh remainder — woh word ki fingerprint hai. Ab main ek lambi sentence mein ek window slide karti hoon. Do paas-paas windows apne almost saare letters share karti hain — sirf front wala nikalta hai aur ek naya join karta hai. Toh fingerprint dobara build karne ki bajaye, main teen quick moves karta hoon: jaane wale letter ko uske unche tower se knock karo, baaki sab ko ek floor upar uthao (base se multiply karo), aur naye letter ko ground floor par daalo. Teen operations, ho gaya. Agar fingerprint pattern ki se match kare, tab bhi main real letters check karta hoon — kyunki kabhi kabhi do alag words ek fingerprint share kar lete hain. Bas yahi poora trick hai.

Recall Quick self-test

Roll mein se multiply kyun karte hain? ::: Har remaining letter ka weight se karne ke liye — shared block ek place upar slide karta hai. Pehle subtract kyun karte hain? ::: Jaane wale letter ko evict karne ke liye, jo purani window ke sabse bade weight par baitha tha. Kya precompute karna padta hai? ::: , ek baar, warna roll nahi rehta. Hash match ke baad bhi verify kyun karte hain? ::: Hash ek filter hai; alag strings collide kar sakti hain (~ chance). chhota ho toh kya break hota hai? ::: Constant collisions → har jagah verify → .


Connections

  • Parent topic — full Rabin-Karp note
  • Hashing — fingerprint idea in general
  • Modular Arithmetic — kyun har step par reduce karna legal hai, aur fix
  • String Hashing for Substring Comparison — same roll range equality ke liye
  • Birthday Paradox — collisions ~ kyun hote hain
  • Knuth-Morris-Pratt, Z-Algorithm — collision-free linear alternatives