刘德华见龙卸甲:一步一步写算法(之寻找丢失的数)
来源:百度文库 编辑:中财网 时间:2024/05/14 01:48:03
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
假设我们有一个1亿个数据,其中数据的范围是0~1亿,也就是100M的数据。但是这个数组中丢了一些数据,比如说少了5啊,少了10啊,那么有什么办法可以把这些丢失的数据找回来呢?这个题目不难,但是它可以帮助我们拓展思路,不断提高算法的运行效率。
对于这个问题,我们一个最简单的思路就是对各个数据进行flag判断,然后依次输出数据。
view plaincopy to clipboardprint?
- 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;
- }
view plaincopy to clipboardprint?
- 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;
- }
view plaincopy to clipboardprint?
- 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;
- }
view plaincopy to clipboardprint?
- 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核转变,朋友们在可能的情况下尽量多掌握一些多核编程的知识。
寻找丢失的硬盘空间..
寻找丢失的用户
寻找丢失的数据
寻找丢失的号码
寻找丢失的作品
两个数乘,小数点后位数没有限制,请写一个高精度的算法
如何用C51来写一个,双精度浮点数取整数部分的算法?
写一个算法来计算给定二叉树的叶结点数
寻找一首歌!哪里有一步一步走出监狱大门的下载?
请问谁有三合数的算法
请教不规则数的求和算法
写者问题的算法
如何寻找丢失的爱犬?
请教数独算法(BCB)
如何一步一步的提高写公文材料的水平?
浮点数加减算法
麻将番数算法
TVXQ的《寻找丢失的时光》!
寻找一个最佳算法
寻找最佳算法
寻找最佳算法
怎样寻找丢失的泡泡堂号?
寻找丢失在出租车上的物品
怎样寻找丢失的QQ消息