C/C++ 图形接口,用于表示偏序

C/C++ graph interface for representation of partial order

本文关键字:用于 表示 偏序 接口 C++ 图形      更新时间:2023-10-16

在我的代码中,我使用了一个表示有向无环图的类。我自己写了代码,这并不难。但后来我意识到我的应用程序有更多的要求:图必须是传递约简的,即偏序数的唯一表示。每次用户在图形的可视化 GUI 表示上拖放或剪切/复制/粘贴时,都必须对其进行验证并适应此要求。现在事情变得更加复杂。所以我确实计划了如何安全地执行所有图形操作等,但在我真正深入研究代码之前,我想知道:

部分订单是否有已知的 C/C++ 接口?(最好是C++)

我找到了很多图库,但我已经有了简单的无环二合代码。我找不到任何专门处理传递简化图的东西(我不需要邻接矩阵,数据来自用户,所以在这里效率低下......这是一个用于用户数据的小图表,而不是用于数学用途的东西)

我正在寻找一个接口,它可以自动检测不必要的连接并删除它们,进行测试以查看节点复制/移动操作在部分顺序上是否有效,即保留部分顺序的属性等。

我建议添加一个偏序验证方法。 进行编辑时,制作整个图形的副本,将编辑应用于一个副本,然后对其进行验证。 如果通过,请保留修改后的副本。 如果未通过,请恢复到保存的副本。

也许验证者可以找到所有底部节点,对于每个节点,构建其祖先(或后代,如果你这样称呼它们)的多集,并检查重复条目。 如果您只期望小图形,我会恢复为搜索的递归。

我所知,通常程序在用于非数学目的时都有自己的图类。发生这种情况是因为图形可能比线性容器(如 STL 容器(向量、列表等))复杂得多。

由于您在数学或算法领域没有任何特殊需求(在您的情况下,搜索算法将是一个简单的循环,在大多数情况下,您不需要更多,当然在(过早)优化的情况下不需要)。如果你这样做,你有boost::graph,但我怀疑它会使事情复杂化而不是帮助你。

所以我说,写一个好的图/节点类,如果它足够好并且是为通用而编写的,我们都可以从中受益。没有人回答这个问题,因为实际上没有符合您需求的现有公共代码。编写一次好的自由代码,然后就可以在任何地方使用。祝你好运。

P.S 您自己的搜索算法可能比为通用图形库编写的算法快得多,例如 boost::graph,因为您可以利用特定图形的已知限制和规则,从而使 seraches 更快。例如,在传递约简图中,如果 A 是 B 的父级,则 A 也不能将 b 作为非子项(例如孙子),因此您可以使用这些知识优化搜索。您付出的代价是在更改图形时进行大量测试,但是由于搜索/扫描可以变得更快,因此您可以获得很多回报。