javascript - 如何检查节点是否相关?如果有两个邻居,我如何只选择一个邻居?

标签 javascript jquery d3.js

我在 D3 中有一个强制布局。

我有许多节点,这些节点通过链接将它们连接起来。我的问题是,如果节点满足特定条件,我想删除链接。

假设我有节点 A、B、C。

说这个波浪字符 - “~”表示已连接。

If (A~B && A~C && B~C){

DELETE THE A~C link. //which would leave A~B~C
}

我已经尝试过每个链接:

link.forEach(function{d){ ....

但我似乎无法理解我将如何执行逻辑。

我会遍历每个节点 3 次,检查 A~B、A~C、B~C,但如果我有 100 个节点,那将非常慢。

任何帮助将不胜感激:)

这是我当前的边/链接数组的样子:

edges = [
{
    "source": "A",
    "target": "B",
    "other information" : "randomstring",
    "other information" : "randomstring"
},
{
    "source": "B",
    "target": "C",
    "other information" : "randomstring",
    "other information" : "randomstring"
} // and so on ....
]

最佳答案

这是一个图论问题,我假设您想打破一个循环,这就是我要做的

给定一个图g,大小为n,阶数为m

1) 从 links 构建一个哈希表,它用一个链接映射两个节点(O(m) 如果哈希是在恒定时间内完成的),例如

// a reference to the link itself (which can be an object or a dom node)
var hash = {}
links.each(function (d) {
  var u = d.source
  var v = d.target
  hash[u] = hash[u] || {}
  // again replace this with the dom node if you want
  hash[u][v] = d
})

2) 运行 dfs 查找后缘(更多信息请参见 an article I wrote 或使用快速谷歌搜索),每当您找到后缘时,您将获得有关源/目标节点和循环长度的信息 O(n + m)

3) 如果循环长度为 3 或您的标准是什么,则删除链接,从链接中删除将花费 O(km),其中 k 是数字找到的周期数

现在使用 d3,您可以简单地重新绑定(bind)新数据(删除一些链接)并重新呈现图形

关于javascript - 如何检查节点是否相关?如果有两个邻居,我如何只选择一个邻居?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32656885/

相关文章:

javascript - 如何在 React Native 中隐藏和显示导航栏?

javascript - 如何将带有图像的 div 与带有文本的另一个 div 保持在同一行

javascript - 如何使用javascript将字符串附加到textarea

javascript - 出现错误 - "Argument ' myCtrl' 不是函数,未定义”

jquery - 如何只隐藏标签内的文本而不隐藏其他html元素

javascript - jquery - 从函数返回一个值

javascript - JSFiddle 无法提供 DataTable 导出为 Excel 的按钮

javascript - 如何格式化dimple.js的时间

python - 从 Json 在 Python 中创建具有多个键值的嵌套 Json 结构

javascript - X 轴域线与 d3 条笔划重叠