c++实现哈希表
1、哈希表的概念:
哈希表是一个以哈希函数作为介质来实现映射的效果,用于实现一个键值对(key,value)的存储(key叫做键值,value叫做实际值)。
当我们要存储一个数据的时候,要先找到相应的桶,这个找到桶的过程就是一个映射的问题,当我们要找一个数据的时候,我们一般是根据对应的哈希函数的关系先找到对应的桶,再去这个桶里面找到这个对应的数据。
2、哈希表有一个比较严重的问题,那就是冲突的问题,比如一个下标有好几个数据对应的,但是这个时候我们就需要解决这个冲突问题,解决这个问题的过程就是解决冲突,这里冲突的数量N就是一个键值的问题,我们可以实现用一个数组来实现一个重复数据的存储,要是这个N很大的话那么就会很不方便了,要是实在很大的话我们就要用一个树来实现。
3、很重要的一个知识点,哈希表的两个结构:哈希集合,哈希映射
-
哈希集合 是 集合数据结构的实现之一,用于存储非重复值
-
哈希映射 是 映射数据结构的实现之一,用于存储(key, value)键值对
4、(这里的实现是一个哈希表的结构,但是是一个哈希集合的概念)我们前期需要解决问题是没有冲突的问题,就是先不考虑一个桶内有很多元素的情况下,设计一下哈希集合(假设是一个一对一的映射):
不使用任何内建的哈希表库设计一个哈希集合(HashSet)。//这里设计的是一个集合,所以相同的元素是没有意义的,就像数学上学的集合是一样的,高数上面的集合是不是没有意义的呢,相同的道理。
实现 MyHashSet 类:
void add(key) 向哈希集合中插入值 key 。
bool contains(key) 返回哈希y集合中是否存在这个值 key 。
void remove(key) 将给定值 key 从哈希集合中删除。如果哈希集合中没有这个值,什么也不做。
这里的val的值就不显得那么重要了,因为这都是对key进行操作
#include<iostream>
using namespace std;
#include<vector>
struct node//定义一个节点相当于c++里的map容器的pair
{
int key;
int val;
node(int key, int val):key(key),val(val)
{
}
};
class MyHashSet {
public:
vector<node>* v=new vector<node>;//记录整个哈希结构的数据,里面的每一个节点相当于pair
MyHashSet() {
}
void add(int key)
{
for (vector<node>::iterator it = (*v).begin(); it != (*v).end(); it++)
{
if ((*it).key == key)
{
return;
}
}
node node1(key,0);
(*v).push_back(node1);
}
void remove(int key)
{
int index=-1;
for (int i = 0; i < v->size(); i++)
{
if (v->at(i).key == key)
{
index = i;
}
}
if(index!=-1)
(*v).erase((*v).begin() + index);
return;
}
bool contains(int key) {
for (vector<node>::iterator it = (*v).begin(); it != (*v).end(); it++)
{
if ((*it).key == key)
{
return true;
}
}
return false;
}
};
/**
* Your MyHashSet object will be instantiated and called as such:
* MyHashSet* obj = new MyHashSet();
* obj->add(key);
* obj->remove(key);
* bool param_3 = obj->contains(key);
*/
int main()
{
MyHashSet hash;
hash.add(1);
hash.add(2);
hash.add(3);
hash.add(9);
hash.remove(9);
hash.remove(1);
cout << hash.contains(9) << endl;
system("pause");
return 0;
}
5、(这是一个哈希映射的实现,具有映射的结构,就是内部的数据key和value是有关系的)
struct node//这里是建立一个节点,然后把特定的key和value定义出来
{
int key;
int val;
node(int key,int val):key(key),val(val)
{}
};
class MyHashMap {
public:
vector<node>* v=new vector<node>;//开辟一段空间来记录我们定义的哈希表的存储
MyHashMap() {
}
void put(int key, int value) {
int index=-1;
for(vector<node>::iterator it=v->begin();it!=v->end();it++)//循环遍历找出key
{
if((*it).key==key)
{
(*it).val=value;
index++;
}
}
if(index==-1)
{
node pair(key,value);
v->push_back(pair);
}
}
int get(int key) {
int index=-1;
for(vector<node>::iterator it=v->begin();it!=v->end();it++)
{
if((*it).key==key)
{
return (*it). val;
index++;
}
}
return index;
}
void remove(int key) {
int i=0;
int index=-1;
for(vector<node>::iterator it=v->begin();it!=v->end();it++,i++)
{
if((*it).key==key)
{
index=i;
}
}
if(index>=0)
{
v->erase(v->begin()+index);
}
else
{
return;
}
}
};
/**
* Your MyHashMap object will be instantiated and called as such:
* MyHashMap* obj = new MyHashMap();
* obj->put(key,value);
* int param_2 = obj->get(key);
* obj->remove(key);
*/

浙公网安备 33010602011771号