我有一个系统,我需要表示类似于Path的东西,路径只提供到达特定节点的路径。可以有多个Path可用于到达同一节点。
我目前使用节点向量表示路径,我需要执行replaceSubpath,containsNode,containsSubPath,appendNode,getRootNode,getLeafNode等操作(与字符串完成的操作非常相似)。所有这些操作都可以在向量上完成,但是大路径的性能可能很糟糕。
我正在寻找使用boost :: graph但没有经验,我想知道使用boost :: graph对于这些和类似的操作是否正确/良好的数据结构?
关于使用其他一些数据结构的任何建议也会有所帮助,我知道我可以通过将节点的(多)映射到迭代器等来优化我的向量解决方案。
答案 0 :(得分:2)
基本上,来自Boost.Graph 的类adjacency_list<>
是顶点向量。顶点描述符是此向量中的整数索引。
通常,树或路径(路径是树的特殊情况,对吧?)表示为前趋映射(如从叶子向后或从目标向后传递)。在整数顶点描述符的情况下,这种前趋映射只是vector<int>
。我认为你不能以更紧凑的方式表示路径或树。
当然,这种前辈的向量可以代替字符串操作,尤其是。那些来自Boost.String_Algo,http://www.boost.org/doc/libs/1_55_0/doc/html/string_algo.html
答案 1 :(得分:0)
根据您描述的内容,您可能会在图表中生成和编辑路径,或许是为了优化路线等。
我不认为一个数据结构会给你你想要的东西。我会将图形结构与您生成的路径分开。
replaceSubpath :对我来说,这会建议doubly linked list实施。当您拥有路径的开头和结尾时,只需将其粘贴并替换子路径。
containsNode :考虑添加地图或集以进行快速收容检查。
containsSubPath :根据您的其他问题和速度需求,这可能很难。如果这是一项非常重要的操作,请考虑Suffix Tree来快速测试子路径。如果路径没有太大变化,请记住它更好,因为构造它们是O(N)
appendNode :链接列表在这里很简单
getRootNode :保持指向当前根节点的指针。
getLeafNode :保持指向当前叶节点的指针。
我会制作一个自定义数据结构,可以根据您的目标解决这些问题。查找子路径并快速替换它们可能是竞争性能目标。通常更多的搜索优化=更多的构造开销使它们不那么动态。
答案 2 :(得分:0)
看一下您所钦佩的其他代码如何实现管理路径的需要。例如,您可以查看Dijkstra的几个实现,并选择一个看起来最好,最方便或仅仅符合您口味的那个。
恕我直言,将“路径”建模为对象并不是一个好主意,而是将其视为图形中节点的属性。
一般来说,我会考虑“标记”路径上的节点。例如,用于包含节点属性的类可能有一个标志,如果节点在路径上,则表示为true;如果路径上有下一个节点的索引,则表示该属性。