首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >后缀数组标记内部节点

后缀数组标记内部节点
EN

Stack Overflow用户
提问于 2015-11-30 18:48:12
回答 1查看 63关注 0票数 1

了解内部节点在后缀树中很有帮助,因为它们可以帮助您解决问题,比如查找最长的重复子字符串。

这些都是很难当场构建的(比如白板面试)。所以人们告诉我要研究后缀数组。

我有两个部分的问题:

1.可以先创建后缀数组而不构建后缀树吗?据我所见,大多数实现构建trie,然后遍历它来创建后缀数组。

2.给出了一个后缀数组,如何识别内部节点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-30 20:38:11

(在我看来,对于白板面试来说,这将是一个非常困难的问题。)

要回答第1部分,可以(而且通常)直接构造后缀数组。

这个链接到stanford.edu给出了一个简单实现的简短的O(nlog^2n)算法:

代码语言:javascript
复制
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
#define MAXN 65536
#define MAXLG 17
char A[MAXN];
struct entry { int nr[2], p;
} L[MAXN];
int P[MAXLG][MAXN], N, i, stp, cnt;
int cmp(struct entry a, struct entry b)
{
  return a.nr[0] == b.nr[0] ? (a.nr[1] < b.nr[1] ? 1 : 0) : (a.nr[0] < b.nr[0] ? 1 : 0);
}
int main(void)
{
  gets(A); for (N = strlen(A), i = 0; i < N; i ++)
  P[0][i] = A[i] - 'a';
  for (stp = 1, cnt = 1; cnt >> 1 < N; stp ++, cnt <<= 1) {
    for (i = 0; i < N; i ++)
      { L[i].nr[0] = P[stp - 1][i];
        L[i].nr[1] = i + cnt < N ? P[stp - 1][i + cnt] : -1;
        L[i].p = i; }
    sort(L, L + N, cmp);
    for (i = 0; i < N; i ++) P[stp][L[i].p] = i > 0 && L[i].nr[0] == L[i - 1].nr[0] && L[i].nr[1] == L[i - 1].nr[1] ?
    P[stp][L[i - 1].p] : i;
  } return 0;
} 

此PDF还讨论了如何在实际示例中使用后缀数组。

或者,这个2005年论文“线性工作后缀阵列构造”提供了一种O(n)方法来构造50行代码的后缀数组。

在对长度为100 k的字符串进行的实验中,我发现一个后缀树(使用Ukkonen的O(n)算法)花费16秒,O(nlog^2n)后缀数组花费2.4秒,O(n)后缀数组花费0.5秒。

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

https://stackoverflow.com/questions/34005738

复制
相关文章

相似问题

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