3.8.4 · D1 · Coding › String Algorithms › Z-algorithm — Z-array construction, O(n+m)
Z-algorithm ek kaam karta hai — kisi bhi word mein har starting spot ke liye ye poochta hai: "yahan se kitne letters word ke bilkul shuru se match karte hain?" — aur ye kaam karta hai ek left-to-right sweep mein, jo matches pehle mil chuke hain unhe reuse karke, baar baar count karne ki bajaye. Neeche jo bhi hai wo wahi vocabulary hai jo tumhe chahiye taaki ye sentence poori tarah samajh aaye.
Z-array banane se pehle tumhe kuch choti choti ideas mein fluent hona padega: ek string actually kya hoti hai numbered boxes ki row ke roop mein, ek prefix aur substring pictures mein kaisi dikhti hain, ek interval [ l , r ] kahan point karta hai, aur iska kya matlab hai ke ek word ka ek hissa word ke beginning ka photocopy ho. Chalte hain, ek ek ko samjhte hain.
Definition String aur uske indices
Ek string s bas characters ki ek finite row hoti hai jo left se right rakhi jaati hai. Hum har box ko ek number dete hain jise uska index kehte hain. Hum counting 0 se shuru karte hain (ise 0-indexed kehte hain), toh pehla box index 0 hai, doosra index 1 hai, aur aage bhi aise hi. Boxes ki total ginti ko length kehte hain, jo n se likhi jaati hai.
0 se kyun shuru karein na ki 1 se? Kyunki parent note ke har formula mein (jaise mirror i ′ = i − l ) calculation tab hi clean aati hai jab pehla box 0 ho. Agar 1 se count karein, toh har subtraction ek se off ho jaayegi aur algorithm toot jaayega.
Intuition Woh picture jo dimaag mein rakhni hai
Figure dekho: string labelled boxes ki ek strip hai. Index woh address hai jo har box ke neeche likha hai; character woh cheez hai jo box ke andar rehti hai. Jab hum baad mein "position i " bolte hain, toh hum uss box ki baat karte hain jiska address i hai — kabhi box ke contents ki nahi.
Notation jo ab har jagah dikhegi:
Definition Prefix, suffix, substring
Prefix ek aisi strip hai jo bilkul shuru se start hoti hai (index 0 ) aur kuch door tak right mein jaati hai. s [ 0.. k − 1 ] length k ka prefix hai.
Suffix ek aisi strip hai jo bilkul end par khatam hoti hai (index n − 1 ) aur kahin se start hoti hai.
Substring koi bhi connected strip s [ a .. b ] hai — ye kahin se bhi start aur khatam ho sakti hai.
Z-algorithm sirf ek khaas comparison ki parwah karta hai: ye ek aisi substring leta hai jo kisi index i pe start hoti hai aur poochta hai ke uska kitna hissa prefix se agree karta hai. Toh in teeno mein se, prefix star hai aur index i se start hone wali substring woh cheez hai jo hum uske saamne rakhte hain.
Worked example Shapes ko identify karo
s = aabxaab (length 7 ).
Length 3 ka prefix: s [ 0..2 ] = aab .
i = 4 se start hone wali substring: s [ 4..6 ] = aab .
Ye dono strips equal hain! Length 3 ki ye equality bilkul wohi cheez hai jo Z [ 4 ] record karega.
Definition Do strips match karti hain
Same length ki do strips match karti hain jab har box align ho: ek ki character 0 doosre ki character 0 ke barabar ho, character 1 character 1 ke barabar ho, aur poore strip mein aisa hi ho.
Ab poore topic ki core baat — ek strip ko prefix ke against compare karna aur pehli disagreement pe rokna.
Intuition "Longest matching length" kyun, sirf "kya ye match karte hain?" kyun nahi?
Haan/Nahi wala "kya ye match karte hain?" information throw away kar deta hai. Z-algorithm ko exact number chahiye — kitne boxes agree karte hain pehli mismatch se pehle — kyunki wohi number ek baad wali position ko pehle ka jawab copy karne deta hai. Isliye hum hamesha agreement ki length maapte hain, sirf haan/nahi nahi.
Z padhna
s = aabxaab ke saath: i = 4 pe strip aab prefix aab se saare 3 boxes mein agree karti hai, phir string khatam ho jaati hai — toh Z [ 4 ] = 3 . i = 1 pe box mein a hai (s [ 0 ] se agree karta hai), lekin s [ 2 ] = b = s [ 1 ] = a — toh agreement 1 pe ruk jaati hai, Z [ 1 ] = 1 milta hai.
Ek interval [ l , r ] addresses ki ek pair hai jiska matlab hai "box l se box r tak inclusive strip". Yahaan l left edge hai aur r right edge hai. Agar l > r ho toh interval empty hai (kisi cheez ko point nahi karta) — ye woh starting state hai jab humne kuch nahi dhoondha hota.
Algorithm ek ki jagay do numbers kyun carry karta hai? Kyunki use ek poori stretch yaad rakhni hoti hai jo already verify ho chuki hai — ek single spot nahi. Pair [ l , r ] woh minimum bookkeeping hai jo "yahan se yahan tak sab trusted hai" ko naam deta hai.
Intuition Z-box beginning ka ek photocopy hai
Jab algorithm ne prove kar diya ki strip s [ l .. r ] prefix s [ 0.. r − l ] ke barabar hai, toh wo [ l , r ] ko Z-box kehta hai. Ise ek photocopy ki tarah socho — string ke front ka, box l se start hokar chipkaaya gaya. Kyunki ye photocopy hai, iske andar address i wala box guaranteed identical hai address i − l wale box ke saamne wale front se. Yahi ek guaranteed fact — koi comparison nahi chahiye — poori speed trick hai.
Agar i ek Z-box [ l , r ] ke andar baitha hai, toh uska mirror i ′ = i − l hai: string ke front ke paas woh matching address. "Mirror" isliye kyunki i aur i ′ apne respective left edges se same distance par hain, toh dono same character rakhte hain.
Koi bhi aisa scenario nahi aana chahiye jo foundations ne nahi dikhaya, isliye ye chote edge inputs hain:
Worked example Degenerate inputs
Shuru mein empty box status l = r = 0 : hum abhi kuch nahi jaante, toh pehli real position (i = 1 ) hamesha scratch se compare karti hai.
Z [ i ] = 0 : i wale box mein jo character hai woh immediately s [ 0 ] se disagree karta hai. Zero boxes agree kiye — ek bilkul valid jawab, matlab "pehla letter bhi start se match nahi karta."
Z [ 0 ] : string ko khud se compare karna trivially poori length hai, toh convention se hum ise 0 (ya n ) set karte hain aur simply kabhi use nahi karte.
End se bahar jaana: agar comparison index n tak chali jaaye, toh wahaan koi box nahi hai, isliye agreement ruk jaati hai — string boundary ek mismatch ki tarah count hoti hai.
Definition Amortized cost
Amortized cost ka matlab hai: ye mat poochho "ek step kitna expensive hai?", ye poochho "poora run kitna expensive hai steps ki sankhya se divide karne par ?". Ek single step kabhi kabhi bahut kaam kar sakta hai, lekin agar aise steps rare hain, toh average chota rehta hai.
Parent ka linear-time claim is idea par tika hai (Amortized Analysis mein gehraai se samjhaya gaya hai): har real character comparison right edge r ko ek aage push karta hai , r sirf badhta hai, aur r n se aage nahi ja sakta. Toh poore algorithm mein total real comparisons at most n hain — chahe koi single position kaafi zyada kaam kare.
Index and character s of i
Match and length of agreement
Z-box photocopy of prefix
Upar har ek foundation Z-algorithm — Z-array construction, O(n+m) parent note ko feed karta hai. Related string tools jo inhi ideas ko reuse karte hain: KMP failure function , String Hashing , Suffix Array , Suffix Automaton , Manacher's Algorithm . Hindi walkthrough prefer karte ho? Dekho 3.8.04 Z-algorithm — Z-array construction, O(n+m) (Hinglish) .
s = aabx diya hua hai, s [ 2 ] kya hai?Character b (0-indexed, toh box 2 teesra box hai).
s [ 1..3 ] ka kya matlab hai?Index 1 se index 3 tak inclusive boxes ki strip — yahan abx .
Kisi string ka prefix kya hota hai? Koi bhi strip jo index 0 se start ho aur kuch door tak right mein jaaye.
Ek sentence mein, Z [ i ] kya maapata hai? Index i se start karke, pehli disagreement se pehle prefix se match karne wale boxes ki sankhya.
Interval [ l , r ] kahan point karta hai? Address l se address r tak inclusive boxes ki strip.
[ l , r ] ko "Z-box" kya banata hai?Strip s [ l .. r ] prefix s [ 0.. r − l ] ke barabar prove ho chuki hai — beginning ka ek photocopy.
Agar i ek Z-box [ l , r ] ke andar hai, toh uska mirror index kya hai? i ′ = i − l , front ke paas woh matching address.
Box ke andar s [ i ] = s [ i − l ] ek fact kyun hai, guess nahi? Kyunki box prefix ka photocopy hai, toh left edge se same distance matlab same character.
r − i + 1 kya count karta hai?Position i se right edge r tak boxes ki sankhya, inclusive.
Z [ i ] = 0 ka kya matlab hai?i wala character immediately s [ 0 ] se disagree karta hai — zero boxes prefix se match karte hain.
Ek line mein, total cost O ( n ) kyun hai? Har real comparison r ko aage push karta hai, r sirf badhta hai aur n pe cap hai, toh poore mein at most n comparisons hote hain.