算法导论32.3 Exercises 答案
32.3-1
本题的状态集合$Q={0,1,2,3,4,5}$,起始状态$q_0=0$,接受状态为${5}$。
针对模式串$P=\texttt{aabab}$在字符集$\Sigma={a,b}$上的状态函数$\delta(s,c)$如下表所示。
$\begin{array}{|c|c|c|c|c|c|c|}\hline
s&0&1&2&3&4&5\\hline
\texttt{a}&1&2&2&4&2&1\\hline
\texttt{b}&0&0&3&0&5&0\\hline
\end{array}$
由此,对于文本串$T=\texttt{aaababaabaababaab}$,它的状态转移序列为$0,1,2,2,3,4,5,1,2,3,4,2,3,4,5,1,2,3$,由此$P$在$T$中出现了两次,分别为偏移量为$1$和$9$时出现。
32.3-2
本题的状态集合$Q={0,1,2,3,\dots,20,21}$,起始状态$q_0=0$,接受状态为${21}$。
针对模式串$P=\texttt{ababbabbababbababbabb}$在字符集$\Sigma={a,b}$上的状态函数$\delta(s,c)$如下表所示。
$\begin{array}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|}\hline
s&0&1&2&3&4&5&6&7&8&9&10&11&12&13&14&15&16&17&18&19&20&21\\hline
\texttt{a}&1&1&3&1&3&6&1&3&9&1&11&1&3&14&1&16&1&3&19&1&3&9\\hline
\texttt{b}&0&2&0&4&5&0&7&8&0&10&0&12&13&0&15&8&17&18&0&20&21&0\\hline
\end{array}$
32.3-3
假设$P$的长度为$m$。$P[:k]\sqsupset P[:q]$推导出$k=0\lor k=q$意味着这个字符串只要产生了一次失配,那么就必须从头开始匹配,这意味着任何不以$P[1]$为开头的字符串是$P$的一个前缀,因此,这种模式串一般是$\forall i\in[2,n],P[1]\neq P[i]$成立。
对于这种模式串,它的状态转移函数$\delta(s,c)(s\in[0,m],c\in\Sigma)$如下:
$\delta(s,c)=
\left {\begin{aligned}
&0 & & \text{if}\quad s=m\lor s<m \land P[s+1]\neq c \
&s+1 & & \text{if}\quad s<c\land P[s+1]=c \
\end{aligned}\right.$
32.3-4
由于$x\sqsupset y$,因此有$|x|\le |y|$。又因为$x,y$同为$P$的前缀,因此有$x\sqsubset y$。
按照$\sigma$的定义,有$\sigma(x)= |x|$。但是因为$x\sqsubset y,x\sqsupset y$,因此$\sigma(y)\ge |x|$。最终有$\sigma(x)\le \sigma(y)$。
32.3-5
最少的状态数即为合并$P$和$P’$的最长公共前缀作为共同状态。更一般的说,令$P$和$P’$的最长公共前缀的状态为$r=\max{i:P[:i]=P’[:i]}$,那么一共有$|P|+|P’|-r-1$个状态,直到第$r$个字符之后,状态才会被分开。具体构建过程由COMPUTE-TRANSITION-FUNCTION'给出。
1 | COMPUTE-TRANSITION-FUNCTION'(P, m, P', m', ∑) |
32.3-6
对于包含通配符$\Diamond$的一个模式串$P$,假设我们将其划分成切割成一个个不包含通配符$\Diamond$的模式串$P_1,P_2,\dots,P_k$,那么将这些状态进行“首尾相接”即可,因为只要进行到当前的模式串$P_i$,那么就不能转移到以前的模式串。可见将会一共有$|P|+1$个状态。
具体过程由COMPUTE-TRANSITION-FUNCTION-GAP给出。
1 | COMPUTE-TRANSITION-FUNCTION-GAP(P, ∑, m) |