#python-3.x #algorithm #data-structures #dynamic-programming #permutation
#python-3.x #алгоритм #структуры данных #динамическое программирование #перестановка
Вопрос:
Например, у меня есть 7 списков, как показано ниже. Эти списки могут иметь длину l>0. `
L1 = [1,2,3,4]
L2 = [1,2,3,4,5]
L3 = [6,7]
L4 = [1,6,8,9]
L5 = [1,2,3,4,5,6,10]
L6 = [1,2,3,4]
L7 = [10,11,12,13]
Я хочу выбрать наилучшую комбинацию из 4 списков из этого пула вышеупомянутых 7 списков (L1, L2, …, L7), чтобы получить наибольшее количество уникальных элементов.
Вывод: L2, L3, L4, L7 —> Поскольку он имеет 13 уникальных значений.
Есть идеи о том, как действовать дальше? Кроме того, есть какой-нибудь разумный способ решить эту проблему?
Комментарии:
1. Вы знакомы с
set
операциями Python? Вы могли бы попробовать сначала. Если вы все еще застряли — тогда, пожалуйста, опубликуйте свой код / вопрос, тогда люди смогут вам помочь.2. Каковы ограничения на количество списков и длину в каждом списке?
3. @AbhinavMathur, давайте считать, что у нас 10 000 списков, и каждый список может содержать не более 20 элементов. Я опубликовал решение. У вас есть какой-либо другой подход?
4. @Priyanka есть ли какие-либо ограничения на диапазон значений в списке?
Ответ №1:
@DanielHao, спасибо, что дал мне подсказку! Я попытался реализовать, и решение выглядит так, как показано ниже. Однако я не уверен, является ли это оптимизированным способом или нет.
`
# Choosing combinations of 4 Lists from existing 7.
# Calculating union of those 4 chosen set to calculate unique elements.
# Save the highest length.
from itertools import combinations
comb = combinations([L1, L2, L3, L4, L5, L6, L7], 4)
temp_best_score = 0
temp_best_comb = None
for i in list(comb):
temp_val = set()
for j in range(len(i)):
temp_val = temp_val|set(i[j])
current_score = len(temp_val)
if(current_score > temp_best_score):
temp_best_score = current_score
temp_best_comb = i
best_score = temp_best_score
best_comb = temp_best_comb
`
- Вывод:
best_comb: ([1, 2, 3, 4, 5], [6, 7], [1, 6, 8, 9], [10, 11, 12, 13])
лучший результат: 13
Комментарии:
1. Хорошая работа. Вы очень близки — добились большого прогресса, изучив эти
set()
операции. Но, похоже, все еще есть некоторые синтаксические ошибки: например. эта строка должна быть: для j в диапазоне (len (i)): tmp_val =tmp_val | set(i[j])
2. @DanielHao Большое вам спасибо за вклад! Нет смысла преобразовывать весь список в Set, что я и сделал изначально. Я редактирую это, как вы и предлагали.