您的位置:首页 > 其它

字典树以及模板

2016-08-07 12:50 288 查看
字典树又称为单词查找树。用于统计排序大量字符串(不限于字符串),利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。字典树的性质:

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;
}
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: