[TAOCP 1.1]对加入效率要求的算法的形式化定义的理解
在算法的形式化定义中,Q可能是无限集合,f可能是很复杂的操作,不满足本章提到的效率要求。因此作者提出了更具效率的形式化定义。其基本思想是将一个状态映射为一个字符串,如何映射应该是难点,但作者没有在这里详细描述。状态映射为字符串之后,f变为字符串操作,具有效率,但我觉得Q仍可能是无限集合。
除了Q,I,Ω,f之外,这里又引入了几个符号:
A: 有限集合,包含状态字符串可能用到的字母。通常将是输入中的每个元素和每个运算过程中产生的中间元素映射为一个字母。
$A^*$: 使用A中字母表达的状态的集合,注意这里没有使用$A^*$作为Q。
$\sigma$: 使用字符串表达的状态,是$A^*$中的元素。
j: 状态的数字索引。
Q,I,Ω定义如下:
Q: ($\sigma$,j)的集合,在状态上加入了其索引。
I: ($\sigma$,0)。
$\Omega$: ($\sigma$,N)。
f的定义如下:
f(($\sigma$,j)) = ($\sigma$, $a_j$) if $θ_j$ does not ocur in $\sigma$;
f(($\sigma$,j)) = ($\alpha\phi_j\omega,b_j$) if $\alpha$ is the shortest possible string for which $\sigma$ = $\alpha$$θ_j$$\omega$;
f(($\sigma$,N)) = ($\sigma$,N).
第三行表示最终状态,主要看前两行。这里的关键是判断$θ_j$是否包含于$\sigma$,是否包含是字面意思,实际表达的是状态$\sigma$是否满足$θ_j$代表的条件。如果条件不满足,按第一行操作,状态迁移到$a_j$;如果条件满足,按第二行操作,用$\phi_j$替换$θ_j$,相当于对数据做转换,然后状态迁移到$b_j$。
下面用这种有效率的形式化定义表达E算法。
首先确定A中包含哪些字母,对于输入m,n,这里用字母a的数目代表m,字母b的数目代表n,用字母c的数目代表r(r = |m - n|)。因此A = {a,b,c}。
f可以这样定义:
f(($\sigma$,0)) = (remove ab from $\sigma$,1) if $\sigma$ contains ab, ($\sigma$,2) otherwise; 这里$θ_j$ = ab, $\phi_j$ = (empty)
f(($\sigma$,1)) = (add c at extreme left to $\sigma$,0); 这里$θ_j$ = (empty), $\phi_j$ = c
f(($\sigma$,2)) = (change all a's to b's,3); 这时b已经不存在,c的数目是原来b的数目,a的数目即r,这里相当于$n\leftarrow r,\;θ_j=a,\;\phi_j=b$
f(($\sigma$,3)) = (change all c's to a's, 4); 这里相当于$m\leftarrow n,\;θ_j=c,\phi_j=a$
f(($\sigma$,4)) = ($\sigma$) if no b in $\sigma$; ($\sigma$,0) otherwise. b是余数r,如果余数是0,则$\sigma$中a的数目即输出;否则进入下一轮迭代。