大数据处理位图法

问题描述 :对开头是8的并且为8位的电话号码(如8XXXXXXX)约10000000个数进行排序

要求 :使用1M左右内存,不超过1.5M

采用位图法进行排序和查询

原理:由于第一位固定为8,将后7位写入内存,取出时在加上80000000。在32位操作系统中,创建一个整型数组array,通过把对应的位数置1来存储数据,如 存放1时,

把array[0]的第一位置1 ,存放33则把array[1]的第一位置1,以此类推。

10000000的数共需要 10000000/8/1024/1024 = 1.192M 内存

简单的代码实现如下

#include<stdio.h>
#include<stdlib.h>


#define N  312500   //  10000000 / 32

unsigned long int array[N]; 

//存储数据从0开始
void insertDataToArray(unsigned long int num)
{
	int index = num /32;  //确定数据在数组中的下标
	int count = num % 32;  //确定数据在数组元素中的位置下标
	
	array[index] |= 0x00000001 << count;
}
void readDataFromArray(unsigned long int * array ,int num)
{
	for (int i = 0;i < num/32;i++)
	{
		if (array[i] == 0)
		{
			continue;
		}
		else
		{
			printf("%d \n %d\n", i,array[i]);
			for (int j = 0;j < 32;j++)
			{
				//printf("%d\n", array[i] & (0x00000001 << j));
				if (( array[i] & (0x00000001 << j)) != 0)
				{
					printf("%d \n j = %d\n", 32 * i + j, j);
				}

			}
		}
	}

}

void main()
{
	//插入
	insertDataToArray(9900000);
	//查询所有
	readDataFromArray(array, N*32);

	system("pause");
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值