首页 > 学院 > 开发设计 > 正文

大数据处理位图法

2019-11-06 07:14:18
字体:
来源:转载
供稿:网友

问题描述 :对开头是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 / 32unsigned 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");}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表