基本数据结构—Trie

理论知识与功能

定义

Trie(字典树),用于实现字符串的快速检索。其每个节点都含有若干个字符指针。

例如我在字典树里插入"abc","ac",那么就会生成一个这样丑陋的东西。

好吧是我的图画的丑陋

初始化

一棵空的Trie仅包含一个根节点,那么他的指针自然也指向空。

注:因为Trie运用在检索字符串,所以此处指针指代字符指针。

插入

对于需要插入的一个字符串S而言,我们令指针P指向根节点。然后依次扫描P中的每个字符c

1.若P的c字符指针指向空(即没有这个节点),则新建一个节点Q,令P的c字符指针指向Q,然后令P=Q。

2.若指向一个已存在的节点,直接让P=Q。

当S字符扫描完毕时,在当前节点P上标记他是一个字符串的末尾。

检索

对于需要检索的一个字符串S而言,我们令指针P指向根节点,然后依次扫描S中的每个字符c

1.若P的c指针指向空,则S没有被插入过Trie,返回False

2.若指向存在的节点,则P=Q

当S扫描完毕时,检查P是否被标记为一个字符的末尾。如果没有,就是False。否则为True

代码实现

int trie[Size][26],tot=1;
void insert(char* str){
    int len=strlen(str),p=1;
    for(int k=0;k<len;k++){
        int ch=str[k]-‘a‘;
        if(trie[p][ch]==0){
            trie[p][ch]=++tot;
        }
        p=trie[p][ch];
    }
    end[p]=true;
}
bool search(char* str){
    int len=strlen(str),p=1;
    for(int k=0;k<len;k++){
        p=trie[p][str[k]-‘a‘];
        if(p==0){
            return false;
        }
    }
    return end[p];
}

题中的Show Time

前缀统计 CH1601

就在我打算去写这个模板题题解之际,ContestHunter炸了???

好文章 2015模拟题

这道题Trie不是正解,但是可以拿到一定分数。

#include<iostream>
#include<cstring>
using namespace std;
const int Size=200100;
int trie[Size][26];
bool end[Size];
char S[Size];
int tot;
int ans;
int n,m;
bool Search(int pos){
    //int len=strlen(str),p=1;
    int len=m,p=1;
    for(int k=0;k<len;k++){
        p=trie[p][S[k+pos]-‘a‘];
        if(p==0){
            return false;
        }
    }
    return end[p];
}
void Insert(int pos){//char *str
    //int len=strlen(str),p=1;
    if(Search(pos)){
        //cout<<"重复"<<endl;
        return;
    }
    int len=m,p=1;
    for(int k=0;k<len;k++){
        int ch=S[pos+k]-‘a‘;
        if(trie[p][ch]==0){
            trie[p][ch]=++tot;

            //cout<<"p "<<p<<endl;
        }
        p=trie[p][ch];
    }
    end[p]=true;
    ans++;
}
int main(){
    //abc bca cab aba bac acb cba
    //string s;
    //freopen("B.in","r",stdin);
    //freopen("B.out","w",stdout);
    cin>>n>>m>>S;
    for(int i=0;i<=n-m;i++){
        //cout<<"运行"<<endl;
        Insert(i);
    }
    cout<<ans;
}

50分解法。但由于用到了Trie,所以粘了过来。据题解所述,Trie最高能拿70分,但抱歉我没有看懂。

原文地址:https://www.cnblogs.com/Uninstalllingyi/p/11185212.html

时间: 2024-10-17 02:07:17

基本数据结构—Trie的相关文章

【学习总结】数据结构-Trie/前缀树/字典树-及其最常见的操作

Trie/前缀树/字典树 Trie (发音为 "try") 或前缀树是一种树数据结构,用于检索字符串数据集中的键. 一种树形结构,是一种哈希树的变种. 典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高. 应用: 自动补全 END 原文地址:https://www.cnblogs.com/anliux/p/12590368.html

hdu5269 数据结构Trie

Memphis loves xor very musch.Now he gets an array A.The length of A is n.Now he wants to know the sum of all (lowbit(Ai xor Aj)) (i,j∈[1,n]) We define that lowbit(x)=2k,k is the smallest integer satisfied ((x and 2k)>0) Specially,lowbit(0)=0 Because

基本数据结构①——trie树

RT trie树是一种用于实现字符串的快速检索的树结构:大该是每个节点都有若干个指向字符的指针:如图: 好像看不清,不过没多大事: 然后trie树支持两个操作:插入,查找: 先放代码 struct data p=trie[p].son[ch]; } trie[p].have=true; } int f(char *s) { int len=strlen(s),p=0; for(int k=0;k<len;++k) { int ch=s[k]-'a'; if(!trie[p].son[ch]) r

数据结构~trie树(字典树)

1.概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. 我理解字典树是看了这位大佬博客.还不了解字典树的可以先进去学习一下 https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html 还有这个讲了下为什么用字典树,和其他的相比优缺点在哪 https://www.cnblogs.com/Allen-rg/p/7128518.html 现在来个题来更进一

【hdoj】1251 统计难题 【数据结构-Trie树裸题】

传送门:统计难题 题意: 字典树裸题. 分析 字典树板子,但是这题需要注意一点. 关于字典树的只是可以参考hihocoder hiho一下 第二周 用G++提交会爆内存(Memory Limit Exceeded),用c++提交可以AC. G++ 与 C++提交的区别 参考:OJ中的语言选项里G++ 与 C++的区别 C++是一门计算机编程语言,而G++则是C++的编译器. 选择C++意味着你将使用C++最标准的编译方式,也就是ANSI C++编译. 选择G++则意味这你使用GNU项目中适用人群

数据结构——trie树(字典树)

又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高. 模板题: 代码 #include<iostream> using namespace std; const int N = 200010; //用来存放子节点,idx是已经使用的结点下标 int son[N][26],idx;

B树、Trie树详解

查找(二) 散列表 散列表是普通数组概念的推广.由于对普通数组可以直接寻址,使得能在O(1)时间内访问数组中的任意位置.在散列表中,不是直接把关键字作为数组的下标,而是根据关键字计算出相应的下标. 使用散列的查找算法分为两步.第一步是用散列函数将被查找的键转化为数组的一个索引. 我们需要面对两个或多个键都会散列到相同的索引值的情况.因此,第二步就是一个处理碰撞冲突的过程,由两种经典解决碰撞的方法:拉链法和线性探测法. 散列表是算法在时间和空间上作出权衡的经典例子. 如果没有内存限制,我们可以直接

查找(二)简单清晰的B树、Trie树具体解释

查找(二) 散列表 散列表是普通数组概念的推广.因为对普通数组能够直接寻址,使得能在O(1)时间内訪问数组中的任何位置.在散列表中,不是直接把keyword作为数组的下标,而是依据keyword计算出对应的下标. 使用散列的查找算法分为两步.第一步是用散列函数将被查找的键转化为数组的一个索引. 我们须要面对两个或多个键都会散列到同样的索引值的情况.因此,第二步就是一个处理碰撞冲突的过程,由两种经典解决碰撞的方法:拉链法和线性探測法. 散列表是算法在时间和空间上作出权衡的经典样例. 假设没有内存限

poj2513 Colored Sticks (欧拉通路+Trie树+并查集)

D - Colored Sticks Crawling in process... Crawling failed Time Limit:5000MS     Memory Limit:128000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2513 Appoint description: System Crawler (2016-05-05) Description You are given a bunch