0

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

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

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

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

4

2 回答 2

1

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

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

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

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

于 2013-02-16T13:50:53.153 回答
1

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

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

于 2013-01-24T21:12:20.583 回答