当前位置: 首页 > news >正文

免费公司网站申请重庆营销型网站建设公司

免费公司网站申请,重庆营销型网站建设公司,长沙市网站制作电话,新手学做网站手机位图应用 一. 位图二. 位图概念三. 位图模拟实现3.1 基本思路3.2 set3.3 reset3.4 test 四. 位图小结五. 最后 一. 位图 位图(bitset)是一种特殊且高效的数据结构,用比特位0/1表示数据是否存在,常用于对查找速度和存储空间有较高要求的场景中&#xff0…

位图应用

  • 一. 位图
  • 二. 位图概念
  • 三. 位图模拟实现
    • 3.1 基本思路
    • 3.2 set
    • 3.3 reset
    • 3.4 test
  • 四. 位图小结
  • 五. 最后

一. 位图

位图(bitset)是一种特殊且高效的数据结构,用比特位0/1表示数据是否存在,常用于对查找速度和存储空间有较高要求的场景中,还可以配合宏定义使用,例如系统调用open的的第二个参数就是简单位图结构。

哈希常用与面试场景试题中,例如:

问题1:给出40亿个不重复的无符号整数,给出指定的无符号整数,如何快速判断该整数是否存在于给出40亿个整数中。

1G 约等于10亿多字节,一个整数4个字节,160亿字节,存储这些数据约等于16G,这些数据无法存储于内存中。暴力查找太慢,而二分查找+排序,该算法只能对内存中的数据进行查找,所以这就产生位图

二. 位图概念

位图的本质是直接定址法的体现,存储数据使用vector,而里面存储的0/1表示数据是否存在,
例如vector数组第32位置对应的比特位为1,就表示32这个数存在,为0则表示不存在。

  • 为什么位图可以解决上述问题???

无符号的最大整数:
在这里插入图片描述
假设上面40亿多个无符号整数都存在,即范围[0,4294967295] 一个int可以表示32个整数,看看存储上述这些数需要多少个int,4294967295 / 32 = 134217727.96875约等于1.35亿个int,需要多少空间存储看看,1.35亿 * 4 = 5.4亿字节,也就是说需要不超过1G内存就可以存储,内存肯定存的下。

下面看看工作原理:

在这里插入图片描述

三. 位图模拟实现

3.1 基本思路

使用传进来的整数,再调用构造函数时来进行开空间,例如当传入63时,需要两个int才可以包括该数,一个int表示范围是[0,32],不够表示63。
使用下面公式判断该数是否存在???

  • 判断该数位于哪个下标: N / 32
  • 判断该数具体位置: N % 32
template<size_t N>
class bitset
{
public:bitset(){_bs.resize(N / 32 + 1);}
private:std::vector<int> _bs;
};

在这里插入图片描述
个人感觉有点像哈希桶里面,桶就是下标,而取余的余数表示该数据在桶中的偏移量。
比如34在第二个桶,34%32 =2,在第二个桶中偏移量为2就是34该数,只不过使用0/1表示。

3.2 set

功能:就是将指定数据的比特位设置为1,表示此时该数据存在了,如何实现呢???
先找出该数据在第一个下标,然后取出该下标中的数据按位异或上1左移偏移量的值的结果。
下面用图解释一下:

下面假设下标1中存储的数据为,我们将34对应的比特位设置为1。
在这里插入图片描述
代码如下:

// x映射的位标记成1void set(size_t x){size_t i = x / 32;//第几个位置,这个数存在于该数组下标之中size_t j = x % 32;//简单点说就是偏移量_bs[i] |= (1 << j);}

3.3 reset

功能:就是将指定数据的比特位设置为0,表示此时该数据不存在了,如何实现呢???
先找出该数据在第一个下标,然后取出该下标中的数据按位异与上1左移偏移量的值然后进行取反后的结果。
下面用图解释一下:

下面假设下标1中存储的数据为4,我们将34对应的比特位设置为0。
在这里插入图片描述
伪代码如下:

// x映射的位标记成0void reset(size_t x){size_t i = x / 32;size_t j = x % 32;_bs[i] &= (~(1 << j));}

3.4 test

功能:判断指定的数据是否存在,如何实现呢???
先找出该数据在第一个下标,然后取出该下标中的数据按位异与上1左移偏移量的值然后进行取反后的结果。
下面用图解释一下:

下面假设下标1中存储的数据为4,我们需要判断下标为34的比特位是0或者1。

在这里插入图片描述
若结果为非0,则表示存在;0则表示不存在。伪代码如下:

// x映射的位是1返回真// x映射的位是0返回假bool test(size_t x){size_t i = x / 32;size_t j = x % 32;return _bs[i] &= (1 << j);}

问题2:

给定100亿个整数,设计算法找到只出现⼀次的整数?

如何设计算法???
规定:

  • 0 0:出现0次
  • 0 1:出现1次
  • 1 0:出现2次
  • 其它:出现3次及以上

思路:用两个位图存储,把位图1看做高位,位图2看作低位,第一次出现给位图1设置,第二次出现时给两个位图都设置。

template<size_t N>class twobitset{public:void set(size_t x){//先检测,再进行设置原则bool bit1 = _bs1.test(x);bool bit2 = _bs2.test(x);if (!bit1 && !bit2)//00 -> 01{_bs2.set(x);}else if (!bit1 && bit2)// 01 -> 10{_bs1.set(x);_bs2.reset(x);}else if (bit1 && !bit2)//10 -> 11{_bs2.set(x);}}private:bitset<N> _bs1;bitset<N> _bs2;};

先获取指定数据两个位图对应的比特位,然后进行判断00即0次,01即1次,10即2次等等。
获取出现个数代码:

int get_count(size_t x){bool bit1 = _bs1.test(x);bool bit2 = _bs2.test(x);if (!bit1 && !bit2){return 0;}else if (!bit1 && bit2){return 1;}else if (bit1 && !bit2){return 2;}else{return 3;}}

问题3:

给两个⽂件,分别有100亿个整数,我们只有1G内存,如何找到两个⽂件交集?

用两个位图分别对两个文件数据对应比特位设置为1,然后同时进行判断即可。
问题4:

⼀个⽂件有100亿个整数,1G内存,设计算法找到出现次数不超过2次的所有整数

思路与上述相似,这⾥要统计出现次数不超过2次的,可以每个值⽤两个位标记即可,00代表出现0次,01代表出现1次,10代表出现2次,11代表出现2次以上。最后统计出所有01和10标记的值即可,然后直接调用统计次数(出现1或2次的)的接口即可。

template<size_t N>
class twobitset
{
public:void set(size_t x){//先检测,再进行设置原则bool bit1 = _bs1.test(x);bool bit2 = _bs2.test(x);if (!bit1 && !bit2)//00 -> 01{_bs2.set(x);}else if (!bit1 && bit2)// 01 -> 10{_bs1.set(x);_bs2.reset(x);}else if (bit1 && !bit2)//10 -> 11{_bs2.set(x);}}int get_count(size_t x){bool bit1 = _bs1.test(x);bool bit2 = _bs2.test(x);if (!bit1 && !bit2){return 0;}else if (!bit1 && bit2){return 1;}else if (bit1 && !bit2){return 2;}else{return 3;}}
private:bitset<N> _bs1;bitset<N> _bs2;
};void test_bitset2()
{twobitset<100> tbs;int a[] = { 5,7,9,2,5,99,5,5,7,5,3,9,2,55,1,5,6,6,6,6,7,9 };for (auto e : a){tbs.set(e);}for (size_t i = 0; i < 100; ++i){//cout << i << "->" << tbs.get_count(i) << endl;if (tbs.get_count(i) == 1 || tbs.get_count(i) == 2){cout << i << endl;}}
}

四. 位图小结

位图优点:

  • 查找数据是否存在即快O(1)。
  • 节省空间。

位图缺点:

  • 只能映射整形数据。
  • 对于浮点型或字符型数据无法做到正确映射。

应用场景:

  • 查找数据是否存在。

五. 最后

本文详细先给出一个面试题引入位图可以解决该问题,然后介绍位图概念及应用场景,并模拟实现位图,通过简单的面试题可以加深对位图的理解及实践能力,最后得出位图是一个非常高效数据结构尤其是在查找和对空间有较高要求的场景下,而对于字符串无法进行处理,哈希的另一个应用可以解决该问题:布隆过滤器。详情文章移布置下一篇文章。

http://www.tj-hxxt.cn/news/47783.html

相关文章:

  • 广州网站建设阿里云产品的推广及宣传思路
  • 移动端设计规范短视频seo排名
  • 代申请可信网站公司网站怎么建立
  • 用WordPress管理app西安seo公司
  • 上海公司注册流程和费用谷歌seo排名优化
  • 长春做网站多少钱怎么建立一个属于自己的网站
  • 西宁圆井模板我自己做的网站提交链接
  • 沈阳建站模板系统本地推广最有效的方法
  • vps如何建两个网站广州seo优化公司排名
  • 日本人做爰过程网站巩义网站优化公司
  • 哪个网站可以做化学实验国产最好的a级suv
  • 网站客户服务方案网络营销推广软件
  • wordpress分类目录无内容广州网站优化多少钱
  • 网站导航规划西藏自治区seo 标题 关键词优化
  • 网站管理员登陆不了web网页制作成品免费
  • 一个虚拟主机可以放几个网站网络营销的营销策略
  • 在线域名ip查询aso具体优化
  • 做网站阳泉网络营销专业是干嘛的
  • 公司网站建设素材淄博信息港聊天室网址
  • 公司网络建设计划书seo短视频
  • 菏泽做网站多少钱如何做好推广工作
  • 网站建设?首选百川互动广东培训seo
  • 如何鉴赏网站论文佛山网站排名提升
  • 偷拍哪个网站做的好营销策划的重要性
  • 京东网站制作优点怎样做网站平台
  • 9夜夜做新郎网站西安网站建设比较好的公司
  • 做网站公司哪里好国外网站推广
  • 网站域名转出百度竞价排名怎么做
  • 博白建设局网站品牌如何推广
  • 国内做新闻比较好的网站有哪些公司营销策划方案案例