Поиск перекрывающихся данных в массивах

мы пишем приложение на C#, которое поможет удалить ненужные ретрансляторы данных. Ретранслятор может быть удален только в том случае, если все полученные данные будут получены другие репитеры. Что нам нужно в качестве первого шага объясняется ниже:

У меня есть коллекция массивов int, например

a. {1, 2, 3, 4, 5}

b. {2, 4, 6, 7}

c. {1, 3, 5, 8, 11, 100}

Это может быть тысячи таких массивов. Мне нужно найти массивы, которые можно удалить. Массив может быть удален только в том случае, если все его номера включены в другие массивы. В приведенном выше примере, массив a может быть удален, потому что его номера 2 и 4 находятся в массиве b а цифры 1, 3, 5 находятся в массиве c.

какой лучший способ сделать такую операцию?

2 ответов


Это не оптимизированное решение для минимального количества оставшихся массивов.

сделайте словарь изобилия для члена массивов. например:

1 => 2
2 => 2
3 => 2
4 => 2
5 => 2
6 => 1
7 => 1
...

проверьте каждый из массивов, и если обилие всех членов больше 1, Удалите массив и уменьшите количество каждого числа в словаре.


получение минимального количества оставшихся массивов (в отличие от подмножества массивов, где больше массивов не может быть удалено) является NP-hard установить проблему покрытия. Даже с тысячами массивов, однако, есть хороший шанс, что, если вы примените смешанный целочисленный программный решатель к формулировке в связанной статье Википедии, он сможет найти оптимальное решение.