识别连接节点堆中的图形 - 这是如何调用的?

时间:2010-09-10 20:56:00

标签: sql algorithm graph

我有一个包含三列X,Y,Z的SQL表。我需要将它分组,以便将具有相同X或Y或Z值的所有记录分配给同一组。我需要确保具有相同值X或Y或Z的记录永远不会分成多个组。

如果您将记录视为X,Y,Z作为边的节点和值,则此问题与查找每个图中的节点将通过X,Y或Z直接或间接连接的所有图相同。边缘,但每个图形将没有与其他图形共同的边缘(否则它将是同一图形的一部分)。

几年前,我知道这叫什么,甚至记得算法,但现在它逃脱了我。请告诉我这个问题是如何调用的,这样我就可以通过Google解决问题。如果你现在是一个很好的算法 - 请指出我。如果您有SQL实现 - 我会嫁给你:)

示例:

    X                   Y               Z            BUCKET
---------     ----------------      ---------      -----------
   1                   34              56              1
   54                  43              45              2
   1                   12              22              1
   2                   34              11              1

最后一行在桶1中,因为Y = 34的值与第1行(在桶1中)的值相同。

3 个答案:

答案 0 :(得分:2)

它看起来不像图表,更像是simplicial complex。 但是如果我们将这个复数视为其骨架图(数字被视为顶点而表中的一行意味着所有三个顶点都通过边连接),那么我们可以使用任何算法来查找connected components这张图。我不确定在SQL中是否有可行的方法来执行此操作,或许以某种方式使用graph database会更为谨慎。

但是,对于这个特定问题,可能有一些简单的解决方案可以通过SQL获得,我没有找到。

答案 1 :(得分:0)

查找每组x中的节点数:

select x, count(x) 
from mytable
group by x

或找到集合列表x:

select distinct x from mytable;

答案 2 :(得分:0)

为什么不首先GROUP BY其中一个列(比如X),制作存储桶,然后对Y和Z执行此操作,如果找到新组,则每次合并上一步中的所有存储桶。

重复X,Y和Z的过程,直到桶停止变化。

你在为link-in或facebook工作吗? :)