针对leetcode的706题,设计简单hash表,有两种冲突处理方法:
(1)开放寻址方法(再hash);
(2)完全散列法.(hash+链表/bst)。
设计hash表,有3种操作,增(包括改),删,查。hash函数为取模。
(1)代码如下:
class MyHashMap {
public:
struct kv{
int k;
int v;
kv()
{
k=-1;
v=-1;
}
kv(int _k,int _v){
k=_k;
v=_v;
}
};//kv为内部结构。
MyHashMap() {
v=vector<kv>(5000);
}
int calcPos(int key)//得到桶位置
{
int ret=key%v.size();
while(v[ret].k != -1 && v[ret].k != key)
ret=(ret+1)%v.size();
return ret;
}
void put(int key, int value) {
v[calcPos(key)]=kv(key,value);
}
int get(int key) {
return v[calcPos(key)].v;
}
void remove(int key) {
v[calcPos(key)]=kv(-2,-1);//用过的桶不重复,为保证稳定。
}
vector<kv> v;
};
(2)代码如下:
class MyHashMap {
public:
MyHashMap() {
v=vector<map<int,int>>(2000);//map为高效的bst结构
}
void put(int key, int value) {
int p=key%v.size();
v[p][key]=value;
}
int get(int key) {
int p=key%v.size();
if(v[p].empty())
return -1;
if(v[p].find(key)==v[p].end())
return -1;
return v[p][key];
}
void remove(int key) {
int p=key%v.size();
v[p].erase(key);
}
vector<map<int,int>> v;
};
总结,实际的c++的unordered_map设计采用以素数为基础的hash函数,更不易冲突,而且类成员方法更完善。