У меня есть набор уникальных множеств (представленных в виде бит-масок) и хотел бы удалить все элементы, которые являются правильными подмножествами другого элемента. Например:
input = [{1, 2, 3}, {1, 2}, {2, 3}, {2, 4}, {}]
output = [{1, 2, 3}, {2, 4}]
Я не смог найти стандартный алгоритм для этого или даже имя для этой проблемы, поэтому я называю это "максимальными подмножествами" из-за отсутствия чего-либо еще. Вот алгоритм O (n ^ 2) (в Python для конкретности), предполагая, что is_subset_func
есть O (1): 1
def eliminate_subsets(a, cardinality_func, is_subset_func):
out = []
for element in sorted(a, reverse=True, key=cardinality_func):
for existing in out:
if is_subset_func(element, existing):
break
else:
out.append(element)
return out
Есть ли более эффективный алгоритм, надеюсь, O (n log n) или лучше?
1 Для бит-масок постоянного размера, как и в моем случае, is_subset_func
- это просто element & existing == element
, который выполняется в постоянное время.