Java 如何找到事件的重复序列

Java 如何找到事件的重复序列,java,algorithm,Java,Algorithm,我试图找到一种有效的算法来识别重复出现的字符序列。假设序列可以是至少3个字符,但只返回最大长度的序列。数据集可能包含数千个字符。另外,我只想知道序列是否重复,比如说,重复3次 例如: 阿舍克谢德谢克 “SHEK”出现3次,将被识别。“SHE”出现4次,但未被识别,因为“SHEK”是包含该序列的最大长度序列 此外,没有“种子”序列被提供给算法,它必须自主地找到它们 提前感谢,, J看起来像Rabin Karp < P>如果你认为存在和(n)/ 2个可能的起始字符串,而不是简单地寻找一个匹配,但是最

我试图找到一种有效的算法来识别重复出现的字符序列。假设序列可以是至少3个字符,但只返回最大长度的序列。数据集可能包含数千个字符。另外,我只想知道序列是否重复,比如说,重复3次

例如: 阿舍克谢德谢克

“SHEK”出现3次,将被识别。“SHE”出现4次,但未被识别,因为“SHEK”是包含该序列的最大长度序列

此外,没有“种子”序列被提供给算法,它必须自主地找到它们

提前感谢,,
J

看起来像Rabin Karp

< P>如果你认为存在和(n)/ 2个可能的起始字符串,而不是简单地寻找一个匹配,但是最匹配的子串,如果算法是正确和完整的,我认为你的算法将有一个可怕的理论复杂性。 但是,您可能会通过使用。算法如下所示:

  • 对于字符串中的每个偏移量。。。 每个长度的子字符串1。。。
  • 将其插入trie中。trie中的每个节点都有一个数据值(“计数”整数),您可以在访问该节点时按该值递增
  • 一旦您建立了trie以对数据建模,请从trie中删除根低于某个优化阈值(在您的情况下为3)的所有子树

    剩下的路径应该足够少,以便有效地排序和选择所需的路径

    我建议将此作为一个起点,因为Trie是为处理公共前缀而构建的,并且作为一个副作用,它将压缩您的数据集

    我个人的选择是,在确定我想要的子字符串之后,作为一个单独的过程来确定子字符串的位置。否则,您将存储每个子字符串位置,这将爆炸您的内存。你的计算已经相当复杂了


    希望这有点道理!祝你好运

    尝试为字符串创建后缀数组

    联机生成器:


    检查后缀数组中连续行的开头以匹配

    考虑以下算法,其中:

    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。不过只是一个想法。。。