#python-3.x #list
#python-3.x #Список
Вопрос:
У меня есть список целочисленных элементов, я хочу сгенерировать все подпоследовательности списка, я попробовал этот код —
def sequences(arr, n):
sheet = []
opsize = (2**n)
for counter in range( 1, (int)(opsize)) :
t = []
for j in range(0, n) :
if (counter amp; (1<<j)):
t.append(arr[j])
sheet.append(t)
return sheet
Если входной список — [1,2,2]
Вывод — [ [1], [2], [1, 2], [2], [1, 2], [2, 2], [1, 2, 2] ]
Но для любого высокого значения n требуется много времени. Кто-нибудь может предложить мне какой-либо другой подход, чтобы минимизировать его сложность.
Спасибо.
Комментарии:
1. Посмотрите на
itertools.combinations
.2. Он возвращает подпоследовательности элементов фиксированной длины из входного iterable. Но мне нужен весь размер подпоследовательностей.
3. Поэтому просто перебирайте
range(1, len(sequence) 1)
и вызывайтеcombinations
для каждой длины.4. Здесь я также беспокоюсь о временной сложности, поэтому, пожалуйста, дайте подход, который минимизирует временную сложность.
5. Это настолько мало, насколько это возможно; генерация всех возможных подмножеств по своей сути является
2^n
операцией. Использованиеitertools
для генерации объектов, по крайней мере, позволит вам делать это лениво, вместо того, чтобы хранить все в памяти, что может помочь с реальной скоростью.