生成组合/排列(v 符号上的 t 集)

Posted

技术标签:

【中文标题】生成组合/排列(v 符号上的 t 集)【英文标题】:Generating Combinations/Permutations (t-sets on v symbols) 【发布时间】:2013-01-28 09:10:54 【问题描述】:

我正在处理覆盖数组,需要一些关于生成集(给定某些参数)的指导,以计算数组是否为覆盖数组。

我得到了两个输入来解析 - tv 作为整数。 v 包含数组中唯一符号(整数)的数量。可以假定这是一组任何整数。整数t 代表我想从这个集合中抓取符号的长度。

例如,假设v = 3 代表0,1,2 作为符号,而t = 2。然后我将生成组合 (0,0), (0,1), (0,2), (1,0), (1,1), (1,2), ..., (2,2) 。一般来说,我将生成v^t 组合。我想知道是否有比我一直使用的算法更好的算法,它的计算成本可能更低。

基本上我所做的是在不同的基础上进行计数。因此,例如,在上面的示例中,我最初从一个数组开始,该数组将 t 空间分配为 0。在每次传递时,我递增最低有效位并将其转换为一个集合或其他一些数据结构来保存我的组合.一旦最低有效位溢出,我将其设置为 0 并递增下一个有效位。这一切都在不同的基础上计算。所以我最终会得到t=2v=3 的以下输出:

00
01
02
10
11
12
20
21
22

我最大的问题是——这是排列问题还是组合问题?我对两者之间的细节有点模糊。我相信这是排列,因为重复发生了,因为顺序并不重要。

同样,这个算法是否足够好(可能)处理一个大的v?我得到的参数是 t 将是 2 或 3,但 v 是未知的。是否有一种众所周知的算法来计算长度 - t 设置在 v 符号上?作为参考,我正在使用 C++ 来执行此操作。

【问题讨论】:

随着v 的增加,计数的摊销成本会下降,因为您花费了较小比例的时间来传播进位。 @bgoers:在您的示例中,01 和 10 是不同的,因此它不仅仅是组合问题 - 组合的可能排列。 @OliCharlesworth 感谢您的意见。所以假设(在这种情况下我可以安全地由于限制)v 【参考方案1】:

您正在处理variations with repetitions。在 SO 和整个 Internet 上都有很多示例。至于你的算法,它的复杂性至少是输出的大小——你已经指出了——它将是 Ω(v^t)。如果按位运算对您有用(即适合其余的实现),那么可以,您可以这样做。

【讨论】:

太棒了!谢谢(你的)信息。我一直在寻找这类问题的具体名称,只是没有具体确定。

以上是关于生成组合/排列(v 符号上的 t 集)的主要内容,如果未能解决你的问题,请参考以下文章

数组排列组合(多用与属性组合)

基于补集最大值思想的排列组合

排列 组合

排列组合

(转)C#全排列组合算法

排列组合的数学公式