3.8.4 · D5 · HinglishString Algorithms
Question bank — Z-algorithm — Z-array construction, O(n+m)
3.8.4 · D5· Coding › String Algorithms › Z-algorithm — Z-array construction, O(n+m)
Quick symbol refresh taaki pehli line ka matlab samajh aaye:
- hamari string hai, length , positions numbered .
- = kitne characters, position se start karke, ke beginning (prefix) se match karte hain.
- = rightmost Z-box: wo interval jo hum already prove kar chuke hain ki prefix ke barabar hai, aur jiska right end sabse bada hai.
- = ka mirror: wo jagah ke shuru ke paas jo ki photocopy hai, jab box ke andar hota hai.
True or false — justify
Poori string apna prefix khud hai, isliye ko ke barabar hona chahiye.
Technically sach hai — position par substring length ke pure prefix se match karti hai. Lekin hum convention se set karte hain kyunki wahan use karne se box logic aur pattern-matching scan index par ek jhootha "match" report karta; hume us value ki zaroorat kabhi nahi padti.
Agar hai, toh .
Sach. Position se shuru karke hum padhte hain, jo prefix se teeno characters ke liye match karta hai jab tak string khatam ho jaaye, isliye .
Z-array ki har entry satisfy karti hai.
Sach. Position se shuru hone wala match se end tak bache characters se zyada use nahi kar sakta, aur exactly hi bache hote hain.
Box ke andar equality sirf shayad true hai, isliye hume phir bhi verify karna chahiye.
Galat. ke andar string provably prefix ke barabar hai, isliye ek proven fact hai, guess nahi. Use dobara verify karna exactly wahi kaam waste karta hai jise skip karne ke liye algorithm design hua tha.
Agar do positions aur ka mirror value same ho , toh unka -value bhi same hoga.
Galat. Copy tabhi trusted hoti hai jab mirror ka match box ke andar rahe; agar unme se koi boundary tak pahunch jaaye toh hume comparison se extend karna padega, jo possibly bada answer deta hai.
Box backward move ho sakta hai ( decrease ho sakta hai) jab badhta hai.
Galat. Hum box tab hi update karte hain jab koi naya match current se aage jaata hai, isliye kabhi decrease nahi hota; naye starting index par jump karta hai lekin right end sirf aage hi badhta hai.
Length ki string ka Z-array build karne mein while loop mein kabhi bhi se zyada character comparisons nahi hote.
Sach. Har successful
while comparison ko ek aage push karta hai; se at most tak jaata hai aur kabhi peeche nahi aata, jo saari extensions ko total mein bound karta hai.Tum Z-array ko left to right ki jagah right to left compute kar sakte ho aur same complexity milegi.
Spirit mein galat — poora method pehle se jaani hui matches pe rely karta hai left ki taraf (chhote indices), taaki box fill ho, isliye left to right process karna essential hai; right-to-left pass mein koi reused information nahi hogi.
Spot the error
" ke liye, directly set karo aur aage badho."
Error cap skip karna hai. Agar box edge se aage jaata hai, toh tum ke baad matches claim kar rahe ho jo kabhi check nahi hue; tumhe use karna chahiye aur phir
while ko edge ke baad kuch bhi verify karne do." compute karne ke baad, box ko fresh rakhne ke liye hamesha set karo."
Error unconditional updating hai. Agar hai toh yeh ko shrink kar deta hai, " sirf badhta hai" invariant aur amortized proof ko destroy kar deta hai. Sirf tab update karo jab naya match aur aage jaaye.
"Case B jahan ka matlab answer exactly hai."
Error boundary par rukna hai. Edge tak pahunchna sirf tak match guarantee karta hai; ke baad aur zyada matching characters ho sakte hain, isliye tumhe se aage compare karna jaari rakhna chahiye.
"Pattern ko text mein dhundhne ke liye, bas concatenate karo aur dekhte raho."
Error missing separator hai. Bina sentinel ke, ek match – boundary ke upar ja sakta hai aur ke characters ko text ke jaisa count kar sakta hai, false hits deta hai. use karo jahan dono mein absent ho.
"while loop condition sirf s[Z[i]] == s[i+Z[i]] ho sakti hai."
Error missing bounds check hai. Tumhe yeh bhi require karna chahiye ki , warna tum string ke end ke baad read karte ho aur ya toh crash hota hai ya garbage compare hota hai.
" jahan — main mirror ke liye use karunga."
Error wrong endpoint ke against mirror karna hai. Box prefix ko mirror karta hai, jiska left end se align hota hai, isliye prefix mein offset hai, nahi.
"Case A () ko Case B se alag special code chahiye."
Logic mein galti nahi hai lekin economy mein hai — Case A bas Case B hai jahan se initialize hota hai aur koi cap nahi, isliye single
while loop dono handle karta hai; alag branches likhna redundant hai.Why questions
Hum box ko rightmost box kyun kehte hain, bas "a box" kyun nahi?
Kyunki un sab intervals mein jo prefix se match karte hain, hum woh rakhte hain jiska right end sabse bada ho — yeh maximize karta hai ki kitne future positions uske andar aate hain aur free mein answer paate hain.
Mirror value copy karna linear time kyun deta hai sirf ek achhi shortcut hone ki jagah?
Har position jo free mein answer paata hai usme zero comparisons lagti hain, isliye saara real character kaam
while loop tak confined hai, aur woh loop kitna aage badhta hai isse bounded hai — overall at most steps.Mirror ka match khatam karne wala mismatch sub-case B1 mein par "dobara kyun hota hai"?
Kyunki woh mismatch ek aise position par hua tha jo box ke andar tha, aur box ke andar prefix ki exact copy hai, isliye same mismatch corresponding spot par ke paas bhi hona zaroori hai.
Naive method specifically par kyun hai?
Har starting index prefix se end tak match karta hai, isliye index lagbhag comparisons karta hai, aur unhe sum karne par jaisa kaam milta hai.
Separator character dono aur mein absent kyun hona chahiye, sirf ek mein nahi?
Agar kisi bhi string mein appear kare toh algorithm use ordinary character ki tarah match kar sakta hai, ek "match" ko boundary ke paas se leak hone de sakta hai aur aisi positions report karta hai jo poora pattern contain nahi karti.
min cap while ko pure B1 case mein zero kaam kyun karne deta hai?
Jab ho toh cap chhod deta hai, aur test hone wala agla character ek aisi position par hota hai jahan mirror ne already mismatch find kiya tha, isliye pehli
while comparison hi fail ho jaati hai aur koi extension nahi hoti.ko prefix comparison mein ke right ki positions use karke define kyun nahi kiya ja sakta?
Definition se ko se compare karta hai, yaani woh prefix jo hamesha position se start hoti hai; comparison dono anchors se aage badhta hai, prefix start ke right ki kisi cheez ko kabhi reference nahi karta.
Edge cases
Length ki string ke liye kya hai, maano ?
Sirf exist karta hai aur woh convention se set hota hai; koi aur indices nahi hain, aur algorithm ka loop se tak simply run hi nahi karta.
Ek string jahan har character distinct ho, jaise , uske Z-array ka kya hoga?
ke liye har hoga, kyunki ke baad koi position prefix ke pehle character se start nahi karti; koi box kabhi nahi banta.
Agar pattern poore text ke barabar ho (), toh pattern-matching build kya report karta hai?
mein separator ke baad wali position ka hoga, isliye yeh exactly ek match text index par report karta hai — pattern poore text mein ek baar aata hai.
(last position) at most kya hai, aur woh max kab hit karta hai?
At most , kyunki sirf ek character bachta hai; yeh exactly hota hai jab last character ke barabar ho, aur otherwise .
Kya box kabhi ho sakta hai?
Haan. Jab koi position prefix se exactly ek character ke liye match kare () aur pehle se aage tak pahunche, toh box ek single point ban jaata hai, phir bhi ek valid "length 1 ke liye prefix se match" interval hai.
Agar exactly ho (boundary par, strictly andar nahi)?
Yeh tab bhi Case B count hota hai (): mirror ek value deta hai, cap at most hai, aur
while ke baad koi bhi extension verify karta hai.Kya construction mein empty pattern ka koi matlab hai?
Empty pattern ka hota hai, isliye "match" har jagah hoga, jo correctly reflect karta hai ki empty string har position par occur hoti hai — usually ise trivial special case ke taur par guard kiya jaata hai.
Related tools jo inhi tasks par Z-array se mukabla karte hain: KMP failure function, String Hashing, Suffix Array, Suffix Automaton, Manacher's Algorithm, aur Amortized Analysis argument jo linear bound ko underlie karta hai.