在复习的时候,遇到了一些令人头大的概念,包括rep、RI、AF等等,这篇文章就是为了整理相关概念,尽量把这些东西能够讲清楚。
1、表示空间和抽象空间
我们使用R表示表示空间(值空间),由实际实现实体的值组成。
ADT将作为单个对象实现,但更常见的是需要一个小的对象网络,因此值通常是相当复杂的东西。
我们使用A表示抽象空间,由该类型设计支持的值组成。
它们是理想的实体,并不像描述的那样存在,但它们是我们想要查看抽象类型元素的方式,作为该类型的客户端。例如,无界整数的抽象类型可能将整数作为其抽象值空间;它可能被实现为一个简单的(有界)整数的数组,这一事实与类型的用户无关。
ADT开发者关注表示空间R,client关注抽象空间A。
每个抽象值都会被一些表示值映射到,即从R到A的映射是满射。实现抽象类型的目的是支持对抽象值的操作。通常情况下,我们将需要能够创建和操作所有可能的抽象值,因此它们必须是可表示的。
一些抽象值可能被多个表示值映射到,即从R到A未必是单射。这是因为表示不是一种严格的编码。如:将无序字符集表示为字符串的方法不止一种。
不是所有的表示值都会被映射到,即从R到A未必是双射。假设我们定义字符串不应该包含重复项,因此“abbc”项是不会被映射到的。
2、AF(Abstraction Function)
定义:抽象函数是R和A之间映射关系的函数,即如何将R中的每一个值解释为A中的每一个值。(AF:R→A)
性质:AF是满射、非单射、未必双射的,即R中的部分值并非合法的,在A中无映射值。
一般情况下,AF可以使用数学语言表示这种映射,也可以使用文字进行描述。比如如下文字:represents the set of characters found in s,只需要用自然语言你的表示值解释清楚即可。
3、RI(Rep Invariant)
在了解RI之前,你首先需要解决rep的定义。rep指表示值,你可以简单地理解为你在class里定义的成员变量,就是你用来表示抽象值的具体实现。
定义:表示不变量RI是一个从R到布尔值(boolean)的变量。对于一个表示值r,RI(r)为真,当且仅当r可以被AF映射到。换句话说,RI告诉我们给定的表示值是否“良好”。或者,你可以将RI看作是一个集合:它是定义AF的代表值的子集。
(小声哔哔:不要被这个“表示不变量”迷惑到,RI表示的其实就是一个规则,满足这个规则的rep即为合法的,这个映射值为true)
表示不变性RI:某个具体的“表示”是否是“合法的”。也可以将RI看作所有表示值的一个子集,包含了所有合法的表示值。也可以将RI看作一个条件,描述了什么是“合法”的表示值。
一般情况下,你可以使用自然语言描述这样的条件(或者规则),比如如下文字:s contains no repeated characters,同样地,把事情讲述清楚即可。