给定一组的项目,例如:生成第k个组合,而不会产生/迭代以前
[ 1, 2, 3, 4, 5, 6 ]
我想产生一定长度与重复所有可能的组合。扭曲是我想从一个预定的组合开始(一种偏移到组合列表中)。
例如,从这样的:
[ 1, 5, 6 ]
第一(下)组合是:
[ 1, 6, 6 ]
我不得不使用itertools.combinations_with_replacement()
生成组合的成功,但是这个项目需要使用一套产生太多组合的集合 - 首先创建它们并且迭代到正确的点是不可能的。
我发现this example for generating kth combination这似乎没有工作对我非常好。 This answer似乎是另一种可能性,但我似乎无法将它从C移植到Python。
这里是我到目前为止的代码使用kth combination example:
import operator as op
items = [ 1,2,3,4,5,6 ]
# https://stackoverflow.com/a/4941932/1167783
def nCr(n, r):
r = min(r, n-r)
if r == 0:
return 1
numer = reduce(op.mul, xrange(n, n-r, -1))
denom = reduce(op.mul, xrange(1, r+1))
return numer // denom
# https://stackoverflow.com/a/1776884/1167783
def kthCombination(k, l, r):
if r == 0:
return []
elif len(l) == r:
return l
else:
i = nCr(len(l)-1, r-1)
if k < i:
return l[0:1] + kthCombination(k, l[1:], r-1)
else:
return kthCombination(k-i, l[1:], r)
# get 1st combination of 3 values from list 'items'
print kthCombination(1, items, 3)
# returns [ 1, 2, 4 ]
任何帮助将是巨大的!
? – pqnet
@pqnet根据OP,扭曲开始于一个预定的组合,而不是性能。此外,如你所说,排列的生成不是cuadratic,但n^m。问题是,这不是**解决方案**的大小,这是**问题**的大小。换句话说,我们问题的“N”实际上是n^m。从这个角度来看,所有置换生成算法都是O(1)(或者非常接近它)。 –
@pqnet现在,如果你提出了一个参数'n'和'm'的问题,并且在我的解决方案中我说过“我们需要生成这些组合/排列”,那么是:**我的算法**与* *那个问题**会是'n^m'。 –