38 | 分治算法:谈一谈大规模计算框架MapReduce中的分治思想
该思维导图由 AI 生成,仅供参考
如何理解分治算法?
- 深入了解
- 翻译
- 解释
- 总结
分治算法是一种重要的算法思想,其核心思想是将原问题划分成规模较小且结构相似的子问题,递归地解决这些子问题,然后合并其结果,从而得到原问题的解。这种思想在海量数据处理中得到了广泛应用,特别是在Google的MapReduce框架中。MapReduce本质上就是利用了分治思想,将任务拆分到多台机器上来处理,最后再将结果合并。这种并行处理的思想不仅能克服内存的限制,还能利用多线程或者多机处理,加快处理的速度。除了MapReduce,分治算法还可以用于解决逆序对个数、快速计算最近的点对和矩阵乘积求解等经典问题。分治算法的应用非常广泛,读者可以通过这些例子更好地理解分治算法的原理和应用。通过对分治算法的理解,读者可以更好地将零散的知识提炼成体系,从而更好地应用于实际生活和工作中。
《数据结构与算法之美》,新⼈⾸单¥68
全部留言(133)
- 最新
- 精选
- Williamzhang置顶第一个留言有问题可以再理解一下,不要误导后边人,作者的num+=语句位置正确
作者回复: 哈哈 终于有人看懂了 我的跟留言那位同学的思路不一样而已 他的更简洁些
2018-12-2046 - 李二木在统计方面比较多,比如统计我国人口,要知道我国人口就要先知道每个省人口,要知道省人口就要知道每个市人口,要知道市人口就要知道每个区县人口,直到村社区,然后汇总求的总人数。
作者回复: 👍
2018-12-19146 - 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-1939 - h…王争老师,我是后台开发,想换算法类工作,能不能给我点建议
作者回复: 算法现在很火啊 供不应求 如果年轻的话 并且愿意学习的话 转起来也不难 建议找几本书看看 多代码练习一下 入了门之后 先找个一般的公司干干 积累些项目经验 以此再去好点公司
2018-12-20836 - 刘文坛分治算法本质上就是利用多核cpu并行计算能力,如果只是单核cpu,分治算法是不是就不可行了?
作者回复: 不。单核也可以利用多线程并行。毕竟一般的算法代码都包括:内存访问、CPU计算两部分,并不只是CPU计算。
2019-02-02425 - J.Smile老师,请问我做java但是不从事算法岗位,这门课需要学习到什么程度呢?总觉得心里有目标会更好点。
作者回复: 把比较基础的算法看懂就可以了,我后面有一篇文章分享关于新手如何循序渐进学习的,你可以看下。
2019-08-1327 - 不上进的码农if (a[i] <= a[j]) { num += (j - q - 1); tmp[k++] = a[i++]; } else { tmp[k++] = a[j++]; } 我想了想,这段代码应该求的是有序对而不是逆序对吧
作者回复: 逆序对
2018-12-193 - wahaha老师,求有(逆)序对只需一遍扫描即可,O(n)就能解决,所以用归并排序求解的这个例子并不太合适。
作者回复: 怎么搞定的呢?貌似不行吧
2019-04-261 - 行者老师,我前两个留言想说的是您文中说到的两个经典的分治算法的例子,不是思考题。一方面想问一下在您的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