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

功能网站合肥网站排名推广

功能网站,合肥网站排名推广,如何做免费的网站推广,中上网站建设目录 问题引入 位图 定义 相关整型位操作 疑点 位运算 C库里的bitset 实现 应用 优缺点 问题引入 有一道经典的面试题:有40亿个无序无符号整数,要求你高效判断一个数是否在这堆数中。 想法一:暴力查找似乎能够解决问题&#xf…

目录

问题引入

位图

定义

相关整型位操作 

疑点

位运算 

C++库里的bitset

实现

应用

优缺点


问题引入

有一道经典的面试题:有40亿个无序无符号整数,要求你高效判断一个数是否在这堆数中。

想法一:暴力查找似乎能够解决问题,但显然找一次就要消耗O(N)的时间,这是不能接受的;

想法二:问题的本质是查找,因此想到使用高效的二分查找:

                先进行一次O(N logN)的排序,之后的每次查找都只要O(logN)。

想法二的改进很不错,将时间消耗降到了一个可接受的范围,但却只考虑了时间,没考虑空间。

由于1GB = 1024MB = 1024*1024 KB = 1024*1024*1024 B,所以40亿个整数大致是16GB,而一个程序能给你这么多内存吗?二分的下标索引需要在内存中进行,如果放在外存上,索引效率就不行了,也就无法进行二分查找。

这可如何是好啊!?但既然是高效查找,就还应该有想法三:哈希映射。可尽管如此,哈希表也仍然会遇到内存不够的问题。

既然两个想法都被空间所限制,所以决定在空间上进行优化。

既然内存不够,“压缩”一下内存,不就够了?

位图

定义

位图是一种基于直接定址的紧凑数据结构,通过将整数索引映射到二进制bit位上以存储状态信息。

核心原理就是建立高效的直接定址的映射关系:

传统数组的整数索引需至少占用1 byte(bool)来进行状态表示;

位图将整数索引映射到int型(4byte = 32 bit)的每一bit位上,只需要一bit位就能进行状态表示。即一个int就能表示32个数的独立状态,实现了显著的空间压缩效果,提高了32倍的空间利用率。

相关整型位操作 

由于位图把一个整型当作32bit操作,主角是一个整型中的每一bit位,就不可避免要使用到整型位操作。

但首先还是要先将整数索引的bit位址找出来,这不难:

i = n / 32;
j = n % 32;

 i 表示在第几个int中,j 表示在第 i 个整型中的第几位。

疑点

有人可能会提出问题:不同的编译器有大小端的差异,且我们一般在位运算时将右边视为最低位,这样从左到右划分整型索引,运算时会不会出问题?索引结果会不会对不上?

首先是大小端的问题,这是整型在存储时高低位在大小地址存储的问题,这仅是存储的机制,但并不改变byte内部的bit顺序,所以并无影响;

第二个整形索引与位序共存的问题:i 表示的是第几个byte(数组从左往右看),而 j  = n % 32表示的是在 i 中 n 的逻辑bit最低位 (int的32位中从右往左看)。在进行位运算时,只要 j 明确是逻辑bit位,就能够进行正确运算。

只不过一开始的图可能会令人有点迷惑,可能要改改。

位运算 

由于0和1能表示的信息有限,位图通常的操作就是修改整型索引对应的位状态。

常用的操作:【1】判断一个数n的第 i 位是0 or 1

return (n>>j) & 1;

【2】将一个数 n 的第 i 位修改成1 

n |= (1<<i);

【3】将一个数 n 的第 i 位修改成0 

n &= (~(1<<i));

 

C++库里的bitset

【1】在C++库里的 bitset 的主要常用接口:

bitset& set (size_t pos, bool val = true); 将pos位置 置1
bitset& reset (size_t pos); 将pos位置 置0
bool test (size_t pos) const; 返回pos位置的状态

【2】C++库里的 bitset 是用静态数组实现,追求极致性能换取编译器优化。但如此在栈上开的空间就可能不够,没办法直接开辟UINT_MAX的空间(下列都不行)。

std::bitset<-1> bs1;
std::bitset<UINT_MAX> bs2;
std::bitset<0xffffffff> bs3;

但是总是有办法的,在栈上开不出来,就去堆上开。

auto pbs = new bitset<UINT_MAX>();

 

实现

模拟实现一个简易的位图,但我不追求极致性能,所以底层用动态数组。

template<size_t N>class bitset {public:bitset(){_bits.resize(N / 32 + 1);}void set(size_t pos) {size_t i = pos / 32;size_t j = pos % 32;_bits[i] |= (1 << j);}void reset(size_t pos) {size_t i = pos / 32;size_t j = pos % 32;_bits[i] &= (~(1 << j));}bool test(size_t pos) {size_t i = pos / 32;size_t j = pos % 32;return (_bits[i] >> j) & 1;}private:std::vector<int> _bits;};

应用

( 虽然是100亿个数,但还是按整数范围开空间,所以还是开2^32个位)

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

用两个位图的信息进行组合,组合出现信息:00->0次,01->1次,10->2次即以上

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

把数据读出来,分别放到两个位图,依次遍历,同时在两个位图的值就是交集

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

用两个位图的信息进行组合,组合出现信息:00->0次,01->1次,10->2次,11->2次以上。

优缺点

优点:高效查找,高空间利用率

缺点:只限整数

http://www.dtcms.com/wzjs/503824.html

相关文章:

  • 廊坊外贸网站建设可口可乐搜索引擎营销案例
  • 施坦威网站关于我们班级优化大师官网
  • 眼查看网站开发语言网站广告调词软件
  • 做公司年报网站登录密码是什么收录是什么意思
  • 济南正规做网站公司最有效的app推广方式有哪些
  • 好的手机网站推荐百度搜索推广多少钱
  • 网站建设营销排名方案外贸推广平台哪个好
  • 磁力猫郑州纯手工seo
  • 如何在相关网站免费做宣传广告百度商家平台
  • 国外网站制作有哪些沈阳seo网站关键词优化
  • html5 手机网站 模板网站页面优化方案
  • 上海金融网站制作网站制作公司好网站友情链接的作用
  • 中国人民解放军文职考试一年几次百度seo排名工具
  • 南宁网站seo优化公司怎么申请域名建网站
  • 梅州建网站百度竞价排名平台
  • 网站服务器报价培训后的收获和感想
  • 自己建站模板写一篇软文1000字
  • 长沙php网站建设刷关键词排名系统
  • 手机网站模版php源码百度搜索指数排行榜
  • 做美女网站犯法吗最新军事动态最新消息
  • 网站在线qq客服系统西安seo按天收费
  • 销售类网站开发百度灰色词排名代发
  • 自己怎样做网站淘宝运营培训
  • 电商类网站开发项目流程今日热搜榜排行榜
  • 创新的天津网站建设莆田百度seo公司
  • 柳州正规网站制作公司哪家好2022新闻热点10条
  • 海南医院网站建设品牌的宣传及推广
  • 可信赖的南昌网站建设广西壮族自治区在线seo关键词排名优化
  • 做网站国家大学科技园郑州做seo推广一年大概的费用
  • 政府网站和政务新媒体建设管理办法国际新闻军事最新消息