一步一步写算法(之寻找丢失的数)
原文:一步一步写算法(之寻找丢失的数)

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱: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核转变,朋友们在可能的情况下尽量多掌握一些多核编程的知识。

posted on 2014-12-11 10:06 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/4156960.html

一步一步写算法(之寻找丢失的数)相关推荐

  1. 编程题C语言写牛牛数星星,一步一步写算法(之“数星星”)

    原文: 一步一步写算法(之"数星星") [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 学过编程的朋友都知道,当初为了学习 ...

  2. 一步一步写算法(之“数星星”)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 学过编程的朋友都知道,当初为了学习编程语言中的各种语法结构,我们要试着解决各种各样奇怪的题目. ...

  3. 一步一步写算法(之图结构)

    原文:一步一步写算法(之图结构) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 图是数据结构里面的重要一章.通过图,我们可以判断两个点之间是 ...

  4. 一步一步写算法(之prim算法 中)

    原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...

  5. 一步一步写算法(之克鲁斯卡尔算法 中)

    一步一步写算法(之克鲁斯卡尔算法 中) 原文:一步一步写算法(之克鲁斯卡尔算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面说到 ...

  6. 一步一步写算法(之prim算法 下)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前两篇博客我们讨论了prim最小生成树的算法,熟悉了基本的流程.基本上来说,我们是按照自上而下 ...

  7. 一步一步写算法(开篇)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 算法是计算机的生命.没有算法,就没有软件,计算机也就成了一个冰冷的机器,没有什么实用价值.很多 ...

  8. 一步一步写算法(之 算法总结)【转】

    转自:http://blog.csdn.net/feixiaoxing/article/details/6993718 版权声明:本文为博主原创文章,未经博主允许不得转载. [ 声明:版权所有,欢迎转 ...

  9. 一步一步写算法(之 算法总结)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 自10月初编写算法系列的博客以来,陆陆续续以来写了几十篇.按照计划,还有三个部分的内容没有介绍 ...

最新文章

  1. 【Linux】Linux computer文件夹下各种文件的作用
  2. 文件名批量汉字转拼音+核磁共振影像数据处理
  3. python整除表达 mod_[零基础学python]啰嗦的除法
  4. [云炬创业基础笔记]第六章商业模式测试17
  5. Kubernetes监控之Heapster源码分析
  6. Android性能调优利器StrictMode
  7. Vue第二部分(2):组件的嵌套与通信
  8. bat脚本实现一键IP切换
  9. Linux下pgadmin4启动报错,在CentOS 7/Fedora 29系统上安装配置pgAdmin 4的方法
  10. USB2.0接口管脚定义
  11. 解决ERROR: text file '***' contains disallowed UTF-8 whitespace character(s)
  12. 带你认识网络世界,什么是网络协议、分层有什么好处
  13. IOS高级开发~开机启动无限后台运行监听进程
  14. KANKAN AI不良信息过滤技术:用数据证明自己是最好的
  15. 在ubuntu17.10上裝搜狗輸入法
  16. 消息队列系统Kafka_01
  17. outlook单独下载_在单独的Windows中打开不同的Outlook功能以提高生产率
  18. php获取ip地址,记录用户登陆日志
  19. [年度极品 普7风暴]《中关村GHOST WIN7纯净自选旗舰年度珍藏版2010V12》
  20. Java编程领域技术名词解释

热门文章

  1. Linux 光盘的挂载和解挂
  2. 非公平锁和公平锁在reetrantlock里的实现过程是怎样的
  3. JVM 调优实战--一个案例理解常用工具(命令)
  4. 【客户下单】后台系统匹配分区关键字实现自动分单
  5. id3与软件测试,ID3算法的实现
  6. 【已解决】Dreamweaver修改快捷键
  7. 【例子】外键约束的创建及例子
  8. 深度、广度优先生成树(C完整代码)
  9. 算法练习day15——190403(简介、求n!、汉诺塔、打印字符串的子序列、打印字符串的全排列、母牛生小牛、最小路径和、累加和是否达到给定值)
  10. java idle,java – IMAP IDLE库