Хотя этот вопрос сформулирован с использованием языка программирования Python, я считаю, что это скорее проблема программирования.Обрезать список комбинаций на основе наборов
У меня есть список всех возможных комбинаций, а именно: п выбрать K
Я могу подготовить такой список, используя
import itertools
bits_list = list(itertools.combinations(range(n), k))
Если «п» 100 и 'к»5, то длина «bits_list» будет равна 75287520.
Теперь я хочу обрезать этот список, чтобы числа отображались в группах, или нет. Давайте использовать следующие наборы в качестве примера:
Set 1: [0, 1, 2]
набор 2: [57, 58]
Набор 3: [10, 15, 20, 25]
Набор 4: [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
Здесь каждый набор должен отображаться в любом члене списка бит или вместе.
До сих пор я только мог думать о методе грубой силы if-else для решения этой проблемы, но число условий if-else будет очень большим.
Вот что у меня есть:
bits_list = [x for x in list(itertools.combinations(range(n), k))
if all(y in x for y in [0, 1, 2]) or
all(y not in x for y in [0, 1, 2])]
Теперь это охватывает только набор 1. Я хотел бы сделать это для многих наборов. Если длина набора больше, чем значение k, мы можем игнорировать множество (например, k = 5 и Set 4).
Обратите внимание, что конечная цель состоит в том, чтобы «k» перебирать диапазон, скажем [5:25] и работать над добавленным списком. Размер списка растет экспоненциально здесь, и вычислительно говоря, очень дорого!
С «k» как 10 интерпретатор python прерывает процесс до завершения на любом среднем ноутбуке с 16 ГБ ОЗУ. Мне нужно найти решение, которое подходит для памяти относительно современного сервера (а не кластера или фермы серверов).
Любая помощь с благодарностью!
P.S .: Интуитивно подумайте об этой проблеме как о создании всех возможных случаев для людей, посещающих общественный автобус или систему поездов. Обычно вы садитесь на целую группу, или вы никого не посещаете.
ОБНОВЛЕНИЕ:
Для заданных наборов выше, если к = 5, то действительный член bits_list будет [0, 1, 2, 57, 58], а именно: сочетание из Set1 и Set2. Если k = 10, то мы могли бы построить Set1 + Set2 + Set3 + NoSetElement в качестве возможного члена. @ Решение DonkeyKong заставило меня понять, что я не упомянул об этом в моем вопросе.
У меня много комплектов; Я намерен использовать достаточное количество наборов, чтобы обрезать полный список комбинаций таким образом, чтобы бит_list в конечном итоге вписывался в память.
Предложение 9000 здесь совершенно справедливо, что во время каждой итерации я могу сохранить комбинации как фактические биты.
Эта проблема, вероятно, более подходит для обмена столами в компьютерной науке – Brian
Вы проводник, сидящий на поездах в поезде, или вы - человек, который стоит на транспорте? – Back2Basics
Итак, вам определенно нужен фактический список в памяти с этим множеством предметов? Потому что именно это становится вашим узким местом. – miradulo