内存效率表示最短路径的方法?

Memory efficient way to represent shortest path?

本文关键字:方法 最短路径 效率 表示 内存      更新时间:2023-10-16

假设我得到了从节点 A 到节点 B 的最短路径。路径只是边缘列表,因此路径 A->B->C,将表示为[(A,B(,(B,C(]。

目前,每个节点都是字符串类型,从一个节点到另一个节点的路径,比如(A,B(,是一组字符串,路径是集合的列表

现在,该路径由超过 60k 条边组成,必须将其保存到数据库中以供以后检索。

所以很明显,我需要一种非常好的方法来表示这条路径C++这样:

  1. 与原始路径相比,路径的大小显着减小,
  2. 从数据库检索路径时,检索时间足够小。

谁能给我一些见解?

谢谢。

很难确切地看到你想要什么,但也许你只是像这样存储你的路径:

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而不是将所有路径存储为字符串,通过这种方式,您将显着减少图形上的冗余,因为ABBAB路径,将存储为三个char节点(1字节(,这个想法忽略了常见的子结构,例如(AB(。

您也可以查看此论文。

如果您在c++代码中大量复制字符串并且它们非常大,则可以考虑改用指针或智能指针。还可以选择对字符串进行哈希处理,但这主要用于比较。一般来说,为什么要首先担心使用字符串,除非它们像文本文档一样非常大。

至于容器,你可以只使用std::vector<std::string>

最后存储 A 到 B 的最短路径的最有效方法是存储端点,然后仅在需要时计算结果。