Algorithm MapReduce矩阵乘法复杂性
假设我们有一个大文件,其中包含两个矩阵(A和B)单元的描述: 我们要计算这个矩阵的乘积:Algorithm MapReduce矩阵乘法复杂性,algorithm,mapreduce,complexity-theory,matrix-multiplication,Algorithm,Mapreduce,Complexity Theory,Matrix Multiplication,假设我们有一个大文件,其中包含两个矩阵(A和B)单元的描述: 我们要计算这个矩阵的乘积:C=A x B 根据定义:C_i_j=sum(A_i_k*B_k_j) 这里有一个两步MapReduce算法,用于计算这个乘积(我将提供一个伪代码): 第一步: function Map (input is a single row of the file from above): i = row[0] j = row[1] value = row[2] matrix =
C=A x B
根据定义:
C_i_j=sum(A_i_k*B_k_j)
这里有一个两步MapReduce算法,用于计算这个乘积(我将提供一个伪代码): 第一步:
function Map (input is a single row of the file from above):
i = row[0]
j = row[1]
value = row[2]
matrix = row[3]
if(matrix == 'A')
emit(i, {j, value, 'A'})
else
emit(j, {i, value, 'B'})
function Map (input is a single row of the file, which produced in first step):
i = row[0]
j = row[1]
value = row[2]
emit({i, j}, value)
此映射函数的复杂性为O(1)
这个Reduce函数的复杂度是
O(N^2)
在第一步之后,我们将获得类似以下文件的内容(其中包含
O(N^3)
行):
所以,我们所要做的就是,从包含相同值i
和j
的行中求和值
第二步:
function Map (input is a single row of the file from above):
i = row[0]
j = row[1]
value = row[2]
matrix = row[3]
if(matrix == 'A')
emit(i, {j, value, 'A'})
else
emit(j, {i, value, 'B'})
function Map (input is a single row of the file, which produced in first step):
i = row[0]
j = row[1]
value = row[2]
emit({i, j}, value)
第二步之后,我们将获得文件,其中包含矩阵
C
的单元格
所以问题是:
function Map (input is a single row of the file from above):
i = row[0]
j = row[1]
value = row[2]
matrix = row[3]
if(matrix == 'A')
emit(i, {j, value, 'A'})
else
emit(j, {i, value, 'B'})
function Map (input is a single row of the file, which produced in first step):
i = row[0]
j = row[1]
value = row[2]
emit({i, j}, value)
考虑到MapReduce集群中存在多个实例,哪种方法是估计所提供算法复杂性的最正确方法
我想到的第一个问题是:假设MapReduce集群中的实例数为
K
。
而且,由于第一步后产生的文件行数是O(N^3)
,因此总体复杂性可以估计为O((N^3)/K)
但是这个估计没有考虑很多细节:比如MapReduce集群实例之间的网络带宽,在不同距离之间分发数据的能力,以及在本地执行大部分计算等
因此,我想知道哪种方法是评估提供的MapReduce算法效率的最佳方法,使用Big-O表示法来评估MapReduce算法的效率是否有意义?正如您所说,Big-O评估计算复杂性,并且没有考虑网络问题(带宽、拥塞、延迟…) 如果您想计算实例之间的通信效率,在这种情况下,您需要其他网络指标 然而,我想告诉你一些事情,如果你的文件不够大,你将看不到执行速度方面的改进。这是因为MapReduce只有在大数据的情况下才能有效工作。此外,您的代码有两个步骤,即两个作业。从一个作业到另一个作业,MapReduce需要时间上载文件并重新启动作业。这会稍微影响性能 我认为您可以从速度和时间两个方面高效地计算数据,因为MapReduce方法在大数据方面肯定更快。如果我们将其与顺序算法进行比较,就会发现这一点 此外,效率可以与容错性有关。这是因为MapReduce将自行处理故障。因此,程序员无需处理实例故障或网络故障