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);