bitmap思想和2-Bitmap实现.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
bitmap思想和2-Bitmap实现

bitmap思想和2-Bitmap 实现1. Bit-map思想 给你一堆西安市的电话号码列表,数量大概在千万级,要求从中找出所有重复的电话号码,需要时间复杂度尽可能小。 目前西安市的电话号码大概都以8开头,为8位,也就是类似样子 二重暴力搜索时间复杂度太高,这里我们不予考虑。 容易想到的办法就是建立一个标志数组,int boolean都行,用相应的位置值来代替这个号码是否出现, 根据数组的可直接存取特性,来提高效率。但是你是否想过或测试过 int[] a = new int[100000000]; boolean[] a = new boolean[100000000]; //需要大概100M*4的内存,如果这样类似的语句是否可以通过编译并且执行。 再仔细思考下,就会发现,int型的字段太过于占空间,我们只需要知道这个号码存在与否, 所以最简单的0和1就够用了,能表示0和1的最小存储单位是什么呢? 是内存中的一位。//int 为4 byte? ,那么1个int 可以存放32位; 申请一个int一维数组,那么可以当作为列为32位的二维数组, ??????????? |??????????????????????????? 32位 ???????????????????????????????????? | int a[0] |0000000000000000000000000000000000000| int a[1] |0000000000000000000000000000000000000| ……………… int a[N] |0000000000000000000000000000000000000| 每一个电话号码,用上面的一位表示,如电以用a[0]的第一位表示,有则是表示为1,无则是0 OK,这就是bitmap的思想。 将西安市的电话号码去掉开头的8,就可以将其映射到一个1数组中。 8bit是1byte,1024byte是1kb,1024kb是1mb 所bit占用的空间8/1024/1024mb大概为1mb多些, 这对于现在大家动不动几G的内存来说,完全是小菜一碟。 2. 2-Bitmap实现 在2.5亿个整数中找出不重复的整数,内存不足以容纳这2.5亿个整数。*/ 每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义 ??? #includestdio.h ? ??? #includememory.h ? ??? //用char数组存储2-Bitmap,不用考虑大小端内存的问题 ? ??? unsigned char flags[1000]; //数组大小自定义 ?? ??? unsigned get_val(int idx) ? ??? {? |??? 8 bit???? | |00 00 00 00|? //映射3 2 1 0 |00 00 00 00| //表示7 6 5 4 …… ??????? int i = idx/4;? //一个char 表示4个数, ??????? int j = idx%4; ? ??????? unsigned ret = (flags[i](0x3(2*j)))(2*j);? //0x3是0011 j的范围为0-3,因此0x3(2*j)范围11000000 如7 i= ,j=3 那么flags[1 得到的是|00?00 00 00| //表示7 6 5 4 ??????? return ret; ? ??? } ? ???? ? ??? unsigned set_val(int idx, unsigned int val) ? ??? { ? ??????? int i = idx/4; ? ??????? int j = idx%4; ? ??????? unsigned tmp = (flags[i]~((0x3(2*j))0xff)) | (((val%4)(2*j))0xff); ? ??????? flags[i] = tmp; ? ??????? return 0; ? ??? } ? ??? unsigned add_one(int idx) ? ??? { ? ??????? if (get_val(idx)=2) {? //这一位置上已经出现过了?? ??????????? return 1; ? ??????? } ? ??????? else? { ? ??????????? set_val(idx, get_val(idx)+1); ? ??????????? ret

文档评论(0)

xy88118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档