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

阳江网站seo公司做网站设计网站建设推广

阳江网站seo公司,做网站设计网站建设推广,网络推广策划案范文5篇,东莞网站建设网站推广价钱目录 前言 位图 模拟实现 应用举例 布隆过滤器 模拟实现 应用举例 后记 前言 在介绍unordered系列容器时#xff0c;我们知道其底层使用的是哈希表#xff0c;其实哈希是一种方法#xff0c;是一种思想#xff0c;哈希思想#xff08;Hashing#xff09;是一种在…目录 前言 位图 模拟实现  应用举例 布隆过滤器 模拟实现 应用举例 后记 前言 在介绍unordered系列容器时我们知道其底层使用的是哈希表其实哈希是一种方法是一种思想哈希思想Hashing是一种在常数时间内完成数据插入和查找的算法思想。其基本思想是通过对数据进行一个映射函数的变换把数据存储在一个数组中这个数组称为哈希表。受这种思想启发许多哈希应用应运而生包括位图、布隆过滤器、海量数据处理等下面我们逐一进行介绍深度理解一下哈希这种思想无论是在解决笔试题还是面试题都能有所帮助。 位图 在32位机器下一个整数最大可以表示到2^32也就是42亿多。如果给定40亿个数如何查找一个数是否在这40亿个数中理想情况下创建一个size为2^32的vector用1标识存在用0标识不存在再将这40亿个数映射到vector中查找一个数只要查看对应下标所在元素是1or0即可但是想一下这个vector有多大2^32(个数)*4(int大小)Byte16G这是何等浪费。         想一下非要用一个int来记录0、1以标记存在情况吗是不是可以考虑使用一个比特位如果用一个比特位标记那需要多大空间呢2^32bit512MB这极大地减少了内存的消耗同时又达到了目的。因此可以在vector中存储字符一个字符是8个比特位使用的时候是一个比特位一个比特位的用设计出这么一个类在处理这种海量数据上面可以说是相当的合适了stl的位图bitset就是这样实现的如下图。所谓位图就是用每一位比特位来存放某种状态适用于海量数据且数据无重复的场景来判断某个数据存不存在的。具体使用不过多介绍参考 https://cplusplus.com/reference/https://cplusplus.com/reference/类中主要函数的使用在模拟实现时会介绍到继续往下看 模拟实现  首先通过模板参数将需要存储的个数传进来因为我这里将成员属性vector的元素设置成了char也可设置成int所以在构造函数中将N个bit除以8就是char的个数再1的原因是预留比如N为6则N/8就是01才可以进行存储多出来两个bit也没事。         其次对于set将N除以8得到第几个char将N取模8得到此char的第几个比特位将对应比特位【或】上1其余【或】上0不变对于reset如set一样不同在于将对应比特位【且】上0其余位【且】上1不变对于test将对应比特位【且】上1得到0则当前比特位是0得到1则当前比特位是1。 代码 templatesize_t N class Bitset { public:Bitset(){_bits.resize(N / 8 1, 0);}//将x位置的比特位设置成1void set(size_t x){size_t i x / 8;size_t j x % 8;_bits[i] | (1 j);}//将x位置的比特位设置成0void reset(size_t x){size_t i x / 8;size_t j x % 8;_bits[i] ~(1 j);}//x位置的比特位是否为1bool test(size_t x){size_t i x / 8;size_t j x % 8;if ((_bits[i] (1 j)) 0)return false;elsereturn true;} private:vectorchar _bits; }; 应用举例 1.给100亿个整数找到只出现一次的整数 因为整数范围是0~2^32-1即最大是42亿多所以这100亿个整数肯定存在重复。         这里我们借助两个bitset对应两个比特位结合起来标识不同的情况即00表不存在01表仅存在一个10表存在两个及以上将100亿个整数插入之后查看对应比特位是01的就是只出现一次的整数。         实现代码参考如下twoBitset1是对此实现的一个类成员对象包括两个位图bitset对于set函数若遇到00的情况说明不存在此整数将其变成01表示插入了一个若遇到01说明此整数仅存在一个将其变成10表示再插入一个若遇到10说明此整数有两个或以上无需再插入了对于print_once_num函数功能是同时遍历两个位图对应比特位是01的记录下来即为仅出现一次的整数。 代码 template size_t N class twoBitset1 { public:void set(size_t x){bool bs1bool _bs1.test(x);bool bs2bool _bs2.test(x);if (bs1bool false bs2bool false){_bs2.set(x);}else if (bs1bool false bs2bool true){_bs1.set(x);_bs2.reset(x);}}void print_once_num(){size_t i 0;for (i 0; i N; i){if ((_bs1.test(i) false) (_bs2.test(i) true))cout i ;}cout endl;}private:bitsetN _bs1;bitsetN _bs2; }; 2.给两个文件分别有100亿个整数只有1G内存如何找到两个文件的交集 先想一下强调只有1G内存的意义在哪。前面提到过整数范围是0~2^32-1也就是有2^32个整数虽然文件里的整数有100亿个但是说明其中肯定有重复的映射到0~2^32-1的范围内最多也就是有2^32个也就是2^32个bit即2^29个byte2^19个kb2^9个mb即512mb使用两个这样的位图正好1G内存。         这里我们就是使用两个位图将两个文件的整数分别映射到这两个位图中再让两个位图的对应比特位【且】一下可以【且】到某一个位图上然后找到此位图上比特位为1的整数就是两个文件的交集思路很清晰实现也不难这里无参考代码可以自己实现一下。 3.一个文件中有100亿个整数有1G内存找到出现次数不超过两次的所有整数。 如题不超过两次也就是仅出现一次或出现两次的整数。其实这道题是第一题的变形思路跟第一个大差不差就是需要多标识一种情况即00标识没出现01标识仅出现一次10标识仅出现两次11标识出现三次及以上实现过程与第一题也一样这里也不多赘述可以自己实现一下。 布隆过滤器 思考一下上面位图的缺点是不是只能映射整数如果关键字是非整数比如浮点数、string面对海量数据又如何处理呢是不是可以通过哈希函数将这类关键字进行一个转换再映射到位图当中来标记数据是否存在啊布隆过滤器bloomfilter就是这么操作的。布隆过滤器是一种概率性数据结构使用多个哈希函数将同一个数据映射到位图中可以高效地插入和查询用来告诉某样东西一定不存在或者可能存在如下图。         比如说我们设计三个哈希函数来映射key对于插入函数set根据三个哈希函数将对应三个比特位改为1即可对于查询函数给一个key也通过三个哈希函数计算出对应下标查看三个位置是否都是1首先有一个不是1那肯定就是不存在那三个都是1就一定存在吗我们说不一定因为这三个位置可能是另外一个key映射过来的并不一定是你当前查询的key映射的这也就是布隆过滤器为什么告诉你某样东西一定不存在或可能存在的原因要是判断为存在那就是可能存在也可能不存在具体存不存在需要进一步判断但这不是布隆过滤器的任务了。 模拟实现 先看属性属性是一个位图大小是ratio*N其中N是插入元素的个数ratio是一定的比率详细可看详解布隆过滤器的原理使用场景和注意事项 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/43263751https://zhuanlan.zhihu.com/p/43263751再看模板参数除了N以外布隆过滤器需要传入一个类型这里默认是string因为布隆过滤器常用于处理字符串还需要传入三个Hash函数用以处理同一个key映射到三个比特位这里Hash函数也是针对于string若是不同的类型可以针对性的传入其中针对于string的Hash函数的选取可参考各种字符串Hash函数转 - 鸭子船长 - 博客园 (cnblogs.com)https://www.cnblogs.com/zl1991/p/11820922.htmlhttps://www.cnblogs.com/zl1991/p/11820922.html这里我选择了其中的三个。         对于插入函数set使用Hash函数映射出三个哈希值分别将其变成1对于判断存在函数test实现逻辑一样使用位图的test函数判断是否存在实现代码可参考下方。 代码 #pragma once #include iostream #include bitset #include string #include vector using namespace std;//将关键字类型默认为string是因为布隆过滤器常用于处理字符串 templatesize_t N, class K string, class Hash1 HashBKDR, class Hash2 HashAP, class Hash3 HashDJB class BloomFilter { public:void set(const K key){Hash1 hash1;Hash2 hash2;Hash3 hash3;size_t i1 hash1(key) % (ratio * N); //注意ratio*N加上括号否则会有优先级问题size_t i2 hash2(key) % (ratio * N);size_t i3 hash3(key) % (ratio * N);_bs.set(i1);_bs.set(i2);_bs.set(i3);}bool test(const K key){Hash1 hash1;Hash2 hash2;Hash3 hash3;size_t i1 hash1(key) % (ratio * N); //注意ratio*N加上括号否则会有优先级问题size_t i2 hash2(key) % (ratio * N);size_t i3 hash3(key) % (ratio * N);if (!_bs.test(i1))return false; //明确不存在if (!_bs.test(i2))return false; //明确不存在if (!_bs.test(i3))return false; //明确不存在return true; //可能存在即有误判}private:const static size_t ratio 5;bitsetratio* N _bs; }; 注意为什么布隆过滤器没有支持reset删除函数         因为删除某一个key时可能会影响到其他keyeg如下图删除美团百度也会受到影响 那如何扩展布隆过滤器使得支持删除可以使用计数技术为每个比特位增加一个计数器类似硬链接有key映射到比特位计数器就删除就--当减到0才真正的删除比如 但是布隆过滤器并没有这样做因为空间消耗更加的大了本身的优势就被削弱了能应用到布隆过滤器的地方也不是很需要删除操作。 应用举例 那布隆过滤器能给出某样东西一定不存在或者可能存在这样的数据结构能应用在什么情形呢其实还是比较多的有很多地方就是不需要特别的准确只需要一个概率即可比如说游戏的昵称存在机制、预备黑名单等。         先说游戏的昵称存在机制在刚开始注册游戏时需要输入一个昵称当你输入一个已经存在的游戏会让你重新输入直到输入一个游戏不存在的昵称。其中可以用一个布隆过滤器实现将所有昵称放进一个布隆过滤器当玩家输入一个昵称时就会到这个布隆过滤器查询若是不存在则真是不存在此昵称可以使用若时是存在则是可能存在直接让玩家重新输入一个。         一般情况下黑名单会放进一个数据库当判断一个ip是不是在黑名单中时一个个去遍历查询就很麻烦可以在这个正式黑名单之前放一个预备黑名单用布隆过滤器实现查询一个ip时若不存在则肯定不在正式黑名单中若存在则可能存在则需要再进入正式黑名单中遍历检查。 再来看一个有关的面试题给两个文件分别有100亿个query(请求(字符串))只有1G内存如何找到两个文件的交集分别给出近似算法和精确算法。 近似算法         将一个文件的query映射到一个布隆过滤器遍历另外一个文件的query去查看是否存在。这样做会存在两个问题①会有误判因为这是布隆过滤器自身的缺陷②得到的交集存在重复但是这也算是达到了近似算法的要求了。 精确算法          精确算法要求真真切切的交集不能有重复不能有误判那这就不能使用布隆过滤器了这里我们使用哈希切分的思想。假设两个文件分别是A、B ①一次读取A中的query根据iHash(query)%份数M将此query放进名为Ai的小文件B中的query也是如此分别放进Bi小文件中 ②将对应i相等的Ai、Bi两个小文件加载到内存用set去判断两个小文件的交集然后将所有对应小文件的交集放在一起即可如下图。 原理A、B中相同的query会进入相同编号的小文件避免了A中的一个query要与B中所有的query都比较一番。 份数M的选取按照平分情况分割下的小文件大小能加载进内存的份数。比如说若一个query10byte100亿个query就是3000亿type300G平均分成1000份下来一份就是300MB左右可加载进内存因此M可选1000。但是值得注意实际上切割并不是平分而是哈希切割也就是可能某一份小文件大小并不是300MB左右可能已经多的加载不进内存了此时需要一个循环重新选择哈希函数再去分割。 后记 从上面两种应用以及举例可以看出哈希思想特别适合处理海量数据的情形可以将海量的数据通过哈希中一一映射的原理分类从而解决”是否存在“、“出现几次”问题这种题型在面试时很大概率会被提到希望大家能够理解这种思想在面对各种此类型的题目时都可以不变应万变有不理解的地方可以问在评论区大家讨论拜拜
http://wiki.neutronadmin.com/news/90427/

相关文章:

  • 做网站是用什么软件做的什么网站做电子章做得好
  • 泊头网站建设的有哪些深圳东门希尔顿欢朋酒店
  • 用手机做免费自助网站网架加工厂选择徐州先禾网架
  • 微商分销商城seo网络推广教程
  • 想自己做网站该学些什么美橙互联网站管理后台
  • 网站内容怎么做广西模板哪家最好
  • dw制作一个手机网站模板下载地址二手车网站建设
  • 周口建设网站的台达电子东莞有限公司
  • 电商网站项目建设wordpress网站搬家图片路径
  • 织梦培训机构网站模板wordpress没有加载图片
  • 如何规避电子政务门户网站建设的教训马鞍山人才网
  • 南京手机网站制作公司263企业邮箱官网登录
  • 有没有做淘宝的网站康县建设局网站
  • windowxp做网站服务器家居企业网站建设服务
  • 手机网站推荐.net 企业网站源码下载
  • 西安医院网站建设某网站的安全建设方案
  • 济南免费网站建站模板wordpress先生
  • 网站建设合同通用范本wordpress 制作首页模板
  • 重庆网站制作教程龙岩网站建设要多
  • 网站制作眼精准引流怎么推广
  • 股票配资网站建设wordpress wap html 博客系统
  • 百度指数 网站网页制作怎么添加视频
  • 做房产网站需要了解什么百度云建网站
  • 做国际网站找阿里网站记登录账号怎么做
  • php源码网站后台面密码忘了在哪能找回密码查看wordpress版本对应的php
  • 网站建设官方网站建筑投标网站
  • 网页游戏网站mhn敬请期待的文案
  • 网络营销网站建设培训做网站的行业平台
  • 公司网站未备案吗智能商标logo设计
  • 天河网站开发安徽省交通运输厅章义