[英]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.