我有一个无向图A,它具有:任意两个节点之间没有多链路,没有自连接节点,可能有一些孤立节点(度数为0的节点)。
我需要通过图A中所有可能的节点对组合来为不存在的链接分配某种分数(假设我的图有k个节点和n个链接,那么组合的数量应该是(k *(k-1)/ 2-n)组合)。我分配分数的方式是基于组合的2个节点之间的公共邻居节点。
例如:A-D之间的分数应为1,G-D之间的分数应为0 ......
最大的问题是我的图表有超过100.000个节点,并且处理几乎10 ^ 10个组合的速度太慢,这是我第一次尝试接近解决方案。
我的第二个想法是因为算法基于节点的常见邻居,我可能只需要查看邻居,这样我就可以指定不同于0的分数。其余的可以确定为0而不需要计算。但这可能会重复组合。
任何想要接近这个解决方案的人都表示赞赏。请记住,实际网络有超过100.000个节点。
答案 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]
,其中:
V[k]
与V[j]
V[k]
不是S
的元素(以避免直接连接的节点)k != i
(避免周期)k > i
(以避免重复)我个人更喜欢这种方法,因为它在完成下一个节点之前完成了一个节点的邻接列表。
假设在具有~100,000个节点的图中有大约600,000个边,假设所有节点上的边均匀分布,则每个节点的平均度数为12.然后,每个节点的可能路径数量为10 2 的数量级。对于完整的图,超过10个 5 节点给出大约10 7 总路径而不是理论极限10 10 。仍然是一个很大的数字,但比以前快了一千倍。