关于表示系统中路径的数据结构的建议

Advice on data-structure for represeting a Path in system

本文关键字:路径 数据结构 系统 于表示 表示      更新时间:2023-10-16

我有一个系统,我需要表示类似于Path的东西,路径只是提供到达特定节点的路径。可以有多条路径可用于到达同一节点。

我目前使用节点向量表示路径,我需要做操作,如replaceSubpath, containsNode, containsSubPath, appendNode, getRootNode, getLeafNode(非常类似的操作为字符串完成)。所有这些操作都可以在矢量上完成,但对于大路径的性能可能会很糟糕。

我正在寻找使用boost::graph,但没有经验,我想知道如果使用boost::graph将是正确/良好的数据结构,这些和类似的操作?

任何关于使用其他数据结构的建议也会有所帮助,我知道我可以通过保持(多)节点到迭代器的映射等来优化我的向量解决方案

本质上是Boost中的adjacency_list<>类。图一个顶点向量。顶点描述符是该向量的整数索引。

通常,树或路径(路径是树的一种特殊情况,对吧?)表示为前导映射(例如从叶子到根或从目标到源的反向映射)。在整数顶点描述符的情况下,这样的前导映射就是vector<int>。我不认为你可以用更紧凑的方式来表示一条路径或一棵树。

当然,这样的前代向量可以替换为字符串操作,特别是Boost中的字符串操作。String_Algo http://www.boost.org/doc/libs/1_55_0/doc/html/string_algo.html

从你的描述听起来像是你在生成和编辑图中的路径,可能是为了优化路线等。

我不认为一个数据结构会给你你想要的。我会将图结构与生成的路径分开。

replaceSubpath:对我来说,这将建议双重链表实现。当你有路径的开始和结束时,只需粘贴它并替换子路径。

containsNode:考虑添加映射或集合以进行快速包含检查。

containsSubPath:这可能很难,这取决于您的其他关注点和速度需求。如果这是一个非常重要的操作,可以考虑使用后缀树来快速测试子路径。请记住,如果路径没有太大变化,因为构造它们是O(N)

appendNode:链表将很容易在这里

getRootNode:保持指向当前根节点的指针。

getLeafNode:保持指向当前叶节点的指针。

我将创建一个自定义数据结构,可以根据您的目标解决这些问题。查找子路径并快速替换它们可能是相互竞争的性能目标。通常更多的搜索优化=更多的构建开销,使其不那么动态

看看您欣赏的其他一些代码是如何实现管理路径的需要的。例如,您可以查看Dijkstra的几种实现,并选择看起来最好、最方便或最符合您口味的实现。

我认为,将"路径"建模为对象不是一个好主意,而是将其视为图中节点的属性。

一般来说,我会考虑"标记"路径上的节点。例如,用于包含节点属性的类可能有一个标记,如果节点位于路径上,则表示为true;如果有一个属性,则表示路径上的下一个节点的索引。