从40亿个数据中找到出现次数最多的那个数字——基于哈希表

一、准备知识

1.1、哈希函数

  • 性质一:对于任意长度的输入,都会得到长度固定的哈希值。
  • 性质二:相同的输入,得到的哈希值一定是相同的。
  • 性质三:不同的输入,得到的哈希值也许不相同。(因为存在哈希冲突)
  • 性质四:哈希冲突,输入内容不相同时,会得到相同的哈希值,但是这种情况出现的概率特别特别小。
  • 性质五:你所得到的哈希值是均匀分布在输出域里面。并且给所有得到的结果求模,得到的值任然是均匀分布;

二、根据题目去理解哈希表的使用

2.1、题目

  • 现在有40亿个数字,每个数字值的范围是0~2^32,并且只有1G内存可以适用。请输出出现次数最多的那个数字。

2.2、传统的思维

  • 通过HashMap,统计每一个数字出现的次数。然后找到次数最多的那个;
  • 这种做法看似可行,但是,请不要忽略了内存的限制。我们现在就来大概算一下这种做法需要的内存大小。在只考虑键的值所需空间的情况下,一个键占用四个字节,一个值占用四个字节。也就是说,一个数据的统计最少需要八字节。现在我们来考虑一种情况,如果40亿个数字都没有重复的,那么我们需要40(亿)*8个字节空间,也就是32G的大小。所以这种做法肯定是不行的。

2.3、正确解决方式

  • 首先我们将每一个元素的哈希值对100求模,同时按照0~99命名建立一百个文件。按照模值与文件名对应的方式,将40亿个数字分别在一百个文件里面进行统计。按照哈希函数性质二和性质五可以知道,相同的数值一定会被存放在同一个文件里,并且40亿个数字会被这100个文件均匀统计,然后求出每个文件里面最大的数字,再进行比较,从而得到最大的数字。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值