贪心算法
回溯算法
分治算法
动态规划

MapReduce本质就是分治算法,是Google大数据处理的三驾马车之一,另外两个是GFS和Bigtable。它在倒排索引,PageRank计算,网页分析等搜索引擎相关的技术中都有大量的应用。
MapReduce 框架只是一个任务调度器,底层依赖 GFS 来存储数据,依赖 Borg 管理机器。它从 GFS 中拿数据,交给 Borg 中的机器执行,并且时刻监控机器执行的进度,一旦出现机器宕机、进度卡壳等,就重新从 Borg 中调度一台机器执行。

一:如何理解分治算法

1,分治算法的核心思想其实就是四个字,分而治之,将原问题划分成n个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后在合并其结果,就得到原问题的解。

2,分治算法的定义类似于递归,但区别在于:分治算法是一种处理问题的思想,递归是一种编程技巧。

3,分治算法一般都比较适合递归来实现,分治算法的递归实现中,每一层递归都会涉及这样的三个操作:
分解:将原问题分解成一系列子问题;
解决:递归地求解各个子问题,若子问题足够小,则直接求解;
合并:将子问题的结果合并成原问题;

4,分治算法能解决的问题,一般需要满足下面这几个条件:
原问题与分解成的小问题具有相同的模式;
原问题分解成的子问题可以独立求解,子问题之间没有相关性,这一点是分治算法跟动态规划的明显区别,
 具有分解终止条件,即当问题足够小时,可以直接求解。
 可以将子问题合并成原问题,而这个操作的复杂度不能太高,否则就起不到减小算法总体复杂度的效果。

二:分治算法应用举例分析

假设有n个数据,期望数据从小到大排序,那完全有序的数据的有序度就是n(n-1)/2。逆序度等于0;相反,倒序排序的数据的有序度就是0,逆序度是n(n-1)/2。除了这两中极端情况外,我们通过计算有序对或逆序对的个数,来表示数据的有序度或逆序度。

现在问:如何编程求出数组中的数据有序对个数或逆序对个数?
1,最简单的办法:拿每个数字和他后面的数字比较,看有几个比它小。将比它小的数字个数记作k,通过这样的方式,把每个数字都考察一遍后,对每个数字对应的k值求和,最后得到的总和就是逆序对个数。但时间复杂度是O(n^2)。
2,用分治算法,套用分治的思想,将书中分成前后两半A1和A2,分别两者中的逆序对数,然后在计算A1和A2之间的逆序对个数k3。那整个数组的逆序对个数就是k1+k2+k3。
要快速计算出两个子问题A1和A2之间的逆序对个数需要借助归并排序算法
归并排序算法有个非常关键的操作,即将两个有序的小数组,合并成一个有序的数组。实际上,在合并的过程中,就可以计算这两个小数组的逆序对个数。每次合并操作,都计算逆序对个数,把这些计算出来的逆序对个数求和,就是这个数组的逆序对个数。


private int num = 0; // 全局变量或者成员变量public int count(int[] a, int n) {num = 0;mergeSortCounting(a, 0, n-1);return num;
}private void mergeSortCounting(int[] a, int p, int r) {if (p >= r) return;int q = (p+r)/2;mergeSortCounting(a, p, q);mergeSortCounting(a, q+1, r);merge(a, p, q, r);
}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); // 统计p-q之间,比a[j]大的元素个数  !!!! 统计tmp[k++] = a[j++];}}while (i <= q) { // 处理剩下的tmp[k++] = a[i++];}while (j <= r) { // 处理剩下的tmp[k++] = a[j++];}for (i = 0; i <= r-p; ++i) { // 从tmp拷贝回aa[p+i] = tmp[i];}
}

三:分治思想在海量数据处理中的应用

假设,给10GB的订单文件按照金额排序这样一个需求,看似是一个简单的排序问题,但是因为数据量大,有10GB,而我们的机器的内存可能只有2,3GB这样子,无法一次性加载到内存,也就无法通过单纯地使用快排,归并等基础算法来解决。

要解决这种数据量大到内装不下的问题,我们就可以利用分治的思想,将海量的数据集合根据某种方法,划分为几个小的数据集合,每个小的数据集合单独加载到内存来解决,然后在将小数据集合合并成大数据集合,实际上利用这种分治的处理思路,不仅能克服内存的限制,还能利用多线程或者多机处理,加快处理的速度。

采用分治思想的算法:快排、合并排序、桶排、基数排序、二分查找、递归树、数据库分片、MapReduce

创新的源泉来自对事物本质的认识,无数优秀架构设计的思想来源都是基础的数据结构和算法。

笔记整理来源: 王争 数据结构与算法之美

【数据结构与算法】【算法思想】分治算法相关推荐

  1. 快速排序 c++_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)

    本文始发于个人公众号:TechFlow 在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法. 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及 ...

  2. 排序中减治法算法伪代码_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)...

    在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法. 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及建模.今天这篇文章呢,就正式和大家聊一聊 ...

  3. 程序员都会的五大算法之一(分治算法),恶补恶补恶补!!!

    前言 点击查看算法介绍 五大算法 分治算法 动态规划 贪心算法 回溯算法 分支限界算法 WX搜素"Java长征记"对这些算法也有详细介绍. 分治算法 一.算法概述 简单来说,分治算 ...

  4. 算法导论系列:分治算法

    说起分治法,大家一定也都听过秦始皇采用郡县制将国家分为三十六郡的故事,我们常说"山高皇帝远",意思就是山高路远,皇帝都管不了,实际上无论皇帝多远,山有多高,整个国家都属于朝廷统治, ...

  5. C语言分治算法求中位数,【算法复习】分治算法

    Outline 分治思想和递归表达式 大整数乘法 矩阵乘法的Strassen算法 快速傅里叶变化 基于分治的排序 merge-sort排序 快速排序 排序的下界问题 中位数和顺序统计量 最邻近点对 凸 ...

  6. 五大常用算法之一:分治算法

    分治算法 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题-- ...

  7. 计算机基础算法棋盘覆盖,分治算法求解棋盘覆盖问题互动教学过程.doc

    分治算法求解棋盘覆盖问题互动教学过程 分治算法求解棋盘覆盖问题互动教学过程 摘要:针对算法设计与分析课程难度较大.对学生编程能力要求较高的现状,通过对棋盘覆盖问题的分治算法求解过程进行互动教学设计,引 ...

  8. c语言分治算法之归并排序,分治算法之归并排序

    分治算法: 将一个规模为N的问题分解为K个规模较小的子问题,这些子问题互相独立且与原问题性质相同.求出子问题的解后进行合并,就可得到原问题的解. 一般步骤: 1.分解,将要解决的问题划分成若干规模较小 ...

  9. 【算法概论】分治算法:k路归并

    首先了解两个概念,胜者树和败者树: 胜者树和败者树都是二叉排序树,是树形选择排序的一种变形.每个叶子节点相当于一位选手,每个中间结点相当于一场比赛,每一层相当于一轮比赛.胜者树的中间结点记录的是胜者的 ...

  10. 神经元网络算法的思想,神经网络算法应用案例

    神经网络算法原理 一共有四种算法及原理,如下所示:1.自适应谐振理论(ART)网络自适应谐振理论(ART)网络具有不同的方案.一个ART-1网络含有两层一个输入层和一个输出层. 这两层完全互连,该连接 ...

最新文章

  1. stack UVA 442 Matrix Chain Multiplication
  2. phpStudy mysql升级至5.7
  3. python 小例子 源码 莫凡_100 个 Python 小例子(一)
  4. HashMap源码学习
  5. Mockito框架实现学习之when(dummy)
  6. HATEOAS的RESTful服务。 记录超媒体API
  7. [css][移动设备]禁止横竖屏时内容自动调整
  8. object detection训练自己数据
  9. U2Net基于ModelArts Notbook的仿真实验
  10. 10 亿元赌约“揭盅”!董明珠与雷军这五年变得更像对方了
  11. matlab报童模型推导,报童模型推导
  12. 手机html己停用怎么办,iphone手机出现已停用请五分钟再试怎么办
  13. 打印所有的水仙花数---初学c语言
  14. 手把手教你用深度学习做物体检测(四):模型使用
  15. 复制粘贴-实现动态爱心 网页版
  16. Pandas学习(二)—— Pandas基础
  17. 电脑文件定时备份到U盘
  18. R语言绘制QQ图实战(qqplot函数、qqnorm函数、qqline函数)
  19. 自动控制理论(6)——高阶系统的时域分析及线性系统的稳定性分析
  20. sqlplus的简单使用和常用命令

热门文章

  1. vue2 watch引用类型 失败原因
  2. 做最好的自己——读书笔记
  3. poj 1715 Hexadecimal Numbers 排列组合
  4. 借口很多呀嘛接口也很多呀嘛态也很多
  5. media recovery oracle,Oracle非归档模式Media Recovery错误之--ORA-26040
  6. springcloud gateway 源码解析、请求响应流程、第三方响应结果在 gateway 的经过
  7. Python爬虫自学之第(④)篇——强大的正则表达式,re模块
  8. 查看Chome浏览器中已保存的密码
  9. oracle数据库安装过程中出现主目录不兼容的问题
  10. jquery ajax json转换出错Invalid JSON