在cs.stackexchange上,我询问了github上的algebird scala库,推测他们为什么可能需要抽象的代数包。
github页面有一些线索:
Monoid的实现用于有趣的近似算法,例如Bloom过滤器,HyperLogLog和CountMinSketch。这些使您可以像想数字一样思考这些复杂的操作,然后将它们加到hadoop或在线中以生成强大的统计信息和分析数据。
并在GitHub页面的另一部分中:
它最初是作为Scalding的Matrix API的一部分开发的,其中矩阵的值是Monoids,Groups或Rings的元素。随后,很明显,该代码在Scalding和Twitter的其他项目中具有更广泛的应用。
甚至Twitter的Oskar Boykin也赞叹道:
主要的答案是,通过利用半群结构,我们可以构建可以正确并行化的系统,而无需了解底层操作(用户有望实现关联性)。
通过使用Monoid,我们可以利用稀疏性(我们处理许多稀疏矩阵,其中在某些Monoid中几乎所有值都是零)。
通过使用Rings,我们可以对数字以外的东西进行矩阵乘法(有时我们做过)。
algebird项目本身(以及发行历史)非常清楚地解释了这里发生的事情:我们正在构建许多用于聚合大型数据集的算法,并且利用操作的结构使我们在系统方面取得了成功(这通常是尝试在1000个节点上生产算法时的痛点)。
为任何Semigroup / Monoid / Group / Ring解决一次系统问题,然后您可以插入任何算法,而无需考虑Memcache,Hadoop,Storm等。
怎么样Bloom filters
/ hyperloglog
/ countminsketch
同样的数字?
数据库聚合如何具有单调结构?
这个半身像是什么样的?他们曾经有过小组组织吗?
参考文献会有所帮助。