2016-12-29 53 views
0

我一直在读一nice answerDifference between reduce and foldLeft/fold in functional programming (particularly Scala and Scala APIs)?samthebest提供,我不知道如果我理解所有的细节:差异,减少再谈

  • 根据答案(reduce VS foldLeft):

    一个很大很大的区别(...)是降低应给予可交换独异,(...)

    这种区别对大数据/ MPP /分布式计算非常重要,甚至存在减少的全部原因。

    减少被正式定义为MapReduce的范例的一部分,

    我不知道这两种说法如何结合。任何人都可以对此有所了解吗?

  • 我测试了不同的收藏,我还没有看到reducefoldLeft之间的性能差异。它看起来像ParSeq是一个特例,是吗?

  • 我们是否真的需要订购fold

    我们不能定义fold,因为块没有排序,fold只需要关联性而不是交换性。

    为什么它不能被推广到无序集合?

+0

有什么可以理解的?对于'foldLeft',你不能假设关联性/交换性(没有并行化的机会),对于'reduce'你可以(平行化)。不知道如何做得更清楚。这些都是通用概念,并且超出了任何特定时间点在Scala标准库中发生的任何集合的性能。 –

+1

@JaredSmith我认为减少MapReduce与减少Spark或Scala集合的意义不同。我错了吗? – user7337271

+0

是的,AFAIK目前唯一的区别是可以提供给'foldLeft'的种子值。但是你引用的答案的重点是*应该*是一个涉及应用于所讨论类型的二元运算符的数学性质的差异。这个问题的答案应该可以帮助你http://stackoverflow.com/questions/17408880/reduce-fold-or-scan-left-right –

回答

3

作为评价所述,术语减少的MapReduce的上下文中使用,并且在函数编程的上下文中使用时,当装置不同的事情。

  • 在MapReduce的,所述系统组由一个给定键的map函数的结果,然后调用reduce操作的每个基团的聚合值(因此reduce为每个组称为一次)。您可以将它看作一个函数(K, [V]) -> R,将组密钥K与属于组[V]的所有值一起取出并产生一些结果。

  • 在函数式编程中,reduce是一个函数,它在给它一个可以组合两个元素的操作时聚合某些集合的元素。换句话说,您可以定义一个函数(V, V) -> V,并且reduce函数使用它来将集合[V]汇总为单个值V

当你想添加使用+作为功能编号[1,2,3,4],该reduce功能可以通过多种方式做到这一点:

  1. 它可以从一开始运行,并计算((1+2)+3)+4)
  2. 它也可以并行计算a = 1+2b = 3+4,然后添加a+b

foldLeft根据定义总是从左边开始,所以它总是使用(1)的评估策略。事实上,它也需要一个初始值,所以它评估的东西更像(((0+1)+2)+3)+4)。这使得foldLeft对于顺序很重要的操作很有用,但这也意味着它不能用于无序集合(因为你不知道“左”是什么)。

+0

谢谢,它证实了我的理解。另一个答案非常高调,我开始怀疑我的理智。 – user7337271