原贴地址:http://blog.csdn.net/feixiaoxing/article/details/6945730
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
假设我们有一个1亿个数据,其中数据的范围是0~1亿,也就是100M的数据。但是这个数组中丢了一些数据,比如说少了5啊,少了10啊,那么有什么办法可以把这些丢失的数据找回来呢?这个题目不难,但是它可以帮助我们拓展思路,不断提高算法的运行效率。
对于这个问题,我们一个最简单的思路就是对各个数据进行flag判断,然后依次输出数据。
- void get_lost_number(int data[], int length)
- {
- int index;
- assert(NULL != data && 0 != length);
- unsigned char* pFlag = (unsigned char*)malloc(length * sizeof(unsigned char));
- memset(pFlag, 0, length * sizeof(unsigned char));
- for(index = 0; index < length; index ++){
- if(0 == pFlag[data[index]])
- pFlag[data[index]] = 1;
- }
- for(index = 0; index < length; index++){
- if(0 == pFlag[index])
- printf("%d\n", index);
- }
- free(pFlag);
- return;
- }
- void get_lost_number(int data[], int length)
- {
- int index;
- assert(NULL != data && 0 != length);
- unsigned char* pFlag = (unsigned char*)malloc((length + 7) >> 3);
- memset(pFlag, 0, length * sizeof(unsigned char));
- for(index = 0; index < length; index ++){
- if(0 == (pFlag[data[index] >> 3] & (1 << (data[index] % 8))))
- pFlag[data[index] >> 3] |= 1 << (data[index] % 8);
- }
- for(index = 0; index < length; index++){
- if(0 == (pFlag[data[index] >> 3] & (1 << (data[index] % 8))))
- printf("%d\n", index);
- }
- free(pFlag);
- return;
- }
- void get_lost_number(int data[], int length)
- {
- int index;
- RANGE range[4] = {0};
- assert(NULL != data && 0 != length);
- unsigned char* pFlag = (unsigned char*)malloc((length + 7) >> 3);
- memset(pFlag, 0, length * sizeof(unsigned char));
- range[0].start = 0, range[0].end = length >> 2;
- range[1].start = length >> 2 , range[1].end = length >> 1;
- range[2].start = length >> 1 , range[2].end = length >> 2 * 3;
- range[3].start = length >> 2 * 3, range[3].end = length;
- #pragma omp parallel for
- for(index = 0; index < 4; index ++){
- _get_lost_number(data, range[index].start, range[index].end, pFlag);
- }
- for(index = 0; index < length; index++){
- if(0 == (pFlag[data[index] >> 3] & (1 << (data[index] % 8))))
- printf("%d\n", index);
- }
- free(pFlag);
- return;
- }
- typedef struct _RANGE
- {
- int start;
- int end;
- }RANGE;
- void _get_lost_number(int data[], int start, int end, unsigned char pFlag[])
- {
- int index;
- for(index = start; index < end; index++){
- if(0 == (pFlag[data[index] >> 3] & (1 << (data[index] % 8))))
- pFlag[data[index] >> 3] |= 1 << (data[index] % 8);
- }
- }
工作总结:
(1)代码的优化是可以不断进行得,但是不见得适用于所有的场景
(2)目前的cpu已经开始从2核->4核->8核转变,朋友们在可能的情况下尽量多掌握一些多核编程的知识。