Java 如何找到事件的重复序列
我试图找到一种有效的算法来识别重复出现的字符序列。假设序列可以是至少3个字符,但只返回最大长度的序列。数据集可能包含数千个字符。另外,我只想知道序列是否重复,比如说,重复3次 例如: 阿舍克谢德谢克 “SHEK”出现3次,将被识别。“SHE”出现4次,但未被识别,因为“SHEK”是包含该序列的最大长度序列 此外,没有“种子”序列被提供给算法,它必须自主地找到它们 提前感谢,,Java 如何找到事件的重复序列,java,algorithm,Java,Algorithm,我试图找到一种有效的算法来识别重复出现的字符序列。假设序列可以是至少3个字符,但只返回最大长度的序列。数据集可能包含数千个字符。另外,我只想知道序列是否重复,比如说,重复3次 例如: 阿舍克谢德谢克 “SHEK”出现3次,将被识别。“SHE”出现4次,但未被识别,因为“SHEK”是包含该序列的最大长度序列 此外,没有“种子”序列被提供给算法,它必须自主地找到它们 提前感谢,, J看起来像Rabin Karp < P>如果你认为存在和(n)/ 2个可能的起始字符串,而不是简单地寻找一个匹配,但是最
J
看起来像Rabin Karp
< P>如果你认为存在和(n)/ 2个可能的起始字符串,而不是简单地寻找一个匹配,但是最匹配的子串,如果算法是正确和完整的,我认为你的算法将有一个可怕的理论复杂性。 但是,您可能会通过使用。算法如下所示:希望这有点道理!祝你好运 尝试为字符串创建后缀数组 联机生成器:
检查后缀数组中连续行的开头以匹配考虑以下算法,其中:
str
是事件字符串
T(i)
是子字符串str(0..i)
的
T(i+1)
可从T(i)
快速获取,例如使用
对于输入字符串str
中的每个字符位置i
,遍历
从T(i)
根开始沿边缘的路径,标记为
输入的连续字符,从位置i+1开始
此路径确定重复字符串。如果路径长于
在以前找到的路径中,记录新的最大长度和位置
i+1
使用str[i+1]
更新后缀树,并在下一个位置重复此操作
类似这样的伪代码:
max.len = 0
max.off = -1
T = update_suffix_tree (nil, str [0])
for i = 1 to len (str)
r = root (T)
j = i + 1
while j < len (str) and r.child (str [j]) != nil
r = r.child (str [j])
++j
if j - i - 1 > max.len
max.len = j - i - 1
max.off = i + 1
T = update_suffix_tree (T, str [i+1])
max.len=0
最大关闭=-1
T=更新后缀树(nil,str[0])
对于i=1到len(str)
r=根(T)
j=i+1
而jmax.len
最大长度=j-i-1
最大关闭=i+1
T=更新后缀树(T,str[i+1])
在k
th迭代中,内部while
最多执行n次-
k
迭代,后缀树结构是O(k)
,因此
循环体的复杂度为O(n)
,执行次数为n-1次,
因此,整个算法的复杂性是<>代码> o(n^ 2) .< /P>,不是我的答案本身,但我可以建议你看看Sigg并把你的内环工作编译成C++吗?我以前在NLP/机器学习上工作过,IF-I CU-DO-IT-OUT,我将核心算法放在C++中,并把它们链接到我的计算服务器/Hadoop集群的JVM。不过只是一个想法。。。