11.12学习笔记

1.topK问题
题目

10亿int整型数,一台可用内存为1G的机器,时间复杂度要求O(n),统计只出现一次的数。

分析

首先分析需要多大的内存才能表示10亿的数,一个int型占4个字节,10亿就是40亿字节,约等于4GB。如果要完全读入内存的话明显内存不够用。一般思路有两种:

位图法:用一个bit位来标识一个int型整数。

分治法:分批处理这10亿数。

1.1位图法
int型整数是4个字节,即32位,那么把所有int型整数表示出来需要232bit空间,232/8=2^29字节,即512MB。所以利用512MB的空间就可以储存所有的int数。对于这个题目,可以每两个bit表示一个数字,00表示没出现过,01表示出现过一次,11表示出现过多次,比如扫描过程中对于某数字,状态为01则变为11,11则保持不变,那么内存占用1G也是可以满足要求的。

对于1个bit表示一个数字的情况,具体只要申请一个数组int tmp[N/32+1],tmp每个元素占32位,可以表示32个数字,得到BitMap表:

tmp[0]表示0~31

tmp[1]表示32~63

以此类推

假设数据为3,6,8,32,36,则BitMap表如下所示:

img

优点:

(1)运算效率高

(2)占用内存少

缺点:

不可以对重复的数据进行排序和查找。

一般来说BitMap可用于数据查找、去重、排序等操作。

1.对三亿个没有重复的整数进行排序
对于非重复整数排序BitMap有天然优势,只需要扫描一遍,组装成BitMap后,按Bit位输出即可。

2.已知某个文件包含一些电话号码,每个号码为8位数字,统计不同号码的个数
8位最多为99 999 999,即0-99 999 999的数字,统计个数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值