众所周知,幺半群在编程中无处不在。它们无处不在,非常有用,以至于我作为一个“爱好项目”,正在开发一个完全基于它们的属性(分布式数据聚合)的系统。为了使系统有用,我需要有用的幺半群:)
我已经知道这些:
- 数值或矩阵求和
- 数值或矩阵乘积
- 具有顶部或底部元素的总订单下的最小值或最大值(更一般地,在有界格中加入或相遇,或者更一般地,产品或副产品在一个类别中)
- 设置联合
- 使用 monoid 连接冲突值的映射联合
- 有限集的子集的交集(或者如果我们谈论半群,则只是集的交集)
- 地图与有界关键域的交集(此处相同)
- 排序序列的合并,可能在不同的幺半群/半群中加入键相等的值
- 排序列表的有界合并(同上,但我们取结果的前 N 个)
- 两个幺半群或半群的笛卡尔积
- 列表连接
- 内同构组合。
现在,让我们将操作的准属性定义为符合等价关系的属性。例如,如果我们认为等长的列表或具有相同内容直到置换的列表是等价的,则列表连接是准交换的。
下面是一些准幺半群和准交换幺半群和半群:
- 任意(a+b = a 或 b,如果我们认为载体集合的所有元素都是等价的)
- 任何令人满意的谓词(a+b = a 和 b 中的一个非空且满足某个谓词 P,如果没有满足则为空;如果我们认为所有满足 P 的元素等价)
- 随机样本的有界混合(xs+ys = xs 和 ys 串联的大小为 N 的随机样本;如果我们认为与整个数据集具有相同分布的任意两个样本是等价的)
- 加权随机样本的有界混合
- 让我们称之为“拓扑合并”:给定两个非循环且不矛盾的依赖关系图,一个包含两者中指定的所有依赖关系的图。例如,列表“连接”可能会产生任何排列,其中每个列表的元素按顺序排列(例如,123+456=142356)。
还有哪些其他存在?