不使用任何内建的哈希表库设计一个哈希集合(HashSet)。
实现 MyHashSet 类:
void add(key) 向哈希集合中插入值 key 。
bool contains(key) 返回哈希集合中是否存在这个值 key 。
void remove(key) 将给定值 key 从哈希集合中删除。如果哈希集合中没有这个值,什么也不做。
示例:
输入:
["MyHashSet", "add", "add", "contains", "contains", "add", "contains", "remove", "contains"]
[[], [1], [2], [1], [3], [2], [2], [2], [2]]
输出:
[null, null, null, true, false, null, true, null, false]
解释:
MyHashSet myHashSet = new MyHashSet();
myHashSet.add(1); // set = [1]
myHashSet.add(2); // set = [1, 2]
myHashSet.contains(1); // 返回 True
myHashSet.contains(3); // 返回 False ,(未找到)
myHashSet.add(2); // set = [1, 2]
myHashSet.contains(2); // 返回 True
myHashSet.remove(2); // set = [1]
myHashSet.contains(2); // 返回 False ,(已移除)
简单的用mod来实现hash函数,用链地址法来实现,其中mod为一个质数。
class MyHashSet { private: vector<list<int>> data; static const int mod = 769; int hash(int key) { return key % mod; } public: /** Initialize your data structure here. */ MyHashSet(): data(mod) {} void add(int key) { int num = hash(key); for(auto it = data[num].begin(); it != data[num].end(); it++){ if(*it == key) return; } data[num].push_back(key); } void remove(int key) { int num = hash(key); for(auto it = data[num].begin(); it != data[num].end(); it++){ if(*it == key){ data[num].erase(it); return; } } } /** Returns true if this set contains the specified element */ bool contains(int key) { int num = hash(key); for(auto it = data[num].begin(); it != data[num].end(); it++){ if(*it == key) return true; } return false; } };
自己在写程序的时候在全局中设置了mod = 769,然后在构造函数中想把mod的值给到容器,但是报错了。不知道为什么加了static const 就可以了。
而用int mod = 769却通过不了。
原文:https://www.cnblogs.com/hxl-learning-space/p/14529244.html