Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 是否有用于此集合内容比较的通用算法?这叫什么?_Algorithm_Graph_Set_Theory - Fatal编程技术网

Algorithm 是否有用于此集合内容比较的通用算法?这叫什么?

Algorithm 是否有用于此集合内容比较的通用算法?这叫什么?,algorithm,graph,set,theory,Algorithm,Graph,Set,Theory,我正在用python编写代码 我有一张布景单。这些集合包含整数。如果两个集合共享一个整数项,则该项为“已连接”。我的目标是确定所有这些集合是否都相互连接到一个组中(而不是没有连接的集合或多组相互连接的集合) 这有一个通用的算法吗?这似乎是一个广泛适用的目标 这是我建议的解决方案: 从第一组开始,检查内容是否与任何其他组共享 删除包含共享内容的任何集合,并将其他内容添加到第一个集合 重复此操作,直到第一组没有变化 如果已删除所有其他集,则它们都已连接 澄清 我想区分一个相互连接的集合链 o--o-

我正在用python编写代码

我有一张布景单。这些集合包含整数。如果两个集合共享一个整数项,则该项为“已连接”。我的目标是确定所有这些集合是否都相互连接到一个组中(而不是没有连接的集合或多组相互连接的集合)

这有一个通用的算法吗?这似乎是一个广泛适用的目标

这是我建议的解决方案:

从第一组开始,检查内容是否与任何其他组共享

删除包含共享内容的任何集合,并将其他内容添加到第一个集合

重复此操作,直到第一组没有变化

如果已删除所有其他集,则它们都已连接

澄清

我想区分一个相互连接的集合链

o--o--o--o--o--o
从相互连接的集合的独立组中

o--o--o o--o--o

因此,仅仅检查每个集合是否连接到另一个集合是不够的。

以下是我将尝试的:

  • 检查每一组
  • 比较每个集合成员:

  • 如果有一个公共整数,则保留一个集合并继续使用另一个集合,继续此操作直到不再有集合

  • 如果没有任何成员共享,则中断并输出false


您的解决方案是正确的,并且是DFS的一个变体(尽管由于您操作集合,因此可能有点效率低下)

您的问题基本上是一个图形问题,其中:

这个图本质上是无向的,你的问题是找到它是否连通。这可以由或完成。只需从一个任意顶点开始,直到“卡住”(无需从新源重新启动)。如果发生这种情况时,您已经“发现”了所有集合,则图形是连接的。否则,情况并非如此

运行时间是
O(|V |+| E |)
,其中
|V |
是您拥有的集合数,
|E |
是连接数

注:通过创建一个。对于每个数字,创建一个包含该数字的所有集合的列表(这是输入大小的线性),然后通过遍历列表中的所有对来生成边(对于稀疏图,这应该相当小)。

尽管对于稠密图,生成它的更有效的方法可能只是遍历所有对集合。

如果可能的整数已知,并且它们的数目有一个小的上界,如32,则可以将每个集合表示为位向量,并按位应用,如下所示:
x(n)=x(n-1)&s(n)
s(n)是第n个集合,
是按位和。如果任何
n
x(n)
的所有位都为零,您将知道有多组集合。这种方法的时间复杂度是线性的,并且使用当前硬件可以非常有效地执行的操作


可以通过以下检查扩展此解决方案和任何其他解决方案。它必须在原始溶液之前应用。在某些情况下,这个想法会很快完成。检查要求知道每个集合的最小和最大整数。如果所有这些最小整数中的最大整数大于所有最大整数中的最小整数,您将知道存在多组集合。所以,在这种情况下,你可以完成。如果条件为非真,则必须继续使用原始解决方案。

Python已设置运算符来确定子集。我认为你要求的“算法”是一个“集合覆盖”,这是NP-Complete@cricket_007从他的描述来看,我觉得它像是连接在一起的组件,很容易找到。
G = (V,E)
V = { sets }  = {S1, S2, ..., Sn}
E = { (Si,Sj) | Si and Sj share an integer }