如何利用传递闭包获得的进一步得到一个集合组?

时间:2021-03-05 11:27:05
假如我有一大堆东西 a,b,c,d,e,f,g. 如果 a 和 b 有关系, b 和 c 有关系, 那么 根据传递闭包我就可以获得 a 和 c有关系。

我现在已经可以利用传递闭包的算法 得到了一个完整的所有这些东西的关系集合

比如:

元素集合A={a,b,c,d,e,f,g}

已有的关联集合如下:
R={<a,b>,<b,c>,<b,d>,<e,f>,<f,g>}

我根据一些现成的算法已经得到了如下的完整的关系对儿如下:

R'={<a,b>,<a,c>,<a,d>,<b,c>,<b,d>,<e,f>,<e,g>,<f,g>}

可以看到 多出来的 ac,ad,eg都是由于使用了闭包传递算法得到的。

现在我想根据得到的R', 让计算机把凡是有关系的东西都集合在一起如下:

{a,b,c,d}{e,f,g}  生成两个集合,每个集合里的东西是有关系的,不同集合力的东西都没关系。

怎么才能做到呢?

10 个解决方案

#1


因为我有10000万个元素, 里面已经生成了若干元素和元素之间的2元关系对儿。

我利用传递闭包,有增进来了一些关系对儿。

然后我就想把这些有关系的元素 都给聚合一下。

看看这10000万个元素里一共有多少组是有关系的。

#2


构成一个图,然后DFS一遍,看总共分成了几个部分。。。

#3


谢谢,我去想一想,我对数据结构的内容现在都差不多快忘掉了。哎。。。

只是记得离散数学里面的传递闭包。

#4


有向图么?比如ac,ab,bc算有关系么?

#5


引用 4 楼 litaoye 的回复:
有向图么?比如ac,ab,bc算有关系么?


应该是无向的,因为我最后把能写成{a,b,c}可以放在一起就说明a,b,c完全等。

#6


刚刚,我找了一下关于图的资料看了一看,我现在的想法就是这样的,楼上两位以及其他点贴的看看我说的对不对呀:

1:
首先利用已经有的 (所有元素的集合) 以及 (这些元素的关系对儿) 制成一个邻接矩阵

2:
利用这个邻接矩阵,我来画图

3:

利用DFS算法看看能有几个连通图, 因为只有满足是一个连通图才能正确地运行一次DFS


4:
通过3,我就可以知道有多少个像要得到的集合了,因为一个连通图就代表一个集合,而每个集合中的元素就是对应的连通图的结点。


我说的对吧???

#7


引用 2 楼 sosidami 的回复:
构成一个图,然后DFS一遍,看总共分成了几个部分。。。



这些个“部分” 是不是就是构成的图种的一个一个的“连通图”??? 就是我上面说的那样的?

#8


引用 6 楼 phdapp 的回复:
刚刚,我找了一下关于图的资料看了一看,我现在的想法就是这样的,楼上两位以及其他点贴的看看我说的对不对呀:

1:
首先利用已经有的 (所有元素的集合) 以及 (这些元素的关系对儿) 制成一个邻接矩阵

2:
利用这个邻接矩阵,我来画图

3:

利用DFS算法看看能有几个连通图, 因为只有满足是一个连通图才能正确地运行一次DFS


4:
通过3,我就可以知道有多少个像……


没错,不过邻接矩阵太大了,如果是稀疏矩阵的话划不来,具体情况具体分析吧

#9


感谢各位回复喽,刚刚写了一下代码试验了一下成功了:

首先我设置了9个元素的{a,b,c,d,e,f,g}

然后写了一个方法返会现成的各个元素对儿在矩阵中的位置

接着就是循环所有元素,从第一个元素(也就是顶点开始的元素)开始进行DFS遍历,因为我遍历的方法中随时地就把经过的节点的访问状态改变了一下。

for(int i=0;i<10;i++)   // becasue now there are 9 elements
{
if (vertexs[i].isVisited()==false)// 所以在循环当中,如果当前节点已经被访问过了,就不会再去进行遍历,直接找下一个节点
{
g.dfs(i); //如果还没被访问,怎继续DFS遍历。
        System.out.println();
     }
}


假如我的关系对儿为:ab,ac,bc,cd,ef,gi,hi,ig,ih,jg

结果正好就是3组集合{a,b,c,d}{e,f}{g,i,h,j}

表示的图形同集合吻合:



        a                       h
      / \                    /|
     b---c---d   e----f   j---|-/g
                              |/  
                              i 

#10


图形一回复就变形了。。。。

   a
  / \
 b---\c----d


e-----f
          h 
          |
j---------|---g
          |  /
          | /
           i

#1


因为我有10000万个元素, 里面已经生成了若干元素和元素之间的2元关系对儿。

我利用传递闭包,有增进来了一些关系对儿。

然后我就想把这些有关系的元素 都给聚合一下。

看看这10000万个元素里一共有多少组是有关系的。

#2


构成一个图,然后DFS一遍,看总共分成了几个部分。。。

#3


谢谢,我去想一想,我对数据结构的内容现在都差不多快忘掉了。哎。。。

只是记得离散数学里面的传递闭包。

#4


有向图么?比如ac,ab,bc算有关系么?

#5


引用 4 楼 litaoye 的回复:
有向图么?比如ac,ab,bc算有关系么?


应该是无向的,因为我最后把能写成{a,b,c}可以放在一起就说明a,b,c完全等。

#6


刚刚,我找了一下关于图的资料看了一看,我现在的想法就是这样的,楼上两位以及其他点贴的看看我说的对不对呀:

1:
首先利用已经有的 (所有元素的集合) 以及 (这些元素的关系对儿) 制成一个邻接矩阵

2:
利用这个邻接矩阵,我来画图

3:

利用DFS算法看看能有几个连通图, 因为只有满足是一个连通图才能正确地运行一次DFS


4:
通过3,我就可以知道有多少个像要得到的集合了,因为一个连通图就代表一个集合,而每个集合中的元素就是对应的连通图的结点。


我说的对吧???

#7


引用 2 楼 sosidami 的回复:
构成一个图,然后DFS一遍,看总共分成了几个部分。。。



这些个“部分” 是不是就是构成的图种的一个一个的“连通图”??? 就是我上面说的那样的?

#8


引用 6 楼 phdapp 的回复:
刚刚,我找了一下关于图的资料看了一看,我现在的想法就是这样的,楼上两位以及其他点贴的看看我说的对不对呀:

1:
首先利用已经有的 (所有元素的集合) 以及 (这些元素的关系对儿) 制成一个邻接矩阵

2:
利用这个邻接矩阵,我来画图

3:

利用DFS算法看看能有几个连通图, 因为只有满足是一个连通图才能正确地运行一次DFS


4:
通过3,我就可以知道有多少个像……


没错,不过邻接矩阵太大了,如果是稀疏矩阵的话划不来,具体情况具体分析吧

#9


感谢各位回复喽,刚刚写了一下代码试验了一下成功了:

首先我设置了9个元素的{a,b,c,d,e,f,g}

然后写了一个方法返会现成的各个元素对儿在矩阵中的位置

接着就是循环所有元素,从第一个元素(也就是顶点开始的元素)开始进行DFS遍历,因为我遍历的方法中随时地就把经过的节点的访问状态改变了一下。

for(int i=0;i<10;i++)   // becasue now there are 9 elements
{
if (vertexs[i].isVisited()==false)// 所以在循环当中,如果当前节点已经被访问过了,就不会再去进行遍历,直接找下一个节点
{
g.dfs(i); //如果还没被访问,怎继续DFS遍历。
        System.out.println();
     }
}


假如我的关系对儿为:ab,ac,bc,cd,ef,gi,hi,ig,ih,jg

结果正好就是3组集合{a,b,c,d}{e,f}{g,i,h,j}

表示的图形同集合吻合:



        a                       h
      / \                    /|
     b---c---d   e----f   j---|-/g
                              |/  
                              i 

#10


图形一回复就变形了。。。。

   a
  / \
 b---\c----d


e-----f
          h 
          |
j---------|---g
          |  /
          | /
           i