字典树 一种快速插入查询数据结构

定义

字典树,又称单词查找树,Trie树,是一种树形结构,典型应用是用于统计,排序和保存大量的字符串,所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度的减少无谓的字符串比较,查询效率比哈希表高。

解释

这个图片比较经典

就是在每一次边存的是字符,点标记着个点是否之前的边的字符都存在

如图存在的字符串有 abc abcd abd。。。。

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
int cnt;
struct  node
{
    int id;
    int prefix;//记录前缀个数
    node *next[26];//指向字典树下一层,如果全是小写字母是26这视情乱而定
    node(){
        for(int i=0;i<26;i++)
        next[i]=NULL;
        id =0;
        prefix=0;
    }//初始化
}*root;  

int  Insert(char *s){
    int len =strlen (s);
    node *p= root;
    for(int i=0;i<len;i++){
        int k=s[i]-‘a‘;
        if(p->next[k]==NULL){
            p->next[k]=new node();
        }
        p=p->next[k];
        p->prefix++;
    }
    if(p->id==0)
    return p->id=++cnt;
    return p->id;
}//插入并分配id  

int  find(char s[]){
    int len =strlen(s);
    node *p =root;
    for(int i=0;i<len;i++){
        p=p->next[s[i]-‘a‘];
    }
    return p->prefix;
}//查找此前缀是多少人的前缀  

int x;//记录总共有多少字符串参与了排序
int all[200];//记录排好序的id  

void output(node *p){
      if(p!=NULL){
           if(p->id!=0){
                all[x++]=p->id;
            }
        for(int i=0;i<26;i++){  

            if(p->next[i]){
            output(p->next[i]);
            }
        }
      }
}//字符串排序
int main(){
    cnt =0;
    root =new node();
    char s[100][100];
    char s2[100][100];
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%s",s[i]);
        printf("%d\n",Insert(s[i]));
        strcpy(s2[Insert(s[i])],s[i]);
    }
    for(int i=0;i<n;i++){
        printf("%d\n",find(s[i]));
    }
    /*排序后*/
    x=0;
    output(root);
    printf("%d\n",x);
    for(int i=0;i<x;i++){
        printf("%d %s\n",all[i],s2[all[i]]);
    }  

}  

一些题及其代码 戳我

版权声明:都是兄弟,请随意转载,请注明兄弟是谁

时间: 2024-10-18 01:25:06

字典树 一种快速插入查询数据结构的相关文章

【数据结构】前缀树/字典树/Trie

[前缀树] 用来保存一个映射(通常情况下 key 为字符串  value 为字符串所代表的信息) 例如:一个单词集合 words = {  apple, cat,  water  }   其中 key 为单词      value 代表该单词是否存在 words[ 'apple' ] = 存在     而     word[ ' abc' ] = 不存在 图示:一个保存了8个键的trie结构,"A", "to", "tea", "ted

字典树Trie树

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

hdu 4757 Tree(可持久化字典树)

题目链接:hdu 4757 Tree 题目大意:给定一棵树,每一个节点有一个值.如今有Q次询问,每次询问u到v路径上节点值与w亦或值的最大值. 解题思路:刚開始以为是树链剖分,事实上树链剖分仅仅是用来求LCA(能够不用树链剖分). 可持久化字典树.在每次插入的同一时候,不改动原先的节点.而是对全部改动的节点复制一个新的节点,而且在新的节点 上做操作,这样做的目的是可以获取某次改动前的状态.同过可持久化的操作,保留了改动前后的公共数据. 对给定树上的全部节点权值建立01字典树,然后每一个节点都保存

hdoj 1247 Hat’s Words(字典树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1247 思路分析:题目要求找出在输入字符串中的满足要求(该字符串由输入的字符串中的两个字符串拼接而成)的字符串. 对于长度为LEN的字符串,其可能由LEN种可能的拼接可能:现在问题转化为查找能够拼接成该字符串的可能的两个字符串是否都在 输入的字符串中,使用字典树可以实现快速的字符串查找,算法复杂度为O(N*M),N为输入字符串的个数,M为字符串长度. 代码如下: #include <cstdio>

hdu 1251 统计难题 字典树

// hdu 1251 统计难题 字典树 // // 题目大意: // // 有一系列的单词表,以空行结尾,之后会有一些字母串,找出以这些字符串 // 作为前缀的单词的个数 // // // 解题思路: // // 字典树 Trie,在插入字符串的时候每遇到一个节点,该节点的值++.查找的时候 // 字符串时,如果找到了,那么返回当前的val,否则返回0,因为没有以这个字符串 // 为前缀的单词. // // // 感悟: // // 这段时间想学学数据结构,就看了看刘老的大白书,感觉用数组挺巧

HDU 1298 T9(字典树+搜索)

题意:每组有n个字符串,每个串对应一个权值,给出一个手机按键表,每个数字键可对应按出几个字母,m个询问,给出一串数字(最后一位不计),求该数字串对应的权值最大的字符串(将数字串每个前缀对应的字符串输出): 思路:将n个字符串插入字典树,在串的查询操作上进行深搜以便更新最大值,并且每个数字对应几个字符,分别遍历一下.经典题. #include<cstdio> #include<cstring> #include<algorithm> using namespace std

【BZOJ2741】【FOTILE模拟赛】L 可持久化字典树+分块

广告: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44496739"); } 题解: 首先我们处理出来sum[0,n]作为异或前缀和,然后答案就不再是[l,r]中间某段区间的异或和,而转化成求了[l?1,r]中任意两点异或和的最大值. 然后我们分块处理出fi,j表示 [第i块的开头,j

【HDU 6191】Query on A Tree 【可持久化字典树】

题目 给出一棵有n个结点的树,树根是1,每个结点给出一个value.然后给出q个询问,每个询问给出两个整数u和x,你要在以u结点为根的子树中找出一个结点v,使得val[v] xor x最大, 并输出这个最大值 分析 显而易见的可持久化字典树,只不过这次每次查询不是查询一个区间,而是查询一棵子树.那么也很简单,我们只要预处理出dfs序然后找出每个结点以它为根的子树在dfs序中的区间.然后以这个区间建可持久化字典树就可以了. 1 #include <cstdio> 2 #include <c

【C/C++】字典树

引用书籍:<算法竞赛入门到进阶>清华大学出版社 字符串匹配问题 有这样一个字符串的问题:在n个字符串中查找某个字符串是否存在? 如果使用暴力的做法,逐个来匹配每个字符串,复杂度是O(nm),m是字符串的平均长度,这种做法效率很低. 字典树:在上述问题中,如果像查字典一样,比如要查找单词"dog",先翻到字典中d对应的部分,再按顺序查找'o'和'g'.效率要高很多,字典树就是模拟这种操作的数据结构. 例题(hdu 1251) 用map实现: #include<bits/