ข้ามไปเนื้อหา

แถวลำดับแอลซีพี

จากวิกิพีเดีย สารานุกรมเสรี

longest common prefix array (LCP array) ถูกนำมาใช้ในปี 1993. โดย Udi Manber และ Gene Myers เพื่อปรับปรุง suffix array การทำงานของวิธีการค้นหาสตริงของพวกเขา โดยวิธีการคือ สมมุติให้มี อาร์เรย์ A: = [aab, ab, abaab, b, baab] เป็น suffix array อักษรที่ยาวที่สุดระหว่าง A [1] = aab และ A [2] = ab เป็นที่มีความยาว 1 ดังนั้น H [2] = 1 ทำนองเดียวกันใน LCP array ของ A [2] = ab และ A [3] = abaab เป็น ab ดังนั้น H [3] = 2

ตัวอย่าง LCP array

[แก้]

สมมุติให้มีว่าข้อความ S = banana ให้เราเรียงตามลำดับindex

i 0 1 2 3 4 5
S[i] b a n a n a

นำข้อความมาทำเป็นอักษรย่อยแล้วเรียงตามindex

suffix i
banana 0
anana 1
nana 2
ana 3
na 4
a 5

เรียงตามลำดับ suffix array ของอักษรย่อย S

suffix i
a 5
ana 3
anana 1
banana 0
na 4
nana 2

จากนั้นให้เราหาจำนวนอักษรที่ยาวที่สุดของ suffix arrayตามลำดับจะได้ LCP array

i suffix LCP array
5 a 0
3 ana 1
1 anana 3
0 banana 0
4 na 0
2 nana 2

เราจะได้ LCP array ของ S = [0, 1, 3, 0, 0, 2]

การนำ LCP array ไปใช้งานในภาษาPython

[แก้]

ตัวอย่างภาษาไพทอน

def suffix_array(s):
    return [rank for suffix, rank in sorted((s[i:], i) for i in range(len(s)))]

def lcp_array(s):
    
    sa = suffix_array(s)
    n = len(s)
    k = 0
    lcp = [0] * n
    rank = [0] * n
    for i in range(n):
        rank[sa[i]] = i
        
    for i in range(n):
        if rank[i] == n-1:
            k = 0
            continue
        j = sa[rank[i] + 1]
        while i + k < n and j + k < n and s[i + k] == s[j + k]:
            k += 1
        lcp[rank[i]+1] = k;
        if k:
            k -= 1
            
    return lcp

อ้างอิง

[แก้]

LCP array from Suffix Array เก็บถาวร 2017-11-20 ที่ เวย์แบ็กแมชชีน on geeksforgeeks