C++中的hash table
- C++ STL中有四种关联式容器, map ,set, multimap, multiset; 他们底层是RB树, 查找的时间复杂度是O(logN)
- 他们都有对应的hash table版本, unordered_map, unordered_set, unordered_multimap, unordered_multiset. 他们底层的实现是hash table, 查找时间复杂度O(1).
- 解决冲突的方法是
链地址法
- 链地址法 (用一个链表存储所有冲突的记录), 开放地址法 (有冲突, 以当前位置为基准根据探查序列再寻址), 再哈希法
自定义HashSet
- 一个vector, 每个容器都维持着一个链表, 初始化NULL
- vector的下标就是对应的hash_key
- vector存放的是每个链表的头节点, 每个函数都需要
单独判断.
- 删除操作, 需要双指针, 记录删除结点的前一个结点
class MyHashSet
{
public:
struct ListNode
{
int val;
ListNode* next;
ListNode(int v): val(v), next(NULL){
}
};
int range;
vector<ListNode*> bucket_v;
MyHashSet()
{
this->range = 769;
bucket_v.assign(this->range, 0);
}
void add(int key)
{
int hash_key = key % this->range;
ListNode* node = new ListNode(key);
if (bucket_v[hash_key] == NULL) bucket_v[hash_key] = node;
else
{
ListNode* temp = bucket_v[hash_key];
if (temp->val == key) return;
while(temp->next != NULL)
{