На cs.stackexchange я спросил о scala-библиотеке algebird на github, размышляя о том, почему им может понадобиться пакет абстрактной алгебры.
Страница GitHub имеет несколько подсказок:
Реализации Monoids для интересных алгоритмов аппроксимации, таких как фильтр Блума, HyperLogLog и CountMinSketch. Они позволяют вам думать об этих изощренных операциях, как о числах, которые вы можете, и складывать их в hadoop или онлайн для получения мощной статистики и аналитики.
и в другой части страницы GitHub:
Первоначально он был разработан как часть Scalding's Matrix API, где у Matrices были значения, которые являются элементами Monoids, Groups или Rings. Впоследствии стало ясно, что код имеет более широкое применение в Scalding и других проектах в Twitter.
Даже Оскар Бойкин из Твиттера вмешался:
Основной ответ заключается в том, что, используя структуру полугруппы, мы можем создавать системы, которые правильно распараллеливаются, не зная основной операции (пользователь обещает ассоциативность).
Используя моноиды, мы можем воспользоваться разреженностью (мы имеем дело с множеством разреженных матриц, где почти все значения равны нулю в некотором моноиде).
Используя Кольца, мы можем делать умножение матриц на другие вещи, кроме чисел (что мы иногда и делали).
Сам проект algebird (а также история проблем) довольно четко объясняет, что здесь происходит: мы строим множество алгоритмов для агрегации больших наборов данных, а использование структуры операций дает нам выигрыш в системной части. (что обычно является основной проблемой при попытке реализовать алгоритмы на тысячах узлов).
Решите системные проблемы один раз для любой полугруппы / моноида / группы / кольца, и тогда вы сможете подключить любой алгоритм, не думая о Memcache, Hadoop, Storm и т. Д.
Как Bloom filters
/ hyperloglog
/ countminsketch
как числа?
Почему агрегаты баз данных имеют моноидальную структуру?
Как выглядит этот моноид? У них когда-нибудь есть групповая структура?
Литературные ссылки будут полезны.