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);
*/

  

 
 
posted @ 2022-09-04 09:17  铜锣湾陈昊男  阅读(79)  评论(0)    收藏  举报