位图BitMap

引子:

给40亿个不重复的无符号整数,没排过序,给一个无符号整数,如何判断这个数是否在这40亿个数中。

分析:1 字节=8位

1 KB  =1024字节=2^10字节

1 MB  =1024KB

1 GB  =1024MB

40亿个数,40亿可以约看为2^32,即需要将近4G的空间存储,,如果内存够的话,40亿个整数使用位图存储需要500M的空间

位图即每一个位存储,如果这个数存在,则先找到这个字节大小,再将字节的这个位置1

template<class T> 
class BitMap
{
public:
	BitMap(size_t n)
		:_size(0)
	{
		_a.resize((n>>5)+1);//map存储数据时是按位存储,n>>5即n/32
	}
	void set(size_t x)//置位
	{
		size_t index = x >> 5;//即x/32
		size_t num = x % 32;

		if ((_a[index] && (1 << num)) == 0)//先判断当前位是否已被置1,若还没被置1,则_size++且置1
		{
			_size++;
			_a[index] |= (1 << num);
		}
	}
	void Reset(size_t x)//取消置位
	{
		size_t index = x >> 5;
		size_t num = x % 32;

		if ((_a[index] && (1 << num)) != 0)//若当前位不为0则_size--后置0
		{
			_size--;
			_a[index] &= ~(1 << num);
		}

	}
	int test(size_t x)
	{
		size_t index = x >> 5;
		size_t num = x % 32;

		return _a[index] & (1 << num);
	}
private:
	vector<T>_a;
	size_t _size;
	 
};

未完待续

时间: 2024-10-29 19:11:08

位图BitMap的相关文章

(算法)位图BitMap

题目: 给定一数组,大小为M,数组中的数字范围为1-N,如果某带宽有限,无法传输该大小的数组,该怎么办? 思路: 通过位图BitMap来压缩数组,将数组中每个数字在bit位上标志,这样就可以将数组大小压缩很多倍,每个32位int只需要1bit来表示. 代码: #include<iostream> #include<string.h> using namespace std; char* compression(int *A,int imax,int n){ int m=(imax-

【数据结构】位图BitMap、布隆过滤器的算法实现

我们先给出之前我看过的腾讯公司的一道笔试题,引出位图BitMap. 给40亿个不重复的无符号整数,没排过序.给一个无符号整数,如何快速判断一个数是否在这40亿个数中. 这个问题怎么解决呢? 1)将40亿数据保存起来(保存在数组.链表.树中),再和该数判断是否相等. 那我们思考一下需要多少内存: 2)借助位图BitMap解决. 位图(BitMap) 是用一个数组中的每个数据的每个二进制位表示一个数是否存在.1表示存在,0表示不存在. 相当于把数组分成很多块的空间,每一块是32个比特位. 原来32个

海量数据处理第二谈-----位图BitMap

位图的概念: 在C++中,位图是以位来表示整数的结构,普通的整数一个数需要用4个字节来表示,我们可以换种思想,在整个整数的集合范围内,某个整数存在与否,只有两种情况,在或者不在,那么,我们可以考虑只用一个bit位,来表示该整数存在的状态,从而达到节省内存的目的. 位图实例分析: 给一个实际的例子,给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中 我们可以简单计算一下,40亿个整数全部放到内存,需要160亿个字节,粗略计算,大致

位图 bitmap 理解

在数据库学习与试用当中会遇到一个概念"位图索引",这是位图在索引检索中的一个应用案例.现在对位图的基本原来进行下学习.原理其实很简单,主要搞清楚一些基本概念. 先说一下基本的概念:bit,byte,word. bit  位 byte  字节 word  字 字长是指字的长度 关系如下: 1字=2字节(1 word = 2 byte) 1字节=8位(1 byte = 8bit) 1 Byte = 8 Bits 1 KB = 1024 Bytes 1 MB = 1024 KB 1 GB =

【转】Android开发之Bitmap的内存优化详解

本文来源:转载自: http://mobile.51cto.com/abased-410796.htm 在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图片的内存优化,是Android应用开发中比较重要的内容. 1.要及时回收Bitmap的内存 Bitmap类有一个方法recycle(),从方法名可以看出意思是回收.这里就有疑问了,Android系

Camera图片特效处理综述(Bitmap的Pixels处理、Canvas/paint的drawBitmap处理、旋转图片、裁截图片、播放幻灯片浏览图片&lt;线程固定时间显示一张&gt;)

一种是直接对Bitmap的像素进行操作,如:叠加.边框.怀旧.(高斯)模糊.锐化(拉普拉斯变换). Bitmap.getPixels(srcPixels, 0, width, 0, 0, width, height); newR = (int) (pixR * alpha + layR * (1 - alpha));    newR = Math.min(255, Math.max(0, newR));    ...    srcPixels[pos] = Color.argb(newA, ne

BitMap画图

package com.example.examples_05_07; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import a

优化—对Bitmap的内存优化

在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图片的内存优化,是Android应用开发中比较重要的内容. 1) 要及时回收Bitmap的内存 Bitmap类有一个方法recycle(),从方法名可以看出意思是回收.这里就有疑问了,Android系统有自己的垃圾回收机制,可以不定期的回收掉不使用的内存空间,当然也包括Bitmap的空间.那为什么还需

Bitmap详解与Bitmap的内存优化

感觉这里的排版看着更舒服些 Bitmap详解与Bitmap的内存优化 一.Bitmap: Bitmap是Android系统中的图像处理的最重要类之一.用它可以获取图像文件信息,进行图像剪切.旋转.缩放等操作,并可以指定格式保存图像文件. 常用方法: + public void recycle() // 回收位图占用的内存空间,把位图标记为Dead + public final boolean isRecycled() //判断位图内存是否已释放 + public final int getWid