【发布时间】:2013-04-01 18:38:53
【问题描述】:
假设我有一个排序数组,N,由 n 个元素组成。现在,给定 k,我需要一种高效的方法来生成中间组合的 k 组合(如果所有 k 组合都按字典顺序排序)。
例子:
N = {a,b,c,d,e} , k = 3
1:a,b,c
2:a,b,d
3:a,b,e
4:a,c,d
5:a,c,e
6:a,d,e
7:b,c,d
8:b,c,e
9:b,d,e
10:c,d,e
我需要生成组合数 5 的算法。
组合数系统上的维基百科页面解释了如何获得它(以一种贪婪的方式)。然而,由于 n 非常大,我需要找到所有 k 小于 n 的中间组合,我需要更多的东西比这更有效率。
我希望由于兴趣组合始终位于中间,因此有某种直接的方法可以找到它。例如,上面列表中的第一个 k 组合总是由 N 中的前 k 个元素给出,同样最后一个组合总是由最后一个 k 个元素。有没有这样的方法也能找到中间的组合?
【问题讨论】:
-
n 和 k 可以有多大?
-
n 大约为 10^5,但我需要遍历所有小于 n 的 k。因此,当 k=n/2 时,可能的组合数量会非常大。
-
因此,50,000 选择 25,000 会产生一个大约 15,050 位数长的数字。见ohrt.com/odds/binomial.php。您可能会尝试做的是预先计算您正在寻找的值直到某个点,然后想出一个函数来估计它们以获得更大的值。你仍然可以使用我的课程来做一些事情。但是,我怀疑您应该做的是重新考虑问题并将其分解,以便更容易解决。
标签: combinations median