【项目实训日志二】Shortest Superstring最短超串问题


本文章总结一下《Approximation Algorithm》一书中第七章Shortest Superstring的相关内容。

问题定义

Given a finite alphabet Σ, and a set of n strings, find a shortest string s that contains each si as a substringS = { s 1 s_1 s1,…, s n s_n sn} ⊆ Σ+
Σ是一个有穷字符集,比如26个小写字母,S是 s 1 s_1 s1,…, s n s_n sn这n个字符串的集合()假定这些字符串中,每一个都不是另一个的子集。,这些字符串中的字符都取自字符集Σ,比如由小写字母构成的字符串,并且不能是空串。最短超串问题就是找到一个包含S中所有字符串的最小字符串。

定义overlap

定义s,t之间的overlap同时是s的后缀和t的前缀,即两者之间首尾最大重合(最长)。
例:overlap(aabbb,bbbcc)=bbb,|overlap(aabbb,bbbcc)|=3

贪心算法举例

首先是一个贪心算法:在集合S中找出首尾匹配最大的两个串,将他们重叠拼接成一个新串,再放回集合S。重复上述步骤直到集合中只剩下一个字符串,这个串就是一个超串,它包含所有的 s i s_i si作为子字符串。但是贪心算法不一定能找到最优解,它的近似比为2(这里它还没有证明为什么近似比是2,只是说一下)。我们看一个例子假设有三个串 S={ a b k ab^k abk, b k c b^kc bkc b k + 1 b^{k+1} bk+1}。基于贪心策略,无法决定先拼接哪两个串,于是选择前两个串,得到 a b k c ab^kc abkc,最后再和第三串拼接,得到 a b k c b k + 1 ab^kcb^{k+1} abkcbk+1。而实际上最短串是 a b k + 1 c ab^{k+1}c abk+1c,他们几乎相差两倍。
a b k ab^k abk abbbbbbbb(k个b)
b k c b^kc bkc bbbbbbbbc(k个b)
b k + 1 b^{k+1} bk+1 bbbbbbbbb(k个b加1个b)

A factor 4 algorithm一个近似比为4的算法

具体算法

1.构造S中对应字符串的前缀图.

2.找到这个前缀图中的最小权重cycle cover,C = { c 1 c_1 c1 ,…, c k c_k ck }

3.输出σ( c 1 c_1 c1 ) ◦ … ◦ σ( c k c_k ck ).

理解算法

我们先找到最优解的一个良好的下界,假设 s 1 s_1 s1, s 2 s_2 s2,…, s n s_n sn按出现在最短超串s中最左边的顺序编号。

此图在这个问题中非常重要,需要刻进DNA里
令overlap( s i s_i si , s j s_j sj )表示 s i s_i si s j s_j sj之间的最大重叠,也就是说, s i s_i si的最长后缀是 s j s_j sj的最长前缀。同时,用 prefix( s i s_i si , s j s_j sj )表示 s i s_i si 中与 s j s_j sj没有重叠的部分。假设没有 s i s_i si是另一个的子字符串,我们得到
OPT =|prefix( s 1 s_1 s1 , s 2 s_2 s2 )| + |prefix( s 2 s_2 s2 , s 3 s_3 s3 )| + … + |prefix( s n s_n sn , s 1 s_1 s1 )|+|overlap( s n s_n sn , s 1 s_1 s1)|.

现在定义一个prefix graph:
S的前缀图定义如下:
它是一个在顶点集{1,…,n}上的有向图,对于每一对顶点i,j,从i到j的边权重为|prefix( s i s_i si , s j s_j sj )|(包括自环边——一个顶点到这个顶点自身的边)。
显然,|prefix( s 1 s_1 s1 , s 2 s_2 s2 )| + |prefix( s 2 s_2 s2 , s 3 s_3 s3 )| + … + |prefix( s n s_n sn , s 1 s_1 s1 )代表了从1 → 2 → … → n → 1的权重。 因此,由(7.1)可知,通过前缀图的旅行商旅行的最小耗费给出了OPT的下界(因为该路径加上|overlap( s n s_n sn, s 1 s_1 s1)才是OPT|)。但是这个下界不是很有用,因为我们不能有效地计算旅行商的最小耗费(旅行商问题是np-hard的)。

所以换一种思路,使用前缀图的 圈覆盖(cycle cover) 的最小权值进行下界选择(在此书定义中,一个圈覆盖是覆盖所有顶点的不相交的圈的集合)。因为1→2→…→n→1是一个cycle cover,由(7.1)可得cycle cover的最低权重就是OPT的下限。

与最小TSP不同,一个cycle cover的最小权重是多项式时间可计算的。对应于前缀图,构造二分图H。U = { u 1 u_1 u1,…, u n u_n un}和V ={ v 1 v_1

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值