C++ 表示最短路径的内存有效方法?
假设我得到了从节点A到节点B的最短路径。该路径只是一个边列表,因此是一条路径 A->B->C,将表示为[(A,B),(B,C)] 目前,每个节点都是字符串类型,从一个节点到另一个节点的路径,比如(a,B),是字符串的集合,路径是集合的列表 现在,路径由超过60k条边组成,必须保存到数据库中,以便以后检索 显然,我需要一个非常好的方式来表示C++中的路径:C++ 表示最短路径的内存有效方法?,c++,database,memory-management,graph,C++,Database,Memory Management,Graph,假设我得到了从节点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.
std::映射路由;//int是您已经移动的边数(第一个节点从0开始),字符串是您在该点处的节点字母。
这将为您提供有序的路线迭代,并为地图上的操作提供良好的效率(搜索、删除和插入操作具有对数复杂性)。很难准确地看到您想要的内容,但您可能只是将路径存储为:
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.
std::映射路由;//int是您已经移动的边数(第一个节点从0开始),字符串是您在该点处的节点字母。
这使您可以有序地迭代路线,并在地图上进行操作(搜索、删除和插入操作具有对数复杂性)。为什么要表示边?将整个路径存储在数据库中。并且可以随意将它们存储为字符串(正如@vahancho提到的,使用
ABCD
而不是ABBCCD
)。当您查看此路径时,很明显哪些边属于此路径。您甚至可以稍后使用通配符来搜索,通过在关系数据库中使用%BC%
,哪些路径包含类似BC
的边。为什么要表示边?将整个路径存储在数据库中。并且可以随意将它们存储为字符串(正如@vahancho提到的,使用ABCD
而不是ABBCCD
)。当您查看此路径时,很明显哪些边属于此路径。您甚至可以稍后使用通配符来搜索,通过在关系数据库中使用%BC%
,哪些路径包含类似BC
的边。内存效率取决于如何表示数据(路径),如果您提供的示例是这样的话,那你可以试试瓦汉乔先生的建议
您可以使用
std::unordered_map
这对内存和时间复杂性都是公平的,或者最好尝试构建自己的数据结构,只存储有用的信息,散列您的路径字符串,。。。等,可以通过包装SLT
和重载一些功能
如果您提供了类似字符串的abbcd
,那么您可以不将所有路径存储为字符串,而是尝试将它们存储为g-trie
数据结构,通过这种方式,您将大大减少图上的冗余,如ABB
和AB
路径将存储为char
(1byte)的三个节点,其思想是忽略公共子结构(AB
)
你也可以检查一下。内存效率取决于你如何表示你的数据(路径),如果你提供的例子是这样的话,那么你可以试试瓦汉乔先生的建议
您可以使用
std::unordered_map
这对内存和时间复杂性都是公平的,或者最好尝试构建自己的数据结构,只存储有用的信息,散列您的路径字符串,。。。等,可以通过包装SLT
和重载一些功能
如果您提供了类似字符串的abbcd
,那么您可以不将所有路径存储为字符串,而是尝试将它们存储为g-trie
数据结构,通过这种方式,您将大大减少图上的冗余,如ABB
和AB
路径将存储为char
(1byte)的三个节点,其思想是忽略公共子结构(AB
)
你也可以检查。
如果你在std::vector
最后一种最有效的A~B路径存储方法是只存储端点,然后只需计算结果即可。
< P>如果在std::vector
存储A到B的最短路径的最有效方法就是存储