Question bank — KMP algorithm — failure function, O(n+m) — full derivation
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.
abofabcd). - Suffix = ek chunk jo back se liya gaya ho (e.g.
cdofabcd). - 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.
Failure function text par depend karta hai, sirf pattern par nahi.
Har valid index ke liye hota hai.
Agar hai, toh ke last characters ke barabar hai.
String aaaa ke liye, failure array [0,1,2,3] hai.
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.
Kyunki kabhi peeche nahi jaata, KMP kabhi koi bhi text character dobara examine nahi karta.
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.
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."
"Full match milne ke baad hum reset karte hain fresh search ke liye."
" mein puri string include honi chahiye kyunki wo longest prefix hai jo suffix bhi hai."
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."
"Match machine mein inner while (doosra box) har ke liye baar tak chal sakta hai, toh loop hai."
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."
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."
Why questions
Mechanism se jawab do, restatement se nahi.
Border reuse karne se pattern minimum safe distance slide kyun hoti hai?
Fallback chain kyun finite aur hamesha terminating hai?
Amortized cost argument mein hum ki jagah variable kyun track karte hain?
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?
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?
Z-algorithm same matching problem kaise solve karta hai lekin alag array meaning ke saath?
(last value) exactly pattern ke longest border ki length kyun hai?
Edge cases
Boundary inputs jahan galat code silently break ho jaata hai.
Length ke pattern ke liye kya hai, maan lo x?
[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 ()?
Text aaaaaaa mein pattern aaaa ke liye kitne matches hain aur overlap kyun hai?
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?
[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?
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?
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?
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.