Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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 跨N个字符串查找公共子字符串的算法_Algorithm_String_Search - Fatal编程技术网

Algorithm 跨N个字符串查找公共子字符串的算法

Algorithm 跨N个字符串查找公共子字符串的算法,algorithm,string,search,Algorithm,String,Search,我熟悉两个字符串的LCS算法。寻找在2..N字符串中查找公共子字符串的建议。每对中可能有多个公共子字符串。在字符串的子集中可以有不同的公共子字符串 字符串:(ABCDEFGHIJKL)(DEF)(ABCDEF)(BIJKL)(FGH) 常用字符串: 1/2 (DEF) 1/3 (ABCDEF) 1/4 (IJKL) 1/5 (FGH) 2/3 (DEF) 1/3 (ABCDEF) 1/2/3 (DEF) 最长公共字符串: 1/2 (DEF) 1/3 (ABCDEF) 1/4 (IJKL)

我熟悉两个字符串的LCS算法。寻找在2..N字符串中查找公共子字符串的建议。每对中可能有多个公共子字符串。在字符串的子集中可以有不同的公共子字符串

字符串:
(ABCDEFGHIJKL)(DEF)(ABCDEF)(BIJKL)(FGH)

常用字符串:

1/2 (DEF)
1/3 (ABCDEF)
1/4 (IJKL)
1/5 (FGH)
2/3 (DEF)
1/3 (ABCDEF)
1/2/3 (DEF)
最长公共字符串:

1/2 (DEF)
1/3 (ABCDEF)
1/4 (IJKL)
1/5 (FGH)
2/3 (DEF)
1/3 (ABCDEF)
1/2/3 (DEF)
最常见的字符串:

1/2 (DEF)
1/3 (ABCDEF)
1/4 (IJKL)
1/5 (FGH)
2/3 (DEF)
1/3 (ABCDEF)
1/2/3 (DEF)

在DNA序列分析中,这种事情一直在进行。你可以找到各种各样的算法。列出了一个合理的集合


还有一种蛮力方法,可以为每个子字符串创建表(如果您只对短字符串感兴趣的话):在每个级别上形成一个N元树(N=26表示字母,256表示ASCII),并在每个节点上存储计数的直方图。如果你删掉很少使用的节点(以保持内存需求合理),你最终会得到一个算法,该算法在N*M^2*log(M)的时间内找到长度为M的所有子序列,输入长度为N。如果你将其拆分为K个单独的字符串,你可以构建树结构并读取答案在一次遍历树的过程中。

后缀树就是答案,除非您有非常大的字符串,而这些字符串会导致内存问题。对于一个好的实现,字符串中每个字符的内存使用量预计为10~30字节。还有一些开源实现,它们使您的工作更容易


还有其他更简洁的算法,但它们更难实现(寻找“压缩后缀树”)。

这是一个ACM竞赛问题,需要具有特定性能的算法吗?子字符串“F”不是最常见的,因为它出现在四个字符串中吗?告诉我们为什么需要它是一个好主意,所以我们可以理解哪里可以妥协,哪里不可以。罗曼-我不是学生,这不是比赛:-)。该应用程序用于在PDF内容流中查找公共元素。interjay-我忽略了单个字符的子字符串,我几乎可以这么说,这一直在计算生物学中使用。然而,“子串/子序列”的定义通常是模棱两可的(对于非算法学家来说并非故意如此),我认为在这种情况下,他的问题要求它们是连续的。