【问题标题】:Calculate memory usage of a tree structure in C++在 C++ 中计算树结构的内存使用情况
【发布时间】:2023-11-02 20:54:01
【问题描述】:

我有一个树形结构

struct TrieNode {
    std::unordered_map<std::string, TrieNode> children;
    std::vector<std::string> terminals;
};

关于其使用的一些细节:

  • 树在填充后不会被修改。
  • 无序映射中的键是短字符串(不超过 5 个字符)。

这种结构可以变得非常大。我需要计算它在内存中的大小。这个大小不需要非常精确。 是否有任何现有的方法可以做到这一点?

如果不是,我正在考虑这些选项:

  1. 我可以单独跟踪对此结构的修改。
  2. 为跟踪空间的容器使用自定义分配器(是否有通用的实现方式?)。
  3. 为我的结构重载 new 运算符以跟踪内存(不知道如何跟踪插入到 vector 之后)。
  4. 通过遍历整棵树来计算树填充后的大小(最后的手段,对于大树,它需要很长时间,但结果更精确)。

最好的方法是什么?

【问题讨论】:

  • 有封装这个的树类吗?我会在那里追踪它。
  • @KennyOstrom 是的。这个结构完全封装在另一个类中。
  • 只要树在被填充后是固定的,我认为“通过遍历整个树来计算树被填充后的大小”不会花费太多额外的时间,因为时间复杂度是O(n),达到输入的下限。
  • 节点数和总字符串长度(终端)似乎是有用的指标。像这样的抽象可能比依赖于实现的“内存”更有用。

标签: c++ memory tree trie


【解决方案1】:

最后一个。我有以下原因:

  1. 这是四种方法中最简单的一种。
  2. 因为树在填充后是固定的,所以懒惰地评估大小更有意义,因为:
    • 当不使用尺寸时,我们可以节省计算尺寸的时间。
    • 不需要额外的时间,因为时间复杂度也是O(n),唯一额外的时间是调用递归函数。
  3. 它避免了全局变量的存在

【讨论】: