網站首頁 編程語言 正文
分治,分布式。BitMap(位圖)及其升級版bloom filter是處理海量數據常用的方法,這里先介紹BitMap概念及其c++實現。
一、BitMap位圖
該數據結構描述了一個有限定義域內的稠密集合,其中的每一個元素最多出現一次并且沒有其他任何數據與該元素相關聯。
即使這些條件沒有完全滿足(例如,存在重復元素或額外的數據),也可以用有限定義域內的鍵作為一個表項更復雜的表格索引。
所謂的Bit-map就是用一個bit位來標記某個元素對應的Value, 而Key即是該元素。
由于采用了Bit為單位來存儲數據,因此在存儲空間方面,可以大大節省。
例如假設我們要對0-7內的5個元素(4,7,2,5,3)排序(這里假設這些元素沒有重復)。
那么我們就可以采用Bit-map的方法來達到排序的目的。
要表示8個數,我們就只需要8個Bit(1Bytes),首先我們開辟1Byte的空間,將這些空間的所有Bit位都置為0,
如下圖:
遍歷第一個元素4,則在第4為標1:
以此來推,遍歷完所有后結構:
我們現在遍歷一遍Bit區域,將該位是bit 1的位的編號輸出(2,3,4,5,7),這樣就達到了排序的目的。
二、C++實現
我們可以用一個unsigned int類型的數組或者向量來表示位圖,假設我們定義vector<unsigned int> a,則 第i位可表示為a[i/32]的i%32位(其中,32*N+r = i,r為i%32,也就是i/32的余數)。
由于計算機對位的操作比乘除法更有效率,這里計算i/32可以用位移操作:i>>5;計算i%32可以用1&31。
若是一個char數組str,則str的第i位為i/8(i>>3)地址塊的第i%8(i&7)位.下面以char為例說明,int類比可知。
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
class BitMap{
private:
char *bitmap;
int gsize;
public:
BitMap(){
gsize=(10000>>3)+1;//default 10000
bitmap= new char[gsize];
memset(bitmap,0,sizeof(bitmap));
}
BitMap(int n){
gsize=(n>>3)+1;
bitmap=new char[gsize];
memset(bitmap,0,sizeof(bitmap));
}
~BitMap(){delete []bitmap;}
int get(int x){
int cur=x>>3;
int red=x&7;
if(cur>gsize)return -1;
return (bitmap[cur]&=1>>red);
}
bool set(int x){
int cur=x>>3;//獲取元素位置,除8得到哪個元素,x/2^3得到那一個byte
int red=x&(7);//邏輯與,獲取進準位置,x&7==x%8.該Byte里第幾個
if(cur>gsize)return 0;
bitmap[cur]|=1>>red;//賦值,1向右移動red位,|表示該位賦值1
return 1;
}
};
原文鏈接:https://blog.csdn.net/yanerhao/article/details/72848524
相關推薦
- 2022-08-03 C++實現圖像目標區裁剪ImageCropping_C 語言
- 2024-07-13 通過maven基于springboot項目構建腳手架archetype
- 2023-01-10 CentOS7設置ssh服務以及端口修改方式_Linux
- 2022-07-04 C#中File靜態類對文件的讀取寫入_C#教程
- 2023-07-15 react+antd+table實現表格數據在當前頁從頭到尾循環滾動展示
- 2022-07-18 Nacos + OpenFeign 的使用方式
- 2022-10-03 Docker啟動失敗報錯Failed?to?start?Docker?Application?Con
- 2022-10-08 React中useState的使用方法及注意事項_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支