找到目标的目标,即朋友有力导向图的朋友

时间:2014-04-30 10:58:13

标签: javascript d3.js

我正在使用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;
    }

My Code Plnkr

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

相关问题