Trie树的C++简单实现

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,和记录相应的id
void 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和相应id
bool 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函数中我用一个字典来测试:
《Trie树的C++简单实现》

《Trie树的C++简单实现》

可以看到

96 well
98 down

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

    原文作者:Trie树
    原文地址: https://blog.csdn.net/a_Mao2016/article/details/78302776
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注