从集合列表中删除适当的子集

时间:2019-03-27 01:08:54

标签: python performance set

我正在尝试从集合列表中删除所有适当的子集。从我的头上开始,我就在考虑使用2 for循环来检查一个元素是否是所有元素的适当子集,但这太慢了。

我正在考虑的代码:

让A为集合列表

让B为空列表

for elm in A:
    for i in range(len(A)):
        if elm.issubset(A[i]) and elm != A[i]:
            B.append(elm)
for junk in B:
    A.remove(junk)

我看了一些答案,看到了这篇文章: Efficient algorithm for finding all maximal subsets 它可以消除所有子集,但是当有两个相同的集合时,我会遇到一个问题,因为两个相等的集合是彼此的子集。如果2个集合相同,则将它们都去除掉,这就是为什么我只想去除适当的子集而不是所有子集的原因。

1 个答案:

答案 0 :(得分:0)

听起来像是动态编程的作业。因此,我不会在代码中向您介绍最终的解决方案。相反,我会给你一些提示。

将列表A的长度表示为N。想象一个NN乘以1和0的矩阵,表示为X。如果X(i, j)为1,则表示A[i]A[j]的适当子集,否则为0。您的任务是以最少的工作填充整个矩阵X

您可以对矩阵X进行几种推断:

  1. X(i, j) == 1暗示X(j, i) == 0
  2. len(A[i]) >= len(A[j])暗示X(i, j) == 0
  3. X(i, j) == 1 and X(j, k) == 1暗示X(i, k) == 1

您在设计算法时的任务是对比较进行排序,以使平均填充X所需的比较次数最少,主要是通过尽可能频繁地使用上述规则。 / p>