如何在具有相似性的节点之间创建边

时间:2019-04-04 22:36:38

标签: javascript algorithm graph

我有一个简单的Graph类,并且必须创建带有节点和边的图。如果nodeAnodeB上的数组有一些相似之处,则nodeAnodeB这两个节点之间有一条边。

例如:

const example = [{
  "node": "A",
  "data": [ 1, 2, 3 ]
}, {
  "node": "B",
  "data": [ 3, 4, 5 ]
}, {
  "node": "C",
  "data": [ 5, 6, 7 ]
}, {
  "node": "D",
  "data": [ 7, 8, 9 ]
}]

这意味着:

  1. AB,因为两个data数组上都有3个尖。

  2. BC,因为两个data数组上都有5个尖。

  3. CD,因为两个data数组上都有7个尖。

因此,从本质上讲,我们在A -> B -> C -> D方面拥有优势

我设法创建了一个图形并使用邻接表来存储边,但是问题是,我不知道如何在具有相似性的节点之间创建边。天真的解决方案是看example[i - 1]example[i]。但这是错误的,因为数据顺序不正确。

class Graph {

  constructor(numOfVertex) {

    this.adj = new Map();

  }

  addNodes(node) {

    this.adj.set(node, []);  

  }

  addEdge(nodeA, nodeB) {

    this.adj.get(nodeA).push(nodeB);

    this.adj.get(nodeA).push(nodeB);

  };

}

并填充图形,我这样做:


    const graph = new Graph(example.length);

    for (let i = 0; i < example.length; i++) {

      const { node, data } = example[i];

      graph.addVertex(title)

      G.addEdge(...)

    }

关于如何循环遍历每个节点的数据数组以有效查看相似性的任何想法?

出于这个问题,我给出了一个小的示例数据,实际上,我遍历了大量数据。

1 个答案:

答案 0 :(得分:0)

根据data数组的大小和结果图的稀疏性,有几种方法可以解决此问题:

  • 遍历所有节点对并计算它们是否具有边。可以在O(|data[A]| + |data[B]|)中针对一对节点(A,B)执行此计算,因此此解决方案的复杂度为O(N^2 + N * (sum of data[i] over all i))。如果您的图形密集,即其中的边数大约为N 2
  • 构建一个映射(X-> ListOfNodes),以使每个数字X映射到其数据中包含X的所有节点。属于同一列表的每对节点都应连接一条边。此解决方案的复杂度为O((sum of data[i] over all i) + (a hard to estimate quantity that is the number of times each pair of nodes shares a data point))。对于稀疏图,这应该比以前的方法更好,但实际上取决于数据数组的构造方式。

如何生成数据?