字典树以及模板
2016-08-07 12:50
288 查看
字典树又称为单词查找树。用于统计排序大量字符串(不限于字符串),利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。字典树的性质:
1.根节点不包含任何字符(空根节点)
2.从根节点到某一节点路径上的字符连起来就是一个字符串
3.每个节点的所有子节点包含的字符串不相同。
一般的每一个节点需要一个统计量count,来记录当前前缀重复的次数。每个节点还可以用一个布尔变量标记当前节点是否构成单词。Trie主要操作有插入单词,删除单词,查找单词。
1.根节点不包含任何字符(空根节点)
2.从根节点到某一节点路径上的字符连起来就是一个字符串
3.每个节点的所有子节点包含的字符串不相同。
一般的每一个节点需要一个统计量count,来记录当前前缀重复的次数。每个节点还可以用一个布尔变量标记当前节点是否构成单词。Trie主要操作有插入单词,删除单词,查找单词。
#define _CRT_SECURE_NO_DEPRECATE #include<iostream> using namespace std; int const MAXN = 26; struct TrieNode{ TrieNode(){ //构造函数,包含初始化 memset(next, 0, sizeof(next)); exist = false; count = 0; } TrieNode*next[MAXN]; bool exist; //记录当前节点是否构成单词 int count; //记录当前前缀重复次数 }; TrieNode *root = new TrieNode; void Insert(char *str){ TrieNode*p = root; while (*str != '\0'){ int id = *(str++) - 'a'; if (p->next[id] == NULL) p->next[id] = new TrieNode; p = p->next[id]; p->count++; } p->exist = true; //串的最后一个节点标志为构成单词 } //查询单词 bool Search(char*str){ TrieNode*p = root; while (*str != '\0'){ int id = *(str++) - 'a'; if (p->next[id] == NULL) //节点不存在 return NULL; p = p->next[id]; } return p->exist; //返回是否存在单词 } //删除一个单词 void Delete(char*str){ //确保树中原来一定含该单词 TrieNode*p = root; while (*str != '\0'){ int id = *(str++) - 'a'; p = p->next[id]; p->count--; } p->exist = false; //串的最后一个节点标志为构 } //删除一颗字典树 void Delete(TrieNode*T){ if (T){ for (int i = 0; i < MAXN; i++) Delete(T->next[i]); free(T); T = NULL; } }
相关文章推荐
- 字典树(前缀数)例题以及模板
- Android studio 设置注释模板以及函数注释快捷键
- 16个HTML5 框架、模板以及生成工具 .
- 模板 可持久化字典树
- HTML页的基本模板以及各部分含义
- docker通过模板创建镜像以及容器、仓库和数据管理
- java回调方法、钩子方法以及模板方法模式
- hdu 1075 What Are You Talking About 字典树模板
- 字典树模板(HDU1251)
- 字典树模板
- stl模板中vector的用法以及其功能
- poj 2001 字典树入门题(数组实现模板)
- 织梦模板dedecms 中包含的函数以及函数所在文件文件位置
- excel模板解析前后设计变化,以及我对此的看法和感受
- 字典树模板题&hdu1251
- 模板引擎smarty工作原理以及使用示例
- Codeforces Round #367 (Div. 2) [D] Vasiliy's Multiset(01字典树模板)
- 字典树模板
- PHP类的include以及赋值路径,以及显示模板
- 字典树【模板】