对于上下文,我编写了这个算法来获取任何字符串的唯一子串的数量.它为计算其包含的节点的字符串构建后缀树,并将其作为答案返回.我想要解决的问题需要一个O(n)算法,所以这个问题只是关于这个代码的行为方式,而不是关于它的作用有多糟糕.
struct node{
char value = ' ';
vector<node*> children;
~node()
{
for (node* child: children)
{
delete child;
}
}
};
int numberOfUniqueSubstrings(string aString, node*& root)
{
root = new node();
int substrings = 0;
for (int i = 0; i < aString.size(); ++i)
{
string tmp = aString.substr(i, aString.size());
node* currentNode = root;
char indexToNext = 0;
for (int j = 0; j < currentNode->children.size(); ++j)
{
if (currentNode->children[j]->value == tmp[indexToNext])
{
currentNode = currentNode->children[j];
j …Run Code Online (Sandbox Code Playgroud) 我只想知道,当后缀树优于增强后缀数组时.
在阅读了使用增强的suf fi x数组替换suf fi x树之后,我再也看不到使用后缀树的理由了.有些方法可能会变得复杂,但您可以使用后缀数组执行所有操作,使用后缀树可以执行的操作,并且需要相同的时间复杂度但内存较少.
一项调查甚至表明,后缀数组更快,因为它们缓存更友好,并且不会产生更多的缓存未命中,然后产生后缀树(因此缓存可以更好地预测数组使用,然后在递归树结构上).
那么,有没有人知道在后缀数组上选择后缀树的原因?
编辑 好的,如果你知道更多告诉我,到目前为止:
algorithm suffix-tree time-complexity suffix-array space-complexity
我正在寻找具有以下功能的广义后缀树(GST)的Java实现:
从1000个字符串创建GST之后,我想知道这1000个字符串中有多少包含其他字符串''.
搜索必须快速安静,因为我需要在大约100'000个平均长度为10的候选字符串上应用搜索.
我需要在String中找到最长的非重叠重复子字符串.我有可用字符串的后缀树和后缀数组.
当允许重叠时,答案是微不足道的(后缀树中最深的父节点).
例如对于String ="acaca"
如果允许重叠,则回答是"aca"但是当不允许重叠时,回答是"ac"或"ca".
我只需要算法或高级想法.
PS:我试过,但我在网上找不到明确的答案.
摘自编程珍珠第15.2节
可在此处查看C代码:http://www.cs.bell-labs.com/cm/cs/pearls/longdup.c
当我使用suffix-array在Python中实现它时:
example = open("iliad10.txt").read()
def comlen(p, q):
i = 0
for x in zip(p, q):
if x[0] == x[1]:
i += 1
else:
break
return i
suffix_list = []
example_len = len(example)
idx = list(range(example_len))
idx.sort(cmp = lambda a, b: cmp(example[a:], example[b:])) #VERY VERY SLOW
max_len = -1
for i in range(example_len - 1):
this_len = comlen(example[idx[i]:], example[idx[i+1]:])
print this_len
if this_len > max_len:
max_len = this_len
maxi = i
Run Code Online (Sandbox Code Playgroud)
我发现这idx.sort一步很慢.我认为它很慢,因为Python需要通过值而不是指针传递子串(如上面的C代码).
测试文件可以从这里 …
解决这个问题的最佳方法(性能方面)是什么?我被建议使用后缀树.这是最好的方法吗?
是否存在从字符串S [1..m] 的后缀树生成字符串S [2..m]的后缀树的快速(O(1)时间复杂度)方法?
我熟悉Ukkonen的,所以我知道如何从字符串S [1..m]的后缀树制作字符串S [1..m + 1]的快速后缀树,但我不能将该算法用于反向情况.
我目前正在开发自己的Suffix Tree实现(使用C++,但问题仍然是语言不可知).我研究了来自Ukkonen的原始论文.这篇文章很清楚,所以我开始研究我的实现并试图解决广义后缀树的问题.
在树中,使用一对整数表示从节点到另一个节点的每个子串.虽然这对于常规后缀树来说很简单,但是当多个字符串在同一个树中共存时(这将成为广义后缀树)会出现问题.实际上,现在这样的一对还不够,我们需要另一个变量来说明我们正在使用哪个参考字符串.
一个简单的例子.考虑字符串coconut:
nut将是(4,6).troublemaker在树中添加,(4,6)现在可以是:
nut 如果我们引用第一个字符串.ble 如果我们引用第二个字符串.为了解决这个问题,我想添加一个表示字符串的id:
// A pair of int is a substring (regular tree)
typedef std::pair<int,int> substring;
// We need to bind a substring to its reference string:
typedef std::pair<int, substring> mapped_substring;
Run Code Online (Sandbox Code Playgroud)
我目前面临的问题如下:
我得到一个查询,在树中添加一个字符串.在算法期间,我可能必须检查与其他已注册字符串相关的现有转换,表示为三元组(参考字符串id,k,p).一些更新操作基于子字符串索引,如何在这种条件下执行它们?
注意:这个问题与语言无关,所以我没有包含c ++ -tag,尽管显示了一些小片段.
suffix-tree ×10
algorithm ×7
suffix-array ×4
c ×1
c# ×1
c++ ×1
java ×1
performance ×1
python ×1
string ×1
substring ×1