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 对应的字符串匹配自动机的状态转换图
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
a | b | a | b | b | a | b | b | a | b | a | b | b | a | b | a | b | b | a | b | b |
状态 | a | b |
---|---|---|
0 | 1 | 0 |
1 | 1 | 2 |
2 | 3 | 0 |
3 | 1 | 4 |
4 | 3 | 5 |
5 | 6 | 0 |
6 | 1 | 7 |
7 | 3 | 8 |
8 | 9 | 0 |
9 | 1 | 10 |
10 | 11 | 0 |
11 | 1 | 12 |
12 | 3 | 13 |
13 | 14 | 0 |
14 | 1 | 15 |
15 | 16 | 8 |
16 | 1 | 17 |
17 | 3 | 18 |
18 | 19 | 0 |
19 | 1 | 20 |
20 | 3 | 21 |
21 | 9 | 0 |
3. 给定字符串
S
[
0
,
.
.
.
n
−
1
]
,
S
S[0,...n−1],S
S[0,...n−1],S 中仅包含字符
a
,
b
a,b
a,b。模式串
P
[
0...
m
−
1
]
,
m
≪
n
P[0...m−1],m ≪ n
P[0...m−1],m≪n,且 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=0m−1[P(i)−S(x−m+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=0∑m−1[P(i)−S(x−m+i+1)]2P(x)S(y)
将模式串P翻转,设:
X
(
i
)
=
P
(
m
−
i
−
1
)
X(i)=P(m-i-1)
X(i)=P(m−i−1)
则完全匹配函数为
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=0∑m−1[X(m−i−1)−S(x−m+i+1)]2X(m−i−1)S(x−m+i+1)]
展开得到
以上是关于32章习题—最大流的更新字符串匹配的主要内容,如果未能解决你的问题,请参考以下文章