首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从LCP阵列构造LCP-LR阵列?

如何从LCP阵列构造LCP-LR阵列?
EN

Stack Overflow用户
提问于 2016-06-30 15:55:25
回答 2查看 915关注 0票数 0

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

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

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

LCP-LR阵列有助于将其改进为O(m+log N).了解更多

我们如何从LCP数组中预先计算LCP-LR数组?

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

请举例说明算法

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-26 11:26:57

代码语言:javascript
复制
// 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
EN

Stack Overflow用户

发布于 2017-09-27 02:51:51

没有足够的代表来评论这样的帖子。是否有人能够使用@Abhijeet Ashok Muneshwar解决方案创建LCP-LR?前为文本-密西西比州后缀数组-

0 1 2 3 4 5 6 7 8 9

10 7 1 4 0 9 8 3 6 2

LCP数组将是

0 1 2 3 4 5 6 7 8 9

1 1 4 0 0 1 0 2 3 0

而LCP-LR将是

0 1 2 3 4 5 6 7 8 9

1 1 0 4 0 0 0 1 3

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38128092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档