【发布时间】:2013-01-28 09:10:54
【问题描述】:
我正在处理覆盖数组,需要一些关于生成集(给定某些参数)的指导,以计算数组是否为覆盖数组。
我得到了两个输入来解析 - t 和 v 作为整数。 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=2 和v=3 的以下输出:
00
01
02
10
11
12
20
21
22
我最大的问题是——这是排列问题还是组合问题?我对两者之间的细节有点模糊。我相信这是排列,因为重复发生了,因为顺序并不重要。
同样,这个算法是否足够好(可能)处理一个大的v?我得到的参数是 t 将是 2 或 3,但 v 是未知的。是否有一种众所周知的算法来计算长度 - t 设置在 v 符号上?作为参考,我正在使用 C++ 来执行此操作。
【问题讨论】:
-
随着
v的增加,计数的摊销成本会下降,因为您花费了较小比例的时间来传播进位。 -
@bgoers:在您的示例中,{01} 和 {10} 是不同的,因此它不仅仅是组合问题 - 组合的可能排列。
-
@OliCharlesworth 感谢您的意见。所以假设(在这种情况下我可以安全地由于限制)v
标签: c++ algorithm permutation combinations combinatorics