今天在看排序算法的时候,看到了用位示图法实现的,上面说可以大大减少内存的使用,尤其针对大数据的存储,数据量非常大的的时候,他的优点就比较明显了,因为他存储数据值依靠1个位来表示。具体是怎么回事呢,继续往下看。位图法,位图法,当然和位相关,下面我给出一组数组int[]{1, 3, 5,8},也许在普通的我们的编程中,我们肯定是存放在一个32位整形的数组中,1个32位整数,4个字节,4个数字总共16个字节,而如果用位图法,表示,可以用一个这么一个位字符串表示:
10101001
1出现的位置就是代表数字的值,第1,3,5,8个位置的值为1,就代表了这些数字的存在,这样一算只需要8位,也就是1个字节,比刚刚那个整整省了15个字节。可见这个算法的效率十分之高,但是又一个难题摆在面前了,如何存储和读取这样的形式中的数值无疑将是这个算法的最难点。
首先是数据的存入过程,将整形数字存入相应的位,并把相应的位置的数字标记为1,就代表完成任务了,第一步,我们当然得先声明一个用来存放数值的数组:
//声明了整形数组,最大的存放的数字的值可以到3 * 32
private static int[] bitmap = new int[3];
我在这里定义了3个单位的数组,每个数组值含32位,也就是说,是3个32位0排成一起,那最大表示的值就是96了。这个很好理解吧。为了容易懂,把操作改小了容易懂。接下来就是我们要传入值进行位设置操作了,主要分为以下步骤:
1.算出是在哪个一个数组下标的范围内,除以32去商
2.知道了哪个下标了,算出在此下标的偏移位置,再取余32操作
3.根据偏移量