这个集合内容比较是否有通用算法?这个叫什么?

时间:2016-08-11 16:47:12

标签: algorithm graph set theory

我在python中编码。

我有一套套装。这些集合包含整数。如果两个集共享一个整数项,则它是“已连接”。我的目标是确定是否所有这些集都是相互连接成一个组(而不是没有连接集或多组相互连接的集)。

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

这是我提议的解决方案:

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

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

重复直到第一次设置没有变化

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

澄清

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

arrayAdapter.add(getString(R.string.example, parameter))

来自不同组的相互连接的组

@color/secondary

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

2 个答案:

答案 0 :(得分:3)

您的解决方案是正确的,并且是DFS的变体(虽然因为您操纵集合可能会有点效率低下)

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

G = (V,E)
V = { sets }  = {S1, S2, ..., Sn}
E = { (Si,Sj) | Si and Sj share an integer }

此图表本质上是无向的,您的问题是找到它是否已连接。这可以通过BFSDFS来完成。从一个任意顶点开始,直到你“卡住”(不从新的源重新启动)。如果它发生时,您已“发现”所有集合,则图表已连接。否则,它不是。

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

注意:通过创建inverted index,可以为已解析的图表有效地计算集E。对于每个数字,创建一个包含此数字的所有集合的列表(这是输入大小的线性),然后通过遍历列表中的所有对来生成边缘(对于稀疏图形,这应该相当小) 。
虽然对于密集图,生成它的更有效方法可能只是遍历所有对集。

答案 1 :(得分:0)

这是我要尝试的内容:

  • 浏览每一对。
  • 比较每个成员:

  • 如果有一个共同的整数然后留下一个并继续另一个,继续这个,直到没有更多的集。

  • 如果没有任何成员共享而不是中断并输出false。