【问题标题】:Memory efficient way to represent shortest path?表示最短路径的内存有效方法?
【发布时间】:2020-06-25 10:01:18
【问题描述】:

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

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

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

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

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

谁能给我一些见解?

谢谢。

【问题讨论】:

  • 您在路径中使用了两次相同的节点。您不能将路径表示为ABCD 而不是ABBCCD?你会获得一些记忆。

标签: c++ database memory-management graph


【解决方案1】:

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

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.

这为您提供了路线的有序迭代,并为地图上的操作提供了不错的效率(搜索、删除和插入操作具有对数复杂性)。

【讨论】:

    【解决方案2】:

    为什么要表示边?将整个路径存储在数据库中。并且随时将它们存储为字符串(正如@vahancho 提到的,使用ABCD 而不是ABBCCD)。当您查看它时,很明显哪些边缘属于该路径。您甚至可以稍后使用通配符进行搜索,通过在关系数据库中使用%BC%,哪些路径包含类似BC 的边。

    【讨论】:

      【解决方案3】:

      内存效率取决于您如何表示您的数据(路径),如果您提供的示例是这种情况,那么您可以试试先生。 vahancho 建议


      您可以使用 std:: unordered_map 这对于 内存时间 复杂性都是公平的,或者尝试构建自己的 数据结构可能会更好> 仅存储有用信息,散列你的路径字符串,...等,可以通过包装SLT重载一些功能。

      如果您提供ABBCCD 这样的字符串,那么您可以尝试将它们存储为g-trie 数据结构,而不是将所有路径存储为字符串,这样您将减少 显着上的冗余ABBAB路径,将存储为char的三个节点(1 byte),这个想法忽略了常见的子结构AB)。

      您也可以查看paper

      【讨论】:

        【解决方案4】:

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

        至于容器,你可以使用std::vector&lt;std::string&gt;

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-25
          • 2021-12-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多