字典树介绍
来源:互联网 发布:sql 维护计划 编辑:程序博客网 时间:2024/04/29 02:28
又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。
字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没有该单词,如果在就在该字母的孩子节点里找是不是有单词的第二个字母,没有说明没有该单词,有的话用同样的方法继续查找.字典树不仅可以用来储存字母,也可以储存数字等其它数据。
字典树的数据结构:
#define MAX 26//英文字母的个数typedef struct Trie { Trie *next[MAX]; //下一个节点 int v; //根据需要变化}; Trie *root;//根
<span style="color: rgb(51, 51, 51); font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13.3333px; line-height: 24px; widows: 1; background-color: rgb(214, 211, 214);">next是表示每层有多少种类的数,如果只是小写字母,则26即可,若改为大小写字母,则是52,若再加上数字,则是62了,这里根据题意来确定。</span><br style="color: rgb(51, 51, 51); font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13.3333px; line-height: 24px; widows: 1; background-color: rgb(214, 211, 214);" /><span style="color: rgb(51, 51, 51); font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13.3333px; line-height: 24px; widows: 1; background-color: rgb(214, 211, 214);">v可以表示一个字典树到此有多少相同前缀的数目,这里根据需要应当学会自由变化。</span>字典树的建立:
void createTrie(char *str){ int len = strlen(str); Trie *p = root, *q; for(int i=0; i<len; ++i) { int id = str[i]-'0';//确定是哪个节点,若是小写字母则为减去'a' if(p->next[id] == NULL)//如果下个节点为空,则开辟新的空间, { q = (Trie *)malloc(sizeof(Trie)); q->v = 1; //初始v==1 for(int j=0; j<MAX; ++j)//下个节点全部为空 q->next[j] = NULL; p->next[id] = q; p = p->next[id];//向下走 } else//若不为空 { p->next[id]->v++;//v代表此前缀的个数 p = p->next[id]; } } p->v = -1; //若为结尾,则将v改成-1表示}
查找字典树:
<pre name="code" class="cpp">int findTrie(char *str){ int len = strlen(str); Trie *p = root; for(int i=0; i<len; ++i)//一个一个字母的查找 { int id = str[i]-'0'; p = p->next[id]; if(p == NULL) //若为空集,表示不存以此为前缀的串 return 0; if(p->v == -1) //字符集中已有串是此串的前缀 return -1; } return -1; //此串是字符集中某串的前缀}
字典树建立后用完还需要删除,不删除可能会超空间。
删除操作:
<pre name="code" class="cpp">void deal(Trie *p){ for(int i=0;i<26;i++) { if(p->next[i]!=NULL) deal(p->next[i]; } delete []p;}
0 0
- 字典树介绍
- 字典树基本介绍(字典树模板)
- Trie树/字典树介绍
- 【字典树】字典树的创建(入门详细介绍)
- 数据字典的介绍
- Oracle数据库字典介绍
- trie树(字典树)介绍及简单实现
- AC自动机——1 Trie树(字典树)介绍
- 字典树的简单介绍及其如何求最短前缀
- oracle数据字典的介绍
- python中的字典详细介绍
- python中的字典详细介绍
- 数组、字典、set集合介绍
- python中的字典详细介绍
- iOS开发NSDictionary字典介绍
- python中的字典详细介绍
- C# Dictionary字典类介绍
- python 字典的详细介绍
- codeforces362(div2)ABC
- 92.You executed the following commands in an RMAN session for your database instance that has failur
- Android集成友盟推送
- 6个处理数据不均衡的策略
- MBR&/BOOT和GRUB三者关系总结
- 字典树介绍
- HDU Problem 1312 Red and Black 【DFS】
- hdu 5735
- 关于solr 5.5 windows script 下无法使用post工具的解决办法
- 倒计时 小例子 SurfaceView
- 关于serialVersionUID的说明
- redis学习记录(redis的持久化操作、基于java的jedis操作)
- 判断Wifi
- 1008. 数组元素循环右移问题 (20)