38 | 分治算法:谈一谈大规模计算框架MapReduce中的分治思想

2018-12-19 王争
《数据结构与算法之美》
课程介绍


讲述:冯永吉

时长:大小11.22M


MapReduce 是 Google 大数据处理的三驾马车之一,另外两个是 GFS 和 Bigtable。它在倒排索引、PageRank 计算、网页分析等搜索引擎相关的技术中都有大量的应用。
尽管开发一个 MapReduce 看起来很高深,感觉跟我们遥不可及。实际上,万变不离其宗,它的本质就是我们今天要学的这种算法思想,分治算法。

如何理解分治算法?

为什么说 MapRedue 的本质就是分治算法呢?我们先来看,什么是分治算法?
分治算法(divide and conquer)的核心思想其实就是四个字,分而治之 ,也就是将原问题划分成 n 个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。
这个定义看起来有点类似递归的定义。关于分治和递归的区别,我们在排序(下)的时候讲过,分治算法是一种处理问题的思想,递归是一种编程技巧。实际上,分治算法一般都比较适合用递归来实现。分治算法的递归实现中,每一层递归都会涉及这样三个操作:
分解:...

展开全文
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。

精选留言

  • Williamzhang
    置顶
    2018-12-20
    第一个留言有问题可以再理解一下,不要误导后边人,作者的num+=语句位置正确

    作者回复: 哈哈 终于有人看懂了 我的跟留言那位同学的思路不一样而已 他的更简洁些

    
    43
  • 李二木
    2018-12-19
    在统计方面比较多,比如统计我国人口,要知道我国人口就要先知道每个省人口,要知道省人口就要知道每个市人口,要知道市人口就要知道每个区县人口,直到村社区,然后汇总求的总人数。

    作者回复: 👍

    
    132
  • MIAN-勉
    2018-12-27
    把归并排序merge方法的参数列表 由merge(int[] a, int p, int q, int r) 改为 merge(int[] a, int low, int middle, int high) 更容易理解😂,小细节,哈哈
    共 3 条评论
    82
  • Smallfly
    2018-12-19
    「创新并非离我们很远,创新的源泉来自对事物本质的认识。无数优秀架构设计的思想来源都是基础的数据结构和算法,这本身就是算法的一个魅力所在。」 这句话讲的太好啦。各种前端框架层出不穷,本质的东西,也是基本都没有变。 与其最新,不如求本。
    展开
    共 2 条评论
    53
  • 建强
    2019-12-08
    采用分治思想的算法包括: 1.快速排序算法 2.合并排序算法 3.桶排序算法 4.基数排序算法 5.二分查找算法 6.利用递归树求解算法复杂度的思想 7.分布式数据库利用分片技术做数据处理 8.MapReduce模型处理思想
    展开
    共 2 条评论
    42
  • 刘远通
    2018-12-20
    第一个求最近的点对 分成两块 单独求其中一块点对最小距离 然后求这两块之间点对的最小距离 通过一些排序和删除 可以减少到6个点之间比较 很神奇 第二个矩阵计算 v.斯特拉森提出了2*2分块矩阵的计算公式 从原来的8次乘法 缩减到了7次 当n规模很大的时候 缩减效果就很明显 (7/8)^(logn)
    展开
    共 3 条评论
    41
  • Yves
    2018-12-19
    代码略有问题:1,num += (q - i + 1),应该是在 a[i] <= a[j] 这个条件分支里面;2,while (i <= q) 里面不应该有 num += (q - i + 1),3,最后的修改原数组迭代条件应该是 i < r - p + 1 而不是 i < r - p 。 private void merge(int[] a, int p, int q, int r) { int i = p, j = q + 1, k = 0; int[] tmp = new int[r - p + 1]; while (i <= q && j <= r) { if (a[i] <= a[j]) { tmp[k++] = a[i++]; } else { num += (q - i + 1); tmp[k++] = a[j++]; } } while (i <= q) { tmp[k++] = a[i++]; } while (j <= r) { tmp[k++] = a[j++]; } for (i = 0; i < r - p + 1; ++i) { a[p + i] = tmp[i]; } }
    展开

    作者回复: 是的 大家代码直接看这位同学的 我晚点改正下。写的时候匆忙 不好意思

    
    38
  • h…
    2018-12-20
    王争老师,我是后台开发,想换算法类工作,能不能给我点建议

    作者回复: 算法现在很火啊 供不应求 如果年轻的话 并且愿意学习的话 转起来也不难 建议找几本书看看 多代码练习一下 入了门之后 先找个一般的公司干干 积累些项目经验 以此再去好点公司

    共 7 条评论
    34
  • Jiemr
    2019-01-11
    老师,我有两个疑问: 给 10GB 的订单排序,我们就可以先扫描一遍订单 ------------------------------------- 1.场景中描述的机器内存只有2、3GB,我理解的是直接加载文件内存应该不够用来扫描一次10GB订单文件,对吗?如果不能,那应该怎么扫描呢? 2.如果用buffer来缓存扫描结果的话,即使能扫描完成,又该怎么对文件根据金额区间进行分割呢?
    展开
    共 7 条评论
    25
  • 刘文坛
    2019-02-02
    分治算法本质上就是利用多核cpu并行计算能力,如果只是单核cpu,分治算法是不是就不可行了?

    作者回复: 不。单核也可以利用多线程并行。毕竟一般的算法代码都包括:内存访问、CPU计算两部分,并不只是CPU计算。

    共 3 条评论
    23
  • 涂
    2019-03-27
    leetcode 315
    共 1 条评论
    22
  • 苏雅拉
    2019-01-02
    微积分是分治思想鼻祖
    共 1 条评论
    21
  • 大毛
    2020-04-07
    其实不仅仅是算法,在工程上也是采取这样的思路,不仅仅是在工程上,任何一个庞大的体系都是使用“分而治之”的思想完成的。 一个个体的能力是有限的,我们需要一套机制把每个个体的力量集合起来办大事。这种思想,在计算机中叫分治,在人类社会中叫合作。这样一套卓有成效的机制,在计算机中是集群分布式架构,在社会中就是一个公司、一个政 府。 在这种合作下会产生很多问题,其中最突出的问题就是个体(公司部门)之间的通信问题。在计算机中,这种问题表现为任务分配和资源冲突,在公司中,这种问题表现为各个部门之间的竞争、自扫门前雪。处理这样的问题,需要考验我们的智慧。 认识事物的本质,触类旁通了解世界,真是一件有趣的事。
    展开
    共 1 条评论
    16
  • CathyLin
    2019-08-06
    本来已经刷完了,但感觉没想明白怎样合并平面中两个距离最近的点对于是又网上查资料嗑了 2 个晚上。 发现通过数学公式的计算,对于左区间中的一个点,我们最多只需要比较右区间中 7 个点就可以了,所以也是相当于是 linear time。 然后通过 T(n) = 2*T(n/2) + O(n) 得到最后的时间复杂度是 O(NlogN)。 Ref: https://en.wikipedia.org/wiki/Closest_pair_of_points_problem 课后思考:深刻的理解到了递归就是实现分治的最好方法,例如我们在构建树的问题时,首先构建左子树,然后再构建右子树,最后把两个子树合并起来形成当前节点。 生活中:就像评论区所留言的那样,美国大选,先从镇开始,然后到州,最后在合并起来。
    展开
    共 2 条评论
    12
  • ALAN
    2018-12-19
    老师,你好,有一个建议,就是对于代码每一行里不是很显然易懂的地方,能否注释下此行代码的作用,不然有时看了代码也不知为啥这样写。
    共 1 条评论
    10
  • 小时候可鲜啦
    2020-09-07
    按照代码算法的意思,计算逆序对的图里边应该是0+2+2+2=6才对吧?
    
    8
  • 康斯坦丁
    2019-07-02
    前面的数据结构与算法中: 归并排序、桶排序、快速排序使用了分治算法. 工作/生活中: 美国大选统计选票.
    
    7
  • Geek_41d472
    2019-01-06
    归并排序忘记了,又跑头前面看一下,不然看不懂了……忘的好快……
    
    7
  • J.Smile
    2019-08-13
    老师,请问我做java但是不从事算法岗位,这门课需要学习到什么程度呢?总觉得心里有目标会更好点。

    作者回复: 把比较基础的算法看懂就可以了,我后面有一篇文章分享关于新手如何循序渐进学习的,你可以看下。

    共 2 条评论
    6
  • 寻路人
    2019-06-10
    团队目标达成也是采用分治思想。 leader:设置一个团队的整体目标。 module owner: 分取整体目标的一个模块。 developer: 分取模块里面一个任务。 整体目标 = 模块任务A + 模块任务B 模块任务A = 个人任务A + 个人任务B + 个人任务C 最后达到整个任务
    展开
    共 1 条评论
    6