最短超串问题
SCS: Shortest Common Superstring
问题描述
口语化描述:给定一系列字符串,求一个最短的字符串,使得给定的所有字符串都是该字符串的子串。例如:
ABC
BCD
DEF
这些字符串的SCS就是"ABCDEF"。
严格描述:给定在字符串集合\(S\),找到最短的字符串\(w\),使得\(\forall x \in S\),\(x\)是\(w\)的子串,即\(w=uxv\)。
判定版本:输入\(S\)和\(k\),\(S\)是否存在长度为\(k\)的superstring。
字符串压缩:C语言中字符串都是用char*指针指向内存中的区域,其实就只需要存这些字符串的superstring就行。
哈密顿路径可以规约到SCS问题
分析
如果我们要找一个最短的超串,本质上就是希望所有字符串拼接时重叠的总长度越大越好
Lemma1:若字符串集合S中有字符串x和y,且x是y的子串,则S和S-{x}的SCS相同
所以后面讨论的S内部不存在x是y的子串。
对\(S=\{x_1,...,x_m\}\)定义重叠图:顶点集合为 \(S\cup\{x_0, x_{m+1}\}\),有向边\((x_i, x_j)\),有权重\(w_{ij}\),为\(x_i\)和\(x_j\)的最大重叠长度。
特别地,\(\forall j \in [1,m], w_{0j}=w_{jm+1}=0\)。
若在重叠图上找到一条从\(x_0\)到\(x_{m+1}\)的哈密顿路径\(H\),那么可以沿着H把字符串依次写下来,\(y_1, ..., y_{m}\),再考虑\(y_i\)和\(y_{i+1}\)重叠的部分,其实就是对应有向边的权重,设为\(z_i\),则\(y_i = z_iv_i\)。再依次写下H经过的字符串,且重叠部分只写一边,得到超串\(p(H)=z_1z_2...z_{m-1}y_m\)。
显然\(|p(H)|=\sum_{i=1}^{m}|y_i|-\sum_{i=1}^{m-1}|v_i|=\sum_{i=1}^{m}|x_i|-|H|\)。当H为最长哈密顿路径时,\(p(H)\)最短。

Theorem1:当\(H\)为最长哈密顿路径时,\(OPT\)就是\(p(H)\)。
如何证明\(OPT\)就是\(p(H)\)呢?仿照写出\(p(H)\)的方式,\(OPT\)也可以分解成若干个字符串连接的形式,令\(OPT\)由\(x_1x_2...x_m\)依次重叠而成,\(u_i\)表示\(x_i\)和\(x_{i+1}\)的重叠部分,它肯定是最长的(见Lemma2),则\(x_i=t_iu_i\),那么\(OPT=t_1t_2...t_{m-1}x_m\)。
Lemma2:\(x_i\)和\(x_{i+1}\)的最长重叠为\(u_i\)。
证明:假设存在i使得\(x_i\)和\(x_{i+1}\)的最长重叠为\(u\),\(|u|>|u_i|\),令\(x_i=t_{i}'u'\),则\(|t_{i}'|<|t_i|\),有超串\(t_1...t_{i-1}t_{i}'t_{i+1}...t_{m-1}x_m\),而\(OPT\)是\(t_1...t_{i-1}t_{i}t_{i+1}...t_{m-1}x_m\),则OPT不是最短的,矛盾。
这满足了重叠图的性质,因此在重叠图中,可以通过\(OPT\)找到一条哈密顿路径,其长度为\(\sum_{i=1}^{m}|u_i|=\sum_{i=1}^{m}|x_i|-|OPT|\),由于\(OPT\)是最短的,则路径是最长的,所以\(OPT = p(H)\)。
贪心算法
上面证明了SCS可以规约到最长哈密顿路径问题,而这是NP-Hard问题,并且有一个贪心算法:
从重叠图剩余边中选择一条边\(e\)满足:
- \(e\)的权重最大
- \(e\)与之前已选的边构成的子图可以被扩展成哈密顿路径
于是计算近似SCS的主要步骤如下:
- 计算S中字符串之间的最大重叠长度。
- 构造重叠图,找到近似最长哈密顿路径\(H\),并构造超串\(p(H)\)。
步骤一:为了求字符串\(x\)和\(x'\)的最大重叠,可以通过字符串匹配算法来解决,比如KMP算法,在\(x\)的最后一个字符匹配时,\(x'\)的已匹配长度就是最大重叠。
步骤二:之前提到贪心构造哈密顿路径的方法,关键在于怎么选边\(e\)。
规定,当\(x\)不是已选边的起点,\(y\)不是已选边的终点,且选择\((x,y)\)加入已选子图不会产生回路时,边\((x,y)\)是可选的。下面给出构造哈密顿路径\(H\)详细步骤:
- \(H\)初始为空,将边集按照边权从大到小排序
- 遍历边\((x,y)\),如果是可选的,则执行:
2.1. 将\((x,y)\)加入\(H\)中
2.2. 标记\(x\)为起始点,\(y\)为终点
2.3. 从\(y\)开始顺序遍历\(H\)到\(y'\),从\(x\)开始逆序遍历\(H\)到\(x'\),标记\((y',x')\)为会产生回路的边

算法总时间复杂度为\(O(mn)\),\(m\)为字符串数量,\(n\)为字符串总长。
近似比分析
按照重叠图方式构造的SCS,不方便直接分析\(p(H)\)与\(OPT\)的关系,因为\(p(H)= n - |H|\),近似过程产生的是\(H\),所以应该分析的是\(|H|\),即算法输出相对于总长压缩的长度,令\(H_{max}\)为最长哈密顿路径,给出结论\(|H| \geq \frac{1}{2}|H_{max}|\)。
为了证明这一点,给出以下定义:
给定两条边\(r\)和\(s\),若\(r\)和\(s\)有相同起点,记作\(r\leftarrow\rightarrow s\),若有相同终点,记作\(r\rightarrow\leftarrow s\)。
记边\(r\)的权重为\(w(r)\)。
若字符串\(x\)有最长的相同前缀后缀,即\(x=vu=u'v\),则记\(x\)是自重叠的。
Lemma3.
(a) 若\(t\leftarrow\rightarrow r\),\(t\rightarrow\leftarrow s\),且\(w(r)\leq w(t)\),\(w(s)\leq w(t)\),\(r\)的终点不是\(s\)的起点,则存在边\(q\)满足\(q\leftarrow\rightarrow s\),\(q\rightarrow\leftarrow r\),且\(w(q)\geq w(r)+w(s)-w(t)\)。
(b) 令\(t,r,s\)满足(a)中条件,假设\(r\)的终点\(z\)是\(s\)的起点,那么\(z\)有自重叠的长度\(\geq w(r)+w(s)-w(t)\)。

证明:(a) 显然\(w(r)+w(s)\leq w(t)\)时一定满足,所以假设\(w(r)+w(s)> w(t)\),\(t\)的起点有后缀\(a_1...a_{w(t)}\),同时也有后缀\(a_{w(t)-w(r)+1}...a_{w(t)}\),t的终点有前缀\(a_{1}...a_{w(s)}\),那么\(r\)和\(s\)的公共终点有前缀\(a_{w(t)-w(r)+1}...a_{w(s)}\),因此对应边\(q\)有\(w(q)\geq w(r)+w(s)-w(t)\)。
(b)此时\(s\)的起点有前缀\(a_1...a_{w(s)}\),r的终点有后缀\(a_{w(t)-w(r)+1}...a_{w(t)}\),两点为同一点,说明该点有相同前后缀,长度至少为\(w(r)+w(s)-w(t)\)。
接下来证明近似比至少有1/3:
令\(H\)包含边\(t_1,t_2,...,t_{m+1}\),考虑算法在某一次选择了\(t_{i}\)并做完相关标记,令\(H_i=\{t_1,...,t_i\}\),初始\(H_0\)为空。另外,令\(K_i\)表示\(H_{max}\)包含的边中可选的部分。
最初,\(K_0 = H_{max}\),
随着算法执行,\(t_{i}\)被加入\(H\),有\(K_i=(K_{i-1}-\{r,s,p,t_i\})\cup \{q\}\)。
\(r\)满足\(t\leftarrow\rightarrow r\),\(s\)满足\(t\rightarrow\leftarrow s\),\(p\)满足加入\(p\)到\(H_{i-1}\)中会产生回路,其实\(r,s,p\)就是\(t_{i}\)加入\(H_{i-1}\)后被标记的边,这些边自然不再可选,连带着\(t_{i}\)本身,要从\(K_{i-1}\)中删去。
每次贪心选择至多从\(H_{max}\)中删去3条正确的边,并且被选的边的权重不会比被删去的边的权重更小。这说明,算法找到的\(|H|\)至少为\(|H_{max}|\)的三分之一。
上述推理是针对最长哈密顿路径的,没有利用到SCS蕴含的信息,即Lemma3,下面给出一个更好的近似比:
根据Lemma3(a),当存在\(r\)和\(s\)且\(r\)的终点\(z\)和\(s\)的起点\(z'\)不是同一点时,一定存在边\(q\)满足
\(w(t_i)+w(q)\geq w(r)+w(s)\)
如果\(q\)仍然是可选的(即它没有被标记为\(p\)),则加入\(K_{i-1}\)中,由于\(t_{i}\)和\(q\)的权和不小于\(r\)和\(s\)的权和,说明\(q\)的加入补偿了\(r,s\)的删除,如果每次都能加入\(q\),平均每次选择至多删除2条正确的边。
但是这显然没有考虑到\(q\)是不可选的情况。
根据贪心选择的操作,\(H_i \cup K_i\)中不存在两条边有相同起点或相同终点,令\(G_i\)表示\(H_i \cup K_i\)构成的子图,对\(i=0,...,m+1\)满足以下性质:
Property G1. 子图\(G_i\)有不相交的路径和回路
Property G2. \(G_i\)中的每个回路至少有两条边来自\(K_i\)
令\(c_i\)表示\(G_i\)中回路数量,声明:\(2|H_i|+|K_i|-c_iw(t_i) \geq |H_{max}|\)
证明:\(i=0\)时,\(H_i\)为空,\(K_i=H_{max}\),\(c_i=0\),满足;
假设\(i-1\)满足该式,考虑第\(i\)步选择的边\(t=t_i=(x,y)\):
分了7种情况讨论,最终归纳证明。
那么对于算法结束时的\(i=m+1\),\(H_{m+1}=H\),由性质G1和G2得\(K_{m+1}\)为空,\(c_{m+1}=0\),则\(2|H|\geq H_{max}\),证毕。
例:\(S=\{ab^h,b^hb,b^ha\}\),则最优解为\(ab^hba\),而贪心算法的重叠图如下:

输出\(ab^hab^hb\),发现\(|H|=h\)而\(|H_{max}|=2h\)。
Reference
Jorma Tarhio, Esko Ukkonen,
A greedy approximation algorithm for constructing shortest common superstrings,
Theoretical Computer Science,
Volume 57, Issue 1,
1988,
Pages 131-145,
ISSN 0304-3975,
https://doi.org/10.1016/0304-3975(88)90167-3.
(https://www.sciencedirect.com/science/article/pii/0304397588901673)
Abstract: An approximation algorithm for the shortest common superstring problem is developed, based on the Knuth-Morris-Pratt string-matching procedure and on the greedy heuristics for finding longest Hamiltonian paths in weighted graphs. Given a set R of strings, the algorithm constructs a common superstring for R in O(mn) steps where m is the number of strings in R and n is the total length of these strings. The performance of the algorithm is analysed in terms of the compression in the common superstrings constructed, that is, in terms of n−k where k is the length of the obtained superstring. We show that (n−k)⩾12(n−kmin) where kmin is the length of a shortest common superstring. Hence the compression achieved by the algorithm is at least half of the maximum compression. It also seems that the lengths always satisfy k⩽2·kmin but proving this remains open.

浙公网安备 33010602011771号