Поиск перекрывающихся данных в массивах
мы пишем приложение на 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 установить проблему покрытия. Даже с тысячами массивов, однако, есть хороший шанс, что, если вы примените смешанный целочисленный программный решатель к формулировке в связанной статье Википедии, он сможет найти оптимальное решение.