1 个稳定版本
1.0.1 | 2022 年 1 月 23 日 |
---|
#1083 在 数学 中
100KB
1.5K SLoC
set-partitions
set-partitions 是一个 crate,允许表示和枚举集合的划分。
划分表示为包含限制增长序列的切片,按字典序枚举,使用 Donald Knuth 在《计算机程序设计艺术》卷 3b,第 27 页提出的算法。
lib.rs
:
set-partition crate 提供了表示、枚举和计算给定有限大小集合的所有可能划分的方法。
您可以使用 set_partitions
函数获取具有 n
个元素的集合的划分数量,并可以使用 SetPartition
结构和它的 increment()
函数来枚举它们(以及它的更通用的变体)。
集合划分表示为值的序列,每个划分集合的元素对应一个值,如果两个元素在同一个子集中,则序列将在相应的索引处具有相同的值。
在所有可能的序列中,选择字典序最小,且使用从 Default::default()
开始并使用 increment()
增量的序列作为代表。
有关更多信息和使用此处算法的描述,请参阅 http://www-cs-faculty.stanford.edu/~uno/fasc3b.ps.gz 第 27 页。
如何使用
对于固定大小的集合划分,使用 SetPartition
;如果您想使用除了 u8
之外的数据类型,请使用 GenSetPartition
。对于 16 个元素以下的可变大小集合划分(超过 16 个元素会产生超过 2^32 个划分),使用 SmallSetPartition
或 GenSetPartition
。对于中等大小的可变大小集合划分,使用 ArrayVecSetPartition
。对于任意大小的集合划分,使用 VecSetPartition
。
如果您不关心获取子集内容,请传递()
或省略类型参数。否则,使用SmallSubsets
或GenSmallSubsets
,通过ArrayVecs表示子集,无需内存分配,用于大小为16或更小的集合划分。对于其他数据结构中的子集,您可以使用ArrayVecSubsets
、VecSubsets
、HashSubsets
或BTreeSubsets
。
要枚举集合划分,调用increment()
直到它返回false
,并使用get()
、num_subsets()
或subsets().subsets()
来检查集合划分。
依赖项
~220KB