字典树(Trie),又称为单词查找树或键树。Trie是树形结构,是一种哈希树的变形。典型应用于统计、排序和保存大量的字符串,所以经常被搜索引擎系统用于文本词频统计。
字典树的结构特点:
1、根结点不包含字符,除根结点外其他结点都只包含一个字符。
2、从根结点遍历字典树至某一节点,则从根节点至该节点所经过的节点连接结成的字符串即为该节点对应的字符串。
3、每个节点的所有子结点所包含的字符都不相同。
字典树的优势:
1、利用字符串的公共前缀存储,最大限度节约存储空间。
2、最大限度减少字符查找比较次数,查询的效率比哈希表高。
字典树存储结构:
#define MAX 26 //字符集大小 typedef struct TrieNode { int count; //记录该字符出现次数 struct TrieNode *next[MAX]; TrieNode() //结点初始化 { count = 1; for(int i = 0; i < MAX; i++) { next[i] = NULL; } } }TrieNode;
字典树操作:
1、字典树的插入
//将字符串word插入根为root的字典树中 //将字符串word插入根为root的字典树中void insert(TrieNode *&root, char *word) { int i = 0, b; TrieNode *p = root; if(p == NULL) //字典树为空 { p = new TrieNode(); root = p; } while(word[i]) { b = word[i] - 'a'; if(p->next[b]) //如果该字符存在,字符出现次数加1 { p->count++; } else //如果该字符不存在,建立新结点 { p->next[b] = new TrieNode(); } i++; p = p->next[b]; } }
2、字典树的查找
//在根为root的字典树中查找字符串word //字符串word存在返回1,不存在返回0 int search(TrieNode *root, char *word) { int i = 0, b; TrieNode *p = root; if(p == NULL) //字典树为空,查找失败返回0 return 0; while(word[i]) { b = word[i] - 'a'; if(!p->next[b]) //字典树中不包含所查找的字符串,返回0 return 0; i++; p = p->next[b]; } return 1; //查找成功,返回1 }