我正在尝试优化力导向图。到目前为止,我已经使用朴素的 O(n 2 ) 方法实现了它。它只能处理大约 1000 个节点,这对于我的需求来说太少了。
熟悉该算法的人都知道它有两个主要组成部分:库仑定律形式的节点之间的排斥和使用胡克定律沿边缘的弹簧状吸引力,这两个组成部分都涉及节点之间的成对计算。
Barnes-Hut 算法很好地适用于前者,它将排斥分量变为 O(n log n)。但是,我无法为弹簧组件找到类似的东西。我考虑了以下几点:
根据位置将节点划分为重叠的 bin,并仅在同一 bin 中的节点之间执行成对计算。但是,这可能并非在所有情况下都有效,特别是因为节点的初始配置是随机的,并且连接的节点可能在任何地方。我可以更改生成节点的方式,但除非它们都在同一个 bin 中,否则它仍然会产生不正确的结果。
分别存储边缘并遍历它们以计算弹簧力。现在这对我来说似乎是最有希望的方法。
有没有更好的方法我没有考虑过?如果这很重要,我正在使用 C#,如果在并行循环中抛出它是微不足道的,那就太好了。