应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

巧用二进制,让性能提升100倍,让存储空间减少100倍

  假设有一个需求是这样的:在200亿个随机整数中找出某个数是否存在其中?要求效率高,而且要节省内存。
  我们知道,在Java中,int占4字节,1字节8byte,1byte8bit(位)
  如果用int存储,那就是200亿个int,因而占用的空间约为
  (200000000004102410241024)74。5G。
  内存消耗很大,一般的家用电脑是满足不了需求的,所以将数据存储在内存中存储是不合适的。
  如果按位存储就不一样了,200亿个数就是200亿位,占用空间约为
  (20000000008102410241024)2。33G,节省了30倍的空间。
  实际上这就是Bitmap的思想。Bitmap的基本思想是用一个bit位来标记某个元素对应的Value,而Key即是该元素本身。采用bit存储数据,可以大大节省存储空间。
  Bitmap是什么?如何在bitmap中表示一个数呢?
  我们知道计算机底层存储的都是二进制数据,二进制数只有0和1。bitmap每一位的值也只能是0或1,0表示不存在,1表示存在。
  这样我们可以很容易表示{1,2,4,6}这几个数:
  计算机内存分配的最小单位是字节,也就是8位,那如果要表示{12,13,15}怎么办呢?
  当然是在另一个8位上表示:
  这样的话,好像变成一个二维数组了
  1个int占32位,那么我们只需要申请一个int数组长度为inttmp〔1N32〕即可存储,其中N表示要存储的这些数中的最大值,于是:
  tmp〔0〕:可以表示031
  tmp〔1〕:可以表示3263
  tmp〔2〕:可以表示6495
  于是,对于任意整数M,M32可以得到下标,M32就可以得到它在此下标的哪个位置。
  那么,怎么把一个数放进Bitmap呢?比如想把5这个数字放进去
  插入一个数
  首先,5320,5325,也是说它应该在b〔0〕的第5个位置。我们可以把1向左移动5位,然后和b〔0〕按位或即可。
  二进制就是:
  这就相当于8632118,即86(15)118,也就是b〔0〕b
  〔0〕(15)。也就是说,要想插入一个数,将1左移相应的位数,然后与原数进行按位或操作即可。
  删除一个数
  还是上面的例子,假设删除数字6,该怎么做呢?
  只需将该数所在的位置为0即可。即1左移6位,就到达6这个数字所代表的位,然后按位取反,最后与原数按位与,这样就把该位置为0了
  公式如下:
  b〔0〕b〔0〕((16))
  b〔0〕b〔0〕((1(i8)))
  查找一个数
  前面已经提到,1表示存在,0表示不存在。通过把该位置为1或者0来达到添加和清除的效果,那么判断一个数存不存在就是判断该数所在的位是0还是1。比如,我们想知道6在不在,那么只需要判断b〔0〕(16),如果这个值是0,则不存在,如果是1,就表示存在。
  BitMap在统计系统里边能做什么?
  例子1:针对独立用户的统计。比如想知道某个应用,每天有多少个独立用户使用了该应用?可以根据该应用的用户访问日志,每天生成一个BitMap;每个用户对应BitMap里的一个位置,如果当天访问了,该位置就置为1,否则为0。这样要知道当天这个应用的总独立用户数,只需要看看那天的BitMap里边有多少个1。
  对于10M(1000万)用户的应用,每天需要的BitMap大小为10M81。25MB,即只需要1。25兆字节。在采用一些压缩技术的基础上,可以进一步缩减需要的存储量,一般情况下可能只需要大约100200KB的存储即可。
  例子2:用户回访的统计。比如想知道某个应用,昨天使用过的用户中,有多少今天也使用了?可以在例子1(每天保存一个独立活跃用户的BitMap)的基础上,将昨天的BitMap和今天的BitMap进行AND操作,然后数一下生成的BitMap里有多少个1即可。
  怎么将用户映射到BitMap里边的某个位置?
  使用BitMap的时候,都需要将原始数据(比如用户)映射到BitMap里的位置;这种映射一般可以采用外部数据(比如在数据库里保存用户到BitMap位置的映射),或者采用固定的规则(比如计算用户名的hashcode)。
  采用第一种方法时,通常是在数据库里边给用户分配一个数值型的用户ID,而用户ID的生成规则采用自增量的方式来产生;这样比如有100个用户,则其用户ID为1,2,3,,98,99,100;用户ID为1的用户映射到BitMap里的第1个位置,用户ID为2的用户映射到BitMap里的第2个位置(问题:如果自增量的初始值不是0,而是比如10000,会产生什么影响?)
  采用自增量的另外一个好处是,系统用户数少的时候,BitMap需要的位数也少;当用户量增长时,BitMap的位数跟着增长即可;而且如果记住每天的总用户数,BitMap里边还可以直接表明每天的新增用户是哪些(注意:此处对于我们的分析系统不一定适用)
  采用第二种方法时,最常使用的规则是计算用户的hash(比如Object。hashCode,或者MD5);但由于hash生成的数字分布很宽(比如java里边Object的hashCode会返回一个int,所以其分布是2312311),但需要的BitMap的位数往往不用那么大,这样就需要再做一个hashcode到BitMap里位置的映射(一般是取余数),这就要求必须预先知道BitMap的大小,且这个大小一般要求保持不变。
  比如要求将用户映射到一个1024位的BitMap:用户A的hashcode是101,101除1024取余数是101,所以用户A就对应BitMap的第101位;而用户B的hashcode是1234567,1234567除1024取余数是647,用户B就对应BitMap的第647位。
  第二种方法由于采用固定的规则来计算映射,而不需要去做外部数据查询,因此映射这部分的开销会较第一种方法低很多。但第二种方法也有两个缺点,其一是如果预期总用户量会增长到1百万,即使目前系统只有1000个用户,也需要一个1百万位的BitMap,这样会造成很大的存储和计算资源的浪费;其二是hashcode有冲突的问题(即有可能用户C和用户D计算出来的hashcode是一样的);
  而hashcode到BitMap里位置的映射也会造成更多的冲突(比如用户E和用户F的hashcode分别是12345678和12377422,但除1024取余后都是334)。这些冲突的存在,导致了数据可信度的下降,比如BitMap里的第334位为0,则可以知道用户E和F都不在;但如果第334位为1,则并不知道用户E或者用户F是不是在。
  采用第二种方法的BitMap,有一个更广为人知的名字,即BloomFilter(http:en。wikipedia。orgwikiBloomfilter)。BloomFilter经常用于文本分析中来记录某个词是否已经出现;或者垃圾邮件过滤中来检查邮件地址是否在已知的垃圾邮件地址列表里。
  Bloomfilter(布隆过滤器)
  来了解一下Bloomfilter,Bloomfilter是一个数据结构,它可以用来判断某个元素是否在集合内,具有运行快速,内存占用小的特点。插入和查询效率都很高。BloomFilter是一个基于概率的数据结构:它只能确定一个元素不在集合内,不能确定一定在集合内。
  Bloomfilter的基础数据结构是比特向量,可理解为数组。
  主要应用于大规模数据下不需要精确过滤的场景,如检查垃圾邮件地址,爬虫URL地址去重,解决缓存穿透问题等
  如果想判断一个元素是否在集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定。链表、树、散列表等数据结构都是这种思路,但是随着集合中元素的增加,需要的存储空间越来越大;同时检索速度也越来越慢,检索时间复杂度分别是O(n)、O(logn)、O(1)。
  布隆过滤器的原理是,当一个元素被加入集合时,通过K个散列(hash)函数将这个元素映射成一个位数组(Bitarray)中的K个点,把它们置为1。检索时,只要看看这些点是不是都是1就知道元素是否在集合中;如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。之所以说可能,是因为可能有hash冲突的问题。
  BloomFilter流程:
  首先需要k个hash函数,每个函数可以把key散列成为1个整数;
  初始化时,需要一个长度为n比特的数组,每个比特位初始化为0;
  某个key加入集合时,用k个hash函数计算出k个散列值,并把数组中所有对应的比特位置为1;
  判断某个key是否在集合时,用k个hash函数计算出k个散列值,并查询数组中对应的比特位,如果所有的比特位都是1,则key很可能在集合中。如果其中任意一个比特位为0,则确定key不在集合中。
  由此可见,如果我们能灵活运行二进制,确实能给系统带来不少好处。所有的程序和指令在执行前都会被转化成0和1,所以我们用二进制的0和1直接和计算机交互效率是最高的,而且能大幅节省空间。所以大家一定要关心计算机基础啊,基础扎实了,我们的技术能力才能上新的台阶。
  号主简介:冯涛,曾任职于阿里巴巴,每日优鲜等互联网公司,任技术总监,15年电商互联网经历。

英语启蒙越早越好语言学习关键期研究表明,27岁是大脑对语言最敏感的时期,也是语言学习的黄金期。习得与记忆~儿童在大脑对语言最敏感的阶段沉浸在英语的自然语言环境中,能够快速理解……泡面真的没有营养吗?本文转载自怪罗(ID:guailuo123)方便面在我们日常生活当中出现频率高于很多食物,以前小时候想吃不能吃,长大了图方便却不得不吃。据统计,2019年全球方便面……儿子被清华北大同时录取,优秀的背后,这4个阶段的教育要重视生活很多苦,朋友圈的好消息却总是来得猝不及防,儿子同时被清华北大录取!欣慰!兴奋!幸福!一位长辈在朋友圈如是说,不敢点赞,怕同步点赞消息99,只是酸酸地在下面评论了恭喜恭喜!。……孩子刚上一年级,你就要求他端正认真?那你将来注定要为作业发愁今天看到一位妈妈发的帖子,说的是孩子作业的事。通过帖子可以看出来,这个妈妈吐糟孩子的作业,嫌孩子作业不认真,不自觉,同样的题目一错再错。甚至为此发出呐喊我情愿去做苦力,也……咔哒故事斩获2017中国创新论坛中国文化产业领军企业奖近日,由中国商业联合会、中国商报社和《企业观察报》社联合主办的2017(第二届)中国创新论坛在京举行。国务院参事、科技部原副部长刘燕华、著名经济学家、全国政协委员侯云春、咔哒故……等娃睡了,一个很棒的拖延借口!清楚地记得小时候学过的那篇课文《寒号鸟》,哆啰啰,哆啰啰,寒风冻死我,明天就垒窝。在大家讽刺、讥笑这只傻鸟时,我却莫名的同情它,呵呵,大概是物伤其类吧,我也是只得过且过、拖延癌……蓓诺臻羊奶粉好不好,到底值不值得买?蓓诺臻羊奶粉是贝特佳集团旗下产品,贝特佳品牌创立于2013年,品牌历史短暂。奶源方面蓓诺臻采用荷兰奶源,产地在国内,奶基是从荷兰进口的大包粉到国内兑水后生产,新鲜度……英语启蒙100个儿童英文游戏,在玩耍中学英语(附资料)这是【软实力英语】分享的第996篇原创英语启蒙文章。写在前面如果要问孩子在什么时候是最快乐的?相信大家一定会异口同声地回答:做游戏的时候。的确,儿童是在玩耍中认识这……宝宝突然腹痛难忍,拉出果酱便,一定要警惕肠套叠说到肠套叠,许多家长都有所耳闻,但可能并不清楚是怎么回事。今天叨叨G就请来了我们非常喜爱的朱伟医生,来跟大家讲讲到底什么是肠套叠肠套叠是一种常见的婴幼儿急症,每个家长都应……40岁宝妈重塑身材,终结6年减肥史,如果你屡减屡胖,一定要看余佐芹今年40岁,是在芊影减脂的客户之一,花了一个月的时间减掉10斤,感受到了蜕变。她最胖的时候是120斤,也就是刚来芊影参加减肥时的体重,你可能要问:159cm的……看透女人本性1。心无城府的快乐女人用自己的天真快乐感染着周围的每一个人,她们热情,把每一天都当成快乐的周末,无拘无束,好像所有的烦恼都降不到她们身上似的,她们拒绝长途跋涉,厌恶深刻,……神医还是骗子?中医能治精神疾病吗?我之前看了好多医生,都是什么三甲的大专家,没用!最后终于找到XX(某中医名医),才好了!在很多地方,我们都能看到这些中医宣传,如果省略中间的各种曲折发展,叔叔的病例宛然又……
中国无法造假的文物,108条龙相互缠绕,现代科技也无法复制我们国家拥有上下五千年的悠久历史,有许许多多的精神文化或者历史文物传承了下来。而文物随着时间的进程,会具有越来越高的价值,因而有很多商人以收藏文物作为喜好。其实文物在当时的社会……要分手?李柄熹想演戏让张雨绮帮忙被拒,男方秒变脸久久沉默不语自从张雨绮与小8岁男友李柄熹官宣后,许多网友纷纷被这段姐弟恋甜到了。近日他们参加了某恋爱节目,公开展示恋爱过程,完全是撒狗粮现场。但随着进一步接触,大家发现,他们之间所相隔的地……默认了?周也赖冠霖被曝恋情疑密会4天,双方保持沉默拒绝回应8月19日,有媒体曝出周也和赖冠霖秘密约会四天,双方疑似交往。这则爆料有视频为证,但两人并未同框,关于秘密约会以及恋爱,都是从视频推测所得,大家自行判断真假。首先给……那英与他未婚同居,剖腹产下儿子高兴,为何转身嫁给酒吧老板?那英为电影唱主题曲《爱是一颗幸福的子弹》,和刘欢合唱了《过把癔》。她未婚生子遭不幸,但《山不转水转》,那就《放爱一条生路》,所以《一笑而过》。那英与他未婚同居10年……陈梦夺金黄晓明发文炫耀,却被质疑蹭热度,终究是他高攀了奥运会正在如火如荼地开展中,今年最让人震惊的莫过于混双乒乓球竟然只得了亚军,虽然乒乓球选手非常厉害,但是这个结果估计不少人都觉得有些意难平。为了一扫往日阴霾,我国乒乓球选……歌唱家蒋大为是加拿大人吗?文火火(本账号特约撰稿人)蒋大为是大家非常熟悉的歌唱家,尤其受七十年代的人们喜爱。他的代表作《骏马奔驰保边疆》、《在那桃花盛开的地方》《牡丹之歌》等传唱率非常高。自从演唱……最具魅力的东方男人周润发贵圈往事周润发1955年5月18日出生在香港南丫岛的一个农民家庭。从小帮母亲打零工补贴家用,1965年周润发10岁时全家搬到了香港九龙,读中学的三年里,周润发每个暑假都要……婆婆的镯子浣碧遇上甄嬛,一件旗袍撕开婆媳情深的假象这几天,电视剧《婆婆的镯子》热播。饰演刘茵的蓝盈莹,原来也扮演过浣碧,刚好和扮演过甄嬛的邬君梅对上戏,这对婆媳从一开始就故事不断,精彩到爆。邬君梅饰演的婆婆,骨子里……14岁女孩跳楼自杀,1500字遗书的诀别最渴求的是父母的爱上海一位14岁少女跳楼自杀的新闻引爆了舆论,网友一边感叹一位花季少女竟然用这种凄惨的方式和世界诀别,一边在少女所留下的遗书中看到了原生家庭对孩子的伤害。这位少女在走之前和……央视再提何炅事件留给流量明星的好日子,不会太多了吴亦凡过去作为圈内顶流,从韩国回到国内的那一年,第一个给吴亦凡举办生日宴的竟然就是何老师。何炅在圈内是出名的好人缘,情商智商超群,在娱乐圈有一众好友。何炅因为《快乐大本营……快手变脸由盈转亏,广告崛起开菠萝财经(kaiboluocaijing)原创作者苏琦编辑金玙璠在正式登陆港交所一个多月后,3月23日,快手发布了首次年报,却没想到因为亏损超过1166亿上……演反派被骂是观众对表演的肯定演反派被骂是观众对表演的肯定近日,谍战剧《局中人》热播,在大家津津乐道讨论张一山、潘粤明时,作为反派出现的中统行动科科长吕步青却招来了一片谩骂,这也证明演员王梓权表演很到……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网