位图算法及其应用

  • 位图算法

位图法就是bitmap的缩写,所谓bitmap,是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。

  • 应用

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

解决方法:申请512M的内存一个bit位代表一个unsigned int值读入40亿个数,设置相应的bit位读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在。

 2.使用位图法判断整形数组是否存在重复

解决办法:判断集合中存在重复是常见编程任务之一,当集合中数据量比较大时我们通常希望少进行几次扫描,这时双重循环法就不可取了。位图法比较适合于这种情况,它的做法是按照集合中最大元素max创建一个长度为max+1的新数组,然后再次扫描原数组,遇到几就给新数组的第几位置上1,如遇到 5就给新数组的第六个元素置1,这样下次再遇到5想置位时发现新数组的第六个元素已经是1了,这说明这次的数据肯定和以前的数据存在着重复。这种给新数组初始化时置零其后置一的做法类似于位图的处理方法故称位图法。它的运算次数最坏的情况为2N。如果已知数组的最大值即能事先给新数组定长的话效率还能提高一倍。

3.使用位图法进行整形数组排序

解决办法:

首先遍历数组,得到数组的最大最小值,然后根据这个最大最小值来缩小bitmap的范围。这里需要注意对于int的负数,都要转化为unsigned int来处理,而且取位的时候,数字要减去最小值。

应用1代码实现:

#pragma once
#include<vector>
template<class T>
struct DataType
{
	long long operator()(const T&key)
	{
		return key;
	}
};
template<class T>
struct StringType
{
	long long operator()(const string&key)
	{
		long long size = 0;
		for (int i = 0; i < key.size(); i++)
		{
			size += key[i];
		}
		return size;
	}
};
template<class T,class BMFunc=DataType<T>>
class BitMap
{
public:
	BitMap(size_t size = 1)
	{
		_a.resize(size / 32 + 1);
	}
	~BitMap(){}
	void set(T &x)
	{
		BMFunc bmf;
		size_t index = bmf(x)/ 32;
		size_t num = bmf(x) % 32;
		if (!(_a[index] & (1 << num)))
		{
			_a[index] |= (1 << num);
			_size++;
		}

	}
	void Reset(T x)
	{
		BMFunc bmf;
		size_t index = bmf(x) / 32;
		size_t num = bmf(x) % 32;
		if (!(_a[index] & (1 << num)))
		{
			_a[index] &= (~(1 << num));
			_size--;
		}
	}
	bool Test(T x)
	{
		BMFunc bmf;
		size_t index = bmf(x)/ 32;
		size_t num = bmf(x)% 32;
		return _a[index] &(1 << num);
	}
protected:
	vector<size_t> _a; 
	size_t _size;
};

应用2代码实现:

bool hasDuplicatedItem(int *a, int len)
{
	int length, max, i;
	length = len;
	max = a[0];
	for (i = 1; i < length; i++){
		if (a[i] > max)
			max = a[i];
	}
	int *arr;
	arr = (int*)malloc(sizeof(int)* (max + 1));
	for (i = 0; i < length; i++){
		if (arr[a[i]])
			return true;
		else
			arr[a[i]] = 1;
	}
	return false;
}

应用3代码实现:

void bitmapSort(int *a, int len)
{
	int length, max, min, i, index;
	length = len;
	min = max = a[0];
	//找出数组最大值
	for (i = 1; i < length; i++){
		if (a[i] > max){
			max = a[i];
		}
		if (min > a[i]) {
			min = a[i];
		}
	}
	//得到位图数组
	int *arr;
	arr = (int*)malloc(sizeof(int)* (max - min + 1));
	for (i = 0; i < length; i++){
		index = a[i] - min;
		arr[index]++;
	}
	//重整a中的元素
	int arr_length;
	arr_length = max - min + 1;
	index = 0;
	for (i = 0; i < arr_length; i++){
		while (arr[i] > 0){
			a[index] = i + min;
			index++;
			arr[i]--;
		}
	}
}
时间: 2024-11-08 21:31:56

位图算法及其应用的相关文章

LeetCode-Repeated DNA Sequences (位图算法减少内存)

Repeated DNA Sequences All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACGAATTCCG". When studying DNA, it is sometimes useful to identify repeated sequences within the DNA. Write a function to find all

位图算法在用户验证上的应用

前几天在博客园看到一个帖子,讨论两个整数集合比较的算法问题.呵呵,其实任何整数集合的问题都是可以通过位图算法解决.简单地说,就是把值转化为数组下标,将O(n)复杂度降低到O(1)复杂度来获得最高效率.当然,会牺牲一点点空间. 解决单纯的整数集合比较问题,只是纯理论的.实际上,位图算法可以应用在用户登录之后的接口验证上.服务端的设计其实也没什么复杂的地方,就是维护一个数组罢了.只不过这个数组并非是简单的整数集合,而是一个对象List.这个设计的最大优点是在验证方法中,不是通过find方法而是直接访

数据结构(五)位图算法

位图算法实现思想: 将需要排序的数字转换为数组的下标,通过数组的下标完成对数据的排序,优点效率高,缺点浪费存储空间. 1  public class BitMapTest { 2      /** 3       * 参数说明: 4       * @param buf 新定义的bit数组(int类型) 5       * @param value 需排序的传入数值 6       * @return 7       *  8       * 功能说明: 9       *     将value

位图算法

position:static(静态定位) 当position属性定义为static时,可以将元素定义为静态位置,所谓静态位置就是各个元素在HTML文档流中应有的位置 podisition定位问题.所以当没有定义position属性时,并不说明该元素没有自己的位置,它会遵循默认显示为静态位置,在静态定位状态下无法通过坐标值(top,left,right,bottom)来改变它的位置. position:absolute(绝对定位) 当position属性定义为absolute时,元素会脱离文档流

位图算法 C语言

#include <stdio.h> void set_bit(void *base, unsigned long n) { unsigned long *m = (unsigned long*) base; unsigned long size = sizeof(unsigned long) * 8; m[ n / size ] |= 1UL << (n % size); } void clear_bit(void *base, unsigned long n) { unsign

布隆算法Bitmap(位图算法)

2A酶畔B度s冉园亮9Qhttp://www.zcool.com.cn/collection/ZMTgzODMwMzY=.html BN49Y诳切5糖AQG5门http://www.zcool.com.cn/collection/ZMTgzODMxMDA=.html 9敦n傺1艺39牟17http://www.zcool.com.cn/collection/ZMTgzODMxNTY=.html gElMvot踊促炭剐5ZPhttp://www.zcool.com.cn/collection/ZM

BitMap位图

BitMap位图算法https://blog.csdn.net/varyall/article/details/79662029 常见面试题 题1:在2.5亿个整数找出不重复的整数,内存不足以容纳着2.5亿个整数. 方案1:使用2-Bitmap 每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义.然后遍历修改Bitmap中的对应位,如果是00则变01,01则变10,10则保持不变.遍历修改完后,最后遍历输出对应位是01的整数. 方案2:分治法 先将2.5亿个数划分成

复选框与bitmap算法实践

bitmap(位图)算法 bitmap算法是利用数据二进制的每一位的值来表示数据的算法,可用来压缩保存数据集. 如何保存 如 5(int)的二进制表示为 101b,第一位和第三位的值是1就可以表示数据集 {1,3} ,也就是1个int类型,最多可以保存包含 32个int(4字节32位)的数据集,再对比char是2字节32位(纯数字用啥字符类型),都是极大节省了存储空间. 如何存储到数据库 一般数据库可以表示整型类型有int,long(bigint),decimal等,可按需选择,不够再做调整.

Coding for Speed 技术分享

上周和公司技术同事们作了次<Coding for Speed>技术分享,本来这只是再普通不过的技术探讨和交流(虽然挂了个颇有噱头的名称),但分享的时候逻辑没理好,语速很快,时间也太紧,因此难言是合格的"分享"."探讨",所以我觉得有必要以简短的文章形式对原 PPT 作点补充,即便分享的内容很少也很简单. 本文将按原 PPT 的内容顺序分别作扩展说明或阐述,部分敏感信息将隐去,或只会简单提及. 作本技术分享的初衷,一是在工作中了解及接触了一些我个人认为可优