算法【位图】
创始人
2024-11-13 03:07:50
0

特别提醒:Python同学实现位运算的题目需要特别注意,需要自己去手动处理溢出和符号扩展等问题。比如:

(n << shift_amount) & 0xFFFFFFFF

一、位图原理

其实就是用bit组成的数组来存放值,用bit状态1、0代表存在、不存在,取值和存值操作都用位运算。限制是必须为连续范围且不能过大。好处是极大的节省空间,因为1个数字只占用1个bit的空间。

二、位图的实现

一个位图有以下几个函数:

// 初始化位图 只支持0~n-1所有数字的增删改查 Bitset(int n); // 把num加入到位图 void add(int num); // 把num从位图中删除 void remove(int num); // 如果位图里没有num 就加入  如果位图里有num 就删除 void reverse(int num); // 查询num是否在位图中 bool contains(int num);

代码如下。

class Bitset { public:     int *arr;     Bitset(int n);     ~Bitset();     void add(int num);     void remove(int num);     void reverse(int num);     bool contains(int num); };  Bitset::Bitset(int n) {     // 数组大小为n/32向上取整 可写成(n+31)/32     arr = new int[(n+31)/32]; }  Bitset::~Bitset() {     delete [] arr; }  void Bitset::add(int num){     arr[num/32] |= (1 << (num % 32)); }  void Bitset::remove(int num){     arr[num/32] &= ~(1 << (num % 32)); }  bool Bitset::contains(int num){     return ~((arr[num/32] & (1 << (num % 32))) == 0); }  void Bitset::reverse(int num){     if(contains(num)){         remove(num);     }else{         add(num);     } }

由于是用位代表一个数是否存在,所以一个int可代表32个数,则需要的int个数为n/32向上取整。对此可用(a + b -1)/b为a/b的向上取整来计算。对于一个数num,它被哪一个int代表由num/32得到下标,而具体的位则是由num%32得到。add方法中得到具体位数直接或进去,remove方法中得到具体的位数直接与进去。

下面有一个相关测试可以检验一下,按照题目要求修改部分即可。

测试链接:https://leetcode-cn.com/problems/design-bitset/

代码如下。

class Bitset { public:     // 根据数据量提前申请     int arr[3126] = {0};     // 是否翻转 false为没翻转 true为翻转     bool f;     // 记录1的个数     int cnt;     // 能代表多少个数     int nums;     Bitset(int size) {         f = false;         cnt = 0;         nums = size;     }      void fix(int idx) {         if(!f){             if(((arr[idx/32] >> (idx % 32)) & 1) == 0){                 arr[idx/32] |= (1 << (idx % 32));                 cnt++;             }         }else{             if(((arr[idx/32] >> (idx % 32)) & 1) == 1){                 arr[idx/32] &= ~(1 << (idx % 32));                 cnt++;             }         }     }          void unfix(int idx) {         if(!f){             if(((arr[idx/32] >> (idx % 32)) & 1) == 1){                 arr[idx/32] &= ~(1 << (idx % 32));                 cnt--;             }         }else{             if(((arr[idx/32] >> (idx % 32)) & 1) == 0){                 arr[idx/32] |= (1 << (idx % 32));                 cnt--;             }         }     }          void flip() {         f = !f;         cnt = nums - cnt;     }          bool all() {         return cnt == nums;     }          bool one() {         return cnt != 0;     }          int count() {         return cnt;     }          string toString() {         string s = "";         for(int i = 0;i < (nums + 31)/32;++i){             int cons = nums - i * 32 < 32 ? nums - i * 32 : 32;             for(int j = 0;j < cons;++j){                 if((!f && ((arr[i] >> j) & 1) == 1) || (f && ((arr[i] >> j) & 1) == 0)){                     s += '1';                 }else{                     s += '0';                 }             }         }         return s;     } };

其中,翻转使用一个变量代表,不需要每次遍历位图实现翻转。fix和unfix方法均分为翻转和未翻转两种情况。

相关内容

热门资讯

秒懂教程!微信的牛牛房卡怎么弄... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:71319951许多玩家在游戏中会购买房卡来享受...
一分钟推荐“拼三张金花房卡找谁... 新七喜是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:160470940许多玩家在游戏中会购买房卡来...
秒懂教程!拼三张房卡购买联系方... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:66336574许多玩家在游戏中会购买房卡来享...
正版授权“微信炸金花房间怎么创... 微信炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:160470940许多玩家在游戏中会购买房...
秒懂教程!微信群牛牛房间怎么开... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:56001354许多玩家在游戏中会购买房卡来享受...
秒懂教程“微信金花群怎么买房卡... 冷酷大厅是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:86909166许多玩家在游戏中会购买房卡来...
秒懂教程!微信群拼三张房间卡买... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:71319951许多玩家在游戏中会购买房卡来享...
一分钟了解“炸金花房卡专卖店联... 金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:44346008许多玩家在游戏中会购买房卡来享受...
安卓系统彩蛋怎么开的,揭秘隐藏... 你有没有发现,安卓系统里藏着不少小秘密呢?今天,就让我来带你一探究竟,揭秘安卓系统里的那些彩蛋吧!一...
秒懂教程!炸金花房卡如何购买,... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:66336574许多玩家在游戏中会购买房卡来享...
一分钟推荐“微信金花链接房卡怎... 金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡来享受...
秒懂教程!微信怎么开炸金花房间... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:56001354许多玩家在游戏中会购买房卡来享...
房卡必备教程“微信炸金花房卡在... 微信炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:160470940许多玩家在游戏中会购买房...
魅族系统属于安卓系统吗,深度解... 魅族系统属于安卓系统吗?亲爱的读者们,你是否曾好奇过魅族手机所搭载的魅族系统,它究竟是不是安卓系统呢...
秒懂教程!怎么创建拼三张房间卡... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:71319951许多玩家在游戏中会购买房卡来享...
秒懂教程“牛牛链接房卡找谁购买... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:160470940许多玩家在游戏中会购买房卡来享...
秒懂教程!微信的拼三张房卡怎么... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:66336574许多玩家在游戏中会购买房卡来享...
秒懂教程“牛牛金花房卡是如何购... 牛牛大厅是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡来...
一分钟实测分享”新果汁大厅怎么... 一分钟实测分享”新果汁大厅怎么买房卡“炸金花房间卡怎么购买游戏中心打开微信,添加客服【1138577...
秒懂教程!微信牛牛房卡如何购买... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:56001354许多玩家在游戏中会购买房卡来享受...