LeetCode每日一题,706. Design HashMap
先看题目描述
大意就是自己实现一个哈希表数据结构
算法和思路
链地址法
设计哈希表,主要就是考虑解决这几个问题:
- 哈希函数
- 冲突处理
- 哈希表扩容
哈希函数可以考虑 key 对桶数取模,冲突处理有链地址法,开放地址法和再哈希法,这里使用的是链地址法,即将哈希冲突的键值对使用链表串联起来
算法源码
链地址法
下面使用的方法是在哈希表内部存储一个链表数组,键值对作为节点,键对桶数取模得到该节点应置于链表数组的哪个链表中,然后加至链表末尾。add(),put() 和 remove() 方法均使用迭代器 Iterator 来对链表中节点进行迭代
1 | class MyHashMap { |
下面使用的也是链地址法,但哈希表内部存储的不是链表数组,而是节点数组。不过节点有 next 指针,指向其下一个节点,相当于节点本身串成链表,数组中存储的是每个链表的头节点
1 | class MyHashMap { |
由于题目限定了 key 的范围为 0 - 10的6次方,所以也可以直接使用长度为 10的6次方 + 1 的整型数组,相当于哈希函数为 x -> x,不会发生哈希冲突,直接将 value 存于 data[key] 即可,但是运行效率较低
1 | class MyHashMap { |