哈希表原理

哈希表(键值对)

键(key):类似于数组的下标,可以为任意类型,但是不能重复

值(val) :类似于数组的元素,可以为任意类型哈希表不存在元素访问溢出的情况,只要访问未创建的元素,便会创建一个值为0的键值对

哈希表的插入:

//方法一:

【】法(中括号法)

//方法二:

insert()函数插入法

#include <iostream>
#include <string>
#include<unordered_map> //无序哈希表
#include<map>  //有序哈希表
using namespace std;
/*
哈希表(键值对)
键(key):类似于数组下标,可以是任意类型,但不能重复
值(val):类似于数组中的元素
*/
int main() {
    unordered_map<int ,char > map;//创建 键:int类型   值: char类型 的哈希表
    unordered_map<int , int > map1;
//向哈希表中插入元素
    //[]法 (【】本质为运算符)
    map[1] = 'a';
    map1[1] = 111;
    map1[2] = 222;
    cout << map1[2] << endl;
    cout << map1[3] << endl;//map1[3]中没有元素,因此会在map1[3]中插入(3,0)
    //insert()函数法
    pair<int, int > p = make_pair(7, 7);//创建pair数据对
    cout << "pair的第一个元素是:" << p.first << "pair的第二个元素是:" << p.second << endl;
    map1.insert(p);//利用insert传入数据对p
    map1.insert(make_pair(8, 8));//利用insert传入make_pair()
    return 0;
}

利用哈希表的迭代器

  • 查询key的val
  • 循环赋值
  • 遍历哈希表
  • #include <iostream>
    #include <string>
    #include<unordered_map> //无序哈希表
    #include<map>  //有序哈希表
    using namespace std;
    /*
    哈希表(键值对)
    键(key):类似于数组下标,可以是任意类型,但不能重复
    值(val):类似于数组中的元素
    */
    int main() {
        unordered_map<int, int > map;//创建 键:int类型   值: char类型 的哈希表
        unordered_map<int, int >::iterator it;//哈希表的迭代器
        for (int i = 0; i < 5; i++) {
            map[i] = i;
        }
        it = map.begin();//map.begin()返回指向哈希表首元素的迭代器
        //map.end():返回指向哈希表最后一个元素的下一位的迭代器
     for(const auto &it:map){//争强for循环哈希表
     //其中的it代表的是map哈希表里面的各种元素
     //auto(推断类型,根据赋值的类型推断变量的类型)
         cout<<it.first<<" "<<it.second<<endl; 
     }
        for (; it != map.end(); it++) {//迭代器遍历哈希表
            cout << it->first << " " << (*it).second << endl;
            //->和* 两种不同的方式返回迭代器指向的两个值
        }
        //查找find(key);如果存在键为key的键值对,返回该键值对对应的迭代器,否则返回end();
        if (map.find(3) != map.end()) {
            cout << "找到了" << endl;
        }
        else {
            cout << "没找到" << endl;
        }
        return 0;
    }

    无序哈希表的实现(unordered_map):

    无序哈希表:在键盘输入的键值对会随机分配成任意的顺序

    无序哈希表的组成:数组+哈希函数

    原理:

    无序哈希表在存储数据的时候,会将键(key)放入到哈希函数中进行计算

    哈希函数会返回对应的一个int类型的数值n

    紧接着会对n进行 处余桶个数的计算=i(桶:类似于数组),其返回值必然是小于桶的整数

    于是会将值(valval)存储到对应的桶的 i(下标)处

    因此,在经历上述操作下,存入哈希表的数值将会以乱序(非人为输入数)的形式进行存储

哈希函数:

一般的哈希函数都是采用除留余数法(f(key) % m)m不会超过表长

哈希函数的特征:

1、输入域 f(string)无穷大(输入可以是字符串),输出域有限(int类型的范围限制)

2、有可能不同的输入对应相同的输出(哈希表冲突)

3、如果输入的参数是相同的,那么输出一定是相同的,没有任何的随机成分(查找、删除、修改)

4、均匀性:类似的输入,通过打乱,得到均匀的输出

哈希冲突的解决方法(哈希碰撞):

1、线性冲突再散列:(无脑硬算法)

对于val=99的这个数据,经过哈希函数求得,应放入key=2的位置,但是key=2的位置存在数据,因此将会一位一位的向后进行查找,直到发现val为空的哈希表位置,并且将其存入

2、再哈希表法:(无脑硬算法)

类似于【线性冲突再散列】的方法,一旦发现有key的位置发生碰撞,那么会在100多种哈希函数中寻求另外一种哈希函数,直到没有位置冲突为止

3、链地址法(java hashmap 就是采用的这种方法)

在c++和java的哈希表中,都是采用该方法

【数组】+【链表】+【哈希函数】,其时间和空间复杂度大概接近于 O(1)

4、建立一块公共溢出区

在发生哈希碰撞的时候,将冲突的数据放入该公共溢出区,以此来解决哈希冲突

  • 17
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值