我正在图表中测试一些相似性指标。我正在使用JUNG API来处理图表。我已经设法计算了常见邻居和优先附件等基本指标。现在,我想计算如下的katz指标: katz(v1,v2)= B.paths_1(v1,v2)+ B ^ 2.paths_2(v1,v2)+ ... + B ^ n.paths_n(v1,v2) 其中paths_n(v1,v2)是v1和v2之间长度“n”的路径数; B是标量。我将n限制为4,因此可以通过以下方式轻松计算最终的katz矩阵: B.A +(B.A)^ 2 + ... +(B.A)^ 4其中A是图的邻接矩阵。问题是我正在使用的图表非常庞大,我无法将整个katz矩阵存储在内存中。此外,我不需要所有分数,因为我只测试几对节点。 我无法找到一种有效的方法来计算单个分数而不必在图表上进行分析。 有什么想法吗?
答案 0 :(得分:1)
要计算单个分数ketz(v1,v2)
,您只需要考虑邻接子矩阵,该子矩阵仅包含距离v1或v2小于4的距离的顶点。
您可以使用v1和v2中的呼吸优先搜索来定位这些顶点。
但是如果你在从v1开始做BFS时直接计算#paths,你实际上可以做得更好。您只需要记住距离v1和每个顶点的距离,检查您是否已到达v2。如果这样增加适当的计数器。
类似的东西(伪代码):
Queue q = new Queue();
q.enqueue((v1, 0));
int[] counts = new int[] { 0,0,0,0,0 };
while (!q.empty()) {
(v, dist) = q.dequeue();
for(Vertex w : v.Neighbors()) {
if(dist < 3)
q.enqueue((w, dist+1));
if(dist < 4 && w == v2)
counts[dist+1]++;
}
}
因此,在您运行此操作后,对于n = 1,2,3,4
,您将获得counts[n] = paths_n(v1,v2)