我在python中编码。
我有一套套装。这些集合包含整数。如果两个集共享一个整数项,则它是“已连接”。我的目标是确定是否所有这些集都是相互连接成一个组(而不是没有连接集或多组相互连接的集)。
这有一个共同的算法吗?这似乎是一个广泛适用的目标。
这是我提议的解决方案:
从第一组开始,检查内容是否与任何其他组共享
删除任何包含共享内容的集合,并将其他内容添加到第一个集合
重复直到第一次设置没有变化
如果已删除所有其他集,则它们全部已连接
澄清
我想区分一组相互连接的集合
arrayAdapter.add(getString(R.string.example, parameter))
来自不同组的相互连接的组
@color/secondary
因此,仅仅检查每个集合是否连接到另一个集合是不够的。
答案 0 :(得分:3)
您的解决方案是正确的,并且是DFS的变体(虽然因为您操纵集合可能会有点效率低下)
您的问题基本上是图形问题,其中graph是:
G = (V,E)
V = { sets } = {S1, S2, ..., Sn}
E = { (Si,Sj) | Si and Sj share an integer }
此图表本质上是无向的,您的问题是找到它是否已连接。这可以通过BFS或DFS来完成。从一个任意顶点开始,直到你“卡住”(不从新的源重新启动)。如果它发生时,您已“发现”所有集合,则图表已连接。否则,它不是。
运行时间为O(|V|+|E|)
,其中|V|
是您拥有的套数,|E|
是连接数。
注意:通过创建inverted index,可以为已解析的图表有效地计算集E
。对于每个数字,创建一个包含此数字的所有集合的列表(这是输入大小的线性),然后通过遍历列表中的所有对来生成边缘(对于稀疏图形,这应该相当小) 。
虽然对于密集图,生成它的更有效方法可能只是遍历所有对集。
答案 1 :(得分:0)
这是我要尝试的内容:
比较每个成员:
如果有一个共同的整数然后留下一个并继续另一个,继续这个,直到没有更多的集。
如果没有任何成员共享而不是中断并输出false。