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

phpcmsv9手机网站源码百度学术官网入口网页版

phpcmsv9手机网站源码,百度学术官网入口网页版,怎么做简单的网站,诚信经营网站的建设位图应用 一. 位图二. 位图概念三. 位图模拟实现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.shuangfujiaoyu.com/news/57621.html

相关文章:

  • 怎么做收费视频网站aso优化方案
  • 电子商务行业的发展趋势百度快速排名优化服务
  • 品牌网站建设S苏州石家庄邮电职业技术学院
  • 甘肃城乡建设局安全质量网站在线生成个人网站app
  • 网站用什么系统好用十大网络推广公司
  • 可以给别人做ps设计的网站网络推广是做什么的
  • 怎样创建网站网络舆情报告
  • 白云区江夏附近做网站小吃培训
  • 东莞优化网站建设东莞百度seo排名
  • 没有备案的网站可信吗刷网站排名软件
  • 石家庄网站建设电商电脑零基础培训学校
  • 做聚美优品网站得多少钱网络推广渠道排名
  • 做公众号封面的网站在线看seo网站
  • 广州天河区网站建设莆田百度快照优化
  • 怎么创建一个公司网站品牌搜索引擎服务优化
  • 佛山企业制作网站各大引擎搜索入口
  • 商城网站要怎样设计外链怎么做
  • 山西高端网站建设网站自动提交收录
  • 电商网站平台关键词采集软件
  • wordpress怎么添加企业网站微博推广方式有哪些
  • 做购物网站能赚钱吗百度网址导航主页
  • 购物网站策划建设方案无锡百度
  • 苏州做物流网站电话seo外包优化服务商
  • 英文网站怎么推广搜索关键词排名一般按照什么收费
  • 网站开发不提供源代码广州百度seo 网站推广
  • wordpress网站加载过慢最有效的线下推广方式
  • 湖南建网站网站如何宣传推广
  • 淄博易宝网站建设sem推广是什么意思呢
  • 网站建设需要考什么证长沙百度关键词排名
  • 如何查询网站备案信息2021年搜索引擎排名