从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 hadoop 实例

  • 2016年06月20日 15:08
  • 11KB
  • 下载

Python函数式编程(高阶函数、map()、reduce()、filter()、sorted()、lambda、decorator装饰器)

1.函数式概念函数式: functional 一种编程范式。 函数式编程的特点: 1.把计算视为函数而非指令 2.春函数式编程:不需要变量,没有变量,测试简单 3.支持高阶函数,代码简洁 Python...

Map-Reduce体系架构

  • 2014年04月16日 00:33
  • 1.26MB
  • 下载

常用数组Array方法: indexOf、filter、forEach、map、reduce使用实例

ECMAScript5标准发布于2009年12月3日,它带来了一些新的,改善现有的Array数组操作的方法。然而,这些新奇的数组方法并没有真正流行起来的,因为当时市场上缺乏支持ES5的浏览器。 Ar...

Map/Reduce

  • 2013年11月27日 17:23
  • 2.46MB
  • 下载

MapReduce中job参数及设置map和reduce的个数

map的个数 在map阶段读取数据前,FileInputFormat会将输入文件分割成split。split的个数决定了 map的个数。 影响map个数,即split个数的因素主要有: ...

3提取KPI数据(Map-Reduce).part2

  • 2014年11月25日 23:30
  • 50.57MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从Map和Reduce说起
举报原因:
原因补充:

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