zoukankan      html  css  js  c++  java
  • Bitmap介绍

    转自:http://blog.csdn.net/xgdofull/article/details/5424611

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

     

    位图排序算法如下:

        /**

         *使用位图法进行排序

         *

         *@paramarr

         */

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

     

  • 相关阅读:
    POJ 3635 Full Tank?
    ZOJ 2112 Dynamic Rankings
    POJ 3468 A Simple Problem with Integers (2)
    FJOI2007 轮状病毒
    HDU 3308 LCIS
    POJ 2449 Remmarguts' Date
    Adroid平台图表案例源码
    Android项目——实现时间线程源码
    关于Ubuntu上Eclipse不显示手机设备
    自定义ListView下拉弹起效果
  • 原文地址:https://www.cnblogs.com/limingluzhu/p/3356260.html
Copyright © 2011-2022 走看看