前缀树学习
来源:互联网 发布:网络摄像头一天多少g 编辑:程序博客网 时间:2024/05/17 01:42
Trie(也叫前缀树)
Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。
Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。
它有3个基本性质:
1,根节点不包含字符,除根节点外每一个节点都只包含一个字符。
2,从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
3,每个节点的所有子节点包含的字符都不相同。
前缀树模板:
#include"iostream"#include"string.h"using namespace std;const int maxnode=1e4;const int size=30;struct trie{ int ch[maxnode][size]; //保存子节点 int val[maxnode]; int sz; //节点总数 trie() //初始时只有一个根节点 { sz=1; memset(ch[0],0,sizeof(ch[0])); } int idx(char c) //将char型转化为int型 { return c-'a'; } void insert(char *s,int v)//插入字符串s,字符串附加信息为v,当val[u]!=0代表该字符串结束 { int u=0; int l=strlen(s); for(int i=0;i<l;i++) { int c=idx(s[i]); if(!ch[u][c]) //如果节点不存在 { memset(ch[sz],0,sizeof(ch[sz])); ch[u][c]=sz++; //创建新的节点 val[u]=0; //中间节点无附加信息 } u=ch[u][c]; //向下走 } val[u]=v; //字符串尾加上附加信息v } bool find(char *s) //判断s是否为已插入字符串的前缀 { int u=0; int l=strlen(s); for(int i=0;i<l;i++) { int c=idx(s[i]); if(!ch[u][c]) return false; u=ch[u][c]; } return true; }};int main(){ trie jj; char ai[][30]={"明明","静静","你是猪吗","张老三我问你你的家在哪里"}; for(int i=0;i<4;i++) { jj.insert(ai[i],1); } cout<<jj.find("张老三我问你")<<endl; return 0;}
阅读全文
1 0
- 前缀树学习
- 前缀树
- 前缀树
- 前缀树
- 前缀树
- 前缀树
- 前缀树
- 前缀树
- 汇编学习笔记-段前缀
- 前缀、中缀、后缀表达式学习
- 前缀树、后缀树
- trie树(前缀树)
- 前缀树,Trie树
- HDU 1237 前缀树
- Perl 前缀树实现
- 简单前缀树
- Trie前缀树
- uva1401 前缀树
- Unity3D之Mecanim动画系统学习笔记(五):Animator Controller
- codeforces——500A—— New Year Transportation
- Android备忘录 -- 布局方式
- angular-ui-tree
- 一次完整的http请求
- 前缀树学习
- 初识菜单
- 贪吃蛇游戏
- 碰撞检测:圆的碰撞运动,关键在于碰撞后速度的分解问题
- 秒杀活动的解决思路
- libtool
- HashMap接口
- C++中的单例模式
- 数组表示的大整数加1-----plus one