3.8.2 · D5 · HinglishString Algorithms

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

2,321 words11 min read↑ Read in English

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

Shuru karne se pehle, ye plain-language anchors apne dimaag mein rakh lo:

Recall Vocabulary refresher (agar koi word shaky lage toh open karo)
  • Prefix of a string = ek chunk jo front se liya gaya ho (e.g. ab of abcd).
  • Suffix = ek chunk jo back se liya gaya ho (e.g. cd of abcd).
  • Proper prefix/suffix = ek jo puri string se strictly shorter ho (matlab puri string apna khud ka proper prefix nahi hoti).
  • Border = ek string jo dono proper prefix aur proper suffix ho. Failure function length of the longest border of store karta hai.
  • Text pointer text mein chalti hai; pattern pointer count karta hai ki abhi kitne pattern characters match ho rahe hain.

Ye ideas Borders and Periods of Strings se connect hote hain — length ka border length ki string mein matlab hai string ki period hai.

Ye page self-contained hai. Neeche ke do code snippets wahi machinery hain jo tumhe chahiye; har "Spot the error" aur "Why" item in exact lines ko refer karta hai, isliye inhe nazaron ke saamne raho.


True or false — justify

True/false bolo AUR reason bhi do. Sirf "true" bolna yahan koi kaam ka nahi.

kisi kisi string ke liye se zyada ho sakta hai.
False. ek single character hai; iska ek hi proper prefix hai — empty string — toh longest border ki length hamesha hogi.
Failure function text par depend karta hai, sirf pattern par nahi.
False. purely se (ya jis bhi string ko tum feed karo usse) build hota hai. Text baad mein sirf match loop mein scan hota hai; ek baar precompute hota hai, text-independent.
Har valid index ke liye hota hai.
True. (jis ki length hai) ka proper prefix zyada se zyada lamba ho sakta hai, toh uski length — aur isliye — kabhi se zyada nahi hoti.
Agar hai, toh ke last characters ke barabar hai.
True. Yahi border ki definition hai: length- prefix aur length- suffix ek hi characters hain, isliye hum unhe re-compare kiye bina reuse kar sakte hain.
String aaaa ke liye, failure array [0,1,2,3] hai.
True. Har naya a previous border ko ek se badhata hai: a→0, aa→1, aaa→2, aaaa→3. Longest proper border badhta rehta hai kyunki har prefix bhi ek suffix hai.
KMP worst-case mein guarantee karta hai, sirf average-case mein nahi.
True. par amortized potential argument har input ko bound karta hai, including adversarial ones jaise , — unlike Rabin-Karp, jiska worst case hash collisions se tak degrade ho jaata hai.
Kyunki kabhi peeche nahi jaata, KMP kabhi koi bhi text character dobara examine nahi karta.
False (subtle). peeche nahi jaata, lekin ek inner while ke andar kaafi baar compare ho sakta hai (har baar ek alag, chote ke against). Baat ye hai ki total comparisons bounded hain, ye nahi ki har char ek hi baar touch hota hai.
Ek prefix ke borders ki poori count directly ek single value se padhi ja sakti hai.
False. Ek sirf longest border deta hai. Borders ki poori chain se tak iterate karke milti hai.

Spot the error

Har line mein ek plausible-sounding lekin broken claim hai. Fix reveal karo. Upar ke do code boxes ko refer karo.

"Mismatch par hum set karte hain."
Wrong index. matched characters count karta hai, toh last matched pattern index hai; jo border chahiye wo par hai. padhna ek unmatched (aur possibly out-of-range) slot ko touch karta hai.
"Full match milne ke baad hum reset karte hain fresh search ke liye."
Overlaps miss ho jaate hain. Jaise upar ka self-contained example dikhata hai ( in hits 0,1,2), par reset karne se index 1 wala overlapping hit drop ho jaata. use karo reusable tail rakhne ke liye.
" mein puri string include honi chahiye kyunki wo longest prefix hai jo suffix bhi hai."
Progress khatam ho jaati hai. Iska matlab hoga, toh fallback kabhi ko shrink nahi karega aur while forever loop karta rahega. Border proper (strictly shorter) hona chahiye.
"-build loop ke mismatch case mein (upar ke box mein Case 2) hum se dobara retry karein."
Koi progress nahi. Hum loop ke top par pehle se set kar chuke hain aur wo mismatch hua; same value retry karna forever loop karega. Case 2 ko next-shorter border par jaana chahiye, jo hai.
"Match machine mein inner while (doosra box) har ke liye baar tak chal sakta hai, toh loop hai."
Amortization miss kiya. Har while step ko drop karta hai, aur sirf per outer step rise karta hai, toh total drops total rises . while total mein baar chalta hai, jo deta hai.
"Agar aur (Case 3) ho, toh hum par fall back karein."
Aisi koi slot nahi hai. ke saath shrink karne ke liye koi border nahi hai; hum simply set karte hain aur rok dete hain. Box mein while j > 0 guard exactly access rokne ke liye hai.
"Saare matches dhundhne ke liye humein ek alag loop chahiye; -build loop aur match loop fundamentally different algorithms hain."
Same machine hai. Dono boxes compare karo: dono identical "extend or fall back" automaton chalate hain; matching wahi hai jahan doosri string text hai aur hum ko reach karte dekhte hain.

Why questions

Mechanism se jawab do, restatement se nahi.

Border reuse karne se pattern minimum safe distance slide kyun hoti hai?
Longest border sabse bada overlap hai jo pehle se text ke saath match hone ke liye jaana jaata hai, toh se slide karna (sabse chota shift) kisi real occurrence ko jump over nahi kar sakta — chota border aur aage slide karega aur match skip karne ka risk hoga.
Fallback chain kyun finite aur hamesha terminating hai?
Har step strictly chota border length deta hai (), toh sequence non-negative integers mein strictly decreasing hai aur finite steps mein tak pahunchni chahiye.
Amortized cost argument mein hum ki jagah variable kyun track karte hain?
"potential" hai: ye per outer step zyada se zyada rise karta hai aur har expensive while iteration apna cost drop karke khud chukati hai. Total decrease ko total increase se bound karna hidden work cap kar deta hai — ye ek textbook Amortized Analysis hai.
Naive matcher aaaa...ab vs aaaa par kyun achieve nahi kar sakta?
Naive har mismatch par saare matched characters throw away kar deta hai aur unhe next shift par re-scan karta hai, toh wo same as ka run baar per position re-read karta hai — bilkul wahi re-reading jo KMP ka forward-only forbid karta hai.
Matching ke liye hi kaafi information kyun hai, pattern ka structure kisi aur tarike se store kiye bina?
har prefix ki border chain fully encode karta hai, aur match loop ko sirf "given maine chars match kiye aur abhi fail hua, next-best matched length kya hai?" — jo exactly ek lookup hai.
Z-algorithm same matching problem kaise solve karta hai lekin alag array meaning ke saath?
Z har position ke liye longest substring ki length store karta hai jo wahan se shuru hoke prefix se match karti hai — ek "forward" view; har position par end hone wala longest border store karta hai — ek "backward" view. Dono matching dete hain, same self-similarity ko alag tarike se encode karke.
(last value) exactly pattern ke longest border ki length kyun hai?
puri pattern hai, toh iska longest proper prefix jo suffix bhi hai — final index par ki definition — by definition pattern ka longest border hai.

Edge cases

Boundary inputs jahan galat code silently break ho jaata hai.

Length ke pattern ke liye kya hai, maan lo x?
Sirf [0]. Ek character ka koi proper prefix nahi hai, toh array ek single zero hai — aur matching phir bhi kaam karta hai, x ke barabar har text position par hit report karta hai.
Kya hota hai agar pattern text se lamba ho ()?
kabhi nahi pahunch sakta kyunki outer loop sirf baar chalta hai aur har step mein zyada se zyada rise karta hai. Sahi taur par, koi match report nahi hota.
Text aaaaaaa mein pattern aaaa ke liye kitne matches hain aur overlap kyun hai?
Chaar matches (indices 0,1,2,3 par). Har full match ke baad hum set karte hain, teen matched as rakhte hue, toh agla match ek position baad shuru hota hai — overlapping runs capture ho jaate hain, skip nahi hote.
Agar pattern mein saare distinct characters hain, e.g. abcd, toh kaisa dikhta hai?
Sab zeros: [0,0,0,0]. Jab har character unique ho toh koi prefix kisi suffix ke barabar nahi ho sakta, toh kisi bhi mismatch par seedha par reset ho jaata hai — KMP gracefully naive-like behavior mein degenerate ho jaata hai lekin phir bhi rehta hai.
Empty string ka kya hai, aur kya code uske liye well-defined hai?
Empty string ke koi indices nahi hain, toh ek empty array hai; build loop (i = 1 .. m-1) simply kabhi nahi chalta. Koi special-casing nahi chahiye — loop bounds usse handle kar lete hain.
abcabcab jaise periodic pattern ke liye, last value tumhe kya batata hai?
(border abcab), aur period hai — repeating block abc ke saath match karta hua. Ye border↔period link Borders and Periods of Strings ka bridge hai.
Agar do alag patterns ka same array ho, toh kya KMP unpar identically behave karta hai?
Nahi. fallback structure control karta hai, lekin actual character comparisons vs real letters par depend karti hain — same skip-logic, alag match outcomes.

Mirror-image "forward" formulation ke liye, Z-algorithm se compare karo; many-patterns-at-once ke liye, ye machine Aho-Corasick tak generalize hoti hai. Heavier index-structure alternatives Suffix Automaton, Suffix Array ke neeche hain.