3.8.4 · D2 · HinglishString Algorithms

Visual walkthroughZ-algorithm — Z-array construction, O(n+m)

2,296 words10 min read↑ Read in English

3.8.4 · D2 · Coding › String Algorithms › Z-algorithm — Z-array construction, O(n+m)

Neeche sab kuch ek hi running string par kaam karta hai. Chaliye use abhi fix karte hain taaki har figure ek hi language bole.


Step 1 — kya sawaal poochta hai?

KYA. Koi bhi starting position lo. String ke beginning ki ek copy slide karo taaki uska pehla letter position ke upar baithe. Ab right walk karo, letter-by-letter compare karo, aur count karo ki pehle disagreement se pehle kitne letters match hue. Woh count hai.

  • prefix, front se padha hua.
  • — substring se start hoti hai, wahan se padha hua jahan humne apni copy rakhi.
  • "longest run" — hum pehle mismatch par ruk jaate hain (ya string ke end par).

KYUN. Yeh ek number secretly pattern matching ko power karta hai (pattern ko text ke aage glue karo; ek -value jo pattern ki length ke barabar ho = ek match). Lekin pehle humein ise padhna aana chahiye.

PICTURE. Neeche overlaid ruler dikhata hai: teen green ticks, phir string khatam.

Figure — Z-algorithm — Z-array construction, O(n+m)
Recall Apni reading check karo

kyun hai aur kyun nahi? ::: After matching aab (3 letters) we reach position , which is off the end of the string — there is no letter to compare, so we stop at .


Step 2 — Naive method, aur yeh kyun dukh deta hai

KYA. Obvious plan: har starting position ke liye, ruler dobara plant karo aur scratch se count karo. Koi memory nahi, koi cleverness nahi.

YEH SLOW KYUN HAI. Cruel input consider karo. Position par letters match hote hain, position par match hote hain, aur aise chalte rahta hai. Tum almost poori tail ko har baar re-scan karte ho:

  • — string ki length.
  • Sum — har position par kaam, jod ke.
  • — length ke square ki tarah badhta hai: string double karo, kaam chaar guna ho jaata hai.

Yahi woh quadratic wall hai jo KMP failure function aur String Hashing todne ke liye banaye gaye the. Hum chahte hain: kaam jo sirf string ke proportionally badhta ho.

PICTURE. Re-scanned regions ki staircase — dekho kitna red overlap waste re-work hai.

Figure — Z-algorithm — Z-array construction, O(n+m)

Step 3 — Ek idea: string apne aap ko photocopy karta hai

KYA. Maan lo kisi pehle wali position par humne ek lamba match discover kiya — maan lo position se start hoke prefix se kaafi der tak match hua, position par khatam hua. Toh letters ka poora stretch letter-for-letter identical hai prefix ke. Hum ko ek Z-box kehte hain: ek window jo hum already prove kar chuke hain string ke front ke barabar hai.

  • — window ka left edge (jahan prefix ki matched copy shuru hoti hai).
  • — right edge (last position jo humne verify ki).
  • — window ki length minus one, isliye prefix piece ki length ke barabar hai.

YEH GOLD KYUN HAI. Is window ke andar string apne hi beginning ki ek photocopy hai. Isliye position window ke andar wala letter guaranteed equal hai us letter ke jo uski mirror position par front ke paas hai. Hum woh answers chura sakte hain jo hum already compute kar chuke hain — free mein, zero new comparisons ke saath.

PICTURE. Window (mint) seedha identical prefix (lavender) ke neeche rakhi; dashed lines har position ko uske mirror se connect karti hain.

Figure — Z-algorithm — Z-array construction, O(n+m)

Step 4 — Mirror position, exactly defined

KYA. Ek position lo jo box ke andar baithe (). Prefix mein uska mirror hai:

  • — jahan hum abhi khade hain, window ke andar.
  • — window ka left edge.
  • left edge se kitna dur hai; wahi distance string ke front se us mirror par land karta hai.

KYUN. Kyunki window prefix ki photocopy hai, par letter par letter ke barabar hai, aur isse bhi zyada: jo bhi match length humne pehle par nikali thi (value ) par copy ho jaani chahiye — jab tak woh match window ke andar rahti hai.

PICTURE. Mint box ke andar position ; arrow tak lavender prefix mein fold back karta hai. par chota match-run par copy hone ke liye ready dikhaya gaya hai.

Figure — Z-algorithm — Z-array construction, O(n+m)

Step 5 — Case B1: mirror ka match box ke andar fit ho jaata hai

KYA. Hum box ke andar hain aur do lengths compare karte hain: mirror ne kitna match kiya, , versus box edge tak kitni jagah bachi hai, .

  • — window ka right edge.
  • — current position.
  • se tak positions ka count including (woh "+1" ko bhi include karta hai).

Agar hai, toh mirror ka poora match — including woh mismatch jo use end kiya — window ke andar hai. Kyunki window ek exact copy hai, wahi match aur wahi terminating mismatch par repeat hota hai:

KOI COMPARISON KYUN NAHI. Woh letter jo mirror ke match ko todta tha window ke andar hai, isliye woh ek known, copied letter hai. Woh guaranteed hai ki par match ko same spot par todega. Dobara check karna redundant hoga.

PICTURE. Mirror ka chota match (green) apne red mismatch ke saath, dono box ke andar safely, par verbatim copy kiya hua.

Figure — Z-algorithm — Z-array construction, O(n+m)

Step 6 — Case B2: mirror ka match box edge se bahar nikal jaata hai

KYA. Ab : mirror kam se kam box boundary tak match kiya. Edge tak hum copy par trust kar sakte hain — lekin ke baad koi photocopy nahi hai, isliye hume haath se compare karna hoga:

  • — woh portion jo hume free milta hai, edge tak.
  • extra term — new letters jo hum actually compare karte hain, position se start karke, right walk karte hue jab tak mismatch na ho.

ke baad jo bhi discover hota hai woh box ko extend karta hai: hum aur set karte hain, kyunki ab hum ek longer prefix-match jaante hain jo aur aage right tak pahuncha.

KYUN CAP MATTER KARTA HAI. ko blindly copy karna yahan ke baad matches claim kar deta — jo kabhi check nahi hue — ek jhooth. Hum sirf edge tak trust karte hain, phir verify karte hain.

PICTURE. Mirror ka match box edge se aage nikal jaata hai; green up to , phir ke baad ek "?" zone jahan fresh comparisons shuru hoti hain (aur ko aage push karti hain).

Figure — Z-algorithm — Z-array construction, O(n+m)

Step 7 — Degenerate cases (koi gap mat chhodna)

KYA. Teen boundary situations jo picture ko cover karni chahiye:

  1. — har box ke bahar. Koi photocopy exist nahi karti. Fresh start: , phir position se compare karo. Agar kuch match hota hai, naya box kholo.
  2. Box ke andar . Mirror kabhi match nahi hua; , aur par pehla comparison bhi likely fail hoga. Kuch gain nahi, kuch break nahi.
  3. Match string ke bilkul end tak pahunch jaata hai. while isliye rukta hai kyunki (compare karne ke liye koi letter nahi), mismatch ki wajah se nahi. aab mein position string ke tail par exactly aisa hi hai.

YEH MATTER KYUN KARTA HAI. Amortized argument is baat par rely karta hai ki sirf badhta hi hai. Isliye parent note ki teesri galti — box ko tab update karna jab naya match ke past nahi pahunchta — forbidden hai: yeh ko shrink hone deta aur linearity khatam kar deta.

PICTURE. Teen mini-panels: (1) ke past fresh start, (2) zero mirror, (3) run-off-the-end. Har ek dikhata hai ki box edge kabhi peeche nahi jaata.

Figure — Z-algorithm — Z-array construction, O(n+m)

Step 8 — par Full trace

KYA. Dekho kaise right ki taraf creep karta hai jab hum ko left to right fill karte hain.

case while ke baad box
1
2 unchanged
3
4 , (B1) unchanged
5 , unchanged

Result: .

YAHAN LINEAR KYUN HAI. Real character comparisons sirf tab hue jab se tak push hua. Positions aur ne kuch nahi pay kiya — unhone copy kiya. Box ek baar forward sweep kiya; kabhi retreat nahi kiya.

PICTURE. Saato chah positions par moving box, green "copied" positions ko red "compared" walo se alag dikhaya hua.

Figure — Z-algorithm — Z-array construction, O(n+m)

Ek-picture summary

Is page par sab kuch ek single diagram mein collapse ho jaata hai: prefix, rightmost box, mirror fold, aur box edge par branching hote do cases.

Figure — Z-algorithm — Z-array construction, O(n+m)

no

yes

yes B1

no B2

position i

i inside box l..r?

compare from zero

look at mirror Z of i minus l

mirror fits inside box?

copy mirror value, done

trust up to edge then compare past r

if match reaches past r, move box

Recall Feynman: poora walkthrough retell karo

String ke pehle kuch letters ko ek stamp ki tarah socho. Tum woh stamp string ke saath press karte ho aur count karte ho ki kitne letters line up hote hain pehle ek galat hone se — woh count hai (Step 1). Yeh har jagah scratch se karna boring inputs jaise aaaa par thaka dene wala hai (Step 2). Lekin har lamba match jo tum dhundho woh actually string ke opening ki ek photocopy hai (Step 3), aur us photocopy ke andar koi bhi spot ka ek twin front ke paas hota hai — uska mirror (Step 4). Agar twin ka match photocopy ke andar completely fit ho jaata hai, toh bas twin ka answer copy karo, koi kaam nahi (Step 5, B1). Agar twin ka match photocopy ke right edge se spill ho jaata hai, toh edge tak trust karo aur baaki haath se compare karo, jo photocopy ko aur right extend karta hai (Step 6, B2). Jab tum photocopy se bilkul bahar ho, ya twin ne kuch nahi dhundha, ya string ka end aa gaya — unhe seedha handle karo, aur crucially right edge sirf aage hi badhti hai (Step 7). Ise aabaab par trace karo aur dekho ki box exactly ek baar right creep karta hai, real comparisons sirf grow karte waqt karta hai (Step 8). Forward-only motion hi poori wajah hai ki total kaam linear hai.