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

网易门户网站建设北京移动端网站多少钱

网易门户网站建设,北京移动端网站多少钱,网络营销方式论文,wordpress 国产插件1. unordered系列关联式容器 在C98中#xff0c;STL提供了底层为红黑树结构的一系列关联式容器#xff0c;在查询时效率可达到 #xff0c;即最差情况下需要比较红黑树的高度次#xff0c;当树中的节点非常多时#xff0c;查询效率也不理想。最好的查询是#xff0c;进行…1. unordered系列关联式容器 在C98中STL提供了底层为红黑树结构的一系列关联式容器在查询时效率可达到 即最差情况下需要比较红黑树的高度次当树中的节点非常多时查询效率也不理想。最好的查询是进行很少的比较次数就能够将元素找到因此在C11中STL又提供了4个unordered系列的关联式容器这四个容器与红黑树结构的关联式容器使用方式基本类似只是其底层结构不同本文中只对unordered_map和unordered_set进行介绍。(unordered_multimap和unordered_multiset 使用的不多用法与multimap和multiset使用类似)1.1. unordered_map1.1.1. 使用介绍unordered_map是存储key, value键值对的关联式容器其允许通过keys快速的索引到与其对应的value。在unordered_map中键值通常用于惟一地标识元素而映射值是一个对象其内容与此键关联。键和映射值的类型可能不同。在内部,unordered_map没有对kye, value按照任何特定的顺序排序, 为了能在常数范围内找到key所对应的valueunordered_map将相同哈希值的键值对放在相同的桶中。unordered_map容器通过key访问单个元素要比map快但它通常在遍历元素子集的范围迭代方面效率较低。unordered_maps实现了直接访问操作符(operator[])它允许使用key作为参数直接访问value。它的迭代器至少是前向迭代器。 unordered_map使用文档1.1.2. 接口说明unordered_map的构造函数声明功能介绍unordered_map构造不同格式的unordered_map对象unordered_map的容量函数声明功能介绍bool empty() const检测unordered_map是否为空size_t size() const获取unordered_map的有效元素个数unordered_map的迭代器函数声明功能介绍begin返回unordered_map第一个元素的迭代器end返回unordered_map最后一个元素下一个位置的迭代器cbegin返回unordered_map第一个元素的const迭代器cend返回unordered_map最后一个元素下一个位置的const迭代器unordered_map的元素访问函数声明功能介绍operator[]返回与key对应的value没有一个默认值注意该函数中实际调用哈希桶的插入操作用参数key与V()构造一个默认值往底层哈希桶中插入如果key不在哈希桶中插入成功返回V()插入失败说明key已经在哈希桶中将key对应的value返回。unordered_map的查询 函数声明功能介绍iterator find(const K key)返回key在哈希桶中的位置size_t count(const K key)返回哈希桶中关键码为key的键值对的个数注意unordered_map中key是不能重复的因此count函数的返回值最大为1unordered_map的修改操作函数声明功能介绍insert向容器中插入键值对erase删除容器中的键值对void clear()清空容器中有效元素个数void swap(unordered_map)交换两个容器中的元素unordered_map的桶操作函数声明功能介绍size_t bucket_count()const返回哈希桶中桶的总个数size_t bucket_size(size_t n)const返回n号桶中有效元素的总个数size_t bucket(const K key)返回元素key所在的桶号1.2. unordered_set 其功能与接口和unordered_map类似这里就不再详细列举出其使用方法和接口。详细请参考unordered_set使用手册。1.3. unordered系列容器与map和set的区别unordered系列遍历不按key排序unordered系列的迭代器全部是单向迭代器unordered系列综合效率略胜map和setmap和set对key的要求需要key能够支持比较大小如果不能比较必须要显式的传入比较仿函数。unordered_map、unordered_set对key的要求需要key能够支持取模或者转化成取模的无符号整数需要key能够比较是否相等或者传入仿函数。2. 哈希表unordered_map和unordered_set的增删查改的效率都为O(1)是非常快的是因为它的底层结构使用了哈希表。2.1. 哈希理想的搜索方法可以不经过任何比较一次直接从表中得到要搜索的元素。 如果构造一种存储结构通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系那么在查找时通过该函数可以很快找到该元素。插入元素据待插入元素的关键码以此函数计算出该元素的存储位置并按此位置进行存放搜索元素对元素的关键码进行同样的计算把求得的函数值当做元素的存储位置在结构中按此位置取元素比较若关键码相等则搜索成功该方式即为哈希(散列)方法哈希方法中使用的转换函数称为哈希(散列)函数构造出来的结构称为哈希表(Hash Table)(或者称散列表) 例如数据集合{176459}哈希函数设置为hash(key) key % capacity; capacity为存储元素底层空间总的大小 2.2. 哈希冲突例如我们使用哈希的方法向顺序表中插入整数顺序表的容量为10先插入15那么插入到数组下标为5的位置如果再插入25怎么办类似上面这种情况将不同的元素通过哈希函数映射到了哈希表的相同位置就是哈希冲突。2.3. 哈希函数引起哈希冲突的一个原因可能是哈希函数设计不够合理。 哈希函数设计原则哈希函数的定义域必须包括需要存储的全部关键码而如果散列表允许有m个地址时其值域必须在0到m-1之间哈希函数计算出来的地址能均匀分布在整个空间中哈希函数应该比较简单常用哈希函数1. 直接定制法取关键字的某个线性函数为散列地址**HashKey A*Key B** 优点简单、均匀 缺点需要事先知道关键字的分布情况 使用场景适合查找比较小且连续的情况 面试题字符串中第一个只出现一次字符2.除留余数法设散列表中允许的地址数为m取一个不大于m但最接近或者等于m的质数p作为除数按照哈希函数Hash(key) key% p(pm),将关键码转换成哈希地址。2.4. 哈希冲突解决解决哈希冲突两种常见的方法是闭散列和开散列2.4.1 闭散列闭散列也叫开放定址法当发生哈希冲突时如果哈希表未被装满说明在哈希表中必然还有空位置那么可以把key存放到冲突位置中的“下一个” 空位置中去。那如何寻找下一个空位置呢线性探测比如上面举的例子现在需要插入元素25先通过哈希函数计算哈希地址hashAddr为5因此25理论上应该插在该位置但是该位置已经放了值为15的元素即发生哈希冲突。线性探测从发生冲突的位置开始依次向后探测直到寻找到下一个空位置为止。二次探测发生哈希冲突后寻找下一位空位置的方法为Hi (H0i^2)%m (i1,2,3...)H0是通过散列函数Hash(x)对元素的关键码 key 进行计算得到的位置m是表的大小。线性探测优点简单。线性探测缺点一旦发生哈希冲突所有的冲突连在一起容易产生数据“堆积”即不同关键码占据了可利用的空位置使得寻找某关键码的位置需要许多次比较导致搜索效率降低。 二次探测优点缓解线性探测的数据堆积问题。二次探测缺点空间利用率较低。还有一个有效解决哈希冲突的方法是扩容这样能将部分数据的映射位置分开。注意采用闭散列处理哈希冲突时不能随便物理删除哈希表中已有的元素直接删除元素会影响其他元素的搜索 。实际的处理方法是给每一个位置做一个标记位通过改变标记位来控制删除。(例如empty为空exist为存在delete为删除)2.4.2 开散列 开散列概念开散列法又叫链地址法(开链法)首先对关键码集合用散列函数计算散列地址具有相同地址的关键码归于同一子集合每一个子集合称为一个桶各个桶中的元素通过一个单链表链接起来各链表的头结点存储在哈希表中。 这样就能很好的解决哈希冲突的问题实际哈希表在实现时也是使用的这种方法。3. 位图给40亿个不重复的无符号整数没排过序。给一个无符号整数如何快速判断一个数是否在这40亿个数中。【腾讯】 将所有数据存放在位图中数据是否在给定的位图中结果是在或者不在刚好是两种状态那么可以使用一个二进制比特位来代表数据是否存在的信息如果二进制比特位为1代表存在为0代表不存在。节省了大量空间。3.1. 概念所谓位图就是用每一位来存放某种状态适用于海量数据数据无重复的场景。通常是用来判断某个数据存不存在的。3.2. 位图的实现#pragma once #include vectornamespace bit {templatesize_t Nclass bitset{public:bitset(){_bits.resize(N / 8 1, 0); //为了避免存入数据的个数不是8的整数倍所以多开一开字节}void set(size_t x){size_t i x / 8; // 找到存入的值在哪个字节size_t j x % 8; // 找到在该字节中的具体位置_bits[i] | (1 j); // 将该位置置为1}void reset(size_t x){size_t i x / 8;size_t j x % 8;_bits[i] (~(1 j));}bool test(size_t x){size_t i x / 8;size_t j x % 8;return _bits[i] (1 j);}private:std::vectorchar _bits; // 每个字段8个比特位//std::vectorint _bits;};3.3. 位图的应用快速查找某个数据是否在一个集合中排序求两个集合的交集、并集等操作系统中磁盘块标记 4. 布隆过滤器如果遇到数据量非常大的问题虽然有些可以使用位图解决但是位图的使用非常局限即位图中只能存整数那么如果遇到字符串、自定义类型怎么办4.1. 布隆过滤器概念 布隆过滤器是由布隆Burton Howard Bloom在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构特点是高效地插入和查询可以用来告诉你 “某样东西一定不存在或者可能存在”它是用多个哈希函数将一个数据映射到位图结构中。此种方式不仅可以提升查询效率也可以节省大量的内存空间。 4.2. 布隆过滤器的实现由于布隆过滤器的底层也是由位图去实现的那么就出现了一个问题位图中的映射关系是直接映射那么如果使用哈希函数将其他类型转化成整数就必然存在哈希冲突问题。所以为了解决位图中的哈希冲突布隆过滤器中使用了多个哈希函数将转化的整数形成多个映射存放在位图的不同位置。(当然这种方式不能完全解决哈希冲突)#pragma once#include bitset #include string #include time.hstruct BKDRHash {size_t operator()(const string s){// BKDRsize_t value 0;for (auto ch : s){value * 31;value ch;}return value;} };struct APHash {size_t operator()(const string s){size_t hash 0;for (long i 0; i s.size(); i){if ((i 1) 0){hash ^ ((hash 7) ^ s[i] ^ (hash 3));}else{hash ^ (~((hash 11) ^ s[i] ^ (hash 5)));}}return hash;} };struct DJBHash {size_t operator()(const string s){size_t hash 5381;for (auto ch : s){hash (hash 5) ch;}return hash;} };templatesize_t N, size_t X 8, class K string, class HashFunc1 BKDRHash, class HashFunc2 APHash, class HashFunc3 DJBHash class BloomFilter { public:void Set(const K key){size_t len X*N;size_t index1 HashFunc1()(key) % len;size_t index2 HashFunc2()(key) % len;size_t index3 HashFunc3()(key) % len;/* cout index1 endl;cout index2 endl;cout index3 endlendl;*/_bs.set(index1);_bs.set(index2);_bs.set(index3);}bool Test(const K key){size_t len X*N;size_t index1 HashFunc1()(key) % len;if (_bs.test(index1) false)return false;size_t index2 HashFunc2()(key) % len;if (_bs.test(index2) false)return false;size_t index3 HashFunc3()(key) % len;if (_bs.test(index3) false)return false;return true; // 存在误判的}// 不支持删除删除可能会影响其他值。void Reset(const K key); private:bitsetX*N _bs; };注意布隆过滤器如果说某个元素不存在时该元素一定不存在如果该元素存在时该元素可能存在因为有些哈希函数存在一定的误判。 为了降低布隆过滤器的误判问题可以适当增大位图的大小。4.3. 布隆过滤器删除布隆过滤器不能直接支持删除工作因为在删除一个元素时如果该位置也可能映射有其他元素可能就会影响其他元素。一种支持删除的方法将布隆过滤器中的每个比特位扩展成一个小的计数器插入元素时给k个计数器(k个哈希函数计算出的哈希地址)加一删除元素时给k个计数器减一通过多占用几倍存储空间的代价来增加删除操作。缺陷无法确认元素是否真正在布隆过滤器中存在计数回绕 4.3. 布隆过滤器优点 增加和查询元素的时间复杂度为:O(K), (K为哈希函数的个数一般比较小)与数据量大小无关哈希函数相互之间没有关系方便硬件并行运算 布隆过滤器不需要存储元素本身在某些对保密要求比较严格的场合有很大优势 在能够承受一定的误判时布隆过滤器比其他数据结构有这很大的空间优势数据量很大时布隆过滤器可以表示全集其他数据结构不能使用同一组散列函数的布隆过滤器可以进行交、并、差运算 4.4. 布隆过滤器缺陷 有误判率即存在假阳性(False Position)即不能准确判断元素是否在集合中(补救方法再建立一个白名单存储可能会误判的数据)不能获取元素本身一般情况下不能从布隆过滤器中删除元素如果采用计数方式删除可能会存在计数回绕问题 布隆过滤器使用场景数据量大节省空间允许误判这样的场景就可以使用布隆过滤器。如注册时输入昵称时将数据库中的昵称放入布隆过滤器中检查是否存在。昵称不存在时不会发生误判如果存在可能会发生误判但是不会影响数据库中的数据(即误判了本来不存在的昵称为存在)5. 海量数据面试题5.1. 哈希切割给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址 与上题条件相同如何找到top K的IP如何直接用Linux系统命令实现哈希切分(1)依次读取IPi BKDRHash(ip)%200(n)i是多少ip就进入对应编号的小文件中相同的ip就一定进入了同一个小文件然后使用map统计一个小文件的ip的次数就是这个ip准确的次数。(2)使用priority_queue将map中的每个ip插入小堆中即可统计出来。5.2. 位图应用1.给定100亿个整数设计算法找到只出现一次的整数使用两个位图将两个位图相同的位置用作一个整数的计数(00未出现01出现一次10出现两次及以上)这样只找01位置的数即可。代码templatesize_t N class TwoBitSet { public:void Set(size_t x){if (!_bs1.test(x) !_bs2.test(x)) // 00 - 01{_bs2.set(x);}else if (!_bs1.test(x) _bs2.test(x)) // 01 - 10{_bs1.set(x);_bs2.reset(x);}// 10 表示已经出现2次或以上不用处理}void PrintOnceNum(){for (size_t i 0; i N; i){if (!_bs1.test(i) _bs2.test(i)) // 01{cout i endl;}}} private:bit::bitsetN _bs1;bit::bitsetN _bs2; };2.给两个文件分别有100亿个整数我们只有1G内存如何找到两个文件交集把一个文件中的整数set到位图bs1中另一个文件set到位图bs2中。遍历bs1中的值然后看这个值在不在bs2中。将两个位图相与得到的结果位图中为1的位置就是交集。3.位图应用变形1个文件有100亿个int1G内存设计算法找到出现次数不超过2次的所有整数 同第一题一样使用两个位图00未出现01出现1次10出现2次11出现3次及以上。5.3. 布隆过滤器 1.给两个文件分别有100亿个query(查询)我们只有1G内存如何找到两个文件交集分别给出精确算法和近似算法。近似算法将一个文件放入布隆过滤器遍历另一个文件看它在布隆过滤器中有没有如果存在就是交集。(存在误判会导致不是交集的query也被找出来)精确算法哈希切分分别读取两个的query使用哈希算法(如i BKDRHash(query)%200),得到的结果分别放入Ai、Bi号小文件这样相同的文件就会被放进相同编号(i)的文件中然后相同的编号文件进行比较即可。(如果单个小文件太大超过内存可以考虑换个哈希算法再切分一次)
http://www.hkea.cn/news/14327111/

相关文章:

  • 什么是建设企业网站建站助手
  • 网站建设介绍推广用语深圳宝安住房和建设局网站官网
  • 做自己的免费网站现在哪些网站自己做装修
  • ppt做视频的模板下载网站有哪些七彩建设发展有限公司官方网站
  • 海南做网站跨境电商就是忽悠人的
  • 做彩票网站要什么接口如何重新安装wordpress
  • 食品网站建设网站定制开发淄博做网站哪家好
  • h5商城网站怎么做的全栈工程师是做网站吗
  • 营销型网站建设实战》王也踏青图照片
  • 教育wordpress模板下载地址提高seo关键词排名
  • 如需郑州网站建设盘龙网站建设
  • 闵行区邮编广州网站优化公司如何
  • 仿唧唧帝笑话门户网站源码带多条采集规则 织梦搞笑图片视频模板品牌建设网站公司排名
  • 苏州做网站优化的erp教学零基础入门
  • 高端网站建设公司排行呼市做网站建设的公司哪家好
  • 网站流量数据什么网站做推广效果好
  • 建设网站思路科技公司 网站 石家庄
  • 北京网站开发公司前十名昆明网页制作设计
  • 个人网站建设计划表2345网址导航手机版下载
  • 龙口建网站价格最少的钱怎么做网站
  • 在后台怎么做网站内链嵌入式软件开发工程师工作内容
  • 网站的设计开发免费建站系统下载
  • 网站开发进程报告wordpress主题和预览不同
  • 东莞公司想建网站网页制作学什么东西
  • 杨家平网站建设做废品回收哪个网站好点
  • 嘉峪关做网站做外国人生意的网站有哪些
  • 太原网站建设制作公司哪家好wordpress h5
  • 做网站软件A开头的wordpress主题是用什么开发出来的
  • 关于建设网站的情况说明书网络规划设计师学历低
  • 邢台做移动网站费用大连房地产网站建设