配合前置文章食用更佳,传送门如下:
实现Hash表(一)----手写一个简单hash表
问题描述
之前文章中讲到的hash算法实现很复杂,我们可以换其他方式来实现hash表,来降低其复杂度。
一种和链表结合的实现方式
其实就是另一种get_valid_index映射算法
不同的算法主要是在第一映射为index时和处理冲突时不同
-
创建一个list,每个节点用于存储链表头
-
根据key求得index
-
第一种情况:对应的index为空—直接插入
第二种情况:对应的index已经有值(注意这是链表头),直接将这对(key,value)放到对应的链表的最后一个元素
也就是每个节点其实存储的是一个链表
实现增删改查
增:
前文已经说清楚
删:
- 通过key获取index
- 如果index对应的值的key和传入的key相同,删除链表头,让下一个元素当链表头,如果不相同,遍历该链表,找到对应的key为止。
- 该方法不用向之前一样考虑get_valid_index
改:
key对应位置查找方式与删除时类似,将删除操作变为赋值即可。
查:
key对应位置查找方式与删除时类似,直接返回对应的value就行了。
总结
一些可能问到的问题:
1.用其他结构存储可以吗?
可以,每个节点可以用任何数据结构,但是每个节点需要存储多个数据
2.每个节点太长的话,如何让插入/查找接近O(1)
当每个链表过长的时候,就会影响查找的效率
需要扩大你的hash表,重新进行插入