【发布时间】:2016-06-11 13:42:39
【问题描述】:
我知道如何计算给定 n 和 k 的 binomial coefficient(我为此使用了一个库)。 现在假设您将所有这些组合存储在一个数组中。每个组合都有一个索引。我实际上不需要将它们存储在数组中,但我需要知道,如果要存储它们,每个组合的数组索引是多少。
例如给定可能组合的 C(n,k) 集合中的一个元素,我需要一个函数,它可以在数组中给出它的索引 i,而实际上并不创建整个数组。编程语言无所谓,虽然我需要在java中实现功能,但是任何(伪)语言算法都可以,然后我将它翻译成java。
例如在n=5和k=2的情况下,我凭经验定义这个函数f(n, k, [a,b]) => N为:
f(5, 2, [1,2]) = 0
f(5, 2, [1,3]) = 1
f(5, 2, [1,4]) = 2
f(5, 2, [1,5]) = 3
f(5, 2, [2,3]) = 4
f(5, 2, [2,4]) = 5
f(5, 2, [2,5]) = 6
f(5, 2, [3,4]) = 7
f(5, 2, [3,5]) = 8
f(5, 2, [4,5]) = 9
表示 (3,5) 组合将占用数组中的索引 8。另一个 n=5 和 k=3 的例子是f(n, k, [a,b,c]) => N,根据经验定义为
f(5, 3, [1,2,3]) = 0
f(5, 3, [1,2,4]) = 1
f(5, 3, [1,2,5]) = 2
f(5, 3, [1,3,4]) = 3
f(5, 3, [1,3,5]) = 4
f(5, 3, [1,4,5]) = 5
f(5, 3, [2,3,4]) = 6
f(5, 3, [2,3,5]) = 7
f(5, 3, [2,4,5]) = 8
f(5, 3, [3,4,5]) = 9
在 cmets 之后进行澄清:
在上面的例子中,[1,2,3]、[2,4,5] 等是 C(n,k) 集合的元素之一,例如n 个可能数中 k 个数的可能组合之一。该函数需要它们来计算它们在数组中的索引。
但是,我需要为 n 和 k 的通用值编写此函数,而无需创建数组。也许这样的函数已经存在于一些组合微积分库中,但我什至不知道它会被如何调用。
【问题讨论】:
-
提示:数组元素个数为
(n*(n-1)) /2 -
@wildplasser 不,恐怕不是。数组中元素的数量是 n 和 k 的二项式系数,例如n!/(k!(n-k)!)
-
你说的是数组的内容。我说的是数组的 size (:= 元素数),在你的情况下 (5*4/2) 是 10。
-
不,我也在谈论数组大小。 5*2 也是 10,但这并不意味着正确的函数是 n*k。
-
Hint2:索引是元素之前的数量。 (假设基数为零索引)