数据结构与算法之美
王争
前 Google 工程师
283752 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 81 讲
基础篇 (38讲)
数据结构与算法之美
15
15
1.0x
00:00/00:00
登录|注册

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

两个矩阵的乘积计算
二维平面上最近点对的计算
合并子数组并计算跨越两个子数组的逆序对个数
递归地求解子数组的逆序对个数
将数组划分为两个子数组
思考生活和工作中还有哪些地方可以应用分治算法的思想
回顾之前学习的知识,找出采用了分治算法思想的例子
分治算法的思想在各个领域都有应用
数据结构和算法是架构设计的基础
创新的源泉来自对事物本质的认识
解决海量数据处理问题
降低问题求解的时间复杂度
利用集群并行处理提高效率
每个小任务独立计算,最后合并结果
将任务拆分到多台机器上处理
最后合并小数据集合的结果
单独加载小数据集合到内存处理
利用分治思想将数据划分为小的数据集合
数据量过大无法一次性加载到内存
其他经典问题
逆序对个数的求解
合并子问题的结果得到原问题的解
递归地解决子问题
将原问题划分成n个规模较小且结构相似的子问题
思考题
分治算法的魅力
分治算法的应用场景
MapReduce框架的本质是分治思想
分治算法在海量数据处理中的应用
分治算法的应用举例
分治算法的定义
分治算法的应用

该思维导图由 AI 生成,仅供参考

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

如何理解分治算法?

为什么说 MapRedue 的本质就是分治算法呢?我们先来看,什么是分治算法?
分治算法(divide and conquer)的核心思想其实就是四个字,分而治之 ,也就是将原问题划分成 n 个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。
这个定义看起来有点类似递归的定义。关于分治和递归的区别,我们在排序(下)的时候讲过,分治算法是一种处理问题的思想,递归是一种编程技巧。实际上,分治算法一般都比较适合用递归来实现。分治算法的递归实现中,每一层递归都会涉及这样三个操作:
分解:将原问题分解成一系列子问题;
解决:递归地求解各个子问题,若子问题足够小,则直接求解;
合并:将子问题的结果合并成原问题。
分治算法能解决的问题,一般需要满足下面这几个条件:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

分治算法是一种重要的算法思想,其核心思想是将原问题划分成规模较小且结构相似的子问题,递归地解决这些子问题,然后合并其结果,从而得到原问题的解。这种思想在海量数据处理中得到了广泛应用,特别是在Google的MapReduce框架中。MapReduce本质上就是利用了分治思想,将任务拆分到多台机器上来处理,最后再将结果合并。这种并行处理的思想不仅能克服内存的限制,还能利用多线程或者多机处理,加快处理的速度。除了MapReduce,分治算法还可以用于解决逆序对个数、快速计算最近的点对和矩阵乘积求解等经典问题。分治算法的应用非常广泛,读者可以通过这些例子更好地理解分治算法的原理和应用。通过对分治算法的理解,读者可以更好地将零散的知识提炼成体系,从而更好地应用于实际生活和工作中。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《数据结构与算法之美》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(133)

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

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

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

    作者回复: 👍

    2018-12-19
    146
  • Yves
    代码略有问题: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]; } }

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

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

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

    2018-12-20
    8
    36
  • 刘文坛
    分治算法本质上就是利用多核cpu并行计算能力,如果只是单核cpu,分治算法是不是就不可行了?

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

    2019-02-02
    4
    25
  • J.Smile
    老师,请问我做java但是不从事算法岗位,这门课需要学习到什么程度呢?总觉得心里有目标会更好点。

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

    2019-08-13
    2
    7
  • 不上进的码农
    if (a[i] <= a[j]) { num += (j - q - 1); tmp[k++] = a[i++]; } else { tmp[k++] = a[j++]; } 我想了想,这段代码应该求的是有序对而不是逆序对吧

    作者回复: 逆序对

    2018-12-19
    3
  • wahaha
    老师,求有(逆)序对只需一遍扫描即可,O(n)就能解决,所以用归并排序求解的这个例子并不太合适。

    作者回复: 怎么搞定的呢?貌似不行吧

    2019-04-26
    1
  • 行者
    老师,我前两个留言想说的是您文中说到的两个经典的分治算法的例子,不是思考题。一方面想问一下在您的github上有没有代码实现(这个您在回复我上一条留言中已经给了github地址了),另一方面是想问一下3×3阶矩阵相乘的话,可不可以用分治的思想去做呢?您的例子是n×n,n不必是2的倍数吗?如果可以的话,您能不能详细讲一讲3×3阶矩阵相乘怎么做。 我同学面试的时候面试官问到了这个问题,但他当时除了3个for循环,也没想出什么比较好的方法。我们讨论的时候,也没想出来

    作者回复: 可以去算法导论,dp那一节课里有讲到矩阵乘法

    2019-09-05
  • 行者
    3x3阶矩阵怎么用分治做呢?nxn阶,是要求n必须为2的整数倍吗

    作者回复: 不要求必须是2的倍数,3*3的可以分解为一个1*1,一个2*2的吧。不过,亲,这篇文章没有说到什么矩阵分治呀?能具体点吗?

    2019-08-27
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部