Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 表示最短路径的内存有效方法?_C++_Database_Memory Management_Graph - Fatal编程技术网

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++中的路径: 与原始路径相比,路径的大小显著减小 从数据库检索路径时,检索时间足够短 有谁能给我提供一些见解吗 谢谢。很难准确地看到您想要什么,但也许您只是

假设我得到了从节点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


    你也可以检查。

    如果你在 C++ +/Cuth>代码中复制字符串,它们非常大,你可以考虑使用指针或智能指针。还有对字符串进行散列的选项,但这在比较中最有用。一般来说,为什么首先要担心使用字符串,除非它们像文本文档一样非常大

    至于容器,您可以使用
    std::vector


    最后一种最有效的A~B路径存储方法是只存储端点,然后只需计算结果即可。

    < P>如果在 C++ +/Cuth>代码中复制字符串,它们非常大,你可以考虑使用指针或智能指针。还有对字符串进行散列的选项,但这在比较中最有用。一般来说,为什么首先要担心使用字符串,除非它们像文本文档一样非常大

    至于容器,您可以使用
    std::vector

    存储A到B的最短路径的最有效方法就是存储