算法:检查集合包含的最快方法是什么?

时间:2010-08-12 12:16:49

标签: algorithm set

拥有N个数组,生成这些集的包含图的最快方法是什么?

4 个答案:

答案 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。这是你的算法:

  1. 如果所有设置为空,则退出
  2. 查看每个非空集的第一项
  3. 找到这些
  4. 中的最小值
  5. 哪些偷看套装包含这些最低限度的物品?
  6. 对于步骤4中标识的集合,set包括(*,那些集合)为false
  7. 在步骤4中识别的每组的弹出顶部项目
  8. GOTO 0
  9. 如果所有集合都为空,则您有一个MxM集