我现在已经可以利用传递闭包的算法 得到了一个完整的所有这些东西的关系集合
比如:
元素集合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万个元素里一共有多少组是有关系的。
我利用传递闭包,有增进来了一些关系对儿。
然后我就想把这些有关系的元素 都给聚合一下。
看看这10000万个元素里一共有多少组是有关系的。
#2
构成一个图,然后DFS一遍,看总共分成了几个部分。。。
#3
谢谢,我去想一想,我对数据结构的内容现在都差不多快忘掉了。哎。。。
只是记得离散数学里面的传递闭包。
只是记得离散数学里面的传递闭包。
#4
有向图么?比如ac,ab,bc算有关系么?
#5
应该是无向的,因为我最后把能写成{a,b,c}可以放在一起就说明a,b,c完全等。
#6
刚刚,我找了一下关于图的资料看了一看,我现在的想法就是这样的,楼上两位以及其他点贴的看看我说的对不对呀:
1:
首先利用已经有的 (所有元素的集合) 以及 (这些元素的关系对儿) 制成一个邻接矩阵
2:
利用这个邻接矩阵,我来画图
3:
利用DFS算法看看能有几个连通图, 因为只有满足是一个连通图才能正确地运行一次DFS
4:
通过3,我就可以知道有多少个像要得到的集合了,因为一个连通图就代表一个集合,而每个集合中的元素就是对应的连通图的结点。
我说的对吧???
1:
首先利用已经有的 (所有元素的集合) 以及 (这些元素的关系对儿) 制成一个邻接矩阵
2:
利用这个邻接矩阵,我来画图
3:
利用DFS算法看看能有几个连通图, 因为只有满足是一个连通图才能正确地运行一次DFS
4:
通过3,我就可以知道有多少个像要得到的集合了,因为一个连通图就代表一个集合,而每个集合中的元素就是对应的连通图的结点。
我说的对吧???
#7
这些个“部分” 是不是就是构成的图种的一个一个的“连通图”??? 就是我上面说的那样的?
#8
没错,不过邻接矩阵太大了,如果是稀疏矩阵的话划不来,具体情况具体分析吧
#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
首先我设置了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
a
/ \
b---\c----d
e-----f
h
|
j---------|---g
| /
| /
i
#1
因为我有10000万个元素, 里面已经生成了若干元素和元素之间的2元关系对儿。
我利用传递闭包,有增进来了一些关系对儿。
然后我就想把这些有关系的元素 都给聚合一下。
看看这10000万个元素里一共有多少组是有关系的。
我利用传递闭包,有增进来了一些关系对儿。
然后我就想把这些有关系的元素 都给聚合一下。
看看这10000万个元素里一共有多少组是有关系的。
#2
构成一个图,然后DFS一遍,看总共分成了几个部分。。。
#3
谢谢,我去想一想,我对数据结构的内容现在都差不多快忘掉了。哎。。。
只是记得离散数学里面的传递闭包。
只是记得离散数学里面的传递闭包。
#4
有向图么?比如ac,ab,bc算有关系么?
#5
应该是无向的,因为我最后把能写成{a,b,c}可以放在一起就说明a,b,c完全等。
#6
刚刚,我找了一下关于图的资料看了一看,我现在的想法就是这样的,楼上两位以及其他点贴的看看我说的对不对呀:
1:
首先利用已经有的 (所有元素的集合) 以及 (这些元素的关系对儿) 制成一个邻接矩阵
2:
利用这个邻接矩阵,我来画图
3:
利用DFS算法看看能有几个连通图, 因为只有满足是一个连通图才能正确地运行一次DFS
4:
通过3,我就可以知道有多少个像要得到的集合了,因为一个连通图就代表一个集合,而每个集合中的元素就是对应的连通图的结点。
我说的对吧???
1:
首先利用已经有的 (所有元素的集合) 以及 (这些元素的关系对儿) 制成一个邻接矩阵
2:
利用这个邻接矩阵,我来画图
3:
利用DFS算法看看能有几个连通图, 因为只有满足是一个连通图才能正确地运行一次DFS
4:
通过3,我就可以知道有多少个像要得到的集合了,因为一个连通图就代表一个集合,而每个集合中的元素就是对应的连通图的结点。
我说的对吧???
#7
这些个“部分” 是不是就是构成的图种的一个一个的“连通图”??? 就是我上面说的那样的?
#8
没错,不过邻接矩阵太大了,如果是稀疏矩阵的话划不来,具体情况具体分析吧
#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
首先我设置了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
a
/ \
b---\c----d
e-----f
h
|
j---------|---g
| /
| /
i