3.8.2 · D4 · HinglishString Algorithms

ExercisesKMP algorithm — failure function, O(n+m) — full derivation

2,321 words11 min read↑ Read in English

3.8.2 · D4 · Coding › String Algorithms › KMP algorithm — failure function, O(n+m) — full derivation

Do machines ka reminder jo aap baar baar use karte rahenge:

"Border" ek short word hai uss string ke liye jo ek proper prefix bhi ho aur proper suffix bhi ho. Picture dekho: do shaded blocks equal hain, isliye string ababa ka ek border aba hai jiska length hai.

Figure — KMP algorithm — failure function, O(n+m) — full derivation

Level 1 — Recognition

L1.1 — Definition se ek value padho

Problem. ke liye, haath se compute karo (last position).

Recall Solution

. Hume longest border chahiye.

  • Length 4 candidate aaba vs suffix abaa — nahi.
  • Length 3 candidate aab vs suffix baa — nahi.
  • Length 2 candidate aa vs suffix aahaan.

Toh . (Length 1 a=a bhi kaam karta hai lekin 2 bada hai, toh hum 2 rakhte hain.)

L1.2 — Poora table bharo

Problem. ke liye poora array banao.

Recall Solution

Position by position chalo, hamesha woh longest prefix lo jo ka suffix bhi ho:

i S[0..i] border π[i]
0 a 0
1 aa a 1
2 aab 0
3 aaba a 1
4 aabaa aa 2
5 aabaaa aa 2
6 aabaaab aab 3

Toh . dhyan se dekho: aabaaaaaa? aisa koi prefix nahi; border aa hi rehta hai.


Level 2 — Application

L2.1 — Build machine chalao, apni aankhein nahi

Problem. Code use karo (intuition nahi) ke liye compute karne ke liye. Har step par dikhao.

Recall Solution

Build loop yaad karo: j=pi[i-1]; while j>0 and S[i]!=S[j]: j=pi[j-1]; if S[i]==S[j]: j+=1; pi[i]=j.

i S[i] start j while-jumps S[i]==S[j]? π[i]
1 b 0 b≠a → nahi 0
2 a 0 a==a → +1 1
3 c 1 S[3]=c≠S[1]=b → j=π[0]=0 c≠a → nahi 0
4 a 0 a==a → +1 1
5 b 1 S[5]=b==S[1]=b haan → +1 2
6 a 2 S[6]=a==S[2]=a haan → +1 3
7 b 3 S[7]=b==S[3]=c? nahi → j=π[2]=1; S[7]=b==S[1]=b haan → +1 2

.

L2.2 — Match machine chalao

Problem. ke saath (toh ), mein saare occurrences dhundho. Start indices (0-based) list karo.

Recall Solution

Match loop ko aage badhata rehta hai, matched pattern chars count karta hai.

i T[i] j before action j after
0 a 0 match 1
1 b 1 match 2
2 a 2 match → j=3=m, report 0, j=π[2]=1 1
3 b 1 match 2
4 a 2 match → j=3=m, report 2, j=π[2]=1 1

Occurrences indices 0 aur 2 par start hote hain (overlapping — beech ka a share hota hai).


Level 3 — Analysis

L3.1 — Proper clause optional kyun nahi hai

Problem. Maano koi define karta hai poori string ko allow karte hue longest prefix=suffix ke roop mein. Match loop par trace karo jab pehla mismatch aata hai aur precisely failure explain karo.

Recall Solution

"Improved" definition ke saath, har position ko milta hai (poori substring apna khud ka longest prefix-and-suffix hai). Ab pattern index par mismatch aata hai. Fallback hai . Matlab: change nahi hota. while j>0 and T[i]!=P[j] condition abhi bhi true hai (same , same mismatch), toh hum frozen ke saath loop karte hain — ek infinite loop. Proper clause exactly yahi guarantee karta hai ki ho, toh har jump strictly ko shrink karta hai aur loop terminate karna padta hai.

L3.2 — Total fallback work count karna

Problem. (length ) mein (length ) match karne ke liye, ek tight upper bound do ki match loop ka inner while body total kitni baar run ho sakta hai, aur justify karo ki kaise change hota hai.

Recall Solution

Single variable ko poori run mein watch karo.

  • sirf badhta hai j+=1 mein, ek baar per outer iteration, aur outer iterations hain → total increase .
  • Har while body karta hai jahan hai, toh har body ko kam se kam 1 se decrease karta hai.
  • se shuru hota hai aur kabhi negative nahi hota, toh total decrease total increase .

Isliye while body poori match mein zyada se zyada baar run hoti hai, per character nahi. Yahi bound ka amortized heart hai. "Sawtooth" dekho: ek step at a time chadhta hai aur utna hi gir sakta hai jitna chadha tha.

Figure — KMP algorithm — failure function, O(n+m) — full derivation

Level 4 — Synthesis

L4.1 — Ek string ka smallest period

Problem. Ek string (length ) ka period sabse chhota hai jo ki satisfy kare sabhi valid ke liye. Prove karo ki smallest period hai, phir isse par apply karo.

Recall Solution

Border ⇔ period link. Agar ka length ka border hai, toh length ka prefix length ke suffix ke barabar hai. Unhe overlay karne par milta hai har jagah jo overlap karti hai — toh ek period hai. Ulta, ek period se length ka border milta hai. Toh longest border ⇔ smallest period, aur Apply karo. , . Iska hai , toh . Phir . Sach mein ababab block ab ko repeat karta hai jiska length hai. ✓

L4.2 — Kya kisi chhote block ki repetition hai?

Problem. " kisi block ki copies hai" ke liye ek one-line test do ( use karke), aur isse abcabcabc aur abcab par test karo.

Recall Solution

kisi block ki full copies hai agar aur sirf agar iska smallest period ko divide kare aur ho. Tab .

  • abcabcabc: , , toh . aur → haan, abc ki copies. ✓
  • abcab: , , toh . clean repetition nahi. ✓

Level 5 — Mastery

L5.1 — KMP se longest palindromic prefix

Problem. diya gaya hai, hume iska longest prefix chahiye jo palindrome ho. Dikhao ki isse EK prefix-function computation se kaise nikala jaaye, aur isse par run karo. (Hint: reverse aur ek separator.)

Recall Solution

= ka reverse, aur banao , jahan # ek aisa character hai jo mein kaheen nahi aata. par compute karo. Kyun kaam karta hai: = ka longest prefix jo ka suffix bhi ho. ka suffix (ulta karke) ka prefix backwards padha hai; isse ke prefix se match karna us prefix ko forwards aur backwards same padhne par majboor karta hai — ek palindromic prefix. # border ko beech se cross karne se rokta hai, toh value se zyada nahi ho sakti. Run karo. , , (length 13). par compute karte hain, last value hai, prefix aba match karta hai. Toh abacab ka longest palindromic prefix length 3 ka hai (aba). ✓

L5.2 — Distinct border lengths count karo

Problem. ke saare border lengths ka set (saare proper prefixes jo suffix bhi hain) exactly hai, tak. use karke (L1.2 se, ), poori string ke saare border lengths list karo.

Recall Solution

Last index se shuru karo: . Phir ke through chain chase karo:

  • length → next .
  • length → ruko.

Toh border lengths hain ; trivial empty border ko ignore karke, aabaaab ka sirf ek non-trivial border hai jiska length 3 hai (block aab). -chain ko tail se chase karna har border ko enumerate karta hai, longest pehle, borders ki sankhya ke proportional time mein.


Recall Aage kahan jaana hai
  • Wahi border/period ideas Borders and Periods of Strings ko power karte hain.
  • Z-values par build ek alag linear-matcher: Z-algorithm.
  • Hashing-based matching (alag trade-offs): Rabin-Karp.
  • Ek saath kai patterns: Aho-Corasick; heavy string machinery: Suffix Automaton, Suffix Array.
  • L3.2 mein amortized argument Amortized Analysis ka ek case study hai.

Active Recall

Longest border of aabaaab?
length 3 (block aab)
Smallest period of ababab?
2, since
Is abcab a clean repetition of a block?
Nahi — iska period 3 uski length 5 ko divide nahi karta
On a full match, set j to?
, overlaps rakhne ke liye