抽象数据类型"映射"-------ADT Map
python 最有用的数据类型之一: ‘字典’
字典是一种可以保存key-value键值对的数据类型,其中关键码key可用于查询关联的数据值data,这种键值关联的方法称为"映射Map"
ADT Map的结构时键-值关联的无序集合:
- 关键码具有唯一性
- 通过关键码可以唯一确定一个数据值
ADT Map定义的操作如下:
Map():创建一个空映射,返回空映射对象;
put(key,val): 将key-val关联对加入映射中,如果key已存在,将val替换旧关联值;
get(key):给定key,返回关联的数据值,如不存在,则返回None
del: 通过del map[key]的语句形式删除key-val关联
len():返回映射中key-val关联的数目;
in: 通过 key in map的语句形式,返回key是否存在于关联中,布尔值
使用字典的优势在于,给定关键码key,能够很快得到关联的数据值data,为了达到快速查找的目标,需要一个支持高效查找的ADT实现,可以采用列表数据结构加顺序查找或者二分查找,当然,更为合适的是使用散列表来实现,这样查找可以达到最快O(1)的性能,
下面,我们用一个HashTable类来实现ADT Map,该类包含了两个列表作为成员, 其中一个slot列表用于保存key,另一个平行的data列表用于保存数据项
在slot列表查找到一个key的位置以后,在data列表对应相同位置的数据项即为关联数据
H = HashTable()
H[54] = "cat"
H[26] = "dog"
H[93] = "lion"
H[17] = "tiger"
H[77] = "bird"
H[31] = "cow"
H[44] = "goat"
H[55] = "pig"
H[20] = "chicken"
print(H.slots)
print(H.data)
print(H[20])
print(H[17])
H[20] = 'duck'
print(H[20])
print(H[99])
保存key的列表就作为散列表来处理,这样可以迅速查找到指定的key
注意散列表的大小,虽然可以是任意数,但考虑到要让冲突解决算法能有效工作,就应该选择素数