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

时间:2013-02-12 22:32:21

标签: c++ algorithm permutation combinations combinatorics

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

我有两个输入要解析 - 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 ++来做到这一点。

1 个答案:

答案 0 :(得分:2)

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