Những kịch bản nào sẽ đảm bảo việc sử dụng thuật toán " Bản đồ và thu nhỏ "?
Có một triển khai .NET của thuật toán này?
Những kịch bản nào sẽ đảm bảo việc sử dụng thuật toán " Bản đồ và thu nhỏ "?
Có một triển khai .NET của thuật toán này?
Câu trả lời:
Linq tương đương với Bản đồ và Thu nhỏ: Nếu bạn đủ may mắn để có linq thì bạn không cần phải viết bản đồ của riêng mình và giảm các chức năng. C # 3.5 và Linq đã có nó mặc dù dưới các tên khác nhau.
Bản đồ là Select
:
Enumerable.Range(1, 10).Select(x => x + 2);
Giảm là Aggregate
:
Enumerable.Range(1, 10).Aggregate(0, (acc, x) => acc + x);
Bộ lọc là Where
:
Enumerable.Range(1, 10).Where(x => x % 2 == 0);
Reduce
thay vì Aggregate
... MS chỉ thích làm phiền các lập trình viên
Các lớp vấn đề rất phù hợp cho giải pháp kiểu mapreduce là các vấn đề tổng hợp. Trích xuất dữ liệu từ một tập dữ liệu. Trong C #, người ta có thể tận dụng LINQ để lập trình theo phong cách này.
Từ bài viết sau: http://codecube.net/2009/02/mapreduce-in-c-USE-linq/
phương thức GroupBy đóng vai trò là bản đồ, trong khi phương thức Chọn thực hiện công việc giảm kết quả trung gian vào danh sách kết quả cuối cùng.
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);
Đối với phần được phân phối, bạn có thể kiểm tra DryadLINEQ: http://research.microsoft.com/en-us/projects/dryadlinq/default.aspx
Vì tôi không bao giờ có thể nhớ rằng LINQ gọi nó Where
, Select
và Aggregate
thay vì Filter
, Map
và Reduce
vì vậy tôi đã tạo ra một vài phương thức mở rộng mà bạn có thể sử dụng:
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
Dưới đây là 3 phương thức (từ 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);
}
Một số chi tiết khác từ https://github.com/cs-util-com/cscore#ienumerable-extensions :