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

网站网站制作服务搜索引擎优化公司

网站网站制作服务,搜索引擎优化公司,汶上做网站,网站建设法规政策一、位图的引入 先来看下边一道面试题: 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 经过我们之前的学习,我们可能会有以下的思路: 对这些数进行排序&#xff…

一、位图的引入

先来看下边一道面试题:

给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。

经过我们之前的学习,我们可能会有以下的思路:

  • 对这些数进行排序,再通过二分算法,查找这个数是否存在

  • 插入到unordered_set中,使用find函数查找是否存在

上述方法看起来还不错,二分查找算法时间复杂度为logN,而插入到unordered_set中时间复杂度为O(N),而查找时时间复杂度为O(1),但是都有一个问题就是要将空间不足,40亿个无符号整形,需要160亿字节的空间,大概就是16GB的空间,一般计算机的内促都是4G或者8G,所以空间不足,此时就有了位图的方法来解决:

数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。比如:

对于上图来说,有一个整形数组,我们可以使用直接定址法对数组的数据进行映射,但是与之前不同的是,此时只是使用一个比特位来代表一个整形数据,当这个数存在时,比特位置1,不存在时,比特位置0,此时就可以大大节省空间资源,无符号整数只有2的32次方个,所以最多开2的32次方个空间,一个空间为一个比特,所以最终只需要512MB的空间。但是我们不能按照位来空间,最少必须一个字节,所以我们就每次开一个字节的空间,也就是8个比特位,将8位当做一个整体来处理,对要保存的数据除8就是第几个字节,对保存的数据模8就是在这个字节中的第几个位置。

二、位图的概念

所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。

那么位图还有哪些应用呢?

  • 快速查找某个数据是否在一个集合中

  • 排序 + 去重

  • 求两个集合的交集、并集等

  • 操作系统中磁盘块标记

位图模拟实现

一、构造函数

由于不能按位开空间,所以我们选择每次开一个字节的空间,由于有范围最大为N,一位关联一个数据,所以需要开N/8个字节的空间,但是有时可能不能整除,所以要开N/8+1个字节的空间。所以

直接在构造函数中开好空间:

bitset(){_bits.resize(N / 8 + 1,0);}

二、set,reset,test函数

set函数的作用是对位图中的某一位进行填充

i就表示是第几个字节,而j表示该位在该字节中的第几位,所以对1进行左移j位后与该字节按位或,按位或的作用时不论该位为0还是为1,都将该位变为1。

void set(size_t x){int i = x / 8;int j = x % 8;_bits[i] |= (1 << j);}

reset的作用是将某一位清空

同样的将要清空的那一位置为0,进行按位与,不论原本该位是0还是1,都将该位置0

void reset(size_t x){int i = x / 8;int j = x % 8;_bits[i] &= ~(1 << j);}

test的作用是检测位图中某一位是否存在

bool test(size_t x){int i = x / 8;int j = x % 8;return _bits[i] & (1 << j);}

三、代码测试

void test_bit_set1(){bitset<100> bs1;bs1.set(8);bs1.set(9);bs1.set(20);cout << bs1.test(8) << endl;cout << bs1.test(9) << endl;cout << bs1.test(20) << endl;bs1.reset(8);bs1.reset(9);bs1.reset(20);cout << bs1.test(8) << endl;cout << bs1.test(9) << endl;cout << bs1.test(20) << endl;}

四、完整代码

namespace tmt
{template<size_t N>class bitset{public:bitset(){_bits.resize(N / 8 + 1,0);}void set(size_t x){int i = x / 8;int j = x % 8;_bits[i] |= (1 << j);}void reset(size_t x){int i = x / 8;int j = x % 8;_bits[i] &= ~(1 << j);}bool test(size_t x){int i = x / 8;int j = x % 8;return _bits[i] & (1 << j);}private:vector<char> _bits;};void test_bit_set1(){bitset<100> bs1;bs1.set(8);bs1.set(9);bs1.set(20);cout << bs1.test(8) << endl;cout << bs1.test(9) << endl;cout << bs1.test(20) << endl;bs1.reset(8);bs1.reset(9);bs1.reset(20);cout << bs1.test(8) << endl;cout << bs1.test(9) << endl;cout << bs1.test(20) << endl;}

http://www.khdw.cn/news/66462.html

相关文章:

  • 雁塔免费做网站宁波seo关键词优化教程
  • 沙漠风网站建设怎么样网络品牌营销
  • 景区网站建设策划交换链接的例子
  • 建设外贸网站要多少钱获客软件
  • 一般做一个网站多少钱免费关键词搜索引擎工具
  • 安徽网站建设制作深圳外贸seo
  • 网站架设教程如何优化关键词排名到首页
  • 项目计划书目录seo网站优化教程
  • 做商城购物网站网络推广方式有哪些
  • 国内做网站的公司有哪些seo搜索引擎优化步骤
  • 手机怎么做黑网站网站优化资源
  • 绿色在线网站模板下载安卓优化神器
  • 哈尔滨制作网站多少钱百度搜索引擎的使用方法
  • 深圳做网站补贴哪家公司做seo
  • 成都网站建设网络公司百度网页版入口
  • 制作一个网站建立一个网站需要多少钱
  • 公司网站建设合同企业员工培训内容及计划
  • 微网站开发费用网络营销实训个人总结
  • 做网站需要什么服务器如何免费引流推广
  • 网站的超级链接怎么做搜索引擎有哪几个网站
  • 深圳网站策划seo学徒是做什么
  • 餐饮小程序制作百度快照优化的优势是什么
  • 苏州区建设局网站免费软文发布平台
  • 做外贸要注册那些网站东莞seo建站优化哪里好
  • php电子商务网站开发实例网络网站推广优化
  • 许昌住房建设局的网站广州百度提升优化
  • wordpress首页刷新郑州seo服务技术
  • 做网站需要合同吗合肥网络公司
  • 小程序前端开发教程北京seo推广
  • 建设网站提供资料的函营销策划有限公司经营范围