字典树(Trie)



字典树:又称为Trie,是一种用于快速检索的多叉树结构。Trie把要查找的关键词看作一个字符序列,并根据构成关键词字符的先后顺序构造用于检索的树结构;一棵m度的Trie树或者为空,或者由m棵m度的Trie树构成。

注意:和二叉查找树不同的是,其节点并非存储一个元素。

优点:1、利用公共内存,以达到节约内存的目的

2、根节点只存储其子树,不存储字母

3、每个节点代表的字母都不同

基本定义:

typedef struct Node
{
    struct Node*child[26];
    int n;    //根据题意变化
}Trie;

时间复杂度:㏒n(虽然与二叉查找树的复杂度同为㏒n,但是其效率略优于二叉查找树)

字典树的结构示意:

相关题目:

hdu1251统计难题

hdu1075
What Are You Talking About

hdu1298
T9

hdu1800
Flying to the Mars

zoj
1109 Language of FatMouse

字典树实例:hdu1251统计难题

这是一道十分经典的字典树问题,但是这里大家在提交代码是一定要注意编译器的选择,如果选择g++的话,那么一定是爆内存的,所以提交的一定要选择C++。为什么呢,因为g++是64位版本的编译器,c++是32位的。也就是说同样多的指针,g++是c++的两倍。当然关于这个问题,仅限于hdu。之前我就是用g++上交,然后问题就来了,一直爆内存。最后知道还有这么一回事,然后才AC。白白浪费我一个晚上的时间来改错啊,说多了都是泪啊。

<span style="font-size:14px;">#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Node
{
    Node *child[26];
    int cnt;
}Trie;
Trie* root;      //定义根节点
Trie* addnode(){        //申请新的节点空间并初始化
    Trie* u = (Trie*)malloc(sizeof(Trie));
    for(int i = 0; i < 26; i++){
        u->child[i] = NULL;
    }
    return u;
}
void remove_tree(Trie* u){      //释放内存,一定要注意!!!
    if(u == NULL) return ;
    for(int i = 0; i < 26; i++)
        remove_tree(u->child[i]);
    free(u);
    u = NULL;
    return ;
}
void Insert(char *s){           //插入字符串,并计数
    Trie* u = root;
    for(int i = 0; i < strlen(s); i++){
        if(u->child[s[i]-'a'] == NULL){
            Trie* newnode = addnode();
            u->child[s[i]-'a'] = newnode;
            u = newnode;
            u->cnt = 1;
        }else{
            u = u->child[s[i]-'a'];
            u->cnt = u->cnt + 1;
        }
    }
}
int find(char *s){      //查找字符串
    Trie* u = root;
    for(int i = 0; i < strlen(s); i++){
        if(u->child[s[i]-'a']!=NULL)
            u = u->child[s[i]-'a'];
        else return 0;
    }
    return u->cnt;
}
int main(){
    int n;
    char s[15];
    root = addnode();   //创建根节点
    root->cnt = 0;      //进行初始化
    while(gets(s),strcmp(s,""))
        Insert(s);      //树的构建
    while(scanf("%s",s)!=EOF){
        n = find(s);
        printf("%d\n",n);
    }
    remove_tree(root);  //释放内存
    return 0;
}</span>
时间: 2024-12-29 13:36:43

字典树(Trie)的相关文章

[POJ] #1003# 487-3279 : 桶排序/字典树(Trie树)/快速排序

一. 题目 487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 274040   Accepted: 48891 Description Businesses like to have memorable telephone numbers. One way to make a telephone number memorable is to have it spell a memorable word or

字典树Trie

字典树Trie Trie,又称字典树,前缀树(prefix tree),是一种树形结构,用于保存大量的字符串. 它的优点是:利用字符串的公共前缀来节约存储空间.查找.插入复杂度为O(n),n为字符串长度. 它有3个基本性质: 1. 根节点不包含字符,除根节点外每一个节点都只包含一个字符. 2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串. 3. 每个节点的所有子节点包含的字符都不相同. 假设有abc,abcd,abd, b, bcd,efg,hii这7个单词,可构建字典树

字典树 Trie (HDU 1671)

Problem Description Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let's say the phone catalogue listed these numbers: 1. Emergency 911 2. Alice 97 625 999 3. Bob 91 12 54 26 In this

HDU 1247 Hat&#39;s words(字典树Trie)

解题思路: 判断给出的单词是否恰好由另外两个单词组成,用栈保存每个子字符串的节点,从这个节点出发判断剩下的字符串是否在字典树中即可. #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <map> #include <sta

字典树Trie树

一.字典树 字典树--Trie树,又称为前缀树(Prefix Tree).单词查找树或键树,是一种多叉树结构. 上图是一棵Trie树,表示了关键字集合{"a", "to", "tea", "ted", "ten", "i", "in", "inn"} .从上图可以归纳出Trie树的基本性质: 1. 根节点不包含字符,除根节点外的每一个子节点都包含一

『字典树 trie』

字典树 (trie) 字典树,又名\(trie\)树,是一种用于实现字符串快速检索的树形数据结构.核心思想为利用若干字符串的公共前缀来节约储存空间以及实现快速检索. \(trie\)树可以在\(O((n+m)*len)\)解决形如这样的字符串检索问题: 给定\(n\)个字符串,再给定\(m\)个询问,每次询问某个字符串在这\(n\)个字符串中出现了多少次 特点 \(trie\)树最显著的特点是,当它存储的若干个字符串有公共前缀时,它将不会重复存储. 与其他树形数据结构不同的是,\(trie\)树

hdu_1251统计难题(字典树Trie)

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 31479    Accepted Submission(s): 12087 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的

hdu 1075 What Are You Talking About 字典树 trie

What Are You Talking About Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/204800 K (Java/Others) Total Submission(s): 14703    Accepted Submission(s): 4724 Problem Description Ignatius is so lucky that he met a Martian yesterday. But

[转载]字典树(trie树)、后缀树

(1)字典树(Trie树) Trie是个简单但实用的数据结构,通常用于实现字典查询.我们做即时响应用户输入的AJAX搜索框时,就是Trie开始.本质上,Trie是一颗存储多个字符串的树.相邻节点间的边代表一个字符,这样树的每条分支代表一则子串,而树的叶节点则代表完整的字符串.和普通树不同的地方是,相同的字符串前缀共享同一条分支.还是例子最清楚.给出一组单词,inn, int, at, age, adv, ant, 我们可以得到下面的Trie: 可以看出: 每条边对应一个字母. 每个节点对应一项前

字典树(Trie Tree)

在图示中,键标注在节点中,值标注在节点之下.每一个完整的英文单词对应一个特定的整数.Trie 可以看作是一个确定有限状态自动机,尽管边上的符号一般是隐含在分支的顺序中的.键不需要被显式地保存在节点中.图示中标注出完整的单词,只是为了演示 trie 的原理. trie 中的键通常是字符串,但也可以是其它的结构.trie 的算法可以很容易地修改为处理其它结构的有序序列,比如一串数字或者形状的排列.比如,bitwise trie 中的键是一串位元,可以用于表示整数或者内存地址. Trie树是一种树形结