假设我有以下集合:
X -> {1, 2, 3}
Y -> {1, 4, 7}
Z -> {1, 4, 5}
我正在寻找产生许多集合的交叉点的组合,其中每个元素都是独一无二的。(实际上是一组哈希,其中每个元素都引用回它相交的集合):
A -> {2, 3}: {X}
B -> {7}: {Y}
C -> {5}: {Z}
D -> {4}: {Y, Z}
E -> {1}: {X, Y, Z}
将问题归结为,必须满足以下条件:
蛮力方法是以相反的顺序循环初始集的幂集,与每个集相交,然后找到这个结果集与所有其他测试的交集的差异:
resulting_sets = {}
for sets in powerset(S):
s = intersection(sets)
for rs in resulting_sets.keys():
s -= rs
if not s.empty():
resulting_sets[s] = sets # realistically some kind of reference to sets
当然,在集合操作的
O(n^2log(n))
O(2^n*2^(n/2))时,上述效率相当低(就我而言,它可能已经运行了n^2次)。对于这种类型的问题,有更好的解决方案吗?
更新:不迭代任何集合,仅使用集合运算
该算法正在建设性地构建结果集,即每次看到新的源集时,我们都会修改现有的唯一元素集和/或添加新的元素集。
这个想法是,每个新集合都可以分为两部分,一部分是已经看到的值,另一部分是新的唯一值。对于第一部分,它被当前结果集进一步拆分为各种子集(最多 # 个已见源集的幂集)。对于每个这样的子集,它还分为两部分,一部分与新的源集相交,另一部分不相交。作业是更新每个类别的结果集。
就集合运算的复杂性而言,这应该是O(n*2^n).对于OP贴出的解决方案,我觉得复杂度应该是O(2^(2n),因为< code>len(resulting_sets)最坏情况下最多有2^n元素。
def solution(sets):
result_sets = [] # list of (unique element set, membership) tuples
for sid, s in enumerate(sets):
new_sets = []
for unique_elements, membership in result_sets:
# The intersect part has wider membership, while the other part
# has less unique elements (maybe empty).
# Wider membership must have not been seen before, so add as new.
intersect = unique_elements & s
# Special case if all unique elements exist in s, then update
# in place
if len(intersect) == len(unique_elements):
membership.append(sid)
elif len(intersect) != 0:
unique_elements -= intersect
new_sets.append((intersect, membership + [sid]))
s -= intersect
if len(s) == 0:
break
# Special syntax for Python: there are remaining elements in s
# This is the part of unseen elements: add as a new result set
else:
new_sets.append((s, [sid]))
result_sets.extend(new_sets)
print(result_sets)
sets = [{1, 2, 3}, {1, 4, 7}, {1, 4, 5}]
solution(sets)
# output:
# [(set([2, 3]), [0]), (set([1]), [0, 1, 2]), (set([7]), [1]), (set([4]), [1, 2]), (set([5]), [2])]
---------------下面的原始答案---------------
这个想法是找到每个唯一元素的“成员资格”,即它属于什么集合。然后我们创建一个字典,根据成员资格对所有元素进行分组,生成请求的集合。复杂度是O(n*len(套)),或者在最坏的情况下是O(n^2)。
def solution(sets):
union = set().union(*sets)
numSets = len(sets)
numElements = len(union)
memberships = {}
for e in union:
membership = tuple(i for i, s in enumerate(sets) if e in s)
if membership not in memberships:
memberships[membership] = []
memberships[membership].append(e)
print(memberships)
sets = [{1, 2, 3}, {1, 4, 7}, {1, 4, 5}]
solution(sets)
# output:
# {(0, 1, 2): [1], (1, 2): [4], (0,): [2, 3], (1,): [7], (2,): [5]}
这是一个算法问题。如果我错过了Python中任何有帮助的现有函数,请大喊一声。 给定一组元素的,我们可以在Python中使用函数来找到所有唯一的k元素子集。让我们调用包含所有这些子集的集合。请注意,每个这样的子集都有不同的元素。 问题是两步走。首先,给定这些k-不同元素子集,我想组合(其中的一些),这样(组合只是一些子集的超集): > 构图中任意两个子集之间的交集为空 构图中所有子集的并集给出的正
问题内容: 我有一个Python,我将根据条件从中逐个删除元素。当集合只剩下1个元素时,我需要返回该元素。如何从集合中访问此元素? 一个简化的例子: 问题答案: 用途: 在您的情况下,它将是: 但是请注意,这将从集合中删除该项目。如果不希望这样做,则可以使用| : 演示:
问题内容: 考虑以下列表: 我该如何实现? 我试过了: 但是,只有当我按一定顺序具有元组的元素时,它才起作用,这意味着它将导致以下结果: 问题答案: 您可以将元组视为图形中的边,而将目标视为在图形中查找连接的组件。然后,您可以简单地遍历顶点(元组中的项),并为尚未访问的每个顶点执行DFS生成组件: 输出: 注意,在上面,组件和组件中的元素都是随机顺序。
我有一本字典。 我想找到两个元素的组合,其中每个元素必须来自不同的判决键。 例如:就是这样的组合,而不是这样的组合。 我已经试过这个了 但是它给了和两个不同的组合,但是我只想要其中一个。
我在Wordpress和Visual Composer一起工作,我有一个切换容器。基本上,我点击每个选项卡,下面的内容就会发生变化。我想通过CSS为每个选项卡分配一个不同的图像作为背景。但是,我已经实现了这一点,因为每个选项卡都有相同的类名(由visual composer赋予它),所以图像是相同的。我需要弄清楚如何给每个选项卡一个唯一的id,这样我就可以给每个选项卡一个自己的背景图像--但是由于
我需要迭代两个元素的所有组合:在集合[1,2,3,4]中,我想迭代[(1,2),(1,3),(1.4),(2,3),,(2,4),(3,4)]。是否有现有的工具可以执行此操作? 这段代码将执行两倍于所需的操作,因为在两个循环中都将访问每个对象。 为此编写自己的方法是微不足道的,我只是不想发明轮子。我期望在Guava或Collections API中找到这个,但是没有找到这样的功能。