假设我有一个排序数组,N,包含n元素。现在,由于k,我需要一个高效的方法来生成中间组合的k-组合(如果所有的组合都按字典顺序排序)。查找n个排序元素的中间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中的第一个元素给出,并且类似地最后的组合总是由最后的元素给出。有没有这种方式来找到中间组合?
http://en.wikipedia.org/wiki/Combinatorial_number_system
n和k有多大? –
n的数量级为10^5,但是我需要遍历所有小于n的k。所以当k = n/2时,可能的连击数量会非常大。 – sasan
因此,50,000选择25,000产生一个大约15,050位数字的数字。见http://www.ohrt.com/odds/binomial.php。你可能试着做的是预先计算你正在寻找的值到某个点,然后想出一个函数来估计它们的值。你仍然可以使用我的课程中的一些。但是,我怀疑你应该做的就是重新思考问题并将其分解,以便更容易解决。 –