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
你们也可以自己下载来试试哦
字典下载
阅读全文
0 0
- Trie 树的简单实现
- trie 树的简单实现
- 简单的trie实现
- 一个Trie字典树的简单实现
- 一个简单的Trie树实现
- 一个Trie树的简单实现
- 字典树(Trie)的简单实现
- Trie树的C++简单实现
- Trie 前缀树的c 实现
- Trie前缀树简单实现
- Trie树的实现
- Trie树的实现
- Trie树的简单实现(Java版本)
- 字典树(Trie树)的C程序实现代码
- 最简单的trie树
- Trie树的简单应用
- Trie Tree简单实现
- 初识Trie树--最简单的Trie树介绍
- Android应用开发—重载fragment构造函数导致的lint errors
- Android Binder机制(超级详尽)
- 基于阿里移动端积木框架Tangram自定义首页卡片
- 一种在智能对话中实现上下文功能的方法
- 数组排序,交换法,选择法
- Trie树的C++简单实现
- HDU
- 队列在多线程中使用
- Unix-Linux编程实践教程——第三章
- centos7.3安装Apache
- 阿里巴巴Java开发规约插件全球首发
- 1067. 试密码(20)
- 实用命令
- 一张图看懂新一代人工智能知识体系