我有一个简单的Graph类,并且必须创建带有节点和边的图。如果nodeA
和nodeB
上的数组有一些相似之处,则nodeA
,nodeB
这两个节点之间有一条边。
例如:
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 ]
}]
这意味着:
A
和B
,因为两个data
数组上都有3个尖。
B
和C
,因为两个data
数组上都有5个尖。
C
和D
,因为两个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(...)
}
关于如何循环遍历每个节点的数据数组以有效查看相似性的任何想法?
出于这个问题,我给出了一个小的示例数据,实际上,我遍历了大量数据。
答案 0 :(得分:0)
根据data
数组的大小和结果图的稀疏性,有几种方法可以解决此问题:
O(|data[A]| + |data[B]|)
中针对一对节点(A,B)执行此计算,因此此解决方案的复杂度为O(N^2 + N * (sum of data[i] over all i))
。如果您的图形密集,即其中的边数大约为N 2 。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))
。对于稀疏图,这应该比以前的方法更好,但实际上取决于数据数组的构造方式。如何生成数据?