加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

algorithm – 使用LRS数组增强的因子oracle查找多个字符串的最长

发布时间:2020-12-12 16:29:28 所属栏目:百科 来源:网络整理
导读:我们可以使用带后缀链接的因子oracle( paper here)来计算多个字符串的最长公共子字符串吗?这里,substring表示原始字符串的任何部分.例如,“abc”是“ffabcgg”的子串,而“abg”则不是. 我找到了一种方法来计算两个字符串s1和s2的最大长度公共子串.它通过使
我们可以使用带后缀链接的因子oracle( paper here)来计算多个字符串的最长公共子字符串吗?这里,substring表示原始字符串的任何部分.例如,“abc”是“ffabcgg”的子串,而“abg”则不是.

我找到了一种方法来计算两个字符串s1和s2的最大长度公共子串.它通过使用不在其中的字符连接两个字符串来工作,例如’$’.然后,对于长度为i> = | s1 |的连接字符串s的每个前缀在图2中,我们计算其LRS(最长重复后缀)长度lrs [i]和sp [i](其LRS的第一次出现的结束位置).最后,答案是

max{lrs[i]| i >= |s1| + 2 and sp[i] <= |s1|}

我编写了一个使用这种方法的C程序,当| s1 |时,我的笔记本电脑可以在200ms内解决问题| S2 | < = 200000,使用因子oracle.

s1 = 'ffabcgg'
s2 = 'gfbcge'
s = s1+'$'+s2 
  = 'ffabcgg$gfbcge'
p: 0 1 2 3 4 5 6 7 8 9 10 11 12 13
s:  f f a b c g g $g f  b  c  g  e
sp: 0 1 0 0 0 0 6 0 6 1  4  5  6  0
lrs:0 1 0 0 0 0 1 0 1 1  1  2  3  0

ans = lrs[13] = 3

我知道这两个问题都可以使用后缀数组和后缀树来高效解决,但我想知道是否有一个方法使用因子oracle来解决它.我对此感兴趣,因为oracle因素易于构造(30行C,后缀数组需要大约60,后缀树需要150),并且运行速度比后缀数组和后缀树快.

您可以在this OnlineJudge中测试第一个问题的方法,在here中测试第二个问题.

Can we use a factor-oracle with suffix link (paper here) to compute
the longest common substring of multiple strings?

我不认为算法非常适合(它被设计为考虑单个字符串)但您可以通过将原始字符串与唯一分隔符连接来使用它.

给定abcdefg和hijcdekl和mncdop,找到最长的公共子串cd:

# combine with unique joiners
>>> s = "abcdefg" + "1" + "hijcdekl" + "2" + "mncdop" 
>>> factor_oracle(s)
"cd"

作为其线性时间和空间算法的一部分,因子oracle快速重新发现输入字符串之间的断点,作为其搜索公共因子的一部分(唯一的连接符提供并立即提示以停止扩展到目前为止发现的最佳因子) .

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读