程序原本(三十九):程序设计的核心思想——数据结构:散列存储(欢迎来到“名 / 值”数据的世界)

阅读数:35 2019 年 9 月 28 日 18:29

程序原本(三十九):程序设计的核心思想——数据结构:散列存储(欢迎来到“名/值”数据的世界)

此前我们讨论到,所有的数据最终都可以被抽象为数组,或者说我们此前讨论的所有数据类型都可以视为数组类型的转义。我们也讨论到,如果一个数组能确定长度,则它总能在运行前被顺序存储;如果它不能确知长度,也可以通过指针来保证在运行中实现顺序存储。

但是我们似乎多了一个题设。我们需要设问:顺序存储是必须的吗?

顺序存储的必要性在于:

  • 运算器需要通过一种简单的方法来找到数据;
  • 可以通过地址的余量来确知存储的占用情况,进而给程序员控制它的可能。

但是这两项条件都是与机器实现有关的,前者是运算器寻址的需求,后者是存储器容量的限制。而这些——我们必须强调在思想上要突破所有的限制——不是“计算”所必须的。换言之,一个计算过程仅仅是需要数据,并没有限制用何种手段来获得数据

据此,只要其抽象结果不会影响计算过程,我们就可以将数据的那些仅仅应用于具体语言实现的抽象概念一一抽离。仍以下面的代码为例:

复制代码
var
Number aNum = 100;

这一句代码(的语法),对应着四个语义:

  • 有一个标识,记为aNum
  • 其数据类型为Number
  • 标识所指代的数据,其值是可变的(即,变量var);
  • 该数据当前值为 100。

当我们把“值可变”与“当前值”这两个——由存储问题推导出来的——概念抽离之后,一个数据就只有三个普遍含义了:

  • 名字,即标识:aNum
  • 值,即数据:100
  • 类型,即数据类型:Number

此前我们也提到过,顺序存储中我们可以将所有数据类型都视为数组的转义,因此我们也可以把“数据类型”从这样的系统抽象中抽离——当一个事物不存在类别含义时,也就无需识别它了。这样,这个数据抽象系统就只剩下了1

1 本质上来说,我们是回到了对“数据的性质”的讨论,参考本书第 1 章。

复制代码
aNum = 100

现在,我们来到了“名 / 值”(name/value pair)数据的世界。

评论

发布