从Map和Reduce说起

原创 2006年06月03日 01:01:00
从Map和Reduce说起 最近在看函数式编程的一些东西,尤其是Sheme和Python,有些困惑,遂写下一些东西。 在Python中,map/reduce/filter是函数式编程的一组重要的工具. map将过程(函数)应用于数据以产生新的数据,而reduce则是将数据进行归并. 下面的语句分别完成将List中每个元素平方的功能和对List求和的功能:
>>> map(lambda x: x*x,[1,2,3,4,5]) [1, 4, 9, 16, 25] >>> reduce((lambda x,y:x+y),[1,2,3,4,5]) 15 
map将过程x*x应用于list中的每个元素,并产生新的list作为返回值,而reduce每次将 list中当前元素与上次应用过程的结果作为输入应用到过程中. 看一个复杂的例子,用于求前10个Fibobacci数:
map(lambda x,f=lambda x,f:(x<=1) or (f(x-1,f)+f(x-2,f)): f(x,f),range(10)) 
Map与Reduce在Scheme/Lisp中就已经流行,Scheme中的Map实现为:
(define (map proc items)    
(if (null? items) (list )
(cons (proc (car items)) (map proc (cdr items)))))
(define (reduce proc items) (if (null? items) 0
(proc (car items) (reduce proc (cdr items)))))
根据上面的map/reduce的定义,下面的表达式用于求1-5的平方和
(reduce (lambda (x y) (+ x y)) (map (lambda(x) (* x x)) (list 1 2 3 4 5)))  
通过Map和Reduce建立了一种处理表的高层抽象.与命令式语言相比,Scheme等函数式语言将处理数据的逻辑与提取元素的细节隔离开。(From: SICP) 在C/C++中也可以用函数指针来实现函数式编程的概念,但是由于语言特性的不支持,所以代码相当的晦涩,远不如Python中的优雅自然.
#include<stdio.h>  
typedef int(*function)(int);
typedef int(*reduceFunc)(int,int);
int square(int i)
{
return i*i;
}

int multiply(int i)
{
return 2*i;
}

int add(int i, int j)
{
return i + j;
}

int map(function func,int* list,int len)
{
for(int i=0;i&ltlen; i++)
list[i] = func(list[i]);
return len;
}

int reduce(reduceFunc func,int* list,int len)
{
if(len<=0)
return -1;
int retVal = list[0];
for(int i=1; i<len; i++)
retVal = func(list[i],retVal);
return retVal;
}

int main(int argc, char** argv)
{
int intArray[5];
for(int i=0;i<5;i++)
{
intArray[i] = i+1;
}

function funcPointer = (function)&square;
map(funcPointer,intArray,5);

for(int i=0;i<5; i++)
{
printf("intArray[i]:%d/n ",intArray[i]);
}

funcPointer = (function)&multiply;
map(funcPointer,intArray,5);
for(int i=0;i<5; i++)
{
printf("intArray[i]:%d/n ",intArray[i]);
}

int reduceArray[] = {8,7,2,-17,5,-5};
reduceFunc reduceFp = (reduceFunc)&add;
int reduceValue = reduce(reduceFp,reduceArray,6);
printf("reduceValue: %d/n",reduceValue);
}
Gooogle的工程师们根据Map/Reduce的思想,实现了一种分布式调度算法MapReduce,其核心是利用一个Map操作以Key/Value对作为输入,并且产生一组中间key/Value集合。Reduce方法接收一个中间的键I和一组关于该键的值,然后将该将这些值合并成一组更小的集合.
相关链接: Microsoft F#: http://research.microsoft.com/fsharp/fsharp.aspx
MapReduce: http://labs.google.com/papers/mapreduce-osdi04.pdf

从Map和Reduce说起

从Map和Reduce说起最近在看函数式编程的一些东西,尤其是Sheme和Python,有些困惑,遂写下一些东西。在Python中,map/reduce/filter是函数式编程的一组重要的工具. m...
  • wishfly
  • wishfly
  • 2006年08月08日 23:44
  • 1717

Map和Reduce中间过程描述

读书笔记,记录Map和Reduce函数中间发生的操作。
  • haibo_hn
  • haibo_hn
  • 2016年09月30日 16:59
  • 1116

python之map和reduce的区别

从参数方面来讲: map()函数: map()包含两个参数,第一个是参数是一个函数,第二个是序列(列表或元组)。其中,函数(即map的第一个参数位置的函数)可以接收一个或多个参数。 reduce()函...
  • code_better
  • code_better
  • 2016年11月01日 14:29
  • 2703

Map Reduce 和 shuffle过程 浅述

Map Reduce 和 shuffle过程 map 负责数据的过滤分发,reduce负责数据的计算归并; 在map和reduce中间有个被叫做“神奇发生的地方”就是shuffle过程 shuffl...
  • H_lInTheMirror
  • H_lInTheMirror
  • 2016年12月04日 17:09
  • 505

Hadoop、HDFS和Map/Reduce

Hadoop是一个开发和运行处理大规模数据的软件平台,是Appach的一个用java语言实现开源软件框架,实现在大量计算机组成的集群中对海量数据进行分布式计算框架。Hadoop的核心是分布式文件系统H...
  • lion19930924
  • lion19930924
  • 2016年08月17日 22:33
  • 527

Python 中 map和reduce 的用法

首先是map:接受两个参数,第一个是函数,第二个是一个可迭代的的参数(Iterable)如下例子,我们定义一个函数f(x)=x^2#map的用法 def func(x): return x*x...
  • zjq_1314520
  • zjq_1314520
  • 2017年07月30日 10:47
  • 342

Map,Filter和Reduce

Map,Filter和Reduce三个函数能为函数式编程提供便利。通过实例一个一个讨论并理解他们。 Map map会将一个函数映射到一个输入列表的所有元素上。这是它的规范: 规范:map...
  • u013362975
  • u013362975
  • 2016年12月07日 15:46
  • 1004

Array数组(JS)之map与reduce方法

map// Define the callback function. function AreaOfCircle(radius) { var area = Math.PI * (radius...
  • gx15366039985
  • gx15366039985
  • 2016年12月21日 21:07
  • 2307

python map(),reduce()函数的使用

map()函数:接收两个参数:一个是函数,一个是序列,map函数将传入的函数一次作用到序列的每个元素,若传入的函数有返回则把结果作为新的序列返回.反之,返回空序列(字符串也是序列)reduce()函数...
  • lym152898
  • lym152898
  • 2016年06月05日 17:48
  • 978

MapReduce中的map与reduce

本文主要介绍MapReduce的map与reduce所包含的各各阶段         MapReduce中的每个map任务可以细分4个阶段:record reader、mapper、comb...
  • baalhuo
  • baalhuo
  • 2016年07月25日 17:45
  • 1004
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从Map和Reduce说起
举报原因:
原因补充:

(最多只允许输入30个字)