我正在使用D3.JS
库强制有向图,
我使用以下代码查找目标节点
graph.links.forEach(function(d) {
linkedByIndex[d.source.index + "," + d.target.index] = 1;
linkedByIndex[d.target.index + "," + d.source.index] = 1;
});
});
function neighboring(a, b) {
return a.index == b.index || linkedByIndex[a.index + "," + b.index];
}
如何找到并突出目标的目标?有人可以帮我吗?
修改
通过以下方式解决问题:
首先创建了相邻的矩阵:
var adjMat=null;
var adjMatSq=null;
adjMat=new Array(graph.nodes.length);
for(var i = 0;i < graph.nodes.length; ++i)
{
adjMat[i]=new Array(graph.nodes.length);
for(var j = 0; j < graph.nodes.length; ++j)
{
adjMat[i][j] = 0;
}
}
然后将值分配给相邻矩阵:
graph.links.forEach(function(d) {
adjMat[d.source.index][d.target.index] = adjMat[d.target.index][d.source.index] = 1;
adjMat[d.source.index][d.source.index] = 1;
});
adjMatSq=matrixMultiply(adjMat, adjMat);
});
然后我找到了矩阵的平方,以便我能够获得第二度节点:
function matrixMultiply(m1,m2)
{
var result = [];
for(var j = 0; j < m2.length; j++) {
result[j] = [];
for(var k = 0; k < m1[0].length; k++) {
var sum = 0;
for(var i = 0; i < m1.length; i++) {
sum += m1[i][k] * m2[j][i];
}
result[j].push(sum);
}
}
return result;
}
定义了一个查找二度节点的函数:
function areAtSecondDegree(a,c)
{
return adjMatSq[a.index][c.index] == 1;
}
答案 0 :(得分:3)
原理如下。给定特定节点,确定其直接邻居。要获得二级邻居,请获取您刚刚确定的邻居列表,并为每个邻居再次获取邻居列表。所有这些列表的联合是一级和二级邻居的列表。
在代码中,这可能如下所示:
var connected = {};
var friends = graph.nodes.filter(function(o) { return areFriends(d, o); });
friends.forEach(function(o) {
connected[o.name] = 1;
// second pass to get second-degree neighbours
graph.nodes.forEach(function(p) {
if(areFriends(o, p)) {
connected[p.name] = 1;
}
});
});
如果你想拥有任意的n度邻居,你需要改变它,以适应你不知道要运行多少迭代的事实。
完整演示here。