我正在寻找一种数据结构,大致对应于(在Java术语中)
Map<Set<int>, double>
。本质上是一组带标签的弹珠集合,其中每个弹珠集合都与一个标量相关联。我希望它能够有效地处理以下操作:
- 将给定整数添加到每个集合中。
- 删除包含(或不包含)给定整数的每个集合,或者至少将关联的double设置为0。
- 合并两个映射,对于同时出现的集合,将它们的double相加。
- 将所有double乘以给定的double。
- 很少遍历整个映射。
在以下条件下:
- 整数将落在受限范围内(大约在1到10,000之间),确切的范围将在编译时知道。
- 范围内的大多数整数(80-90%)永远不会使用,但哪些整数将不容易确定,直到计算结束。
- 使用的整数数量几乎总是超过100。
- 许多集合非常相似,仅由少数元素不同。
- 可能可以识别经常按顺序出现的某些整数组:例如,如果一个集合包含整数27和29,则它(几乎?)肯定也包含28。
- 可能可以在运行计算之前识别这些组。
- 这些组通常会有大约100个整数。
我考虑过tries,但我没有看到处理“删除包含给定整数的每个集合”操作的好方法。
这种数据结构的目的是表示离散随机变量并允许对它们进行加法,乘法和标量乘法操作。每个这些离散随机变量最终都是通过将这些操作应用于一组独立伯努利随机变量(即每个随机变量以某些概率取值1或0)而创建的(在编译时)固定集合。
被建模的系统与时间不齐的马尔可夫链非常接近(这当然会极大地简化此过程),但不幸的是,跟踪各种转换的持续时间是至关重要的。
Map<Set<int>, double>
,你可能想考虑只是继承Set<int>
并添加一个Weight
字段。 - Andy Jones