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