什么是位图?

Posted 小羊教你来编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是位图?相关的知识,希望对你有一定的参考价值。

在这里插入图片描述

目录:

一.位图

引入

面试题【腾讯】 : 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。

可能我们大多数人了解到的位图都是看到了腾讯的这个面试题理解到的,下面我就读于位图进行详细的讲解.

1.位图概念

在这里插入图片描述

位图就是一种直接定址的哈希,它的效率很高,只用O(1)就可以查到对应位置是0还是1

2.位图的实现原理

(1)构建方式

在这里插入图片描述

(2)存储方式

在这里插入图片描述

3.代码实现

代码的实现还是比较简单的,主要的就是上面对于每个元素存储的具体流程的熟悉.

class BitSet{

public:

	//位图的内存大小和数据范围有关系
	BitSet(size_t range)
		:_bit(range / 8 + 1)
	{}

	//存储
	void set(size_t num)
	{
		//0.计算整数位置
		int idx = num / 8;
		//1.计算比特位位置
		int bitIdx = num % 8;
		//2.对应的比特位变为1
		//按位进行或运算

		_bit[idx] |= 1 << bitIdx;
	}

	//查找
	bool test(size_t num){
	
		int idx = num / 32;
		int bitIdx = num % 32;
		return (_bit[idx] >> bitIdx) & 1;
	}
	//删除
	void reset(size_t num){
		
		int idx = num / 32;
		int bitIdx = num % 32;
		_bit[idx] &= ~(1 << bitIdx);
	}

private:
	vector<int> _bit;
};

4.应用场景

它就是主要应用于对于比较大的数据的标记存储,能大量的节省空间,而且对应的时间复杂度只有O(1),方便查找.就像上面的面试题,我们完全可以将数据全部标记在对应的位图中,然后查找对应的数据位置,看其位置是否是1,就能轻松地解决这个问题.

二.布隆过滤器

在这里插入图片描述

布隆过滤器如果说某个元素不存在时,该元素一定不存在,如果该元素存在时,该元素可能存在,因为有些哈希函数存在一定的误判。

1.优点

  1. 增加和查询元素的时间复杂度为:O(K), (K为哈希函数的个数,一般比较小),与数据量大小无关
  2. 哈希函数相互之间没有关系,方便硬件并行运算
  3. 布隆过滤器不需要存储元素本身,在某些对保密要求比较严格的场合有很大优势
  4. 在能够承受一定的误判时,布隆过滤器比其他数据结构有这很大的空间优势
  5. 数据量很大时,布隆过滤器可以表示全集,其他数据结构不能
  6. 使用同一组散列函数的布隆过滤器可以进行交、并、差运算

2.缺点

  1. 有误判率,即存在假阳性(False Position),即不能准确判断元素是否在集合中(补救方法:再建立一个白名单,存储可能会误判的数据)
  2. 不能获取元素本身
  3. 一般情况下不能从布隆过滤器中删除元素
  4. 如果采用计数方式删除,可能会存在计数回绕问题

以上是关于什么是位图?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在OnStop()上回收所有数据并使用保留片段?

合并两个位图的问题

Android - 片段中的 getIntent()

如何在android中使用imageloader释放位图内存?

是否可以在 OnStop() 回收所有数据并使用保留片段?

如何从Android片段中的相机获取图像