String 求子串的长度

String 求子串的长度,string,algorithm,search,substring,String,Algorithm,Search,Substring,我给了n个字符串。我必须找到一个字符串S,给定n个字符串是S的子序列。 例如,我给出了以下5个字符串: AATT CGTT CAGT ACGT ATGC 那么字符串是“ACAGTGCT”。因为,ACAGTGCT包含所有作为超级序列的给定字符串。 要解决这个问题,我必须知道算法。但我不知道如何解决这个问题。伙计们,你们能告诉我解决这个问题的方法吗 我的方法:使用 希望这有帮助:)这是一个称为多重序列比对的NP完全问题 描述了解决方案方法,如动态规划,它适用

我给了n个字符串。我必须找到一个字符串S,给定n个字符串是S的子序列。 例如,我给出了以下5个字符串:

    AATT
    CGTT
    CAGT
    ACGT
    ATGC
那么字符串是“ACAGTGCT”。因为,ACAGTGCT包含所有作为超级序列的给定字符串。 要解决这个问题,我必须知道算法。但我不知道如何解决这个问题。伙计们,你们能告诉我解决这个问题的方法吗

我的方法:使用


希望这有帮助:)

这是一个称为多重序列比对的NP完全问题

描述了解决方案方法,如动态规划,它适用于较小的n,但对于较大的n来说成本过高

基本思想是构造一个数组f[a,b,c,…],表示最短字符串S的长度,该字符串生成第一个字符串的“a”字符、第二个字符串的“b”字符和第三个字符串的“c”字符

1 Definitions
长度为n的序列是从字母表中提取的n个符号的串联。 如果S是长度为n的序列,T是长度为m和n的序列,则S是T的子序列,如果S可以通过从T中删除m-n符号获得。符号不必是连续的。 如果可以通过插入m-n符号获得T,则长度为m的序列T是长度为n的序列S的超序列。也就是说,T是S的超序列当且仅当S是T的子序列。 序列T是序列S1和S2的共同超序列,序列T是S1和S2的超序列

2 The problem
问题是找到一个最短的公共超序列(SCS),这是一个最小长度的公共超序列。对于给定的问题,可能有多个SCS

2.1 Example


S= {a, b, c}
S1 = bcb
S2 = baab
S3 = babc
一个最短的常见超层序是babcab(babacb、baabcb、bcaabc、bacabc、baacbc)

动态规划需要太多的内存,除非输入序列的数量非常小。 分支和绑定需要太多的时间,除非字母表非常小。 当序列的数量比字母表的大小大时,多数合并是最著名的启发式方法。[1] 贪婪(取两个序列,用它们的最优最短公共超序列替换它们,直到只剩下一个字符串)比多数合并更糟糕。[1] 遗传算法表明,它可能比多数合并更好。[1]

4 Implemented heuristics

4.1 The trivial solution
平凡解最多是最优解长度的| |倍,通过将所有字符在sigma中的串联与最长序列的串联次数相等来获得。也就是说,如果={a,b,c}并且最长的输入序列长度为4,我们得到abcabc。 4.2多数合并启发式 多数合并启发式方法通过以下方式从空序列构建超序列:

虽然存在非空的输入序列 s l然后i>j

第二约束强制保留每个序列的顺序,而不是S中的位置。如果我们有两个映射席Xi和XJ,那么如果它们映射到不同的序列,我们只可以交换它们之间的映射。

5.1 The initial solution
有许多方法可以选择初始解决方案。只要序列的顺序保持不变,它就是有效的。我选择不以某种方式随机化解决方案,而是尝试两种不同的解决方案类型,并对它们进行比较

第一种方法是通过简单地连接所有序列来创建初始解

5.1 The initial solution
第二种方法是将序列一次交织一个符号。也就是说,从每个序列的第一个符号开始,然后按照相同的顺序,取每个序列的第二个符号,依此类推

5.2 Local change and the neighbourhood
局部更改是通过在解决方案中交换两个映射来完成的。 进行迭代的一种方法是从i到Sl,并对每个映射进行最佳交换。 另一种方法是尝试按照序列定义的顺序交换映射。也就是说,首先交换s1,1,然后交换s2,1。这就是我们所做的

我尝试过两种变体

在第一种情况下,如果单个映射交换不能产生更好的值,我将返回,否则我将继续

在第二个例子中,我分别为每个序列做了尽可能多的交换,这样每个序列中的一个符号都有可能移动。给出我保留的最佳值的交换,如果该值比算法中最后一步的值差,我返回,否则我继续

只要交换不改变原始序列的顺序,符号可以向左或向右移动任意数量的位置

5.1 The initial solution
第一个变体中的邻域是可以为符号进行的有效交换的数量。在第二种变体中,它是前一个符号交换后每个符号有效交换的总和

5.3 Evaluation
由于解的长度总是恒定的,所以在得到解的实际长度之前,必须对其进行压缩

解决方案S由映射组成,通过使用每个映射指向的符号将其转换为字符串。创建一个新的初始为空的解决方案T。然后执行该算法:

T = {}
  FOR i = 0 TO Sl
    found = FALSE
    FOR j = 0 TO |L|
       IF first symbol in L(j) = the symbol xi maps to THEN
          Remove first symbol from L(j)
          found = TRUE
       END IF
    END FOR 
    IF found = TRUE THEN  
      Add the symbol xi maps to to the end of T            
    END IF
  END FOR
Sl和以前一样是所有序列的长度之和。L是所有序列的集合,L(j)是序列号j

解S的值为| T |


非常感谢:Andreas Westling

我认为S的大小有一些限制,否则您可以简单地连接所有给定的字符串。我必须找到最佳字符串S。我不理解您的示例。ACAGTGCT不包含作为子序列的所有给定字符串。你能更好地解释一下你在寻找什么吗?我已经给出了n个字符串(n你想用“trie”这个词来指什么??trie数据结构!我将添加一个链接,请参阅更新。你能在这里给出具体的算法来解决这个问题吗?
T = {}
  FOR i = 0 TO Sl
    found = FALSE
    FOR j = 0 TO |L|
       IF first symbol in L(j) = the symbol xi maps to THEN
          Remove first symbol from L(j)
          found = TRUE
       END IF
    END FOR 
    IF found = TRUE THEN  
      Add the symbol xi maps to to the end of T            
    END IF
  END FOR