Как выбрать наилучший N список из пула M списков, чтобы получить максимальное количество уникальных элементов?

#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, что я и сделал изначально. Я редактирую это, как вы и предлагали.