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

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: 一种大数据外部排序(内存无法加载所有排序元素)、去除重复元素、快速找到随机被删除元素的BitMap小算法,核心思想即通过将一个数作为下标(index)来索引一个bit表示一个数是否存在,排序时的时间复杂度为O(N),需要的额外空间的复杂度O(N/8)...

一种大数据外部排序(内存无法加载所有排序元素)、去除重复元素、快速找到随机被删除元素的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),所以数据量越来使用这种方式的优势越明显,前提是场景适用这种方式。

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
2月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
87 4
|
2月前
|
存储 分布式计算 算法
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
72 0
|
4月前
|
机器学习/深度学习 自然语言处理 算法
【数据挖掘】金山办公2020校招大数据和机器学习算法笔试题
金山办公2020校招大数据和机器学习算法笔试题的解析,涵盖了编程、数据结构、正则表达式、机器学习等多个领域的题目和答案。
111 10
|
1月前
|
缓存 算法 大数据
大数据查询优化算法
【10月更文挑战第26天】
75 1
|
1月前
|
机器学习/深度学习 数据采集 算法
大数据中缺失值处理使用算法处理
【10月更文挑战第21天】
54 3
|
1月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
2月前
|
消息中间件 分布式计算 NoSQL
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
29 2
|
5月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【7月更文挑战第22天】在大数据领域,Python算法效率至关重要。本文深入解析时间与空间复杂度,用大O表示法衡量执行时间和存储需求。通过冒泡排序(O(n^2)时间,O(1)空间)与快速排序(平均O(n log n)时间,O(log n)空间)实例,展示Python代码实现与复杂度分析。策略包括算法适配、分治法应用及空间换取时间优化。掌握这些,可提升大数据处理能力,持续学习实践是关键。
134 1
|
5月前
|
存储 监控 算法
「AIGC算法」大数据架构Lambda和Kappa
**Lambda与Kappa架构对比:** Lambda提供批处理和实时处理,保证数据最终一致性,但维护复杂。Kappa简化为单一流处理,易于维护,适合实时场景,但可能增加实时处理压力,影响稳定性。选择时考虑数据一致性、系统维护、成本和实时性需求。
111 0
「AIGC算法」大数据架构Lambda和Kappa
|
6月前
|
分布式计算 算法 Java
阿里云ODPS PySpark任务使用mmlspark/synapseml运行LightGBM进行Boosting算法的高效训练与推理
阿里云ODPS PySpark任务使用mmlspark/synapseml运行LightGBM进行Boosting算法的高效训练与推理