拥有N
个数组,生成这些集的包含图的最快方法是什么?
答案 0 :(得分:1)
如果您有一组N组,其中没有一组包含另一组,大小相同,则需要进行N ^ 2组比较。
答案 1 :(得分:1)
好吧,让我们根据最坏的情况来理解它,并且为了简单起见,假设您有一个有效的集合表示,您可以在其中检查恒定时间内的成员资格。
要确定一组X是否是Y的子集,您必须执行| X | Y上的成员资格测试次数。时间与| X |成线性比例。
因此,如果您有N个集合,并且想要确定哪些集合是哪个集合的子集,则必须进行N 2 这样的子集测试,因此我认为您最终得到O的复杂度(AN 2 )其中A是最大集合中元素的数量。
即使你可以做一些聪明的事情同时决定“X子集Y”和“Y子集X”,你也不会获得超过2的因子,因此复杂性不会提高。
答案 2 :(得分:1)
首先,你可以证明这个图形将包含给定n组的O(n ^ 2)个边:考虑集合A1,...,An,每个Ak = {1,...,k}。然后A1子集A2,A1子集A3,...,A1子集An,A2子集A3,...,它们是包含图中的n(n-1)/ 2个边。
鉴于此,我可以想出解决这个问题的一种相当简单的方法。如果Aj中有一些x不在Ai中,那么让Ai可能是子集Aj。现在,Ai子集Aj iff Ai可能是子集Aj而不是Aj可能是子集Ai。
现在,对于每个元素,x将您的集合分为两个:包含x的那些和不包含x的那些。后者可能是前者的子集。将相应的边添加到maybe-subset图中。每当我们在每个方向上连接一对顶点时,我们都知道顶点都不是另一个顶点的子集。对于m个元素和n个集合的宇宙,该算法为O(mn ^ 2)。
Et瞧!
答案 3 :(得分:0)
使用合并排序。
您的输出是包含(行,列)的MxM矩阵。这被初始化为全部为TRUE。这是你的算法:
如果所有集合都为空,则您有一个MxM集