fbpx
วิกิพีเดีย

ขั้นตอนวิธีการค้นหาคำแบบซี

ในวิทยาการคอมพิวเตอร์ ขั้นตอนวิธีนี้ คือ ขั้นตอนวิธีที่เอาไว้ใช้ในการหารูปแบบคำ(pattern)ในคำ(text) โดยเราให้ความยาวของคำ(text) เป็น n และคำเป็น m แล้วผลรวมของเวลาที่ใช้ในการประมวลผล คือ O(n+m) ซึ่งจะเหมือนกับขั้นตอนวิธีของคนูธ-มอร์ริส-แพรตต์

           ขั้นตอนวิธี-ซี เป็นขั้นตอนวิธีแบบตรงไปตรงมา (Brute-Force algorithm) ซึ่งเกิดจากการทำงานวนลูปรูปแบบคำ(pattern) n ครั้ง และวนรูปคำ(text) อีก m ครั้ง ทำให้ประสิทธิภาพของเวลาการทำงานของโปรแกรมเป็น O(n+m)

หลักการ

           หลักการของขั้นตอนวิธีแบบซีนั้น แบ่งขั้นตอนการทำงานออกเป็น 3 หลัก

1.       สร้างสตริงขึ้นมาใหม่ ซึ่งเกิดจากนำเอา Pattern + $ + Text โดยเครื่องหมาย $ เป็นเครื่องหมายที่เราสมมติขึ้นมาเพื่อขั้นระหว่าง Pattern และ Text เพื่อให้ง่ายต่อการตรวจสอบ

ตัวอย่าง

Text = “ABCABCABCD” และ Pattern = “ABCD”

New string S = “ABCD$ABCABCABCD”

2.       สร้างอาเรย์ขึ้นมา 1 อาเรย์ เรียกว่า Z-array ซึ่งภายในจะประกอบไปด้วย Z-Value และ Z-value จะทำให้เกิด Z-box ขึ้น

3.       เมื่อมีคำที่เหมือนกับ Pattern เกิดขึ้น เราสามารถสังเกตได้จาก Z-value ที่มีความยาวเท่ากับ ความยาวของ Pattren

Z-array คืออะไร

     Z-array คืออาเรย์ใหม่ ที่เกิดจากการต่อกันระหว่าง Pattern กับ Text ซึ่งจะมีผลในการหาค่าของ Z-value และยังเป็นขั้นตอนที่สำคัญมากใน string matching ด้วยวิธี Z-algorithm

ตัวอย่าง

position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
New string A B C D $ A B C A B C A B C D

Z-value คืออะไร

           Z-value คือค่าตัวเลขที่ได้จากการทำงานวนลูปซ้อนกัน โดยลูปนอกเป็นอินเด็กซ์ที่ทุกตัวอักษร (สมมติเป็น index k) และลูปในคืออินเด็กซ์ที่ Patter ใน New String S

หลักการสร้าง Z-value

           เราต้องสมมติ Z-box ขึ้นมา ซึ่ง Z-box นี้ คือ กล่องสตริงย่อยที่ตรงกับ Pattern ที่อยู่ด้านหน้า โดยเราจะให้ lt คือ ตัวอักษรด้านซ้ายสุดของกล่อง และ rt คือ ตัวอักษรด้านขวามือของกล่อง

ตัวอย่างการสร้าง Z-value

1. Z algorithm จะเริ่มที่ k = 1, lt = 0, rt = 0 ให้ Z(0) คือความยาวของ Z-array = 15 ที่ k=1 S(1) ไม่เหมือนกับ S(0) ดังนั้นจึงไม่เกิด Z-box ขึ้น ค่าของอินเด็กซ์ lt และ rt ก็ยังคงเป็น 0

position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
New string S A B C D $ A B C A B C A B C D
New string S A B C D $ A B C A B C A B C D
Z-value 15 0

Z(1) = 0 , lt =0, rt = 0

2. ต่อไปขยับอินเด็กซ์ k เป็น k= 2

ที่ k=2 S(2) ไม่เหมือนกับ S(0) ดังนั้นจึงไม่เกิด Z-box ขึ้น ค่าของอินเด็กซ์ lt และ rt ก็ยังคงเป็น 0

position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
New string S A B C D $ A B C A B C A B C D
New string S A B C D $ A B C A B C A B C D
Z-value 15 0 0

Z(2) = 0 , lt =0, rt = 0

3. ต่อไปขยับอินเด็กซ์ k เป็น k= 3

ที่ k=3 S(3) ไม่เหมือนกับ S(0) ดังนั้นจึงไม่เกิด Z-box ขึ้น ค่าของอินเด็กซ์ lt และ rt ก็ยังคงเป็น 0

position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
New string S A B C D $ A B C A B C A B C D
New string S A B C D $ A B C A B C A B C D
Z-value 15 0 0 0

Z(3) = 0 , lt =0, rt = 0

4. ต่อไปขยับอินเด็กซ์ k เป็น k= 4

ที่ k=4 S(4) ไม่เหมือนกับ S(0) ดังนั้นจึงไม่เกิด Z-box ขึ้น ค่าของอินเด็กซ์ lt และ rt ก็ยังคงเป็น 0

position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
New string S A B C D $ A B C A B C A B C D
New string S A B C D $ A B C A B C A B C D
Z-value 15 0 0 0 0

Z(4) = 0 , lt =0, rt = 0

5. ต่อไปขยับอินเด็กซ์ k เป็น k= 5

ที่ k=5 S(5) เหมือน S(0), S(6) เหมือน S(1) และ S(7) เหมือน S(2) ดังนั้น Z(5) = 3 และเกิด Z-box ทำให้ lt = 5 และ rt = 7

position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
New string S A B C D $ A B C A B C A B C D
New string S A B C D $ A B C A B C A B C D
Z-value 15 0 0 0 0 3

Z(5) = 3, lt =5, rt = 7

6. ต่อไปขยับอินเด็กซ์ k เป็น k= 6

ที่  k = 6 อยู่ใน substring ก่อนหน้า ซึ่ง(rt = 7) และ substring ย่อยก่อนหน้านี้เริ่มต้นที่ k-lt (6-5) โดย Z(1) = 0  ซึ่ง < substring ที่เหลือ S[6…7] ดังนั้น Z(6) = Z(1) = 0 โดยไม่ต้องมีการคำนวณเพิ่มเติม

position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
New string S A B C D $ A B C A B C A B C D
New string S A B C D $ A B C A B C A B C D
Z-value 15 0 0 0 0 3 0

Z(6) = 0, lt = 5, rt = 7

7. ต่อไปขยับอินเด็กซ์ k เป็น k= 7

ที่  k = 7 อยู่ใน substring ก่อนหน้า ซึ่ง(rt = 7) และ substring ย่อยก่อนหน้านี้เริ่มต้นที่ k-lt (7-5) โดย Z(2) = 0  ซึ่ง < substring ที่เหลือ S[7…7] ดังนั้น Z(7) = Z(2) = 0 โดยไม่ต้องมีการคำนวณเพิ่มเติม

position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
New string S A B C D $ A B C A B C A B C D
New string S A B C D $ A B C A B C A B C D
Z-value 15 0 0 0 0 3 0 0

Z(7) = 0, lt = 5, rt = 7

8. ต่อไปขยับอินเด็กซ์ k เป็น k= 8

ที่ k=8 S(8) เหมือน S(0), S(9) เหมือน S(1) และ S(10) เหมือน S(2) ดังนั้น S(8) = 3 และเกิด Z-box ทำให้ lt = 8 และ rt = 10

position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
New string S A B C D $ A B C A B C A B C D
New string S A B C D $ A B C A B C A B C D
Z-value 15 0 0 0 0 3 0 0 3

Z(8) = 3, lt = 8, rt = 10

9. ต่อไปขยับอินเด็กซ์ k เป็น k= 9

ที่  k = 9 อยู่ใน substring ก่อนหน้า ซึ่ง (rt = 10) และ substring ย่อยก่อนหน้านี้เริ่มต้นที่ k-lt (9-8) โดย Z(1) = 0  ซึ่ง < substring ที่เหลือ S[9…10] ดังนั้น Z(9) = Z(1) = 0 โดยไม่ต้องมีการคำนวณเพิ่มเติม

position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
New string S A B C D $ A B C A B C A B C D
New string S A B C D $ A B C A B C A B C D
Z-value 15 0 0 0 0 3 0 0 3 0

Z(9) = 0, lt = 8, rt = 10

10. ต่อไปขยับอินเด็กซ์ k เป็น k= 10

ที่  k = 10 อยู่ใน substring ก่อนหน้า ซึ่ง r = 10 และ substring ย่อยก่อนหน้านี้เริ่มต้นที่ k-lt (10-8) โดย Z(2) = 0  ซึ่ง < substring ที่เหลือ S[10…10] ดังนั้น Z(10) = Z(2) = 0 โดยไม่ต้องมีการคำนวณเพิ่มเติม

position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
New string S A B C D $ A B C A B C A B C D
New string S A B C D $ A B C A B C A B C D
Z-value 15 0 0 0 0 3 0 0 3 0 0

Z(10) = 0, lt = 8, rt = 10

11.  ต่อไปขยับอินเด็กซ์ k เป็น k= 11

ที่ k=11 S(11) เหมือน S(0), S(12) เหมือน S(1), S(13) เหมือน S(2) และ S(14) เหมือน S(3) ดังนั้น Z(11) = 4 และเกิด Z-box ทำให้ lt = 11 และ rt = 14

position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
New string S A B C D $ A B C A B C A B C D
New string S A B C D $ A B C A B C A B C D
Z-value 15 0 0 0 0 3 0 0 3 0 0 4

Z(11) = 4, lt = 11, rt = 14

12.  ต่อไปขยับอินเด็กซ์ k เป็น k= 12

ที่  k = 12 อยู่ใน substring ก่อนหน้า ซึ่ง (rt = 14) และ substring ย่อยก่อนหน้านี้เริ่มต้นที่ k-lt (12-11) โดย Z(1) = 0  ซึ่ง < substring ที่เหลือ S[12…14] ดังนั้น Z(12) = Z(1) = 0 โดยไม่ต้องมีการคำนวณเพิ่มเติม

position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
New string S A B C D $ A B C A B C A B C D
New string S A B C D $ A B C A B C A B C D
Z-value 15 0 0 0 0 3 0 0 3 0 0 4 0

Z(12) = 0, lt = 11, rt = 14

13.  ต่อไปขยับอินเด็กซ์ k เป็น k= 13

ที่  k = 13 อยู่ใน substring ก่อนหน้า ซึ่ง (rt = 14) และ substring ย่อยก่อนหน้านี้เริ่มต้นที่ k-lt (13-11) โดย Z(2) = 0  ซึ่ง < substring ที่เหลือ S[13…14] ดังนั้น Z(13) = Z(2) = 0 โดยไม่ต้องมีการคำนวณเพิ่มเติม

position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
New string S A B C D $ A B C A B C A B C D
New string S A B C D $ A B C A B C A B C D
Z-value 15 0 0 0 0 3 0 0 3 0 0 4 0 0

Z(13) = 0, lt = 11, rt = 14

14.  ต่อไปขยับอินเด็กซ์ k เป็น k= 14

ที่  k = 14 อยู่ใน substring ก่อนหน้า ซึ่ง (rt = 14) และ substring ย่อยก่อนหน้านี้เริ่มต้นที่ k-lt (14-11) โดย Z(3) = 0  ซึ่ง < substring ที่เหลือ S[14…14] ดังนั้น Z(14) = Z(3) = 0 โดยไม่ต้องมีการคำนวณเพิ่มเติม

position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
New string S A B C D $ A B C A B C A B C D
New string S A B C D $ A B C A B C A B C D
Z-value 15 0 0 0 0 3 0 0 3 0 0 4 0 0 0

Z(14) = 0, lt = 11, rt = 14

15.   Z-array ที่สมบูรณ์ จะเป็นดังนี้

position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
New string S A B C D $ A B C A B C A B C D
Z-value 15 0 0 0 0 3 0 0 3 0 0 4 0 0 0

มี Pattern อยู่ใน Text กี่ตำแหน่ง

เราจะทราบได้อย่างไรว่ามี Pattern อยู่ใน Text หรือไม่???  Pattern = “ABCD” ซึ่งมีความยาวเป็น 4 และ เราจะพบ Z-value ที่มีค่าเท่ากับ 4 ที่ตำแหน่งที่ 11 ของ Z-array ซึ่ง ถ้าเอา Z(11) - |Pattern+1| = 11-5 = 6 ซึ่ง ตรงกับ Text ในตำแหน่งที่ 6 พอดี

position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
New string S A B C D $ A B C A B C A B C D
Z-value 15 0 0 0 0 3 0 0 3 0 0 4 0 0 0

ประสิทธิภาพการทำงาน

เนื่องจากการทำงานวนลูปรูปแบบคำ(pattern) n ครั้ง และวนรูปคำ(text) อีก m ครั้ง ทำให้ประสิทธิภาพของเวลาการทำงานของโปรแกรมเป็น O(n+m)

โค้ดตัวอย่าง

def search_without_sentinel(text,pattern):  s = pattern + text  Z = [0] * len(s)  Z[0] = len(s)   rt = 0  lt = 0  occurrence = []   for k in range(1,len(s)):  if k > rt:  n=0  while n+k < len(s) and s[n] == s[n+k]:  n+= 1  Z[k] = n  if n>0:  lt = k  rt = k+n-1  else:  p = k-lt  right_part_len = rt-k+1   if Z[p]< right_part_len:  Z[k] = Z[p]  else:  i = rt+1  while i<len(s) and s[i] == s[i-k]:  i+=1  Z[k] = i-k  lt = k  rt = i -1  Z[k] = min(len(pattern),Z[k])   if Z[k] == len(pattern):  occurrence.append(k-len(pattern))   return occurrence 

อ้างอิง

Ivan Yurchenko. (October 15, 2013), "Z algorithm" , Yet another programming blog, 25 เมษายน 2561, https://ivanyu.me/blog/2013/10/15/z-algorithm/

Utkarsh Trivedi, "Z algorithm (Linear time pattern searching Algorithm)" , GeeksforGeeks, 25 เมษายน 2561, https://www.geeksforgeeks.org/z-algorithm-linear-time-pattern-searching-algorithm/

นตอนว, การค, นหาคำแบบซ, ในว, ทยาการคอมพ, วเตอร, นตอนว, นตอนว, เอาไว, ใช, ในการหาร, ปแบบคำ, pattern, ในคำ, text, โดยเราให, ความยาวของคำ, text, เป, และคำเป, แล, วผลรวมของเวลาท, ใช, ในการประมวลผล, งจะเหม, อนก, บข, นตอนว, ของคน, มอร, แพรตต, นตอนว, เป, นข, นตอนว, แ. inwithyakarkhxmphiwetxr khntxnwithini khux khntxnwithithiexaiwichinkarharupaebbkha pattern inkha text odyeraihkhwamyawkhxngkha text epn n aelakhaepn m aelwphlrwmkhxngewlathiichinkarpramwlphl khux O n m sungcaehmuxnkbkhntxnwithikhxngkhnuth mxrris aephrtt khntxnwithi si epnkhntxnwithiaebbtrngiptrngma Brute Force algorithm sungekidcakkarthanganwnluprupaebbkha pattern n khrng aelawnrupkha text xik m khrng thaihprasiththiphaphkhxngewlakarthangankhxngopraekrmepn O n m enuxha 1 hlkkar 1 1 Z array khuxxair 1 2 Z value khuxxair 1 2 1 hlkkarsrang Z value 1 2 2 twxyangkarsrang Z value 1 3 mi Pattern xyuin Text kitaaehnng 2 prasiththiphaphkarthangan 3 okhdtwxyang 4 xangxinghlkkar aekikh hlkkarkhxngkhntxnwithiaebbsinn aebngkhntxnkarthanganxxkepn 3 hlk1 srangstringkhunmaihm sungekidcaknaexa Pattern Text odyekhruxnghmay epnekhruxnghmaythierasmmtikhunmaephuxkhnrahwang Pattern aela Text ephuxihngaytxkartrwcsxbtwxyangText ABCABCABCD aela Pattern ABCD New string S ABCD ABCABCABCD 2 srangxaerykhunma 1 xaery eriykwa Z array sungphayincaprakxbipdwy Z Value aela Z value cathaihekid Z box khun3 emuxmikhathiehmuxnkb Pattern ekidkhun erasamarthsngektidcak Z value thimikhwamyawethakb khwamyawkhxng Pattren Z array khuxxair aekikh Z array khuxxaeryihm thiekidcakkartxknrahwang Pattern kb Text sungcamiphlinkarhakhakhxng Z value aelayngepnkhntxnthisakhymakin string matching dwywithi Z algorithmtwxyang position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14New string A B C D A B C A B C A B C DZ value khuxxair aekikh Z value khuxkhatwelkhthiidcakkarthanganwnlupsxnkn odylupnxkepnxinedksthithuktwxksr smmtiepn index k aelalupinkhuxxinedksthi Patter in New String S hlkkarsrang Z value aekikh eratxngsmmti Z box khunma sung Z box ni khux klxngstringyxythitrngkb Pattern thixyudanhna odyeracaih lt khux twxksrdansaysudkhxngklxng aela rt khux twxksrdankhwamuxkhxngklxng twxyangkarsrang Z value aekikh 1 Z algorithm caerimthi k 1 lt 0 rt 0 ih Z 0 khuxkhwamyawkhxng Z array 15 thi k 1 S 1 imehmuxnkb S 0 dngnncungimekid Z box khun khakhxngxinedks lt aela rt kyngkhngepn 0 position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14New string S A B C D A B C A B C A B C DNew string S A B C D A B C A B C A B C DZ value 15 0Z 1 0 lt 0 rt 02 txipkhybxinedks k epn k 2thi k 2 S 2 imehmuxnkb S 0 dngnncungimekid Z box khun khakhxngxinedks lt aela rt kyngkhngepn 0 position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14New string S A B C D A B C A B C A B C DNew string S A B C D A B C A B C A B C DZ value 15 0 0Z 2 0 lt 0 rt 03 txipkhybxinedks k epn k 3thi k 3 S 3 imehmuxnkb S 0 dngnncungimekid Z box khun khakhxngxinedks lt aela rt kyngkhngepn 0 position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14New string S A B C D A B C A B C A B C DNew string S A B C D A B C A B C A B C DZ value 15 0 0 0Z 3 0 lt 0 rt 04 txipkhybxinedks k epn k 4thi k 4 S 4 imehmuxnkb S 0 dngnncungimekid Z box khun khakhxngxinedks lt aela rt kyngkhngepn 0 position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14New string S A B C D A B C A B C A B C DNew string S A B C D A B C A B C A B C DZ value 15 0 0 0 0Z 4 0 lt 0 rt 05 txipkhybxinedks k epn k 5thi k 5 S 5 ehmuxn S 0 S 6 ehmuxn S 1 aela S 7 ehmuxn S 2 dngnn Z 5 3 aelaekid Z box thaih lt 5 aela rt 7 position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14New string S A B C D A B C A B C A B C DNew string S A B C D A B C A B C A B C DZ value 15 0 0 0 0 3Z 5 3 lt 5 rt 76 txipkhybxinedks k epn k 6thi k 6 xyuin substring kxnhna sung rt 7 aela substring yxykxnhnanierimtnthi k lt 6 5 ody Z 1 0 sung lt substring thiehlux S 6 7 dngnn Z 6 Z 1 0 odyimtxngmikarkhanwnephimetim position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14New string S A B C D A B C A B C A B C DNew string S A B C D A B C A B C A B C DZ value 15 0 0 0 0 3 0Z 6 0 lt 5 rt 77 txipkhybxinedks k epn k 7thi k 7 xyuin substring kxnhna sung rt 7 aela substring yxykxnhnanierimtnthi k lt 7 5 ody Z 2 0 sung lt substring thiehlux S 7 7 dngnn Z 7 Z 2 0 odyimtxngmikarkhanwnephimetim position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14New string S A B C D A B C A B C A B C DNew string S A B C D A B C A B C A B C DZ value 15 0 0 0 0 3 0 0Z 7 0 lt 5 rt 78 txipkhybxinedks k epn k 8thi k 8 S 8 ehmuxn S 0 S 9 ehmuxn S 1 aela S 10 ehmuxn S 2 dngnn S 8 3 aelaekid Z box thaih lt 8 aela rt 10 position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14New string S A B C D A B C A B C A B C DNew string S A B C D A B C A B C A B C DZ value 15 0 0 0 0 3 0 0 3Z 8 3 lt 8 rt 109 txipkhybxinedks k epn k 9thi k 9 xyuin substring kxnhna sung rt 10 aela substring yxykxnhnanierimtnthi k lt 9 8 ody Z 1 0 sung lt substring thiehlux S 9 10 dngnn Z 9 Z 1 0 odyimtxngmikarkhanwnephimetim position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14New string S A B C D A B C A B C A B C DNew string S A B C D A B C A B C A B C DZ value 15 0 0 0 0 3 0 0 3 0Z 9 0 lt 8 rt 1010 txipkhybxinedks k epn k 10thi k 10 xyuin substring kxnhna sung r 10 aela substring yxykxnhnanierimtnthi k lt 10 8 ody Z 2 0 sung lt substring thiehlux S 10 10 dngnn Z 10 Z 2 0 odyimtxngmikarkhanwnephimetim position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14New string S A B C D A B C A B C A B C DNew string S A B C D A B C A B C A B C DZ value 15 0 0 0 0 3 0 0 3 0 0Z 10 0 lt 8 rt 1011 txipkhybxinedks k epn k 11thi k 11 S 11 ehmuxn S 0 S 12 ehmuxn S 1 S 13 ehmuxn S 2 aela S 14 ehmuxn S 3 dngnn Z 11 4 aelaekid Z box thaih lt 11 aela rt 14 position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14New string S A B C D A B C A B C A B C DNew string S A B C D A B C A B C A B C DZ value 15 0 0 0 0 3 0 0 3 0 0 4Z 11 4 lt 11 rt 1412 txipkhybxinedks k epn k 12thi k 12 xyuin substring kxnhna sung rt 14 aela substring yxykxnhnanierimtnthi k lt 12 11 ody Z 1 0 sung lt substring thiehlux S 12 14 dngnn Z 12 Z 1 0 odyimtxngmikarkhanwnephimetim position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14New string S A B C D A B C A B C A B C DNew string S A B C D A B C A B C A B C DZ value 15 0 0 0 0 3 0 0 3 0 0 4 0Z 12 0 lt 11 rt 1413 txipkhybxinedks k epn k 13thi k 13 xyuin substring kxnhna sung rt 14 aela substring yxykxnhnanierimtnthi k lt 13 11 ody Z 2 0 sung lt substring thiehlux S 13 14 dngnn Z 13 Z 2 0 odyimtxngmikarkhanwnephimetim position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14New string S A B C D A B C A B C A B C DNew string S A B C D A B C A B C A B C DZ value 15 0 0 0 0 3 0 0 3 0 0 4 0 0Z 13 0 lt 11 rt 1414 txipkhybxinedks k epn k 14thi k 14 xyuin substring kxnhna sung rt 14 aela substring yxykxnhnanierimtnthi k lt 14 11 ody Z 3 0 sung lt substring thiehlux S 14 14 dngnn Z 14 Z 3 0 odyimtxngmikarkhanwnephimetim position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14New string S A B C D A B C A B C A B C DNew string S A B C D A B C A B C A B C DZ value 15 0 0 0 0 3 0 0 3 0 0 4 0 0 0Z 14 0 lt 11 rt 1415 Z array thismburn caepndngni position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14New string S A B C D A B C A B C A B C DZ value 15 0 0 0 0 3 0 0 3 0 0 4 0 0 0mi Pattern xyuin Text kitaaehnng aekikh eracathrabidxyangirwami Pattern xyuin Text hruxim Pattern ABCD sungmikhwamyawepn 4 aela eracaphb Z value thimikhaethakb 4 thitaaehnngthi 11 khxng Z array sung thaexa Z 11 Pattern 1 11 5 6 sung trngkb Text intaaehnngthi 6 phxdi position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14New string S A B C D A B C A B C A B C DZ value 15 0 0 0 0 3 0 0 3 0 0 4 0 0 0prasiththiphaphkarthangan aekikhenuxngcakkarthanganwnluprupaebbkha pattern n khrng aelawnrupkha text xik m khrng thaihprasiththiphaphkhxngewlakarthangankhxngopraekrmepn O n m okhdtwxyang aekikhdef search without sentinel text pattern s pattern text Z 0 len s Z 0 len s rt 0 lt 0 occurrence for k in range 1 len s if k gt rt n 0 while n k lt len s and s n s n k n 1 Z k n if n gt 0 lt k rt k n 1 else p k lt right part len rt k 1 if Z p lt right part len Z k Z p else i rt 1 while i lt len s and s i s i k i 1 Z k i k lt k rt i 1 Z k min len pattern Z k if Z k len pattern occurrence append k len pattern return occurrencexangxing aekikhIvan Yurchenko October 15 2013 Z algorithm Yet another programming blog 25 emsayn 2561 https ivanyu me blog 2013 10 15 z algorithm Utkarsh Trivedi Z algorithm Linear time pattern searching Algorithm GeeksforGeeks 25 emsayn 2561 https www geeksforgeeks org z algorithm linear time pattern searching algorithm ekhathungcak https th wikipedia org w index php title khntxnwithikarkhnhakhaaebbsi amp oldid 9185648, wikipedia, วิกิ หนังสือ, หนังสือ, ห้องสมุด,

บทความ

, อ่าน, ดาวน์โหลด, ฟรี, ดาวน์โหลดฟรี, mp3, วิดีโอ, mp4, 3gp, jpg, jpeg, gif, png, รูปภาพ, เพลง, เพลง, หนัง, หนังสือ, เกม, เกม