关于hash
2G内存在20亿个整数中找出次数最多的数?
kv来描述一个数,一个整数4byte,两个整数8byte,20亿个整数需要16G内存。
数据结构存储:平衡二叉树map、散列表unordered_map。
分治:20亿个整数拆分成若干个范围,分别统计若干个范围中的次数多最大值,汇总若干个范围中的次数最大值,找出次数最大值对应的树。
逆向分析:
2GB = 2 * 2^10 * 2^10 * 2^10 B = 2^31 B,小范围的数字最多 2^31 / 8 = 2^28
有多少个小范围?整数4个字节共32bit,范围为-2^31~2^31,共2^32个整数,2^32/2^28 = 2^4
正向解决:
- 将20亿个数拆分为16个范围
- 将20亿个数依次除以2^28,得到一个0-15的值,放在一个小文件中,另外一种解法:hash分流,相同的key,经过多次hash总是得到相同的值,hash具备随机性,crc16、md5、murmurhash2、siphash、cityhash
- 每个小文件unordered_map[k]++,散列表进行词频统计,如果某一个key出现次数超过10亿,就不必要统计了,这样也可以控制value的范围
40亿个非负整数中算中位数和找出现两次的数
- 最多使用1GB的内存,找出所有出现了两次的数
出现了两次,共三种状态: