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。
借助归并排序算法,将两个有序的小数组合并成一个有序的数组的过程中,每次合并操作都计算逆序对个数,把计算出来的逆序对个数求和,就是这个数组的逆序对个数。
逆序度1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47//全局变量
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 start, int end) {
if (start >= end) return;
//中点
int mid = (start+r=end)/2;
mergeSortCounting(a,start,mid);
mergeSortCounting(a,mid+1,end);
//合并函数
mergeSort(a,start,mid,end);
}
private void merge(int[] a, int left, int mid, int right) {
//临时数组,大小为当前分区的大小
int[] tmp = new int[right-left+1];
int i = left;//左边起始下标
int j = mid+1;//右边起始下标
int k = 0;
while(i <= mid && j <= right) {
//取左右区间中元素最小值放入当前位置
if(a[i] <= a[j]) {
tmp[k++] = a[i++]
} else {
//统计左区间left-mid之间,比右区间当前元素a[j]大的元素个数
num += (mid-i+1);
tmp[k++] = a[j++];
}
}
//处理左区间剩下的
while(i <= mid) {
tmp[k++] = a[i++];
}
//处理右区间剩下的
while(j <= right) {
tmp[k++] = a[j++];
}
//从tmp拷贝回原数组a对应区间
for(i = 0; i <= right-left+1; i++) {
a[left+i] = tmp[i];
}
}
分治算法处理海量数据
利用分治的思想解决数据量大到内存装不下的问题。
将海量数据集合根据某种方法,划分为几个小的数据集合,每个小的数据集合单独加载到内存来解决,然后再将小数据集合合并成大数据集合。
利用这种分治的处理思路,能克服内存的限制,还能利用多线程或者多机处理,加快处理的速度。
MapReduce框架只是一个任务调度器,底层依赖GFS来存储数据,依赖Borg管理及其。从GFS中拿数据,交给Borg中的机器执行,时刻监控机器执行状态并调度。
可以处理数据与数据之间存在关系的任务-统计文件中单词出现频率
可以处理数据与数据之间没有关系的任务-网页分析、分词