Bitmap在海量无重复整数排序时的应用

来源:互联网 发布:淘宝图片水印大小 编辑:程序博客网 时间:2024/06/06 03:29

前言

bitmap

bitmap就是用一个bit位来标记某个元素对应的value的存在,而key即是这个元素。由于采用bit为单位来存储数据,因此在可以大大的节省空间开销

这里的海量数据以整数为例,整数为4字节,也就是32bit,假设数据量N(N为最大值)=100000000,由于bitmap是用一个bit来标识元素的存在,那么我们只需⌈N/8⌉个字节就可以把数据表示出来也就是12500000字节,约为13MB,比原先的N*8的存储方式少到不知道哪里去了。

对于bitmap中存储的数据进行排序:其实在存储的过程中已经完成了排序

正文

(为了方便,下文将存储bitmap的整数成为bitmap整数)

海量数据的存储

假设该数字为num,则它所对应的bit索引为:第 ⌊num/32⌋ 个bitmap整数中的第 num%32 位

排序

通过每个数字的映射,我们可以得到所需要的bitmap整数个数,我们只需对每个bitmap整数的每一位遍历,当某位为1时,就证明该位所对应的整数存在与原始数据中(其实在存储的过程中,我们通过不断插入数字标识,已经完成了排序),当我们从最低位向最高位遍历时,通过整数与bit索引的逆过程就可以的到原整数,将其一个个输出,我们就能得到原始数据的从小到大排序后的结果,具体实现可以看伪代码

//排序及还原伪代码//max为bitmap整数个数for(int i=0;i<max;i++){    for(int j=0;j<32;j++){        if(1&bitmap[i]>>j){            print i*32+j;        }    }}

注意

① 限于每位只有0,1两个状态,我们无法对有重复数字的海量整数如此排序
② 此种方法适用于数字之间差值比较小的情况(无限趋近于连续数据),若数字之间差值比较大(举个极端的例子:每个bitmap整数中只有一个位为1,其余全为0的情况)时,博主暂时没有想到可行解法……

阅读全文
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 穿越火线精英集结号积分不足怎么办 天猫购物津贴领多了怎么办 车贷逾期车被开走还不清全款怎么办 孩子特别懒不爱动又胖怎么办 微信的聊天记录被限制了怎么办 门面租金交了一年对方不租了怎么办 离职后社保怎么办 无忧保专业可靠 淘宝店铺被投诉到监管局怎么办 淘宝买家每天都来店铺骚扰怎么办 电脑安装软件时解压出现问题怎么办 公婆不尊重你的父母做媳妇的怎么办 手机扣扣接收不上文件怎么办 买了商铺付了首付商铺倒闭了怎么办 宝宝刚满月不喜欢在床上睡怎么办 别人给我打了收货款不发货怎么办 业务员私收货款公司不发货怎么办 付款后商家没发货也不退钱怎么办 苹果7P修过主板耗电严重怎么办 oppo手机进水了开不了机怎么办 手机弯了变形但不影响使用怎么办 拼多多留错电话怎么办如果已经发货 苹果6手机后壳变形了怎么办 京东退货保修卡丢了怎么办 如果京东买的显示器屏碎了怎么办 在微信上买东西退货不退钱怎么办 手机分期付款不还款被起诉了怎么办 朋友用我的花呗分期不还钱怎么办 朋友用我身份证办分期不还钱怎么办 我手机号被别人绑定信用卡了怎么办 5s用不了4g网络怎么办 红米手机返回键没了怎么办 小米手机进水了开不了机怎么办 手机返回键和菜单键失灵怎么办 苹果5s指纹按键坏了怎么办 小米手机安卓系统耗电量大怎么办? 苹果5s充不进去电怎么办 苹果手机6s返回键失灵怎么办 本人被骗同时被利用骗了别人怎么办 京东取消订单后货到了该怎么办 京东电信日租卡流量顶置了怎么办 苹果6s进水后闪光灯不亮怎么办