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

C++哈希进阶-位图

目录

一、位图相关面试题:

二、位图的优缺点:

三、位图相关的考察题目

四、代码实现


一、位图相关面试题:


给40亿个不重复的无符号整数,没排过序,如何判断一个数是否在这40亿数中
 思路一:暴力查找
 思路二:排序+二分查找
 但是第二种方法对内存的要求太高,1G约等于10亿Byte,1G可存10/4个int,40 / (10 / 4)
 因此大约需要16G,但是因为空间太大,只能将这些数放在硬盘中,而二分查找只能处理内存
 中的有序数组
 思路三:每个数映射一个比特位,即位图

二、位图的优缺点:


有点:增删查改特别快
缺点:只适用于整形

三、位图相关的考察题目


 1、给定100亿个整数,找出只出现一次的整数
    还是使用位图,开两个42亿9000万个比特位的空间,第一个代表2^1,第二个代表2^0
    ,10代表出现两次及以上,00代表未出现,01代表只出现一次,因此对位图进行封装就
    可以完成任务
 2、两个文件中都有一百亿个整数,找出两者的相同的数
 3、一个文件中有100亿个整数,1G内存,找到所有出现次数不超过两次的整数
    与第一题完全类似
 

四、代码实现

#pragma once
#include <vector>namespace wjl
{template<size_t N>class bitset{public:bitset(){_bs.resize(N / 32 + 1);}//变为1void set(size_t x){size_t i = x / 32;size_t j = x % 32;//左移不一定是向左移动,只是第字节序往高字节序移动,左移的左不是方向_bs[i] |= (1 << j);}//变为0void reset(size_t x){size_t i = x / 32;size_t j = x % 32;_bs[i] &= (~(1 << j));}//是1就是真bool test(size_t x){size_t i = x / 32;size_t j = x % 32;return _bs[i] & (1 << j);}private:std::vector<size_t> _bs;};template<size_t N>class twobitsets{public:void set(size_t x){bool flag1 = _bs1.test(x);bool flag2 = _bs2.test(x);if (flag1 && !flag2){//10 -> 11_bs2.set(x);}else if (!flag1 && flag2){//01 -> 10_bs1.set(x);_bs2.reset(x);}else if(!flag1 && !flag2){//00 -> 01_bs2.set(x);}}int getcount(size_t x){bool flag1 = _bs1.test(x);bool flag2 = _bs2.test(x);if (flag1 && !flag2){return 2;}else if (!flag1 && flag2){return 1;}else if (!flag1 && !flag2){return 0;}return 3;}private:bitset<N> _bs1;bitset<N> _bs2;};
}

http://www.dtcms.com/a/329757.html

相关文章:

  • 计算机网络技术-知识篇(Day.1)
  • java14学习笔记-打包工具 (Incubator)
  • MoonBit Perals Vol.05: 函数式里的依赖注入:Reader Monad
  • JPrint免费的Web静默打印控件:PDF打印中文乱码异常解决方案
  • 什么是JSP和Servlet以及二者的关系
  • window显示驱动开发—多平面覆盖 VidPN 呈现
  • MVCC底层实现原理
  • Flask入门:从零搭建Web服务器
  • 雅思大作文笔记
  • iOS 签名证书在版本迭代和iOS上架中的全流程应用
  • Docker 在 Linux 中的额外资源占用分析
  • 智汇河套,量子“风暴”:量子科技未来产业发展论坛深度研讨加速产业成果转化
  • 信息学奥林匹克竞赛(NOI/NOIP/CSP) 学习进度自查表
  • 使用 Python Selenium 和 Requests 实现歌曲网站批量下载实战
  • 嵌入式学习 day50 IMX6ULL裸机开发 - 时钟
  • Linux 5.15.189-rt87 实时内核安装 NVIDIA 显卡驱动
  • 手机充电线贴标机如何使用
  • 内存可见性和伪共享问题
  • php7 太空船运算符
  • 在实验室连接地下车库工控机及其数据采集设备
  • 《零基础入门AI:深度学习中的视觉处理(卷积神经网络(CNN)学习)》
  • Github desktop介绍(GitHub官方推出的一款图形化桌面工具,旨在简化Git和GitHub的使用流程)
  • SpringMVC 6+源码分析(六)参数处理
  • 18. parseInt 的参数有几个
  • C语言——深入理解指针(三)
  • 【LeetCode】6. Z 字形变换
  • 美团搜索推荐统一Agent之性能优化与系统集成
  • Linux小白加油站,第二周
  • 云手机未来的发展趋势如何?
  • docker load镜像后 名字和标签异常解决