什么情况下需要使用“映射和减少”算法?

这个算法有。net实现吗?


当前回答

非常适合mapreduce风格解决方案的一类问题是聚合问题。从数据集中提取数据。在c#中,可以利用LINQ以这种风格进行编程。

摘自以下文章: http://codecube.net/2009/02/mapreduce-in-c-using-linq/

GroupBy方法充当映射,而Select方法则将中间结果缩减为最终结果列表。

var wordOccurrences = words
                .GroupBy(w => w)
                .Select(intermediate => new
                {
                    Word = intermediate.Key,
                    Frequency = intermediate.Sum(w => 1)
                })
                .Where(w => w.Frequency > 10)
                .OrderBy(w => w.Frequency);

对于分布式部分,您可以查看DryadLINQ: http://research.microsoft.com/en-us/projects/dryadlinq/default.aspx

其他回答

非常适合mapreduce风格解决方案的一类问题是聚合问题。从数据集中提取数据。在c#中,可以利用LINQ以这种风格进行编程。

摘自以下文章: http://codecube.net/2009/02/mapreduce-in-c-using-linq/

GroupBy方法充当映射,而Select方法则将中间结果缩减为最终结果列表。

var wordOccurrences = words
                .GroupBy(w => w)
                .Select(intermediate => new
                {
                    Word = intermediate.Key,
                    Frequency = intermediate.Sum(w => 1)
                })
                .Where(w => w.Frequency > 10)
                .OrderBy(w => w.Frequency);

对于分布式部分,您可以查看DryadLINQ: http://research.microsoft.com/en-us/projects/dryadlinq/default.aspx

Linq等价的Map和Reduce: 如果你足够幸运有linq,那么你不需要编写自己的map和reduce函数。c# 3.5和Linq已经有了它,尽管名字不同。

地图是选择: 可列举的。范围(10)。Select(x => x + 2); Reduce是Aggregate: 可列举的。范围(10)。聚合(0,(acc, x) => acc + x); 过滤器的位置: 可列举的。范围(10)。式中(x => x % 2 == 0);

https://www.justinshield.com/2011/06/mapreduce-in-c/

因为我不记得LINQ调用它的位置,选择和聚合,而不是过滤,映射和减少,所以我创建了一些扩展方法,你可以使用:

IEnumerable<string> myStrings = new List<string>() { "1", "2", "3", "4", "5" };
IEnumerable<int> convertedToInts = myStrings.Map(s => int.Parse(s));
IEnumerable<int> filteredInts = convertedToInts.Filter(i => i <= 3); // Keep 1,2,3
int sumOfAllInts = filteredInts.Reduce((sum, i) => sum + i); // Sum up all ints
Assert.Equal(6, sumOfAllInts); // 1+2+3 is 6

以下是3种方法(来自https://github.com/cs-util-com/cscore/blob/master/CsCore/PlainNetClassLib/src/Plugins/CsCore/com/csutil/collections/IEnumerableExtensions.cs):

public static IEnumerable<R> Map<T, R>(this IEnumerable<T> self, Func<T, R> selector) {
    return self.Select(selector);
}

public static T Reduce<T>(this IEnumerable<T> self, Func<T, T, T> func) {
    return self.Aggregate(func);
}

public static IEnumerable<T> Filter<T>(this IEnumerable<T> self, Func<T, bool> predicate) {
    return self.Where(predicate);
}

更多详情见https://github.com/cs-util-com/cscore#ienumerable-extensions: