ส่วนต่อท้ายอาร์เรย์สามารถใช้สำหรับปัญหานี้ พวกมันมีตำแหน่งเริ่มต้นของแต่ละคำต่อท้ายของสตริงที่เรียงลำดับตามคำศัพท์ แม้ว่าพวกเขาสามารถสร้างอย่างไร้เดียงสาในความซับซ้อนมีวิธีการสร้างพวกเขาในความซับซ้อนΘ ( n ) ดูตัวอย่างนี้และนี้ ให้เราเรียก SA ต่อท้ายอาร์เรย์นี้O ( n บันทึกn )Θ ( n )
เมื่อสร้างส่วนต่อท้ายแล้วเราจำเป็นต้องสร้างอาร์เรย์ Longfix Common Prefix (LCP) สำหรับอาร์เรย์ต่อท้าย อาร์เรย์ LCP เก็บความยาวของคำนำหน้าทั่วไปที่ยาวที่สุดระหว่างคำนำหน้าสองคำติดต่อกันในอาร์เรย์คำต่อท้าย ดังนั้น LCP [i] มีความยาวของคำนำหน้าทั่วไปที่ยาวที่สุดระหว่าง SA [i] และ SA [i + 1] อาร์เรย์นี้ยังสามารถสร้างขึ้นในเส้นเวลา: ดูที่นี่ , ที่นี่และที่นี่สำหรับการอ้างอิงที่ดีบางอย่าง
ตอนนี้ในการคำนวณความยาวของคำนำหน้าที่ยาวที่สุดที่ใช้ร่วมกันกับสองคำต่อท้ายใด ๆในแผนภูมิต่อท้าย (แทนคำต่อท้ายที่ต่อเนื่องกัน) เราจำเป็นต้องใช้โครงสร้างข้อมูลRMQบางส่วน มันได้รับการแสดงในการอ้างอิงข้างต้น (และสามารถมองเห็นได้ง่ายถ้าอาร์เรย์ถูกมองเห็นเป็นต้นไม้ต่อท้าย) ว่าความยาวของคำนำหน้าทั่วไปที่ยาวที่สุดระหว่างสองคำต่อท้ายมีตำแหน่งและv ( u < v ) ในอาร์เรย์ต่อท้าย สามารถรับได้เป็นm i n u < = k < = v - 1 L C P [ k ]ยูโวลต์คุณ< vm ฉันnu<=k<=v−1LCP[k]. RMQ ดีสามารถ pre-กระบวนการอาร์เรย์O ( n )หรือO ( n log n )เวลาและตอบสนองต่อคำสั่งของรูปแบบL C P [ U , V ]ในO ( 1 )เวลา ดูที่นี่สำหรับอัลกอริทึม RMQ ที่ประสบความสำเร็จและที่นี่สำหรับการสอนที่ดีเกี่ยวกับ RMQ และความสัมพันธ์ (และการลดลง) ระหว่าง LCA และ RMQ นี่เป็นอีกวิธีทางเลือกที่ดีLCPO(n)O(nlogn)LCP[u,v]O(1)
ด้วยข้อมูลนี้เราได้สร้างอาร์เรย์คำต่อท้ายและอาร์เรย์ที่เกี่ยวข้อง (ตามที่อธิบายไว้ข้างต้น) สำหรับการต่อข้อมูลของสองสตริงด้วยตัวคั่นระหว่าง (เช่น T # P โดยที่ '#' ไม่ได้เกิดขึ้นในทั้งสองสตริง) จากนั้นเราสามารถทำการจับคู่สตริง k ที่ไม่ตรงกันโดยใช้วิธี "จิงโจ้" สิ่งนี้และสิ่งนี้อธิบายวิธีการจิงโจ้ในบริบทของต้นไม้ต่อท้าย แต่สามารถนำไปใช้โดยตรงกับอาร์เรย์ต่อท้ายด้วย สำหรับดัชนีทุกของข้อความTหาL C Pของคำต่อท้ายของTเริ่มต้นที่ฉันและคำต่อท้ายของPiTLCPTiPเริ่มต้นที่ 0 นี้จะช่วยให้สถานที่ตั้งหลังจากที่ไม่ตรงกันครั้งแรกเกิดขึ้นเมื่อจับคู่กับT [ ผม ] ให้ระยะเวลานี้เป็นลิตร 0 ข้ามอักขระที่ไม่ตรงกันในTและPแล้วลองจับคู่สตริงที่เหลือ นั่นคือหาL C PของT [ i + l 0 + 1 ]และP [ l 0 + 1 ]อีกครั้ง ทำซ้ำจนกว่าคุณจะได้รับkไม่ตรงกันหรือสตริงเสร็จสิ้น แต่ละPT[i]l0TPLCPT[i+l0+1]P[l0+1]kคือ O ( 1 ) มี O ( k ) L ซีพี 's สำหรับดัชนีแต่ละฉันของ T , ให้นี้ซับซ้อนรวมของ O ( n k )LCPO(1)O(k) LCPiTO(nk)
ฉันใช้วิธีที่ง่ายกว่าในการใช้ RMQ ที่ให้ความซับซ้อนโดยรวมของหรือO ( n k + n บันทึกn )ถ้าm = O ( n )แต่มัน สามารถทำได้ในO ( n k )เช่นกันตามที่อธิบายไว้ข้างต้น อาจมีวิธีการอื่น ๆ โดยตรงสำหรับปัญหานี้ แต่นี่เป็นวิธีที่มีประสิทธิภาพและทั่วไปที่สามารถนำไปใช้กับปัญหาที่คล้ายกันมากมายO(nk+(n+m)log(n+m))O(nk+nlogn)m=O(n)O(nk)