Предполагая, что если ни один набор не является надмножеством всех предоставленных наборов, вы хотите вернуть пустой набор. (Т. Е. Если ни один набор не является надмножеством всех наборов, верните "no thing".)
Итак, ..., вы хотите взять объединение всех наборов, а затем найти первый набор в вашем списке с таким количеством элементов. Это не так сложно, пропуская переформатирование ввода во внутреннюю форму списка ... Mathematica:
topSet[a_List] := Module[{pool, biggest, lenBig, i, lenI},
pool = DeleteDuplicates[Flatten[a]];
biggest = {}; lenBig = 0;
For[i = 1, i <= Length[a], i++,
lenI = Length[a[[i]]];
If[lenI > lenBig, lenBig = lenI; biggest = a[[i]]];
];
If[lenBig == Length[pool], biggest, {}]
]
Например:
topSet[{{1,2,3,4},{4,3},{3,4,1},{4,3,2,1}}]
{1,2,3,4}
topSet[{{4, 3, 2, 1}, {1, 2, 3, 4}, {4, 3}, {3, 4, 1}}]
{4,3,2,1}
topSet[{{1, 2}, {3, 4}}]
{}
Как большой тест:
<<Combinatorica`
Timing[Short[topSet[Table[RandomSubset[Range[10^3]], {10^3}]]]]
{14.64, {}}
То есть, набор из 1000 случайно выбранных подмножеств диапазона [1,1000] был проанализирован за 14,64 секунды (и, что неудивительно, ни один из них не оказался надмножеством всех из них).
- Правка - Экранировал меньше, чем прятал несколько строк реализации. Также ...
Анализ времени выполнения: пусть L будет количеством списков, N будет общим количеством элементов во всех списках (включая дубликаты). Назначение пула принимает O (L) для выравнивания и O (N) для удаления дубликатов. В цикле for все L-назначения для lenI кумулятивно требуют времени O (N), а все L-условия требуют не более O (L) времени. Остальное O (1). Поскольку L
Доказательство правильности: надмножество, если оно существует, (1) содержит себя, (2) содержит любую перестановку себя, (3) содержит каждый элемент, присутствующий в любом (другом) наборе, (4) имеет длину или дольше, чем любой другой набор в коллекции. Последствия: надмножество (если присутствует) является самым длинным набором в коллекции, любой другой набор равной длины является его перестановкой и содержит копию каждого элемента, содержащегося в любом наборе. Следовательно, существует надмножество, если существует множество, равное объединению набора множеств.