《编程原本 》一2.5 动作

2.5 动作

在算法里,变换f经常被用在如下形式的语句中
x = f(x);
应用变换去改变对象的状态,就定义了相应对象上的一个动作(action).变换和动作之间有直接的对偶关系,可以基于变换来定义动作,反之亦然:void a(T& x) { x = f(x); } //从变换定义动作以及T f(T x) { a(x); return x; } //从动作定义变换

虽然存在这种对偶关系,但有时独立的实现效率更高,这种情况下就应该分别提供动作和变换.举例说,如果在很大的对象上定义变换,但是只修改整个状态中很小的一部分,采用动作定义就可能大大提高效率.

练习2.6 请用动作的方式重写本章的各个算法.
项目2.1检查环路的另一种方式是反复检查一个不断更新的元素是否与另一个保存着的元素相等,与此同时按一定间隔更新那个保存的元素.Sedgewicketal.[1982],Brent[1980]和Levy[1982]讨论了这种想法和其他想法.请为轨道分析写一些算法,针对不同应用比较它们的性能,并为选择适当的算法提出一组建议.

时间: 2024-09-15 12:52:05

《编程原本 》一2.5 动作的相关文章

《编程原本 》一导读

前 言 本书将演绎方法应用于程序设计,讨论程序与保证它们能正确工作的抽象数学理论之间的联系.书中把反映这些理论的规程(speci.cation),基于这些理论写出的算法,以及描述算法性质的引理和定理一起呈现给读者.这些算法在一种实际程序设计语言里的实现是本书的中心.虽然规程主要是供人阅读,但它们也应该(或者说必须)严格地与非形式化的.供机器使用的代码相结合,必须在通用的同时又是抽象而且精确的.与在其他科学和工程领域里的情况一样,适合作为程序设计的基础的同样是演绎方法.演绎方法能帮助我们将复杂系统

《编程原本 》一第2章 变换及其轨道

第2章 变换及其轨道 本章把变换定义为从一个类型到它自身的规范函数.从一个初始值开始连续应用一个变换,就得到了这个值的轨道.我们要实现一个能确定轨道结构的算法,它只依赖于变换的规范性和轨道的有穷性.这个算法可以应用到不同的领域.例如,可以用它检查一个链接表是否为循环的,或用于分析一个伪随机数生成器.我们将为这一算法推导出一套接口,形式上是一集过程及其参数和结果的定义.对轨道结构算法的分析,使我们可以用最简单的方式介绍自己的编程方法.

《编程原本 》一1.3 对象

1.3 对象 一个存储(memory)就是一集存储字(word),其中每个字有一个地址(address)和一项内容(content).地址是一种固定大小的值,这个大小称为地址长度.而内容是另一固定大小的值,其长度称为字长.通过装载(load)操作可以取得一个地址的内容.通过保存(store)操作改变一个地址所关联的内容.存储的实例如计算机主存里的一组字节,或磁盘驱动器里的一组区块. 一个对象(object)就是一个具体实体的表示,并且是作为某个存储里一个值.对象有状态(state),其状态就是某

《编程原本 》一第3章 可结合运算

第3章 可结合运算 本章讨论可结合的二元运算.可结合性使人可以重组相邻的运算,基于这种重组能力可以得到一个计算二元运算的幂的有效算法.规范性使我们可以用许多程序变换来优化这一算法.我们随后要利用该算法在对数时间里计算各种线性递归,例如计算斐波那契数.

《编程原本 》一3.1 可结合性

3.1 可结合性 二元运算是有两个参数的运算: 二元的加法和乘法是数学的核心概念,常用的这类东西很多,如求较小或较大的值,合取和析取,集合的交与并等.这些运算都是可结合的(associative): 当然,也存在不可结合的二元运算,例如除法和减法. 如果根据上下文完全可以看清所用的可结合二元运算op,我们常用隐式的乘法记法将其写成ab而不是op(a,b).由于可结合性,在涉及两次或多次应用op的表达式里不需要括号,因为所有分组方式都等价:((a0a1))an.1= •••••• =a0((an.

《编程原本 》一1.1 理念范畴: 实体, 类别, 类属

1.1 理念范畴: 实体, 类别, 类属 为了解释什么是对象.类型,以及其他基本的计算机概念,概述一下与这些概念对应的理念范畴是很有帮助的.抽象实体(abstractentity)指永存的不变的事物,而具体实体(concreteentity)指具体的个别的事物,其出现和存在与时间和空间有关.一个属性(attribute)是具体实体与抽象实体之间的一种对应关系,它描述了该具体实体的某种性质.度量或者品质.标识(identity)是我们感知实在世界的一种基本概念,它确定一个事物在随着时间变化中的不变

《编程原本 》一1.2 值

1.2 值 如果不知道如何解释,在计算机里能看到的也就是一些0和1.一项数据(datum)就是一个0和1的有穷序列.一个值类型(valuetype)是一个(抽象或具体)类别和一集数据之间的一个对应关系.对应于某特定实体的数据称为该实体的一个表示(representation);而这一实体称为相应数据的解释(interpretation).我们把一项数据和它的解释称为一个值(value).值的例子如采用大尾格式的32位二进制补码表示的整数;或者用连续的两个32位二进制序列表示的有理数,这两个二进制

《编程原本 》一2.6 总结

2.6 总结 抽象使我们可以定义出一些能用于不同领域的抽象过程.规范性和函数的类型在这里起着最重要的作用:fast和slow能走同一条轨道的基础就是规范性.开发一批专有术语(例如,轨道的类型和规模),是最基础最重要的工作.一些附属类型,例如距离类型,也需要精确地定义.

《编程原本 》一第1 章 基础

第1 章 基础 本章从相关思想的一个简洁分类开始介绍一些术语:值.对象.类型.过程和概念,它们表示了与计算机有关的许多不同的理念范畴.这里还要详细讨论本书的中心观点:规范性.对一个过程,规范性意味着它对相等的参数总返回相等的结果.对一个类型,规范性意味着它应该有相等运算符,以及保证相等关系的拷贝构造函数和赋值.规范性使我们能应用等值推理(使用等值替换)去变换和优化程序.