1. Bit-map思想 给你一堆西安市的电话号码列表,数量大概在千万级,要求从中找出所有重复的电话号码,需要时间复杂度尽可能小。 目前西安市的电话号码大概都以8开头,为8位,也就是类似于82678578这样子 二重暴力搜索时间复杂度太高,这里我们不予考虑。 容易想到的办法就是建立一个标志数组,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| 每一个电话号码,用上面的一位表示,如电话80000000可以用a[0]的第一位表示,有则是表示为1,无则是0 OK,这就是bitmap的思想。 将西安市的电话号码去掉开头的8,就可以将其映射到一个1到10000000的数组中。 8bit是1byte,1024byte是1kb,1024kb是1mb 所以10000000个bit占用的空间为10000000/8/1024/1024mb大概为1mb多些, 这对于现在大家动不动几G的内存来说,完全是小菜一碟。 2. 2-Bitmap实现 在2.5亿个整数中找出不重复的整数,内存不足以容纳这2.5亿个整数。*/ 每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义 | 8 bit | |00 00 00 00| //映射3 2 1 0 |00 00 00 00| //表示7 6 5 4 …… |00000000| int i = idx/4; //一个char 表示4个数, 如7 i= ,j=3 那么flags[1]&11000000, 得到的是|00 00 00 00| //表示7 6 5 4 |
【大数据处理】bitmap思想和2-Bitmap 实现
最新推荐文章于 2022-01-26 10:54:33 发布