关于表示系统中路径的数据结构的建议
Advice on data-structure for represeting a Path in system
我有一个系统,我需要表示类似于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;如果有一个属性,则表示路径上的下一个节点的索引。
- 链表,反向函数,数据结构
- 如何使用set实现无序数据结构?
- 我们可以将数据永久保存为数据结构吗?
- C++中的可变长度数组/数据结构
- 用于存储由空格分隔的字符串的 C++/C 数据结构
- 通过 NIF 从C++返回自定义数据结构
- 编译器上的策略数据结构不起作用
- 尝试构建"lock-free"数据结构C++
- 设计将引用元素移动到开头的数据结构.C++
- 在学习数据结构之前对STL有一个了解是好的吗?
- 如何解析表示树状数据结构的字符串
- 我对数据结构、双向链表有一些问题
- googletest:测试太大的数据结构
- C++中deque数据结构的大O是什么?
- 我可以使用哪种数据结构来处理这种方式
- 将文本文件解析为树状数据结构
- 最短路径的dijkstra算法的时间复杂度是否取决于所使用的数据结构?
- 如何编写递归函数来计算图形数据结构中的最短路径
- 关于表示系统中路径的数据结构的建议
- 在c++中使用深度优先搜索查找图数据结构中所有可能的路径