介绍Trie树的性质和构造方法。
最终用来统计一片文章各个单词出现的频率。node
最终结果:git
Trie树是一种数据结构,对于词频统计,文本检索很是有效。
Trie树的大小取决与要统计的文本的字母个数。好比只统计26个英文字母的话,单词最大长度为10的话,占用的空间最可能是26^10。但实际上并无这么恐怖。由于没有abc这样的单词。数据结构
在Trie中,将没一个字母做为一个node,其中含有几个信息spa
c#define R 26 typedef struct node { int value;// ASCII码 int frequecy;//c出现的频率 struct node* child[R];//有R个孩子,初始为NULL }Node;
下面用hello这个单词举例子。
第一个节点是h,且h有一个孩子l。日后相似。到了最后的o,此时才是一个真正的单词,因此o的frequecy为1.
创建Trie树的时候,每次都是从Root出发,当再次遇到单词hello时,仍是顺着这条路走下来,到o的时候将frequecy=2。
若是碰到的单词是helloworld,则插入后的结果为
能够看到,frequency>0
的节点,说明从root到这个节点的路径上的全部字母节点构成了一个单词,且单词出现的频率就是frequecy。.net
因此,树的高度与文本中的单词的最大长度有关,但实际上最长的单词也没几个字母……尤为是当不一样的单词具备相同前缀的时候,前缀的路径是共用的。利用这个性质,Trie在前缀搜索上变现也不错。code
当拿到一个文本文档时,咱们能够经过一遍扫描将trie创建,经过遍历trie获得全部词出现的频率。blog