1

我想做某种“搜索和替换”算法,如果可能的话,它会以一种有效的方式识别一个字符串的子字符串,它出现了不止一次,并用一个标记替换该子字符串的所有出现。

例如,给定一个字符串“AbcAdAefgAbijkAblmnAbAb”,注意“A”重复出现,所以在第一个过程中减少到“#1bc#1d#1efg#1bijk#1blmn#1b#1b”,其中#_是一个索引模式(我们注意到索引表中的模式),然后注意“#1b”重复出现,因此减少为“#2c#1d#1efg#2ijk#2lmn#2#2”。字符串中不再出现模式,所以我们完成了。

我找到了一些关于“最长公共子序列”和压缩算法的信息,但似乎没有这样做。它们要么用于比较两个字符串,要么用于获得某种存储优化的结果。

另一方面,我的目标是将基因组简化为“单词”而不是“字母”。即,我想看到 2c1c2c 而不是 gatcatcgatc。之后我可以做一些正则表达式来找到像 "#42*#42"; 这样的东西。在 dna 中看到重复出现的括号会很酷。

如果我能在网上找到它,我会跳过自己做的,但我看不到这个问题以前用我能发现的术语回答。对于任何可以指出我正确方向的人,非常感谢。

4

1 回答 1

1

字节对编码所做的事情非常接近你想要的。不是直接搜索最长的重复字符串(自上而下),而是每次通过字节对编码搜索重复的字节对(自下而上)。但最终它会发现最长的重复字符串(*)。

  • gatcatcgatc
  • 1=在 g1c1cg1c
  • 2=atc g22g2
  • 3=gatc 2=atc 323

如您所见,它找到了最长的重复字符串“gatc”。

(*) 字节对编码要么最终找到最长的重复字符串,要么在进行 (2^8 - uniquechars(source) ) 替换后提前停止。我怀疑可能可以调整字节对编码,以便稍微放松早期停止条件 - 可能是 (2^9 - uniquechars(source) ) 或 2^12 或 2^16。即使这会损害压缩性能,也许它会给像您这样的应用程序带来有趣的结果。

于 2011-06-18T04:33:30.963 回答