Trie树------一种NB的数据结构
2015-12-01 21:19
288 查看
最近在做一些题的时候更加理解到为什么有一句话叫做程序=算法+数据结构,可能之前的一些题我用最基本的数据类型加上一些“意想不到”的算法就可以解决,但是往往一些问题,佐以精妙的数据结构能让人事半功倍。
Trie树就是这样的一种数据结构,先来一段来自百度的定义性描述,它又称单词查找树,字典树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。Trie树再解决mou一类问题时真的是简单又好用。关于它的简单操作也不过是初始化,插入,查询,删除,下面依次给出一种简单的实现,在实际遇到的问题中可能需要增加某种字段或者进行别的怎样的扩展,这都是依题目而变的。
我们假设在这里我们面向的是由26个小写字母组成的字符串。
//因为我们考虑的是由26个小写字母组成的字符串
//具体问题还可以再变化,而这种变化往往是最难的
#define MAX 26
using namespace std;
//定义Trie树的节点
typedef struct Trie_Node{
struct Trie_Node *next[MAX];
}Trie;
Trie *r;//创造的Trie树的根节点的指针
void init(){//以r为根进行初始化
r = (Trie *)malloc(sizeof(Trie));
for(int i = 0;i < MAX;i++){
r->next[i] = NULL;
}
}
void insert(Trie *root,char *word){
Trie *p = root;
while(*word != '\0'){
if(p->next[*word - 'a'] == NULL){
Trie *temp = (Trie *)malloc(sizeof(Trie));
for(int i = 0;i < MAX;i++){
temp->next[i] = NULL;
}
p->next[*word - 'a'] = temp;
}
p = p->next[*word - 'a'];
word++;
}
}
bool search(Trie *root,char *word){
Trie *p = root;
for(int i = 0;word[i]!='\0';i++){
if(p == NULL||p->next[word[i]-'a'] == NULL){
return false;
}
p = p->next[word[i]-'a'];
}
return true;
}
void del(Trie *root){//因为我们用到动态内存分配,不用了就还回去
for(int i = 0;i < MAX;i++){
if(root->next[i] != NULL){
del(root->next[i]);
}
}
free(root);
}
Trie树就是这样的一种数据结构,先来一段来自百度的定义性描述,它又称单词查找树,字典树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。Trie树再解决mou一类问题时真的是简单又好用。关于它的简单操作也不过是初始化,插入,查询,删除,下面依次给出一种简单的实现,在实际遇到的问题中可能需要增加某种字段或者进行别的怎样的扩展,这都是依题目而变的。
我们假设在这里我们面向的是由26个小写字母组成的字符串。
//因为我们考虑的是由26个小写字母组成的字符串
//具体问题还可以再变化,而这种变化往往是最难的
#define MAX 26
using namespace std;
//定义Trie树的节点
typedef struct Trie_Node{
struct Trie_Node *next[MAX];
}Trie;
Trie *r;//创造的Trie树的根节点的指针
void init(){//以r为根进行初始化
r = (Trie *)malloc(sizeof(Trie));
for(int i = 0;i < MAX;i++){
r->next[i] = NULL;
}
}
void insert(Trie *root,char *word){
Trie *p = root;
while(*word != '\0'){
if(p->next[*word - 'a'] == NULL){
Trie *temp = (Trie *)malloc(sizeof(Trie));
for(int i = 0;i < MAX;i++){
temp->next[i] = NULL;
}
p->next[*word - 'a'] = temp;
}
p = p->next[*word - 'a'];
word++;
}
}
bool search(Trie *root,char *word){
Trie *p = root;
for(int i = 0;word[i]!='\0';i++){
if(p == NULL||p->next[word[i]-'a'] == NULL){
return false;
}
p = p->next[word[i]-'a'];
}
return true;
}
void del(Trie *root){//因为我们用到动态内存分配,不用了就还回去
for(int i = 0;i < MAX;i++){
if(root->next[i] != NULL){
del(root->next[i]);
}
}
free(root);
}
相关文章推荐
- [数据结构]二分插入排序
- 数据结构中内部排序总结
- 数据结构(Java)——堆的应用
- 数据结构-- 向量--插值查找
- 冒泡排序
- 数据结构。顺序表
- 数据结构中的排序
- bzoj 2120 数颜色 树状数组套平衡树
- 最近邻算法和向量模型——第二部分——算法和数据结构
- 【数据结构】求最小生成树的权值之和——Prim算法
- 数据结构与算法-----单向线性链表(逆转和反向打印)
- 数据结构与算法-----堆栈-使用链表(链式结构)实现
- 网络设备驱动程序数据结构
- Linux USB驱动数据结构
- [数据结构]合并有序数组
- 数据结构实践—— 英文单词的基数排序
- 数据结构---线段树
- 数据结构实践——归并排序算法的改进
- 数据结构C++语言描述专题系列 (二) 栈
- 数据结构C++语言描述专题系列 (一) 绪论