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

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*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的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
目录
相关文章
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
362 3
|
2月前
|
机器学习/深度学习 自然语言处理 算法
大数据选举预测:算票的不只是选票,还有算法
大数据选举预测:算票的不只是选票,还有算法
120 0
|
19天前
|
算法 搜索推荐 大数据
当“爆款书”遇上大数据:出版业的老路,正在被算法改写
当“爆款书”遇上大数据:出版业的老路,正在被算法改写
108 8
|
6月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
7月前
|
数据采集 机器学习/深度学习 算法
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
432 4
|
3月前
|
算法 搜索推荐 大数据
大数据能不能看透消费者的心?聊聊那些“你以为是偶然,其实是算法的必然”
大数据能不能看透消费者的心?聊聊那些“你以为是偶然,其实是算法的必然”
105 5
|
存储 分布式计算 算法
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
232 0
|
8月前
|
数据采集 机器学习/深度学习 人工智能
大数据中的数据预处理:脏数据不清,算法徒劳!
大数据中的数据预处理:脏数据不清,算法徒劳!
806 2
|
缓存 算法 大数据
大数据查询优化算法
【10月更文挑战第26天】
535 1
|
机器学习/深度学习 数据采集 算法
大数据中缺失值处理使用算法处理
【10月更文挑战第21天】
698 3