我们如何从LCP阵列构建LCP-LR阵列?

时间:2016-06-30 15:55:26

标签: algorithm pattern-matching string-matching suffix-array

查找文本T(长度N)中给定字符串P(长度m)的出现次数

我们必须对T的后缀数组使用二进制搜索。

使用标准二进制搜索(没有LCP信息)的问题是,在您需要进行的每个O(log N)比较中,将P与后缀数组的当前条目进行比较,这意味着一个完整的字符串比较最多m个字符。所以复杂度是O(m * log N)。

LCP-LR阵列有助于将其提高到O(m + log N)。 know more

我们如何从LCP阵列预先计算LCP-LR阵列?

LCP-LR如何帮助找到模式的出现次数?

请用示例解释算法

我在谷歌搜索过,但我找不到任何算法,这就是我要问的原因。

请帮帮我

2 个答案:

答案 0 :(得分:1)

// note that arrSize is O(n)
// int arrSize = 2 * 2 ^ (log(N) + 1) + 1; // start from 1

// LCP = new int[N];
// fill the LCP...
// LCP_LR = new int[arrSize];
// memset(LCP_LR, maxValueOfInteger, arrSize);
// 

// init: buildLCP_LR(1, 1, N);
// LCP_LR[1] == [1..N]
// LCP_LR[2] == [1..N/2]
// LCP_LR[3] == [N/2+1 .. N]

// rangeI = LCP_LR[i]
//   rangeILeft  = LCP_LR[2 * i]
//   rangeIRight = LCP_LR[2 * i + 1]
// ..etc
void buildLCP_LR(int index, int low, int high)
{
    if(low == high)
    {
        LCP_LR[index] = LCP[low];
        return;
    }

    int mid = (low + high) / 2;

    buildLCP_LR(2*index, low, mid);
    buildLCP_LR(2*index+1, mid + 1, high);

    LCP_LR[index] = min(LCP_LR[2*index], LCP_LR[2*index + 1]);
}

参考:https://stackoverflow.com/a/28385677/1428052

答案 1 :(得分:0)

没有足够的代表发表评论。有人能够使用@Abhijeet Ashok Muneshwar解决方案创建LCP-LR。对于文本 - 密西西比的前缀,后缀数组 -

0 1 2 3 4 5 6 7 8 9 10

10 7 1 4 0 9 8 3 6 2 5

LCP阵列将是

0 1 2 3 4 5 6 7 8 9 10

1 1 4 0 0 1 0 2 1 3 0

LCP-LR将是

0 1 2 3 4 5 6 7 8 9 10

1 1 0 4 0 0 0 0 0 1 3

但使用该代码获得的LCP-LR与上述不同。 对于方法buildLCP_LR,我传递index = 0,low = 0,high = n