java 位图法_位图bitmap算法(java)

简单的说就是用数组存放若有数据就标志为1或true,若不存在标志为0或false。比如1,2,2,5,这里最大值为5,0至5中不存0,3,4,所以:

Array[0]=0,Array[1]=1,Array[2]=2,Array[3]=0,Array[4]=0,Array[5]=1

上面数中由于2有两个,所以用int存数组的值,不用boolean型,这样如果有多个同样的数字可以用值表示个数。如上面Array[2]=2,就表示2有2个。

这样排序就方便多了,比如上面开始是{2,5,2,1}这样一无序数组A。找出最大值:5.即用来作位图排序的数组B要申请的大小为5.循环这个数组,把数组A的值用作数组B的下标,如果存在就把值加1,即数组B的值为对应的个数。

for(inti : A) {

B[i]++;

}

这样B的值最后同上面的Array一样。把B值大于0的输出就是排好序的了。如上面的数组大于0依次有:1,2,2,5.

从上面可以看出位图排序至少要注意两点:

1、  最大值和最小值之间不能相差太大,否则浪费空间。

2、  如果有负数,上面要转换一下,最申请的空间大小为max-min+1,数组B的下标也要作对应的转换,输出前也要转换回去。如int[] arr = { 1, 3, -3, 0, 0};

位图排序算法如下:

/**

*使用位图法进行排序

*

*@paramarr

*/

publicstaticvoidbitmapSort(int[] arr) {

//找出数组中最值

intmax = arr[0];

intmin = max;

for(inti : arr) {

if(max < i) {

max = i;

}

if(min > i) {

min = i;

}

}

//得到位图数组

int[] newArr =newint[max - min + 1];

//重新调整arr中的元素

intindex = 0;

for(inti = 0; i < newArr.length; i++) {

while(newArr[i] > 0) {

arr[index] = i + min;

index++;

newArr[i]--;

}

}

}

延伸:

checkbox中有多个值时,为了节约数据空间,我们可以用2^n(n>=0)的值来作为value的值。比如有4个选项A,B,C,D。value分别为1,2,4,8。假如用户选了AC,那么数据库存的就是1+4=5,这样一个5就表示了用户选中的是A,C。取出是用5 分别与上面的1,2,4,8与运算不为0即表示用户选中过。

如5(0101)

A(0001)

--------------

0001-->!=0 表示用户选中A

如5(0101)

B(0010)

--------------

0000-->==0 表示用户没用选中B

其他两项同理。

思考:题目描述:

输入:一个文件,里面大约有1千万行数据,每个数据是7位整数,同时每个数是唯一的,即不允许有2个数相同,这些整数不与其他任何数产生关联。

输出:将这个整数按升序排列,并生成到一文件中

限制:能够使用内存为1M,但是附存足够大,运行时间最多为几分钟,10s为最合适的时间。

可能的算法:

1.基于磁盘的合并排序

2 将每个号码存放到32位整数里,1M空间可以存储250000个号码,使用一个在输入文件中带有40个通道的程序。第一个通道将0-249999之间的任意整数读入内存 进行排序,依次类推 第40个通道排序9750000-9999999。快排不错。但是付出了读40次程序的代价。

3 最适合的算法,位图算法,用含有1千万个位的字符串来表示这个文件,文件中有的数据则标识为1,没有则标识为0,最后从第一位读至最后一位,即为有序的集合。这种算法充分利用了题目中给的条件,但也仅仅适合本题目,(不会有重复的数字,同时不与其余的数进行关联)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值