我需要一种算法来(有效地)解决我正在编写的一些图表软件中出现的问题。
我有两组节点,N 和 M。N 中的每个节点 n0 与 M 中的唯一(对于 n0)节点有 0 到 M 个连接。这些节点集将排列在两条平行的水平线上,N 个节点在 M 个节点上方的行中。连接将绘制为从 N 到 M 的直线。
我需要做的是在它们的水平线上重新排列 N 和 M 节点,以尽量减少交叉。他们有什么方法比简单地列举所有可能的安排更有效,即 O(N!*M!)?(实际上,它比这差得多,因为还必须检查每个连接是否交叉)。
也欢迎参考相关文献,尽管解释为什么需要它的相关性。
正如已经指出的,在一般情况下,这可以被认为是二分图(集合 N 和 M)平面化算法。然而,这个特定的问题比那个(我希望可以让它更快)受到更多的限制,并且需要产生额外的信息(这可能会使它变慢),如下所示:
该图的限制是连接必须绘制为从 N 到 M 的直线。在图论中,这实际上意味着连接不能在 N 或 M 中的节点后面,只能在它们之间。因此,具有四个连接器的 2x2 案例可以在一般的二分图案例中进行平面化,但在我的图表中不能。
额外的信息是,如果它不能被平面化,我仍然需要一个最小交叉的解决方案(或接近它)。通常,最小交叉算法与仅平面化的算法有很大不同。