8.1.1 数据存储和检索
数据访问的基本方式是基于存储位置。
找到数据的存储位置,称为检索。
概述
数据检索牵涉两个方面,一是已存储的数据集合,二是用户检索时提供的信息。检索可以是确定特定数据是否存在于数据集中;也可以是找到与所提供信息相关的数据。后一方式中,用户提供的信息被看作检索码或关键码。关键码作为数据的一部分,存储在数据集里,这就是基于关键码的数据存储和检索。
作为检索基础的关键码,通常是数据项的某种(可能具有唯一性)特征,可以是数据内容的一个组成部分;也可以是专门为数据检索建立的标签,例如学生的学号。
下面的讨论都是基于这样的基本假设:需要存储的数据元素由两部分组成,一是与检索有关的关键码,二是与之关联的数据。
字典操作和效率
实际中使用的字典可以分为两类:
1)静态字典:创建之后,字典内容和结构都不再变化,主要操作只有检索。
2)动态字典:创建之后,字典内容或结果一直处于动态变动之中,除检索操作之外,还有数据项的插入和删除等。
在字典检索中,要么检索成功要么检索失败。有关检索效率的评价标准,通常考虑在一次完整检索过程中比较关键码的平均次数,即平均检索长度。
字典和索引
索引:从关键码到数据存储位置的映射。
8.1.2 字典实现的问题
字典抽象数据类型
各种字典中都不应该允许修改关键码。
字典元素:关联
基于基本假设,一个数据项包括关键码和数据两部分,可以看成一个二元组,称之为关联。
下面定义一个关联对象的类:
1 class Assoc: 2 def __init__(self, key, value): 3 self.key = key 4 self.value = value 5 6 # python解释器遇到"<"就会去类里找该方法 7 def __lt__(self, other): 8 return self.key < other.key 9 10 def __le__(self, other): 11 return self.key <= other.key 12 13 def __str__(self): 14 return 'Assoc({0},{1})'.format(self.key, self.value)
字典的实现
一个细节。字典插入有一个特殊情况:要求插入的关键码已经在字典里了。常见处理方式包括修改已有关键码对应的值,或者插入一个新数据项,或者报错。与之对应,执行删除操作时,可能未找到相应项,或者存在多个关键码相同的项。如何处理视需求而定。
下面采用较简单的方式:如果插入时遇到关键码相同的项,就修改对应值;如果删除时没找到相应项,就什么都不做。