位图

摘要:
位图中的值可以是计数和标识(如图所示)。因为无符号数据的最大范围约为40亿,40*10^8/1024*1024*8=476,所以只需要512M的内存空间,每个位代表一个无符号数据。

1.位图的介绍:

位图第1张

位图就是通过将数组下标与应用中的一些值关联,数组中该下标所指定的位置上的元素可以用来标识应用中值的情况(是否存在 or 数目 or 。。。)。

位图中的值可以是计数、标识(如图)。

2.位图的应用:

      1.给40亿个不重复的unsigned int的整数,没有排过序,然后再给一个数,如果快速判断这个数是否在那40亿个数当中。

      因为unsigned int数据的最大范围在在40亿左右,40*10^8/1024*1024*8=476,因此只需申请512M的内存空间,每个bit位表示一个unsigned int。读入40亿个数,并设置相应的bit位为1.然后读取要查询的数,查看该bit是否为1,是1则存在,否则不存在。

      2.给40亿个unsigned int的整数,如何判断这40亿个数中哪些数重复?

      同理,可以申请512M的内存空间,然后读取40亿个整数,并且将相应的bit位置1。如果是第一次读取某个数据,则在将该bit位置1之前,此bit位必定是0;如果是第二次读取该数据,则可根据相应的bit位是否为1判断该数据是否重复。

/*位图代码的自己的实现*/

class
BitMap { public: BitMap() :_size(0) {} BitMap(size_t size) :_size(0) { _arrays.resize((size >> 5) + 1); } bool Set(size_t num) { size_t index = num >> 5; size_t n = num % 32; if (_arrays[index] & (1 << n)) { return false; } _arrays[index] |= (1 << n); ++_size; return true; } bool ReSet(size_t num) { size_t index = num >> 5; size_t n = num % 32; if (_arrays[index] & (1 << n)) { _arrays[index] &= (~(1 << n)); --_size; return true; } else { return false; } } bool Test(size_t num) { size_t index = num >> 5; size_t n = num % 32; return _arrays[index] & (1 << n); } void Clear() { _arrays.assign(_arrays.size(), 0); } public: vector<size_t> _arrays; size_t _size; };

如果有什么意见或建议的请不吝赐教  ^_^

免责声明:文章转载自《位图》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Ubuntu 20.04 LTS 安装钉钉Spring Boot中@ConditionalOnProperty使用详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

linux --&amp;gt; 获取系统启动时间

获取系统启动时间一、前言   时间对操作系统来说非常重要,从内核级到应用层,时间的表达方式及精度各部相同。linux内核里面用一个名为jiffes的常量来计算时间戳。应用层有time、getdaytime等函数。今天需要在应用程序获取系统的启动时间,百度了一下,通过sysinfo中的uptime可以计算出系统的启动时间。 二、sysinfo结构   sys...

一种高效快速的内存池实现(附源码)

此算法灵感来自于apache内存池实现原理,不过读者如果没有看过apache内存池实现也无关系,因为本算法相对apache内存池算法更为简单而且易懂,个人认为某些场合也更为高效,或许真正到了apache服务器上性能不如,但是这套设计思想应该还是可以借鉴到更多场合的。 我们在调用malloc函数时,操作系统内部会查找一个所谓的空闲链表,当找到足够大的空闲空间...

【Windows编程】系列第五篇:GDI图形绘制

上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图。Windows的GDI函数包含数百个API可供我们使用,本篇把最常用的GDI绘图做一个讲解。GDI可以绘制点、直线曲线、填充封闭区域、位图以及文本,其中文本部分已经在上一篇中将了,请参考【...

(转)用 cairo 实现跨平台图形

来源:http://www.ibm.com/developerworks/cn/linux/l-cairo/?S_TACT=105AGX52&S_CMP=techcto 用于产生一致输出的矢量绘图库 Eli Dow(emdow@us.ibm.com), 软件工程师, IBM Linux Test and Integration Center 简...

浅谈C工程中的.c与.h文件

基于C语言的单片机、arm相关的工程开发时,C语言的模块化特点体现的非常明显。试想一下:你的一个工程中需要用到AD采样模块、液晶显示模块、串口发送模块、DA控制模块等。你肯定不会选择在一个.c文件中进行,必须是分模块的,这样才有利于团队开发,提高效率。 那么模块化设计遵循着怎样的原则呢,应该怎么写.c,.h文件呢。 1. .c和.h文件的区别 通常意义上的...

Android菜鸟成长记15 -- BitMap

BitMap简介 Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。本文从应用的角度,着重介绍怎么用Bitmap来实现这些功能。 BitMap的常用属性 1. BitMap类public void recycle()——回收位图占用的内存空间,把位图标记为Dea...