问题描述 :对开头是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");}
新闻热点
疑难解答