哈希函数是哈希结构的重要组成部分,一个好的哈希函数可以提高查询的效率。在python中有两个数据结构是哈希结构实现的,分别是set集合和dict字典。那么这篇文章主要想带大家实现一个简单的字典的结构,也就是hashmap,这个数据结构是由一个个的键值对(k,v)组成。
假定k,v都是int的整数类型,哈希函数我们使用最经典的取模运算
对于哈希函数会存在key取模后值相同的这种情况,处理办法就是我们采用python自带的数据结构list来线性存储值相同的value
注:由于我们要实现字典的功能,所以存储key,value的数据结构需要我们自己来实现
实现hashmap的组件
对于hashmap这个数据结构,常用方法就是增删改查,具体的实现方法就是对应get(),put(),delete()这个三个函数,我们假定哈希函数为key%1000,存储kv键值对的数据结构如下:
[ [] for i in range(1000) ]
初始化一个包含有1000个空list的二维list,其中空的list中存放的就是含有键值对的对象
键值对的对象代码如图
这个对象需要具备获取key的值(getKey()这个方法),更新key的值(setKey()这个方法),获取value的值(getValue()这个方法),更新value的值(setValue()这个方法),在线性的list中存放的就是Dic这个对象,通过Dic这个对象来实现键值对的增删改查
在基础的元数据结构准备好之后,我们可以开始hashmap的接口(get,put,delete)的实现
- put()方法
如图,hashmap就是初始化好的二维list,通过k的哈希运算(self.mod)得出这个键值对存放的位置,如果bucket为空,说明这个list之前还没有放入元素,那么就可以就直接将生成的dic对象append到bucket中。如果bucket不为空,那么我们就开始遍历整个的bucket列表,如果k之前已经存在bucket中那么就直接更新value的值,当bucket中存在-1的key值,那么说明之前这个位置的dic已经被删除,可以将新的dic覆盖更新到已经删除的这个位置上。如果bucket中没有-1的key并且也没有与dic的相等的key,这个时候就将dic直接append到bucket中就可以了
- get()方法
对于get方法,同理先将获取到的k进行哈希运算得到存放dic的位置,然后遍历bucket,如果存在与k相等的key,通过getValue()返回获取的值,如果遍历完成也没有与k相等的key,说明之前没有存放这个k,返回-1
- delete()方法
delete删除方法的实现,本质上没有将dic对象从list中移除,而是将dic的key值置为-1,这样新的元素遇到删除的位置可以直接覆盖使用,没有必要在遍历到bucket的最后端去开辟一个新的内存空间存放dic元素
由于篇幅的原因,想看完整代码的读者可以咨询作者,欢迎大家关注桓艺恒,一块学习讨论互联网的技术