【问题标题】:Having hard time to understand why this function is called MapReduce很难理解为什么这个函数被称为 MapReduce
【发布时间】:2012-09-28 18:47:40
【问题描述】:

在我的Scala course 中给出了一个例子。它是关于找到一个更通用的函数,它可以用来定义算术求和函数和算术产生函数。以下是应该概括的功能。

def sum(f:Int=>Int)(a:Int,b:Int):Int ={
 if(a>b) 0
 else f(a) + sum(f)(a+1,b)
}

def product(f:Int=>Int)(a:Int,b:Int):Int={
 if(a>b)1
 else f(a)*product(f)(a+1,b)
}

为了概括这些功能,老师给出了这样一个功能:

def mapReduce(f:Int=>Int,combine: (Int,Int)=>Int, zero:Int)(a:Int,b:Int):Int ={
    if(a>b) zero
    else combine(f(a),mapReduce(f, combine, zero)(a+1, b))
}

所以 mapReduce 函数可以用来概括 sum 和 product 函数如下:

def sumGN(f:Int=>Int)(a:Int,b:Int) = mapReduce(f, (x,y)=>(x+y), 0)(a, b)
def productGN(f:Int=>Int)(a:Int,b:Int) = mapReduce(f, (x,y)=>(x*y), 1)(a, b)

我查看了函数式编程中 map reduce 的定义,但我很难理解为什么上面的通用函数被命名为 map reduce。我无法掌握这种关系。任何帮助都会让我很开心。

问候

【问题讨论】:

    标签: scala map reduce


    【解决方案1】:

    这绝不是一个确切的解释(无论如何名字都是模糊的),但这里有一个替代定义:

    def mapReduce(f: Int => Int, combine: (Int, Int) => Int, zero: Int)(a: Int, b: Int): Int ={
      if (a > b) zero
      else (a to b).map(f).reduce(combine)
    }
    

    你看到链接了吗?

    【讨论】:

      【解决方案2】:

      mapReduce 的映射函数在问题中是 f,尽管从来没有一个例子来说明它的定义。对于 sum 和 product,它将是恒等函数,但如果您对平方求和,则映射函数将是平方函数。

      mapReduce 的 reducer 函数是 combine,其中我们将 accumulator+value 的元组归约为一个新的 accumulator,用于下一次递归。

      我认为除了代码不是很清楚之外,缺少的链接是将数字视为集合(例如,3 是三个 1 的集合)。这很不寻常,我不知道它能给你带来什么,但可能是你的老师稍后会使用数字和集合之间的类比来做更深刻的事情。

      这是来自 Odersky 的 coursera 课程吗?

      【讨论】:

        【解决方案3】:

        函数式编程通常具有三个中心运算符:mapreduce(有时称为fold)和filter

        • Map 接受一个列表和一个操作,并生成一个列表,其中包含应用于第一个列表中所有内容的操作。
        • 过滤器接受一个列表和一个测试,并生成另一个列表,其中仅包含通过测试的元素。
        • Reduce(或折叠)采用列表、操作和初始值,并将操作应用于初始值和列表中的元素,将输出与下一个列表项一起传递给自身,产生操作和的列表。

        例如,如果您的列表是 [2,3,4,5,6,7],您的初始值为 1,并且您的操作是加法,则归约的行为方式如下:

        Reduce([2,3,4,5,6,7], +, 1) = ((((((initial + 2) + 3) + 4) + 5) + 6) + 7)
        

        您的教师可能会称它为 mapReduce,因为这是范式的名称,尽管简单的 reduce 也足够了。

        如果你对他的名字的意义感到好奇,你应该问他。他是你的导师。

        【讨论】:

        • 示例来自在线视频课程。很难问导师。
        • 我不知道,既然你不是 OP,我也不确定你是否也这样做。
        • @AntonSizikov 如果您谈论 Coursera 课程,我看到 Martin(讲师)有时会在论坛上回答问题
        • @Wug ,该课程是指 coursera,我可以在讨论论坛中问它,但是我有强有力的证据表明 coursera scala 社区是 SO scala 社区的子集 :)) 我得到了在这里提出问题的效率更高。并感谢所有回答问题的人。问候
        • @cgon:展示我所知道的。您可以链接到问题中的课程吗?
        猜你喜欢
        • 2018-09-12
        • 2012-06-29
        • 2021-12-29
        • 1970-01-01
        • 1970-01-01
        • 2015-03-02
        • 1970-01-01
        • 2019-10-18
        • 2022-01-23
        相关资源
        最近更新 更多