左神算法基础:哈希函数和哈希表(C++)

本文介绍了如何利用哈希函数和哈希表解决在2GB内存中处理20亿数据,找到出现次数最多的数的问题。通过分析哈希函数的性质、哈希冲突的处理,特别是拉链法,阐述了哈希表在解决此类问题中的应用。同时提到了C++中的hash_map,并给出了解决大文件统计问题的策略。
摘要由CSDN通过智能技术生成

文章和资源同步更新至微信公众号:算法工程师之路

笔者在读研刚开始的时候,偶尔看面经,有这样一个问题:只用2GB内存在20亿个整数中找到出现次数最多的数,当时的我一脸懵逼,怎么去思考,20亿个数?What The Fuck! 但是,看完今天的文章,你或许就会觉得原来也不过如此啊!其核心就是哈希函数和哈希表的应用!

哈希函数

哈希函数又称为散列函数,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。假设输出值域为S,哈希函数的性质如下:

  1. 典型的哈希函数都有无限的输入值域
  2. 当哈希函数输入一致时,输出必相同
  3. 当哈希函数传入不同的输入值时,返回值可能一样,也可能不一样,由于输入域远大于值域
  4. (重要)很多的不同输入所得的输出值会均匀的分布在S上(但不是绝对均匀)

最后一个性质对于一个优秀的哈希函数是非常重要的,并且这种均匀与数据的输入规律无关。比如“aa1”、"aa2"经过hash后可能结果会相差很多,当一个哈希函数的输出在S中是均匀的,那么我们将输出值对m取余(%m),就会将不定长输入映射到0~m-1空间中,并且在这个空间也保持均匀分布!哈希表就是这么做的,一会再说!哈希函数还有以下特点:

  1. 免碰撞:即不会出现输入 x≠y ,但是H(x)=H(y) 的情况,其实这个特点在理论上并不成立,比如目前比特币使用的 SHA256 算法,会有 2 256 2^{256} 2256
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值