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