一步一步写算法(之寻找丢失的数)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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;
}
可能朋友也看到了,上面的代码需要分配和原来数据一样length的空间。其实我们可以用bit进行访问标志的设定,所以我们申请的空间还可以减少。
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 forfor(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;
}
为了多核的并行计算,我们添加了子函数_get_lost,我们进一步补充完整。
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核转变,朋友们在可能的情况下尽量多掌握一些多核编程的知识。
转载于:https://www.cnblogs.com/lonelyxmas/p/4156960.html
一步一步写算法(之寻找丢失的数)相关推荐
- 编程题C语言写牛牛数星星,一步一步写算法(之“数星星”)
原文: 一步一步写算法(之"数星星") [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 学过编程的朋友都知道,当初为了学习 ...
- 一步一步写算法(之“数星星”)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 学过编程的朋友都知道,当初为了学习编程语言中的各种语法结构,我们要试着解决各种各样奇怪的题目. ...
- 一步一步写算法(之图结构)
原文:一步一步写算法(之图结构) [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 图是数据结构里面的重要一章.通过图,我们可以判断两个点之间是 ...
- 一步一步写算法(之prim算法 中)
原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...
- 一步一步写算法(之克鲁斯卡尔算法 中)
一步一步写算法(之克鲁斯卡尔算法 中) 原文:一步一步写算法(之克鲁斯卡尔算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 前面说到 ...
- 一步一步写算法(之prim算法 下)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 前两篇博客我们讨论了prim最小生成树的算法,熟悉了基本的流程.基本上来说,我们是按照自上而下 ...
- 一步一步写算法(开篇)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 算法是计算机的生命.没有算法,就没有软件,计算机也就成了一个冰冷的机器,没有什么实用价值.很多 ...
- 一步一步写算法(之 算法总结)【转】
转自:http://blog.csdn.net/feixiaoxing/article/details/6993718 版权声明:本文为博主原创文章,未经博主允许不得转载. [ 声明:版权所有,欢迎转 ...
- 一步一步写算法(之 算法总结)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 自10月初编写算法系列的博客以来,陆陆续续以来写了几十篇.按照计划,还有三个部分的内容没有介绍 ...
最新文章
- 【Linux】Linux computer文件夹下各种文件的作用
- 文件名批量汉字转拼音+核磁共振影像数据处理
- python整除表达 mod_[零基础学python]啰嗦的除法
- [云炬创业基础笔记]第六章商业模式测试17
- Kubernetes监控之Heapster源码分析
- Android性能调优利器StrictMode
- Vue第二部分(2):组件的嵌套与通信
- bat脚本实现一键IP切换
- Linux下pgadmin4启动报错,在CentOS 7/Fedora 29系统上安装配置pgAdmin 4的方法
- USB2.0接口管脚定义
- 解决ERROR: text file '***' contains disallowed UTF-8 whitespace character(s)
- 带你认识网络世界,什么是网络协议、分层有什么好处
- IOS高级开发~开机启动无限后台运行监听进程
- KANKAN AI不良信息过滤技术:用数据证明自己是最好的
- 在ubuntu17.10上裝搜狗輸入法
- 消息队列系统Kafka_01
- outlook单独下载_在单独的Windows中打开不同的Outlook功能以提高生产率
- php获取ip地址,记录用户登陆日志
- [年度极品 普7风暴]《中关村GHOST WIN7纯净自选旗舰年度珍藏版2010V12》
- Java编程领域技术名词解释