`
杨杨和花花
  • 浏览: 21723 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Bitmap在排重问题上的应用

阅读更多
   其实这篇,我已经写了好久,只是一直没发。因为里面还有一些问题,我还没有解决。但是我想学习本来就是一个更新的过程,总有一些我们是不懂的。于是我决定还是展示出来。供大家学习和讨论。

问题的引入:例题:有很多个整数,排除其中重复的数。 要求:尽可能的节省空间、
要想解决此问题,重在存储这些整数。我们通过什么样的结构来存储?
问题的解决的构思:创建一个byte数组,其中每一个元素的8位分别对应元素出现的情况、我们用1表示该对应的
数出现了,0表示没有出现。然后我们遍历整个情况,对于标记1的数都取一个。这些数就是排重过后剩下的数。
问题的具体实现:假设整数的个数为n.我们开辟的byte数组的大小为(n/8+1)。n%8这为byte数的第几位数。
我定义一个排重类:
public class PaiChong {
/*
* 通常先执行常量的初始化,然后执行构造方法
*/
byte a[];
public PaiChong(int b){
a=new byte[b/8+1];//开辟这么大的空间
}
/**
*
* @param x 为你输入的数
*/
public void Fuzhi(int x){
int i,j;//分别作为标记
i=x/8;
j=x%8;
byte y=0;
    byte r[]=ChangeStr(a[i]);
if(j==0)
r[7]=1;
else
r[j-1]=1;
for(int k=0;k<8;k++){
y*=2;
y+=r[k];
}
a[i]=y;
}
/**
*
* @param y 你传入需要改变的数
* @return  返回字符数组
*/
public byte[] ChangeStr(byte y){
byte[] s=new byte[8];//定义长度为8的字符数组
    int t=y;
    int w=0;
int i=0; 
for(;i<7;i++){  
if(t<=1){ 
s[7-i]=(byte) t;
break;//跳出循环
}
    int h=t;
t=(t/2);
w=h-t*2;//记录余数
    s[7-i]=(byte) w;
}
for(int k=i+1;k<8;k++){
s[7-k]=0;
}
return s;
}
public void SystemByte(){
for(int i=0;i<a.length;i++){
System.out.print(a[i]+",");
}
}
}
      在这个类中,Fuzhi这个方法:将待排重的数,进行判断。并修改,对应位上的值。ChangeStr这个方法:
      将byte数转化为一个byte数组,再对byte数组中元素进行操作。以上的代码并没有实现我预期的目标。
      代码中出现一些问题:我们改动这个数,可能会超出byte的范围。从而它自动将其转化为负数。还有对于
      负byte数转化为二进制的方法。
      还有值得考虑的地方,这样的做法是否减少复杂度?如何通过移位对byte的8位数进行操作?
      以及将byte数组变成int数组又会怎么样?
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics