我正在尝试从集合列表中删除所有适当的子集。从我的头上开始,我就在考虑使用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个集合相同,则将它们都去除掉,这就是为什么我只想去除适当的子集而不是所有子集的原因。
答案 0 :(得分:0)
听起来像是动态编程的作业。因此,我不会在代码中向您介绍最终的解决方案。相反,我会给你一些提示。
将列表A
的长度表示为N
。想象一个N
由N
乘以1和0的矩阵,表示为X
。如果X(i, j)
为1,则表示A[i]
是A[j]
的适当子集,否则为0。您的任务是以最少的工作填充整个矩阵X
。
您可以对矩阵X
进行几种推断:
X(i, j) == 1
暗示X(j, i) == 0
len(A[i]) >= len(A[j])
暗示X(i, j) == 0
X(i, j) == 1 and X(j, k) == 1
暗示X(i, k) == 1
您在设计算法时的任务是对比较进行排序,以使平均填充X
所需的比较次数最少,主要是通过尽可能频繁地使用上述规则。 / p>