大数据处理时的一种BitMap小算法

一种大数据外部排序(内存无法加载所有排序元素)、去除重复元素、快速找到随机被删除元素的BitMap小算法,核心思想即通过将一个数作为下标(index)来索引一个bit表示一个数是否存在,排序时的时间复杂度为O(N),需要的额外空间的复杂度O(N/8),支持整个int范围(正负数都支持)的算法示例如下:


char BitMask[] = {0x80 , 0x40 , 0x20 , 0x10 , 0x8 , 0x4 , 0x2 , 0x1};

int WriteNumberBitToByte(char *ByteArra , unsigned int ByteArraSize , int Number)
{
	//printf("%d,%d,%d\n",(ByteArraSize * 4) - 1,-(ByteArraSize*4),Number);

	if (((int)(ByteArraSize * 4) - 1) < Number || Number<-(int)(ByteArraSize*4) )
	{
		return 0;	//failed,number out of bytearra.
	}

	int BaseArraBitPos = ByteArraSize *4;	//ByteArraSize *8 /2

	BaseArraBitPos+=Number;

	printf("BaseArraBitPos=%d,Number=%d\n",BaseArraBitPos,Number);
	ByteArra[BaseArraBitPos/8] |= Mask[BaseArraBitPos%8];

	return 1;	//success
}

int IsNumberBitInByte(char *ByteArra , unsigned int ByteArraSize , int Number)
{
	if (((int)(ByteArraSize * 4) - 1) < Number || Number<-(int)(ByteArraSize*4) )
	{
		return 0;	//failed,number out of bytearra.
	}

	int BaseArraBitPos = ByteArraSize *4;	//ByteArraSize *8 /2

	BaseArraBitPos+=Number;

	if (ByteArra[BaseArraBitPos/8] & BitMask[BaseArraBitPos%8]) {
		return 1;
	}

	return 0;	//number not found.
}

void PrintOrderedBitMap(char *BitMap,unsigned int BitMapCount)
{
	int MinmumNumber = -(BitMapCount*8/2);
	int MaximumValue = (BitMapCount*8/2)-1;

	for (int i = MinmumNumber; i <= MaximumValue; ++i)
	{
		if (IsNumberBitInByte(BitMap,BitMapCount,i))
		{
			printf("%d,", i);
		}
	}

	printf("\n");
}

int main()
{
	int Arra[] = {3,-4,2,0,-1,-8,7,-12,10};

	int MaximumValue =Arra[0],MinmumValue=Arra[0];
	for (int i = 0; i < sizeof(Arra)/sizeof(Arra[0]); ++i)
	{
		if(MaximumValue<Arra[i]) {
			MaximumValue = Arra[i];
		}
		if (MinmumValue>Arra[i])
		{
			MinmumValue = Arra[i];
		}
	}

	MaximumValue=MaximumValue<0?-MaximumValue:MaximumValue;
	MinmumValue=MinmumValue<0?-MinmumValue:MinmumValue;

	MaximumValue=MaximumValue>MinmumValue?MaximumValue:MinmumValue;

	printf("MaximumValue=%d\n",MaximumValue);
	//unsigned int BitMapCount = (MaximumValue*2+7)/8;
	unsigned int BitMapCount = (MaximumValue+3)/4;
	BitMapCount = BitMapCount>0?BitMapCount:1;
	char *BitMap = (char*)malloc(BitMapCount);

	for (int i = 0; i < sizeof(Arra)/sizeof(Arra[0]); ++i)
	{
		WriteNumberBitToByte(BitMap,BitMapCount,Arra[i]);
	}

	PrintOrderedBitMap(BitMap,BitMapCount);
}

仅支持unsigned int范围的算法示例如下:

char BitMask[] = {0x80 , 0x40 , 0x20 , 0x10 , 0x8 , 0x4 , 0x2 , 0x1};

int WriteNumberBitToByte(char *ByteArra , unsigned int ByteArraSize , unsigned int Number)
{
	if (((ByteArraSize * 8) - 1) < Number )
	{
		return 0;	//failed,number out of bytearra.
	}

	int BytePos = Number / 8;
	int BitPos = Number % 8;

	ByteArra[BytePos] |= BitMask[BitPos];

	return 1;	//success
}

int IsNumberBitInByte(char *ByteArra , unsigned int ByteArraSize , unsigned int Number)
{
	if ((ByteArraSize * 8 - 1) < Number )
	{
		return 0;	//failed,number out of bytearra.
	}

	int BytePos = Number / 8;
	int BitPos = Number % 8;

	if (ByteArra[BytePos] & BitMask[BitPos]) {
		return 1;
	}

	return 0;	//number not found.
}

上面的算法都是用一个bit来表示一个数,即只有2种可能,要么有,要么无,可以扩展到一个字节表示一个数,这样就可以统计出现255次范围内的重复元素,原理以此类推。


另外用bit来表示一个int数,节约了31倍的内存空间,即int(4*8),bit(8/1),所以数据量越来使用这种方式的优势越明显,前提是场景适用这种方式。

时间: 2024-08-04 04:11:53

大数据处理时的一种BitMap小算法的相关文章

大数据处理:百分点实时计算架构和算法

当今时代,数据不再昂贵,但从海量数据中获取价值变得昂贵,而要及时获取价值则更加昂贵,这正是大数据实时计算越来越流行的原因.以百分点公司为例,在高峰期每秒钟会有近万HTTP请求发送到百分点服务器上,这些请求包含了用户行为和个性化推荐请求.如何从这些数据中快速挖掘用户兴趣偏好并作出效果不错的推荐呢?这是百分点推荐引擎面临的首要问题.本文将从系统架构和算法两方面全介绍百分点公司在实时计算方面的经验和心得体会,供读者参考. a) 实时计算架构 图 1百分点大数据平台原理示意图 工欲善其事,必先利其器.一

用Apache Spark进行大数据处理—入门篇

文章讲的是用Apache Spark进行大数据处理-入门篇,Apache Spark 是一个围绕速度.易用性和复杂分析构建的大数据处理框架.最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apache的开源项目之一. 与Hadoop和Storm等其他大数据和MapReduce技术相比,Spark有如下优势. 首先,Spark为我们提供了一个全面.统一的框架用于管理各种有着不同性质(文本数据.图表数据等)的数据集和数据源(批量数据或实时的流数据)的大数据处理的需求. Sp

观点:Hadoop并非大数据处理的一切

云计算的伟大之处就在于在进行大数据处理时不必再向以往一样购买大量的服务器集群,租用服务器处理大数据更加利用控制成本.Hadoop作为一个重量级的分布式处理开源框架已经在大数据处理领域有所作为,企业希望利用Hadoop来规划其自身未来数据处理的蓝图.从EMC.Oracle到Microsoft,几乎所有高科技厂商都在过去几个月中宣布了自己以Hadoop为基础的大数据战略.现今Hadoop已经成为IT商场吸引客户的热点词汇. Hadoop的成长得到了个人开发者.初创公司和大企业的支持.这也给予用户长时

Hadoop并非大数据处理的一切 - 产品和技术

Hadoop并非大数据处理的一切 发布时间:2012.05.30 15:48      来源:赛迪网     作者: 云计算的伟大之处就在于在进行大数据处理时不必再向以往一样购买大量的服务器集群,租用服务器处理大数据更加利用控制成本.Hadoop作为一个重量级的分布式处理开源框架已经在大数据处理领域有所作为,企业希望利用Hadoop来规划其自身未来数据处理的蓝图.从EMC.Oracle到Microsoft,几乎所有高科技厂商都在过去几个月中宣布了自己以Hadoop为基础的大数据战略.现今Hado

大数据处理系统是一个IT工具,还是业务系统呢?

对于企业的业务人员,特别是数据科学家人群来说,Informatica的Intelligent Data Platform不仅是一个智能化的大数据预处理工具,而且可以像业务系统一样为企业带来直接的价值. 互联网企业通常会强调细节和微创新,把产品的某一项功能做到极致,借此牢牢吸引大量用户.但是企业级厂商则不同,它们更倾向于将产品平台化.平 台化的好处是可以把尽量多的功能集成在一起,方便部署与管理,而且可以借平台屏蔽底层架构的复杂性.软件厂商尤喜平台化,比如数据保护厂商有数据保护和统 一管理平台,大数

大数据处理需要计算机云计算技术的配合

人们研究大数据, 或是利用大数据技术,其战略意义并不在于是谁掌握了多么庞大的大数据信息,而是在于谁能否将已经捕捉到的那些含有一定意义的数据通过专业化处理,将其变成 一种数据信息资产.这也是大数据分析所需要的真正目的.大数据无限,但可利用尽可能的大数据达到变成数据信息资产的可能. 谁都不能否认,也不可能被否认,大数据既是一种科技,也是一种资产.既然大数据是一种资产,那么,如何利用大数据这种资产最终实现盈利,才是运用大数据的关键.可是,将大数据加工成有增值的数据,并不是一件轻而易举的事情. 第一.研

这5种必知的大数据处理框架技术,你的项目应该使用哪种?

本文将介绍大数据系统一个最基本的组件:处理框架.处理框架负责对系统中的数据进行计算,例如处理从非易失存储中读取的数据,或处理刚刚摄入到系统中的数据.数据的计算则是指从大量单一数据点中提取信息和见解的过程. 下文将介绍这些框架: 仅批处理框架: Apache Hadoop 仅流处理框架: Apache Storm Apache Samza 混合框架: Apache Spark Apache Flink 大数据处理框架是什么? 处理框架和处理引擎负责对数据系统中的数据进行计算.虽然"引擎"

这5种必知的大数据处理框架技术,你的项目到底应该使用其中的哪几种

大数据是收集.整理.处理大容量数据集,并从中获得见解所需的非传统战略和技术的总称.虽然处理数据所需的计算能力或存储容量早已超过一台计算机的上限,但这种计算类型的普遍性.规模,以及价值在最近几年才经历了大规模扩展. 本文将介绍大数据系统一个最基本的组件:处理框架.处理框架负责对系统中的数据进行计算,例如处理从非易失存储中读取的数据,或处理刚刚摄入到系统中的数据.数据的计算则是指从大量单一数据点中提取信息和见解的过程. 下文将介绍这些框架: 1.仅批处理框架: Apache Hadoop 2.仅流处

一种异构集群中能量高效的大数据处理算法

一种异构集群中能量高效的大数据处理算法 丁有伟,秦小麟,刘亮,王涛春 集群的能量消耗已经超过了其本身的硬件购置费用,而大数据处理需要大规模的集群耗费大量时间,因此如何进行能量高效的大数据处理是数据拥有者和使用者亟待解决的问题,也是对能源和环境的一个巨大挑战.现有的研究一般通过关闭部分节点以减少能量消耗,或者设计新的数据存储策略以便实施能量高效的数据处理.通过分析发现即便使用最少的节点也存在很大的能源浪费,而新的数据存储策略对于已经部署好的集群会造成大规模的数据迁移,消耗额外的能量.针对异构集群下