trie在内存中占用的字节数 - C

时间:2017-09-15 07:27:13

标签: c

我正在编写一个trie作为练习练习,用于学习C中的一些基础知识。我的插入,删除和搜索功能似乎工作正常。但是,我不太确定我的函数是否会尝试返回Trie根节点占用的字节数。

unsigned int memory_trie_node(struct TrieNode *node)
{
    int i;
    for (i = 0; i < LETTER_COUNT; i++)
    {
        struct TrieNode *next = node->children[i];
        if (next != NULL)
        {
            return sizeof(next) + memory_trie_node(next);
        }
    }
    return 0;
}

这是我的结构定义

struct TrieNode {
    struct TrieNode* children[LETTER_COUNT];
    int wordEnds; // 1 if string ends at this node, 0 else
};

struct Trie {
    struct TrieNode* root;
};

我创建一个新的trie节点的方式似乎工作得很好,就像我动态分配内存的方式一样,但如果需要,我可以包含其他功能。

我的memory_trie_node功能是否正确?如果没有,我该怎么做才能解决它?

谢谢

2 个答案:

答案 0 :(得分:4)

我建议对递归方法稍作修改:在函数开头处理当前节点,只考虑循环中的子节点:

unsigned int memory_trie_node(struct TrieNode* node)
{
    int i, memory;
    if (!node) return 0;

    memory = sizeof(struct TrieNode); // self size
    for(i = 0; i < LETTER_COUNT; i++)
    {
        memory += memory_trie_node(node->children[i]);
    }
    return memory;
}

答案 1 :(得分:2)

 for(i = 0; i < LETTER_COUNT; i++) {
      struct TrieNode* next = node->children[i];
      if (next != NULL) {
          return sizeof(next) + memory_trie_node(next);
      }
  }

您只是计算第一个non null孩子的大小并在non null孩子上递归,但其他孩子的情况如何。您不要让循环完成。

您还必须考虑当前节点。即使节点的所有子节点都是null,所以大小不应该是zero

 unsigned int totalMemory=0;
 if(node == NULL)
     return 0;
 for(i = 0; i < LETTER_COUNT; i++) {
      struct TrieNode* next = node->children[i];
      if (next != NULL) {
          totalMemory+= memory_trie_node(next));
      }
  } 
  return totalMemory + sizeof(struct TrieNode);

编辑:添加案例来处理node=null的情况。在这种情况下,大小应为零