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