有没有有效的方法来合并具有交集的集合。例如:
l = [{1, 3}, {2, 3}, {4, 5}, {6, 5}, {7, 5}, {8, 9}]
预期结果是:
r = [{1, 2, 3}, {4, 5, 6, 7}, {8, 9}]
所有具有交集(公共分量)的集合都应合并。例如:
{1, 3} & {2, 3}
# {3}
因此,这两个集合应该合并:
{1, 3} | {2, 3}
# {1, 2, 3}
不幸的是我没有任何有效的解决方案。
更新:结果集的顺序并不重要。
@
mkrieger1在注释中提到的一种实现连接组件算法的有效方法是将集合列表转换为一组可散列的冻结集,以便在迭代时找到与当前集合相交的冻结集。从池中删除它:
pool = set(map(frozenset, l))
groups = []
while pool:
groups.append(set(pool.pop()))
while True:
for candidate in pool:
if groups[-1] & candidate:
groups[-1] |= candidate
pool.remove(candidate)
break
else:
break
鉴于l = [{1, 3}, {2, 3}, {4, 5}, {6, 5}, {7, 5}, {8, 9}]
,groups
将变为:
[{1, 2, 3}, {4, 5, 6, 7}, {8, 9}]
鉴于l = [{1, 2}, {3, 4}, {2, 3}]
,groups
将变为:
[{1, 2, 3, 4}]
鉴于l = [{1}, {2}, {1, 2}]
,groups
将变为:
[{1, 2}]
sinter key1 key2...keyN 返回所有给定key的交集 sinterstore dstkey key1...keyN 同sinter,但是会同时将交集存到dstkey下
问题内容: 说,有两个哈希集,如何计算它们的交集? 问题答案: 使用以下方法: 如果要保留集合,请创建一个新集合以保存交集: 该的的说,这正是你想要的: 仅保留此集合中包含在指定集合中的元素(可选操作)。换句话说,从该集合中删除所有未包含在指定集合中的元素。如果指定的集合也是一个集合,则此操作将有效地修改此集合,以使其值为两个集合的交集。
sunion key1 key2...keyN 返回所有给定key的并集 sunionstore dstkey key1...keyN 同sunion,并同时保存并集到dstkey下
我想有效地计算一个n位数字(在我的例子中,n=36)的所有组合,并且设置了精确的k位。
问题内容: 我有一个通用名称,正在尝试找出如何对其中包含的项目进行排序。我已经尝试了一些方法,但是我无法使它们正常工作。 问题答案: 集合本身没有预定义的顺序,因此您必须将它们转换为。然后您可以使用一种形式的
我有一个ArrayList<code>data</code>,其中包含<code>Person</code>类型的Objects,它每n秒更新一次,并具有现有数据的总量。为了在表中显示这些数据,我使用<code>clear()</code>一个ObservableList,并使用<code>addAll(data)</ccode>来避免GUI阻塞。 我想使用HashSet作为Observable