大数据计算基础——算法部分(下)

目录

叁、并行模型算法

一、MapReduce模型

1. 模型介绍

2. 应用举例

二、大规模并行计算(MPC)模型

1. 概述

2. 求和问题

3. 不重复元素数

三、 排序问题

1. 基本思想

2. 分析

肆、亚线性时间算法

一、概述

二、点集的直径

三、连通分量的数目

四、最小生成树


叁、并行模型算法

一、MapReduce模型

1. 模型介绍

        MapReduce中每轮包括三个步骤:Map,Shuffle和Reduce。

        ①Map:将输入的键值对进行处理,输出新的键值对。

        ②Shuffle:将map输出的键值对按key值归类重组。

        ③Reduce:处理Shuffle的输出,得到新的数据集合。

        MapReduce的设计中主要目标是减少处理的轮数、每轮的处理次数等。

2. 应用举例

        倒排索引构建:输入文件和文件内容,经Map处理得到单词与文档的键值对,经Shuffle处理得到含特定单词的文档集合,经过Reduce输出结果。

        单词计数:输入文件和文件内容,经Map处理得到该文档的所有单词(可重复),经Shuffle处理将同一单词汇集起来,经过Reduce统计输出结果。

         矩阵乘法:矩阵乘法有两种实现方式。正常的矩阵乘法是把矩阵A的第 i 行乘矩阵B的第 j 列放到结果矩阵C的对应位置,但在大规模数据下可能没法完整取出一行一列。因此可以转换思路,只需把 aij 与 bjk 的乘积加到 cik 即可(C初始化为0)。

        第一种MapReduce的方法如下,用了两次MapReduce。第一次Map将输入的中间索引 j 作为key,在Reduce中让对应项相乘,得到<i, k>相同的一系列键值对。在第二次的Reduce中相加,就得到了 cik。

         如果再回顾一下矩阵乘法的过程,可以发现矩阵A中的元素 aij 会与矩阵B中第 j 行的所有元素相乘,矩阵B中的元素 bjk 会与矩阵A中第 i 列的所有元素相乘。

        故在Map中体现这个过程,aij 处理后的key值为(i, x),x 取遍所有的 j ,bjk 处理后的key值为(y, k),y取遍所有的 j。然后让key相等的 aij 与 bjk 相乘并求和,即可得到最终结果。

         第一种方法增加了MapReduce的轮次,第二种方法增加了每轮的处理次数。

二、大规模并行计算(MPC)模型

1. 概述

        由于数据量太大,通常的处理是把数据分布式存储在多个机器上并行处理。

        即使分到各台机器上,数据量仍然很大,因此这里的时间代价按照处理的轮次来计算,而不再考虑每轮的代价。

2. 求和问题

        求和相对简单,各台机器间可以独立运行。

        当机器的存储空间 s 规模为\small \sqrt{n} 时,只需一轮计算就能解决,即常数级的代价。

        当机器的存储空间远小于\small \sqrt{n}时,每轮处理能让数据规模缩小至1/s,共需\small O(log_{s}n) 轮。

3. 不重复元素数

        使用之前的FM+算法,每次的FM+重复k =  \small O(\frac{1}{\xi^{2}}) 次,故代价为\small O(log_{\xi^{2}s}n) 。

三、 排序问题

1. 基本思想

        这里介绍TeraSort,通过MapReduce进行高效的大规模数据排序。排序问题与前面的求和问题有本质区别,因为排序时不同机器间很可能不是独立工作的,需要一定的协调。

        TeraSort的基本思想是这样的:先将所有数据分成有序的若干段,然后每台机器负责一段内的数据排序,最后顺序输出。

        举个例子,为了对取值在1~20000中的1000个数进行排序,先将这1000个数分成4段,1~3000一段,3001~7000一段,7001~15000一段,15001~20000一段(不一定是均分),然后让4个人分别负责一段内数据的排序。最后按段依次输出,就得到了最终的排序结果。

        这里如何分段是个很重要的问题,因为机器在并行工作时的最终效率取决于最慢的那台机器,因此需要尽可能均匀分配。在下图的Round1中,就是进行这个分段处理。

        Map后得到了两类键值对,一类把全部数据打上标记0并输出,另一类以概率T/n为每个打上标记1并输出(相当于一个抽样过程)。

        在Reduce中,对标记为1的集合S进行排序,选择排序后的p-1 个 p 等分点作为分段的临界点,并用这 p-1 个点对原始数据进行分段,得到 p 类输出。

        最后在Round2中的Reduce里,对每一类内部排序,并按段序号顺序输出,就得到了排序完成的结果。

2. 分析

        这里的分析相对复杂,我自己也没怎么搞懂。

        主要说明这样的分段是较为均匀的,不等式放缩的地方我不太记得了,但大概是这个意思。

肆、亚线性时间算法

一、概述

        亚线性时间算法中,时间资源受限,甚至不允许完整读取数据一遍。此时无法回答精确的、必须遍历所有数据才能回答的问题。

         在亚线性时间算法中,我们多数情况下只能给出近似的答案。

二、点集的直径

        给定m个点,n条边,求最大边的长度。

        在时间受限的情况下,无法遍历每条边。这里的处理是任选一个点,选择其它点中与该点距离最大的作为选出的直径端点。

三、连通分量的数目

        常规的连通分量数求解可以在线性时间内完成,但在亚线性时间模型中需要更小的代价。

        这里的思想是计算每个顶点 u 所在连通分量的节点数 n_{u},将所有顶点的n_{u}的倒数相加,得到的结果作为C的估计值。 

        为了减少时间开销,对一个顶点所在的连通分量最多遍历 \frac{2}{\varepsilon } 个顶点,并且只取所有顶点中的一部分进行计算,最后等比例放大。

        这样,处理一个顶点的代价为O(\frac{d}{\varepsilon }) ,其中 d 为图G的度。处理 r 个顶点的代价为O(\frac{d}{\varepsilon ^{3}}) ,达到了亚线性时间的要求,并且通过合理选择 r 能够控制结果的近似比。

四、最小生成树

        常规的最小生成树能在多项式时间内完成,这里的思想是转化为连通分量的求解。

        我们可以从这样的角度思考最小生成树的形成过程:从权重为1的边开始选择,得到一个(可能不连通的)无环图,然后从权重为2的边开始选择,依次进行下去,直到得到一颗生成树。只要原图是连通的,就一定可以得到一棵树,并且能够证明这样的树是最小的(贪心)。

        那么每次应该选择几条边呢?如果已经选完了权重小于等于 i 的边,那么就要从权重大于 i 的边中选出 C^{(i)} - 1 条边,其中 C^{(i)} 代表所有顶点和权重不超过 i 的边形成的子图的连通分量个数。

        最终可以得到最小生成树的权值如下,也就转化为了连通分量的求解。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值