Учитывая набор элементов, например:Сформировать сочетание его без генерации/итерации предыдущего
[ 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, поворот начинается с заранее определенной комбинации, а не производительности. Кроме того, генерация перестановок не является каудатической, как вы говорите, но n^m. Проблема в том, что это не размер ** решения **, это размер ** проблемы **. Другими словами, «N» нашей задачи действительно n^m. С этой точки зрения все алгоритмы генерации перестановок действительно O (1) (или очень близки к нему). –
@pqnet Теперь, если вы предложили мне проблему с параметрами 'n' и' m', и в моем решении я сказал «нам нужно сгенерировать эти комбинации/перестановки», то да: ** мой алгоритм ** по отношению к * * эта проблема ** будет 'n^m'. –