在无向图中获取所有组合节点对的最佳算法(需要提高时间复杂度)

时间:2013-09-11 14:27:03

标签: java algorithm loops graph graph-algorithm

我有一个无向图A,它具有:任意两个节点之间没有多链路,没有自连接节点,可能有一些孤立节点(度数为0的节点)。

我需要通过图A中所有可能的节点对组合来为不存在的链接分配某种分数(假设我的图有k个节点和n个链接,那么组合的数量应该是(k *(k-1)/ 2-n)组合)。我分配分数的方式是基于组合的2个节点之间的公共邻居节点。

Ex: score between A-D should be 1, score between G-D should be 0 ... 例如:A-D之间的分数应为1,G-D之间的分数应为0 ......

最大的问题是我的图表有超过100.000个节点,并且处理几乎10 ^ 10个组合的速度太慢,这是我第一次尝试接近解决方案。

我的第二个想法是因为算法基于节点的常见邻居,我可能只需要查看邻居,这样我就可以指定不同于0的分数。其余的可以确定为0而不需要计算。但这可能会重复组合。

任何想要接近这个解决方案的人都表示赞赏。请记住,实际网络有超过100.000个节点。

1 个答案:

答案 0 :(得分:0)

如果将图形表示为邻接列表(而不是邻接矩阵),则可以利用图形只有600,000个边缘的事实,以期有望减少计算时间。

让我们将一个节点V[j]与邻居V[i]V[k]

V[i] ---- V[j] ---- V[k]

要查找所有此类邻居对,您可以获取与V[j]相邻的节点列表,并查找这些节点的所有组合。为避免重复,您必须通过要求V[i]来生成组合而不是结束节点V[k]i < k的排列。

或者,您可以从节点V[i]开始,找到与V[i]距离为2的所有节点。设S为与V[i]相邻的所有节点的集合。对于V[j]中的每个节点S,请创建路径V[i]-V[j]-V[k],其中:

  1. V[k]V[j]
  2. 相邻
  3. V[k]不是S的元素(以避免直接连接的节点)
  4. k != i(避免周期)
  5. k > i(以避免重复)
  6. 我个人更喜欢这种方法,因为它在完成下一个节点之前完成了一个节点的邻接列表。

    假设在具有~100,000个节点的图中有大约600,000个边,假设所有节点上的边均匀分布,则每个节点的平均度数为12.然后,每个节点的可能路径数量为10 2 的数量级。对于完整的图,超过10个 5 节点给出大约10 7 总路径而不是理论极限10 10 。仍然是一个很大的数字,但比以前快了一千倍。