Python程序员面试算法宝典---解题总结: 第9章 大数据 9.4 如何在大量的数据中找出不重复的整数

# -*- coding: utf-8 -*-

'''
Python程序员面试算法宝典---解题总结: 第9章 大数据 9.4 如何在大量的数据中找出不重复的整数

题目:
在2.5亿个整数中找出不重复的整数,注意,内存不足以容纳这2.5亿个整数。

分析:
位图适用于查找非重复数据。
可以采用分治,设定一个哈希函数,将每个整数除以 hashValue,
得到模,例如取hashValue为10000
那么将取模结果为0的整数写入文件A0
...
将取模结果为9999的整数写入文件A9999
注意:
如果上述得到的文件有大小仍然大于限制内存的,继续用上述哈希方法继续划分,
直到每个小文件可以读入到内存中。
然后分别读取A0,...,A9999文件,对每个小文件,
用字典记录出现每个整数的出现次数,将出现次数为1的写入文件Bi,
...
读取每个文件Bi,则可以获得所有不重复的整数。

方法2:
由于2的32次方大约是42亿,2.5亿个整数
可以用2^32个bit,来表示,大约占据2^32bit = 4* 2^30bit=0.5GB左右内存。
这是每个数字占据1个bit位,现在每个整数需要占据2个bit位,来表示1个数字
是出现0次,1次还是多次。因此需要占据1GB
假设整数占用4B,可以用00表示数字没有出现过,01出现1次,10出现了多次,
11不用。


关键:
1 没有想到
位图中用2个bit,00表示数字没有出现,01表示出现1次,10表示出现多次。

参考:
Python程序员面试算法宝典
'''


def process():
    pass


if __name__ == "__main__":
    process()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值