【问题标题】:Why are there separate "trie_node" and "trie" structures?为什么有单独的“trie_node”和“trie”结构?
【发布时间】:2014-11-12 06:41:27
【问题描述】:

我已经阅读了以下实现 trie 的实现。

typedef struct trie_node trie_node_t;
struct trie_node 
{
int value;
trie_node_t *children[ALPHABET_SIZE];
};

// trie ADT
typedef struct trie trie_t;
struct trie 
{
trie_node_t *root;
int count; 
};

我不明白为什么有两个结构,而我们只能有一个带有指针数组和值类型的结构。请帮忙。!

【问题讨论】:

  • 你当然可以这样做。 trie 的根通常具有下面展开的开头字母。您也可以只使用 trie_node 并忽略该值。但是,自定义根节点可以让您有一个地方来存放 trie 范围内的好东西和可能有用的快捷方式(例如:count 成员)。
  • @WhozCraig 你能解释一下上述声明吗?这就是我得到的。 trie_node 有值和 26 个指针(英文)。我希望我们可以计算出在该前缀之前形成了多少个单词。为什么要这样使用。!
  • 仅给出声明,我无法明确说明 count 的用途。由于root 不是一个完整的字母大小的前缀节点指针数组,我只能想象count 是该动态数组的动态计数。 (这是一个有点愚蠢的设计恕我直言,因为这个设计中唯一通过最小化不必要的指针来节省空间的节点似乎是根,它有一个,而不是一般的 trie 节点,其中有 N )。

标签: c++ c string tree trie


【解决方案1】:

简答

trie_node_t 是内部(链接到一个)trie 中每个节点的类型。

trie_t 是每个 trie 的类型。

用法

可能的用法

trie_t tr1, tr2;  /* Create 2 tries */

addstring(&tr1, "baseball");   /* This adds multiple nodes to existing trie */
addstring(&tr1, "basketball");

addstring(&tr2, "rock");
addstring(&tr2, "rocket");
addstring(&tr2, "rob");

作者使用 2 结构可能是因为它使事物更加模块化和可管理,并简化了动态分配。

可视化

 +--------+
 |  tr2   |    trie_t
 +---+----+
     |
   +-+-+
   | r |       trie_node_t
   +-+-+
     |
   +-+-+
   | o |       trie_node_t
   +-+-+
    / \
   /   \
+-+-+ +-+-+
| b*| | c |    both trie_node_t
+---+ +-+-+
        |
      +-+-+
      | k*|    trie_node_t
      +-+-+
        |
      +-+-+
      | e |    trie_node_t
      +-+-+
        |
      +-+-+
      | t*|    trie_node_t
      +---+
(* means count is not zero)

终于

Trie(或其他数据结构,例如链表)只是一个想法,实现可能会有所不同。

例如,链表可以实现为数组(将下一项的索引保持为链接,并为最后一项保持特殊数字)或节点类型和列表类型,其中列表类型包含指向头的指针。以前的实现可能很容易理解、实现和调试,而后来的实现更好地利用了动态分配。一个实现可能适合一个目的,但可能不适合其他目的。

【讨论】:

  • rng..58 在solution of Problem C during Round 1B 2013 of google code jam 中提交了一个基于数组的实现树
  • 这意味着我们正在实现的一组给定字符串只能有一个 trie_t。??
  • 是的,如果你只有 1 个 trie(我们称之为字典)。您向其中添加多个字符串。将有 1 个trie_t,添加的每个字符串可能会创建 0 个或 1 个或多个 trie_node_t 类型的节点并将其链接到现有的 trie。
猜你喜欢
  • 2013-01-20
  • 1970-01-01
  • 2016-03-08
  • 2021-02-22
  • 2022-11-25
  • 1970-01-01
  • 2018-03-20
  • 2012-06-15
  • 2023-04-07
相关资源
最近更新 更多