STATUS: NOMINAL LOCAL TIME: 00:00:00 返回园内

最短超串问题

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\)满足:

  1. \(e\)的权重最大
  2. \(e\)与之前已选的边构成的子图可以被扩展成哈密顿路径

于是计算近似SCS的主要步骤如下:

  1. 计算S中字符串之间的最大重叠长度。
  2. 构造重叠图,找到近似最长哈密顿路径\(H\),并构造超串\(p(H)\)

步骤一:为了求字符串\(x\)\(x'\)的最大重叠,可以通过字符串匹配算法来解决,比如KMP算法,在\(x\)的最后一个字符匹配时,\(x'\)的已匹配长度就是最大重叠。

步骤二:之前提到贪心构造哈密顿路径的方法,关键在于怎么选边\(e\)
规定,当\(x\)不是已选边的起点,\(y\)不是已选边的终点,且选择\((x,y)\)加入已选子图不会产生回路时,边\((x,y)\)是可选的。下面给出构造哈密顿路径\(H\)详细步骤:

  1. \(H\)初始为空,将边集按照边权从大到小排序
  2. 遍历边\((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.

posted @ 2026-05-28 19:03  猫爹爱猫娘  阅读(13)  评论(0)    收藏  举报