你好,游客 登录
背景:
阅读新闻

位图bitmap算法(java)

[日期:2017-09-13] 来源:CSDN  作者:xgdofull [字体: ]

简单的说就是用数组存放若有数据就标志为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 (int i : 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};

 

位图排序算法如下:

    /**

     * 使用位图法进行排序

     *

     * @param arr

     */

    public static void bitmapSort(int[] arr) {

      // 找出数组中最值

      int max = arr[0];

      int min = max;

      for (int i : arr) {

          if (max < i) {

              max = i;

          }

          if (min > i) {

              min = i;

          }

      }

      // 得到位图数组

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

      // 重新调整arr中的元素

      int index = 0;

      for (int i = 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,最后从第一位读至最后一位,即为有序的集合。这种算法充分利用了题目中给的条件,但也仅仅适合本题目,(不会有重复的数字,同时不与其余的数进行关联)

收藏 推荐 打印 | 阅读:
相关新闻       bitmap算法