Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 从字符串中查找子字符串_Algorithm_Language Agnostic_Suffix Tree - Fatal编程技术网

Algorithm 从字符串中查找子字符串

Algorithm 从字符串中查找子字符串,algorithm,language-agnostic,suffix-tree,Algorithm,Language Agnostic,Suffix Tree,输入:字符串S=aagatgatagat 输出:最大重复次数,如GATA(如位置3和8)、GAT(如位置3、8和13)等 最大重复是指子串t在S中出现k>1次,如果t向左或向右扩展,则出现的次数将少于k次 内部节点的叶后代是后缀,每个后缀都有一个左字符 如果所有叶子体的左字符不完全相同,则称为“左多样化”节点 最大重复次数由不同的内部节点决定 总体思路: 构建后缀树,然后在树上执行DFS(深度优先搜索) 对于每个叶,使用其左字符对其进行标记 对于每个内部节点: 如果至少有一个子项标记为*,

输入:字符串S=aagatgatagat

输出:最大重复次数,如GATA(如位置3和8)、GAT(如位置3、8和13)等

  • 最大重复是指子串t在S中出现k>1次,如果t向左或向右扩展,则出现的次数将少于k次

  • 内部节点的叶后代是后缀,每个后缀都有一个左字符

  • 如果所有叶子体的左字符不完全相同,则称为“左多样化”节点

  • 最大重复次数由不同的内部节点决定

总体思路:

  • 构建后缀树,然后在树上执行DFS(深度优先搜索)

  • 对于每个叶,使用其左字符对其进行标记

  • 对于每个内部节点:

  • 如果至少有一个子项标记为*,则使用*

  • 否则,如果其子项的标签多种多样,请使用*

  • 否则,所有子节点都有相同的标签,请将其复制到当前节点


上述观点正确吗?伪代码是如何生成的?然后我可以试着自己编写程序。

你的想法很好,但是有了后缀树,你可以做一些更简单的事情

让T成为序列的后缀树

设x是T中的一个节点,T_x是根为x的T的子树

设N_x是T_x中的叶数

让单词(x)是通过将T从根遍历到节点x而创建的单词

现在使用后缀树的定义,我们得到:

单词(x)的重复次数=N_x,该单词的位置是每个叶子的标签

该算法将是一个基本的树遍历,对于树中的每个节点,计算N_x,如果N_x>2,则将其添加到结果中(如果您也需要位置,则可以添加每个叶的标签)

伪代码:

输入:

我的顺序

输出:

结果(重复计数和位置的单词列表)

算法:

T=后缀树(mySequence)

对于T中的每个内部节点X:

  T_X = subTree(T)
  N_X = Number of lead (T_X)
  if N_X >=2 :
  Result .add ( [word(X), N_X , list(label of leafs)] )
返回结果

示例:

让我们以维基百科的后缀树为例:“香蕉”

我们得到:

N_A = 3 so "A" repeats 3 times in position {1,3,5}
N_N=2  so "N" repeats 2 times  in position {2,4}
N_NA=2  so "NA" repeats 2 times in position {2,4}

我发现这篇论文似乎和你一样对待你的问题,所以是的,我认为你的方法是写:

提取

本文提出了两种算法。第一篇摘录 字母表西格玛上定义的序列中的重复模体。对于 例如,Sigma可以等于{A,C,G,T}和序列 表示DNA大分子的编码。寻找的主题 对应于同一字母表中出现最少的单词 序列中每次最多有e个不匹配的次数q (q称为法定人数限制)。[…]

您可以下载并查看它,作者为您的算法提供了伪代码


希望这有帮助

@Bryan,是的..试图写出编程代码..我想在伪代码方面寻求一些帮助..然后我将尝试写出整个编程…DFS代表深度优先搜索,而不是深度强制搜索。@rock:找出算法(一般来说解决问题)可能是程序员工作中最重要的部分。编码或多或少是一种机械活动。好问题,更重要的是,有效问题。将此与其他“plz发送代码”作业请求进行对比。我不知道为什么每当有人在这里有家庭作业问题时,人们都会大发雷霆+“为了一个有趣的问题,我向你道歉。”托马斯特。这次我没有画:D.从维基百科的后缀树页面上取的。