输入:字符串S = AAGATATGATAGGAT。
输出:最大重复次数,如GATA(如位置3和8),GAT(如位置3,8和13)等等......
最大重复是子串t在S中发生k> 1次,如果t向左或向右延伸,则发生的次数少于k次。
内部节点的叶子后代是后缀,每个后缀都有一个左字符。
如果所有叶子后代的左侧字符都不完全相同,则称为“左侧多样化”节点。
最大重复是左 - 多样化的内部节点。
总体思路:
构建后缀树,然后在树上执行DFS(深度优先搜索)
对于每个叶子,用左侧字符标记
对于每个内部节点:
如果至少有一个孩子标有*,则用*
如果其子女的标签多种多样,请标注*。
否则所有孩子都有相同的标签,将其复制到当前节点
上述想法是否正确?伪代码怎么样?然后我可以尝试自己编写程序。
答案 0 :(得分:3)
你的想法很好,但是使用后缀树你可以做得更轻松。
设T为序列的后缀树。
设x为T中的节点,T_x是带有根x的T的子树。
设N_x为T_x中的叶数
让word(x)成为通过遍历T从根到节点x
创建的单词现在使用后缀树的定义:
单词(x)= N_x的重复次数以及这些单词的位置是每个叶子的标签
用于此的算法将是基本树遍历,对于树中的每个节点计算N_x,如果N_x> 2将此添加到您的结果中(如果您也想要位置,则可以添加每个叶子的标签)
伪码:
输入:
mySequence
<强>输出:强>
结果(与计数和位置重复的单词列表)
算法:
T = suffixTree(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)] )
返回结果
示例:
让我们以后缀树的维基百科示例为例:“BANANA”:
我们得到:
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}
我发现这篇论文看起来像你一样对待你的问题,所以是的,我认为你的方法是写的:
Spelling approximate repeated or common motifs using a suffix tree
摘录强>
我们在本文中提出了两种算法。第一个提取 从字母表Sigma定义的序列重复的图案。对于 例如,Sigma可能等于{A,C,G,T}和序列 代表DNA大分子的编码。搜索的主题 对应于同一字母表中出现最少的单词 序列中的次数q,每次最多不匹配 (q称为仲裁约束)。[...]
您可以下载并查看它,作者为您的算法提供伪代码。
希望这有帮助