繁体   English   中英

特里树结构声明

[英]Trie tree struct declaration

所以我有这段代码(不是我的),我一生都无法理解那些结构是什么样的。 有人可以解释一下吗?

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;
};

第二个结构中的int count是用于计数放入树中的所有单词,但是我想知道每个单词被放入其中的次数,除了修改代码的其余部分外,我应该如何修改结构以实现该功能?

其余代码: http//pastebin.com/9zQuCBjb

我想您已经熟悉了trie的概念,您可以通过沿着单词的字母在树上行走(或爬行,以使用链接的代码的单词)并在每个节点处分支来找到单词和单词的前缀到您找到的字母。 每个节点有许多子节点。 如果使用不区分大小写的拉丁字母,则为26。

该单词被编码在您到达的路径中:

root->[f]->[i]->[s]->[h]  --> "fish"

现在,您需要知道当前节点是否代表一个单词。 "fish"是一个词,但"fis"不是。 您不能使用节点是没有子叶的事实,因为"fishbone"可能在字典中。 这就是输入value目的:零表示当前节点不代表单词,否则该值是当前单词的基于1的索引。

创建新条目时,您只需向下爬取该Trie,就可以在创建过程中创建新节点,并使用当前字数将最后一个节点标记为值。 如果"fishbode"已经在特里"fishbode"中,并且添加了"fish" ,则不会创建新节点,而只会用新值标记"h"节点。

trie结构只是一个帮助,它包含了trie的根节点和一个计数。

如果要跟踪事件的发生,请在节点上添加一个count字段,并在设置value时将其递增。 (原始代码不会检查之前的值是否已经存在,并且会无条件添加单词,从而覆盖所有旧值。)

您还可以通过具有prefix_count字段并在插入键时通过节点时增加该值,来对当前节点prefix_count前缀开头的所有单词进行计数。

当您想要检索发生事件时,您将必须遍历所有子树。

尝试对于自动扩展用户输入的首字母或T9样式的键入系统中的单词很有用,但是它们非常贪婪。 如果您只想计算单词的出现次数(而没有利用trie的好处),则可以使用单个要计数的单词哈希表来实现这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM