0%

分治算法

MapReduce、GFS(Google File System)、Bigtable是谷歌大数据处理的三驾马车。
MapReduce在倒排索引、PageRank计算、网页分析等搜索引擎相关的技术中有大量的应用。

分治算法理解

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

分治算法是一种处理问题的思想,递归是一种编程技巧。分治算法一般都比较适合用递归来实现。

  • 分解:将原问题分解成一系列子问题;
  • 解决:递归地求解各个子问题,若子问题足够小,则直接求解;
  • 合并:将子问题的结果合并成原问题。

前提条件:

  • 原问题与分解成的小问题具有相同的模式;
  • 原问题分解成的子问题可以独立求解,子问题之间没有相关性;(分治算法与动态规划的区别)
  • 具有分解终止条件,当问题足够小时,可以直接求解;
  • 可以将子问题合并成原问题,合并操作的复杂度不高。

分治算法编程应用

排序中应用(二分、归并、快排)
有序度表示一组数据的有序程度,逆序度表示一组数据的无序程度。
n个数据从小到大排列,完全有序的数据(等差数列求和)的有序度就是n(n-1)/2,逆序度等于0;倒序排列的数据的有序度是0,逆序度是n(n-1)/2。
其余通过计算有序对/逆序对的个数,表示数据的有序度或逆序度。

  • 拿每个数字跟它后面的数据比较,看有几个比它小的,把比它小的数字个数记作k,依次类推,对每个数字对应的k值求和,最后得到的总和就是逆序对个数。时间复杂度是O(n2)。

  • 套用分治的思想求数组的逆序对个数,将数组分成前后两半A1和A2,分别计算A1和A2的逆序对个数K1和K2,然后再计算A1与A2之间的逆序对个数K3。数组A的逆序对个数为K1+K2+K3。

    借助归并排序算法,将两个有序的小数组合并成一个有序的数组的过程中,每次合并操作都计算逆序对个数,把计算出来的逆序对个数求和,就是这个数组的逆序对个数。

分治算法处理海量数据

利用分治的思想解决数据量大到内存装不下的问题。

将海量数据集合根据某种方法,划分为几个小的数据集合,每个小的数据集合单独加载到内存来解决,然后再将小数据集合合并成大数据集合。

利用这种分治的处理思路,能克服内存的限制,还能利用多线程或者多机处理,加快处理的速度。

MapReduce框架只是一个任务调度器,底层依赖GFS来存储数据,依赖Borg管理及其。从GFS中拿数据,交给Borg中的机器执行,时刻监控机器执行状态并调度。
可以处理数据与数据之间存在关系的任务-统计文件中单词出现频率
可以处理数据与数据之间没有关系的任务-网页分析、分词