[TAOCP 1.1-9]对算法2实现算法1的定义的理解
题目要求定义算法$C_2$实现算法$C_1$,看答案之前,没有任何概念,完全不清楚如何定义。看了答案,发现并不是很难理解,倒是作者举的例子将简单的事情说得复杂,不看也罢。
说算法$C_2$实现算法$C_1$,意味着:两个算法的输入、输出一一对应,$C_1$中的一步状态迁移可以用$C_2$中的多步迁移实现。这个关系直观上理解起来比较简单,但用数学方式表达可能要复杂一些。
首先定义了三个映射关系:
g: $I_1 \rightarrow I_2$
h: $Q_2 \rightarrow Q_1$
j: $Q_2 \rightarrow$ uint
关于映射关系的定义,一定要有一个函数从$C_1$映射到$C_2$,另一个函数从$C_2$映射到$C_1$,否则我们的表达会变成单向的,无法做$C_1 \rightarrow C_2 \rightarrow C_1$这种描述。至于为什么不选择g: $Q_1 \rightarrow Q_2$; h: $\Omega_2 \rightarrow \Omega_1$这种方式,我不清楚。但我想这种方式应该也是可以的,在最后尝试用这种方式定义一下。
三个条件定义如下:
a) If x is in $I_1$ then h(g(x)) = x.
b) If q is in $Q_2$ then $f_1$(h(q)) = h($f_2$[j(q)](q)), where $f_2$[j(q)] means that the function $f_2$ is to be iterated j(q) times.
c) If q is in $Q_2$ then h(q) is in $\Omega_1$ if and only if q is in $\Omega_2$.
a)是表达输入要一一对应。
b)是表达$Q_1$中的一次状态迁移可以用$Q_2$中的j(q)次状态迁移来实现。$f_2$[j(q)]表示状态的迭代,即前一次迭代的输出作为下一次迭代的输入。
c)字面上是说$\Omega_2$要映射成$\Omega_1$的子集,但由于a),b)两条件的限制,$\Omega_1$和$\Omega_2$的元素数目是相等的,所以表达成输出一一对应。if and only if 也表达此含义。
下面使用g,h的新定义尝试一下:
g: $Q_1 \rightarrow Q_2$
h: $\Omega_2 \rightarrow \Omega_1$
j: $Q_2 \rightarrow$ uint
a) If q is in $Q_1$ then g(q) is in $I_2$ if and only if q is in $I_1$.
b) If q is in $Q_1$ then g($f_1$(q)) = $f_2$[j(g(q))](g(q))
c) if q is in $\Omega_2$ then g(h(q)) = q