Trie树的C++简单实现

来源:互联网 发布:蜻蜓飞行原理知乎 编辑:程序博客网 时间:2024/06/05 17:42

Trie是一种用来高效保存字符串的数据结构,是AC自动机多模匹配算法的基础

#include<iostream>#include<stdio.h>#include<string>#include<string.h>using namespace std;#define maxnode 10000//Trie树中的节点数#define sigma 26//26个小写英文字幕//Trie类class Trie{public:    int ch[maxnode][sigma];//ch[m][n]表示第m个节点的第n个子节点    int v[maxnode];//记录字符串id的数组    int sz;//当前节点数    Trie(){sz=1;memset(ch[0],0,sizeof(ch[0]));}    idx(char ch){return ch-'a';}//计算ch字符的位置的简单函数};//树根Trie R;//插入一个字符串s,和记录相应的idvoid insert(string s, int id){    int l = s.length();    int u = 0;    for(int i=0;i<l;i++){        if(R.ch[u][R.idx(s[i])] == 0){//若该节点不存在            R.ch[u][R.idx(s[i])] = R.sz++;            R.v[u] = 0;            u = R.ch[u][R.idx(s[i])];            memset(R.ch[u],0,sizeof(R.ch[u]));        }else{//若该节点存在,继续沿树边往下走            u = R.ch[u][R.idx(s[i])] ;        }    }    R.v[u] = id;//达到字符串的末尾,记录该字符串的id}//查找函数,找得到则返回布尔值true和相应idbool search(string s, int &id){    int l = s.length();    int u = 0;    for(int i=0;i<l;i++){        if(R.ch[u][R.idx(s[i])] != 0)            u = R.ch[u][R.idx(s[i])];        else            return 0;    }    id = R.v[u];    return id;}    //用一个字典来测试int main(){    freopen("input.txt","r",stdin);    string str;    int id;    for(int i=0;i<2000;i++){        cin >> id >> str;        //cout << id<<"  "<< str<<endl;        insert(str,id);    }    string test[5] = {"well","rock","sun","hello","down"};    for(int i=0;i<5;i++){        id = 0;        if(search(test[i],id)){            cout <<test[i]<<" "<<id << endl;``````    }else{            cout << "NOT FIND" <<endl;        }    }} 

main函数中我用一个字典来测试:
运行结果

这里写图片描述

可以看到

96 well
98 down

你们也可以自己下载来试试哦
字典下载

原创粉丝点击