#组合数学 #数据结构

set-partitions

表示和枚举集合划分

1 个稳定版本

1.0.1 2022 年 1 月 23 日

#1083数学

MIT/Apache

100KB
1.5K SLoC

set-partitions

crate documentation

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 个划分),使用 SmallSetPartitionGenSetPartition。对于中等大小的可变大小集合划分,使用 ArrayVecSetPartition。对于任意大小的集合划分,使用 VecSetPartition

如果您不关心获取子集内容,请传递()或省略类型参数。否则,使用SmallSubsetsGenSmallSubsets,通过ArrayVecs表示子集,无需内存分配,用于大小为16或更小的集合划分。对于其他数据结构中的子集,您可以使用ArrayVecSubsetsVecSubsetsHashSubsetsBTreeSubsets

要枚举集合划分,调用increment()直到它返回false,并使用get()num_subsets()subsets().subsets()来检查集合划分。

依赖项

~220KB