内存效率表示最短路径的方法?
Memory efficient way to represent shortest path?
假设我得到了从节点 A 到节点 B 的最短路径。路径只是边缘列表,因此路径 A->B->C,将表示为[(A,B(,(B,C(]。
目前,每个节点都是字符串类型,从一个节点到另一个节点的路径,比如(A,B(,是一组字符串,路径是集合的列表。
现在,该路径由超过 60k 条边组成,必须将其保存到数据库中以供以后检索。
所以很明显,我需要一种非常好的方法来表示这条路径C++这样:
- 与原始路径相比,路径的大小显着减小,
- 从数据库检索路径时,检索时间足够小。
谁能给我一些见解?
谢谢。
很难确切地看到你想要什么,但也许你只是像这样存储你的路径:
std::map<int, std::string> route; // int is how many edges you've already travelled (starting from 0 for the first node) and the string is the node letter you're at by that point.
这为您提供了路线的有序迭代,以及地图上操作的良好效率(搜索、移除和插入操作具有对数复杂性(。
为什么要表示边缘?将整个路径存储在数据库中。并随意将它们存储为字符串(如@vahancho所述,使用ABCD
而不是ABBCCD
(。当您查看它时,很明显哪些边属于此路径。您甚至可以稍后使用通配符进行搜索,哪些路径包含边缘,例如在关系数据库中使用%BC%
BC
。
内存效率取决于您如何表示数据(路径(,如果您提供的示例是这种情况,那么您可以尝试Vahancho 先生的建议。
您可以使用std:: unordered_map
它对内存和时间复杂度都是公平的,或者最好尝试构建自己的数据结构,以便仅存储有用的信息,对路径字符串进行哈希处理,...等,可以通过包装SLT
和重载某些功能。
对于像您提供ABBCCD
这样的字符串,您可以尝试将它们存储为数据结构g-trie
而不是将所有路径存储为字符串,通过这种方式,您将显着减少图形上的冗余,因为ABB
和AB
路径,将存储为三个char
节点(1字节(,这个想法忽略了常见的子结构,例如(AB
(。
您也可以查看此论文。
如果您在c++
代码中大量复制字符串并且它们非常大,则可以考虑改用指针或智能指针。还可以选择对字符串进行哈希处理,但这主要用于比较。一般来说,为什么要首先担心使用字符串,除非它们像文本文档一样非常大。
至于容器,你可以只使用std::vector<std::string>
最后存储 A 到 B 的最短路径的最有效方法是存储端点,然后仅在需要时计算结果。
- 内存效率表示最短路径的方法?
- 用于查找网格中最短路径的算法
- 查找最短路径算法
- BFS 打印最短路径
- 使用 Dijkstra 算法跟踪两个节点之间的最短路径
- 使用C++具有两个数字的最短路径算法.(C++)
- 使用迭代深度优先搜索算法的未加权图的最短路径
- 如何仅在 2 个节点之间获取最短路径,给定邻接列表有向图?
- 如何使用贝尔曼-福特算法返回所有具有捆绑重量的最短路径?
- 使用优先级队列查找所有与 Dijkstra 相同的最短路径
- 尝试在图形中查找最短路径时的无限循环
- C++计算有向图中的最短路径
- 使用BFS存储和打印最短路径
- 如何制作由原始图形的最短路径边组成的新图形
- 有没有一种方法可以使用弗洛伊德-沃歇尔算法给出最短路径,其中存在负权重循环而不允许重叠边缘?
- 加权图的开始和结束的最短路径
- 使 c++11 Dijkstra 实现返回最短路径
- 弗洛伊德最短路径算法C++
- Dijkstra 最短路径算法性能 std::p riority_queue VS std::set.
- 在 stl 中使用向量和对的最有效实现 Dijkstra 最短路径C++