數據結構-BitMap

BitMap是用bit位來記錄數據存在與否的一種算法。在處理大數據時,可以節省大量空間,速度也很快。

問題:已知有n個整數,這些整數的範圍是[0,100],請你設計一種數據結構,使用數組存儲這些數據,並提供兩種方法, 分別是addMember和isExist.下面是這種數據結構的類的定義。

思路1:用數組存儲,查找是否存在需要for循環n, 有n個數那麼複雜度爲O(n)

思路2: 用數組存儲,添加數據則arr[index] = 1, 這樣查找是否存在有n個數賦值度爲O(1),,直接用過數組下標判斷是否爲1

思路3:加入有1億個數呢, 上面思路2則會造成空間浪費, 我們可以用過1個整數表示32字節,每個字節則可以表示一種狀態,這樣空間上縮小了1/32

class BitMap {
    constructor(size) {
        this.bitArr = new Array(size)
        // 初始化操作
        this.bitArr.fill(0)
    }

    /**
     * 添加一個數據
     * @param {*} data 
     */
    addMember(data) {
        // 1. 計算索引
        let cur_index = Math.floor(data/32)
        // 2. 計算傳入的data在當前索引中位數(1個索引可以表示32位)
        let bit_index = data % 32
        // 3. 計算加入後的數據,並存儲
        this.bitArr[cur_index] = this.bitArr[cur_index] | 1<<bit_index
    }

    /**
     * 判斷當前數據是否已存在BitMap中
     * @param {*} data 
     */
    isExist(data) {
        // 1. 計算索引
        let cur_index = Math.floor(data/32)
        // 2. 計算傳入的data在當前索引中位數(1個索引可以表示32位)
        let bit_index = data % 32
        // 3. 計算是否存在
        let value = this.bitArr[cur_index] & 1<<bit_index

        return !!value
    }
}

利用BitMap作大數據排序(前提:數據中不能有重複):這裏舉個例子,真實數據比較多且不重複情況下

let arr = [0, 26, 38, 17, 71, 34, 10, 99, 22, 111];
let sort_arr = [];
let max = Math.max(...arr)
let bitNum = Math.ceil(max / 32)
let bit_map = new BitMap(bitNum);
for (let i = 0; i < arr.length; i++) {
    bit_map.addMember(arr[i]);
}
for (let i = 0; i <= max; i++) {
    if(bit_map.isExist(i)){
        sort_arr.push(i);
    }  
}
console.log(sort_arr);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章