32章习题—最大流的更新字符串匹配

Posted 之墨_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了32章习题—最大流的更新字符串匹配相关的知识,希望对你有一定的参考价值。

HW 10 \\textHW 10 HW 10

1. (最大流的更新) 设 G = ( V , E ) G=(V,E) G=(V,E)是一个源结点为 s 汇结点为 t 的流网络,其容量全部为整数值。假定我们已经给定 G 的一个最大流。
a. 如果将单条边 ( u , v ) ∈ E (u, v) ∈ E (u,v)E 的容量增加 1 个单位,请给出一个 O ( V + E ) O(V +E) O(V+E) 时间的算法来对最大流进行更新。

根据最小割最大流定理,如果边 ( u , v ) (u,v) (u,v)不在某一个最小割中,那么增加 ( u , v ) (u,v) (u,v)的容量不会改变最大流,此时最大流不需要更新。
如果边 ( u , v ) (u,v) (u,v)在一个最小割中,在Ford-Fulkerson算法的一次循环中,可以找到一条增广路径,并且最大流将增加,使用广度优先搜索BFS在残存网络中寻找一个增广路径,需要的时间为 O ( V + E ) O(V+E) O(V+E)
b. 如果将单条边 ( u , v ) ∈ E (u,v) ∈ E (u,v)E 的容量减少 1 个单位,请给出一个 O ( V + E ) O(V +E) O(V+E) 时间的算法来对最大流进行更新。
如果边 ( u , v ) (u,v) (u,v)的流量已经小于容量即 f ( u , v ) < c ( u , v ) f(u, v) < c(u, v) f(u,v)<c(u,v),则最大流不需要更新。否则,使用BFS在 O ( V + E ) O(V + E) O(V+E)的时间内确定一条从源到汇包含边 ( u , v ) (u,v) (u,v)的路径,将路径上所有边容量的均减少1,则最大流会相应减少1,由a可知,可以通过寻找增广路径确定最大流的更新。

2. 对字母表 Σ = a , b Σ = \\a,b\\ Σ=a,b,画出与模式 a b a b b a b b a b a b b a b a b b a b b ababbabbababbababbabb ababbabbababbababbabb 对应的字符串匹配自动机的状态转换图

123456789101112131415161718192021
ababbabbababbababbabb
状态ab
010
112
230
314
435
560
617
738
890
9110
10110
11112
12313
13140
14115
15168
16117
17318
18190
19120
20321
2190

3. 给定字符串 S [ 0 , . . . n − 1 ] , S S[0,...n−1],S S[0,...n1],S 中仅包含字符 a , b a,b a,b。模式串 P [ 0... m − 1 ] , m ≪ n P[0...m−1],m ≪ n P[0...m1],mn,且 P 由字符 a , b , ∗ a,b,* a,b, 组成,字符 ∗ * 可以匹配任意单个字符,即 ∗ * 可以取代 a a a 或者 b b b,但必须取代一个字符。输出 P P P S S S 中所有匹配的位置。例如 S = a b a b b a b . P = a b ∗ S=a b a b b a b. P = a b ∗ S=ababbab.P=ab, 输出为 0 , 2 0,2 0,2
a. 给出时间复杂度为 O ( n lg ⁡ n ) O(n\\lg n) O(nlgn) 的串匹配算法。
(提示: 将问题转化为多项式相乘问题,多项式相乘可通过 FFT 算法获得 O ( n lg ⁡ n ) O(n\\lg n) O(nlgn) 的时间复杂度。)

定义字符串的匹配函数为 C ( x , y ) = P ( x ) − S ( y ) C(x,y)=P(x)-S(y) C(x,y)=P(x)S(y),由于存在字符"*"可以匹配任意字符,所以需要重新定义匹配函数,设字符 * 的数值为0,则匹配函数为 C ( x , y ) = [ P ( x ) − S ( y ) ] 2 P ( x ) S ( y ) C(x,y)=[P(x)-S(y)]^2P(x)S(y) C(x,y)=[P(x)S(y)]2P(x)S(y),则当字符匹配时,满足 C ( x , y ) = 0 C(x,y)=0 C(x,y)=0,即P的第x个字符和S的第y个字符匹配。由此,再定义完全匹配函数 T ( x ) = ∑ i = 0 m − 1 [ P ( i ) − S ( x − m + i + 1 ) ] 2 P ( x ) S ( y ) T(x)=\\sum_i=0^m-1[P(i)-S(x-m+i+1)]^2P(x)S(y) T(x)=i=0m1[P(i)S(xm+i+1)]2P(x)S(y),当 T ( x ) = 0 T(x)=0 T(x)=0,则说明称S以第x位结束的连续m位,与模式串P完全匹配。通过上述定义匹配函数,翻转模式串P,将完全匹配函数整理得到卷积形式,即将问题转换为多项式相乘的问题后,就可以使用FFT算法即可在 O ( n lg ⁡ n ) O(n\\lg n) O(nlgn)时间内解决

b. 考虑增大字符种类, S S S 中包含字符 A , C , G , T A,C,G,T A,C,G,T 字符,而 P P P 中包含 A , C , G , T , ∗ A,C,G,T,* A,C,G,T, (DNA 链匹配问题),可根据 a a a 中结论得出 O ( n lg ⁡ n ) O(n\\lg n) O(nlgn) 的算法。
定义匹配函数,设字符"*"的数值为0,则匹配函数为:
C ( x , y ) = [ P ( x ) − S ( y ) ] 2 P ( x ) S ( y ) C(x,y)=[P(x)-S(y)]^2P(x)S(y) C(x,y)=[P(x)S(y)]2P(x)S(y)
​ 完全匹配函数为:
T ( x ) = ∑ i = 0 m − 1 [ P ( i ) − S ( x − m + i + 1 ) ] 2 P ( x ) S ( y ) T(x)=\\sum_i=0^m-1[P(i)-S(x-m+i+1)]^2P(x)S(y) T(x)=i=0m1[P(i)S(xm+i+1)]2P(x)S(y)
​ 将模式串P翻转,设:
X ( i ) = P ( m − i − 1 ) X(i)=P(m-i-1) X(i)=P(mi1)
​ 则完全匹配函数为
T ( x ) = ∑ i = 0 m − 1 [ X ( m − i − 1 ) − S ( x − m + i + 1 ) ] 2 X ( m − i − 1 ) S ( x − m + i + 1 ) ] T(x)=\\sum_i=0^m-1[X(m-i-1)-S(x-m+i+1)]^2X(m-i-1)S(x-m+i+1)] T(x)=i=0m1[X(mi1)S(xm+i+1)]2X(mi1)S(xm+i+1)]
​ 展开得到

以上是关于32章习题—最大流的更新字符串匹配的主要内容,如果未能解决你的问题,请参考以下文章

网络流--最小费用最大流 (理解)

java编程思想-第13章-某些练习题

网络操作系统第五章习题

算法设计与分析 实验六 最大流解决论文评审问题

第2章 排序 || 第20节 相邻两数最大差值练习题

DX12龙书第6章习题