位圖bitmap算法

(待解)

簡單地說就是用數組存放,若有數據就標誌爲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}。

位圖排序算法如下:

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千萬個位的字符串來表示這個文件,文件中有的數據則標識爲1,沒有則標識爲0,最後從第一位讀至最後一位,即爲有序的集合。這種算法充分利用了題目中給的條件,但也僅僅適合本題目,不會有重複的數字,同時不與其餘的數進行關聯。


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

發佈了21 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章