[TAOCP 1.1]对算法的形式化定义的理解

  算法的基本功能是将输入转化为输出。通常,这种转化不是一步就可以完成的,那样太简单,体现不出算法的价值。一个算法要分为诸多步骤来实现,这些步骤将输入转化为中间状态,并不断推进中间状态,使其达到最终状态,即输出。了解这些中间状态是理解形式化定义的关键。

 

  算法定义为四元组(Q,I,Ω,f)。
  
Q: 所有状态的集合。这是静态的集合,定义了算法的处理域。
  
I: 输入状态的集合,即算法的初始状态。I是Q中的子集。
  
Ω: 输出状态的集合,即算法的最终状态。Ω也是Q中的子集。
  
f: 状态间的迁移规则。f将Q中的状态连接起来,使输入状态可以通过一条路径达到输出状态。

 

  达到输出状态后,状态就不应再迁移,需要提供稳定的状态供用户读取输出。所以书中提到:

  f should leave Ω pointwise fixed; that is, f(q) should equal q for all elements q of Ω.

  实际上f无法离开Ω,因为它已经固定在最终状态上了。作者的抽象描述使这里有些难以理解,但实现上极易满足,以至于我们注意不到,即算法结束执行就可以了。

 

  还有一个容易误解的地方。

  Each input x in the set I defines a computational sequence, $x_0, x_1, x_2, \ldots$, as follows:
  $x_0=x \quad and \quad x_{n+1}=f(x_n) \qquad for\;n\ge0.$

  为了避免与下面的输出状态$x_k$混淆,将书中的k改为n。x这时是一次输入,作为I中的一个元素。$x_0, x_1, x_2, \ldots$是输入x引起的各个中间状态,是Q中的元素,而不是I中的元素。$x_0$即初始状态,由x决定。$x_k$在f的作用下进行迁移,直到某一状态$x_k$在Ω中,即达到输出状态(下一状态$x_{k+1}=x_k$)。这时我们说状态终结在k,其中k是最终状态的序号。输入x产生了输出$x_k$。

 

  下面用形式化定义表达算法E。
  
输入是两个正整数m, n。因此I定义为正整数对(m,n)的集合。
  输出是一个正整数n。因此Ω定义为正整数n的集合。(输出的n与输入的n表达含义不同)
  
Q首先包括I和Ω,然后还要包括中间状态。这里算法决定了中间状态有3个:(m,n,r,1),(m,n,r,2),(m,n,p,3)。最后一位的数字表示状态的序号;r表示余数,可能为0;p是进入下一轮迭代的余数,已经不可能是0。
  
f((m,n)) = (m,n,0,1);        f((n)) = (n);
  
f((m,n,r,1)) = (m,n,remainder of m divided by n,2);
  
f((m,n,r,2)) = (n) if r = 0, (m,n,r,3) otherwise;
  
f((m,n,p,3)) = (n,p,p,1).
  
首先,输入x在这里是(m,n)。初始状态$x_0$是(m,n,0,1),其中余数r可以是任意值,这里填为0。输入为单个数字时,表示达到输出状态,输出与输入相同。
  
第一步,取余数,r在(m,n,r,2)状态中才有实际值。
  
第二步,判断r。
  
第三步,输入代换,并进入下一轮迭代,(m,n,r,1)中的r可以是任意值,这里使用p。

 

  该表达可优化如下:
  
f((m,n)) = (m,n,1);        f((n)) = (n);
  
f((m,n,1)) = (m,n,remainder of m divided by n,2);
  
f((m,n,r,2)) = (n) if r = 0, (n,r,1) otherwise.

转载于:https://www.cnblogs.com/dongxuenan/archive/2010/12/04/2213998.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值