字典树(Trie树)

字典树(Trie树)
字典树,又称单词查找树,Trie树,是一种树形结构,典型应用是用于统计,排序和保存大量的字符串,所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度的减少无谓的字符串比较,查询效率比哈希表高。


它有三个基本性质,根节点不包含字符,除根节点外每一个节点都只包含一个字符,从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串,每个节点的所有子节点包含的字符都不相同。

字典树的插入,删除和查找都非常简单,用一个一重循环即可。
1. 从根节点开始一次搜索
2. 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索
3. 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索
4. 迭代过程...
5. 在某个节点处,关键词的所有字母已被取出,则读取附在该节点上的信息,即完成查找

字典树的应用
1.字典树在串的快速检索中的应用。
给出N个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。
在这道题中,我们可以用数组枚举,用哈希,用字典树,先把熟词建一棵树,然后读入文章进行比较,这种方法效率是比较高的。

2. 字典树在“串”排序方面的应用
给定N个互不相同的仅由一个单词构成的英文名,让你将他们按字典序从小到大输出
用字典树进行排序,采用数组的方式创建字典树,这棵树的每个结点的所有儿子很显然地按照其字母大小排序。对这棵树进行先序遍历即可

3. 字典树在最长公共前缀问题的应用
对所有串建立字典树,对于两个串的最长公共前缀的长度即他们所在的结点的公共祖先个数,于是,问题就转化为最近公共祖先问题。

 

字典树的基本功能是用来查询某个单词(前缀)在所有单词中出现次数的一种数据结构,它的插入和查询复杂度都为O(len),Len为单词(前缀)长度,但是它的空间复杂度却非常高,如果字符集是26个字母,那每个节点的度就有26个,典型的以空间换时间结构。 

基本模版

1、结构体定义:

struct node
{
int flag;//标记变量
int count;//记录字符出现次数
struct node *next[N];
}tree[maxn];

2、新节点建立

复制代码
int t=0;
struct node *creat()
{
int i;
struct node *p;
p=&tree[t++];
p->count=1;
p->flag=0;
for(i=0;i<N;i++)
{
p->next[i]=NULL;
}
return p;
}
复制代码

3、插入

复制代码
void insert(struct node **root,char *s)
{
int i,k;
struct node *p;
if(!(p=*root))
{
p=*root=creat();
}
i=0;
while(s[i])
{
k=s[i++]-'a';
if(p->next[k])
p->next[k]->count++;
else
p->next[k]=creat();
p=p->next[k];
}
p->flag=1;
}
复制代码

 

 

4、查找

 

复制代码
int search(struct node **root,char *s)
{
int i=0,k;
struct node *p;
if(!(p=*root))
{
return 0;
}
while(s[i])
{
k=s[i++]-'a';
if(!(p->next[k]))
return 0;
p=p->next[k];
}
return p->flag;//return p->count;
}
复制代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【java机器学习】svm入门十讲

博客&#xff1a;http://www.blogjava.net/zhenandaci/archive/2009/03/06/258288.html

Java解析json出现双引号变成转义字符解决办法

Java中&#xff1a;利用StringEscapeUtils.unescapeHtml4强转 String newJson StringEscapeUtils.unescapeHtml4(jsonStr);

棋盘问题 dfs

棋盘问题Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 38265 Accepted: 18742 Description 在一个给定形状的棋盘&#xff08;形状可能是不规则的&#xff09;上面摆放棋子&#xff0c;棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列…

JedisConnectionException: java.Net.SocketTimeoutException: Read timed

jedis操作&#xff1a;https://blog.csdn.net/shuaiOKshuai/article/details/23266091 jedisPool操作&#xff1a;https://blog.csdn.net/gongxinju/article/details/53909239

jedisPool的使用

遇到的问题&#xff1a; 一开始做项目一直用的是jedis对象连接&#xff0c;今天发现自己上线的项目抛出了异常:JedisConnectionException: java.Net.SocketTimeoutException: Read timed和和java.lang.ClassCastException: [B cannot be cast to java.util.List。 异常解释&…

ssdb教程

常见问题解答&#xff1a;http://ssdb.io/docs/zh_cn/faq.html https://www.w3xue.com/server/ssdb/ssdb-comlist.html http://ssdb.io/docs/zh_cn/commands/index.html https://www.w3cschool.cn/ssdb/xd2leud8.html

java ssdb 操作link遍历map的两种方式

方法一&#xff1a;不推荐使用&#xff0c;只会返回map中的key Link link ssdb.link; resp link.request("qpush", "q", "a");for(int i1; i<resp.raw.size(); i2){ String s new String(resp.raw.get(i)); System.out.println(s); }方法…

FileOutputStream为false时候注意的问题

今天写代码时候发现&#xff0c;new FileOutputStream(new File(“test.txt”), false)时候test.txt文件内容会清空&#xff0c;记录一下&#xff01;

java文件重命名有趣实验

Testpublic void filetest() throws Exception {//判断文件会写入到哪个文件内File file new File("test.txt");file.renameTo(new File("test1.txt"));FileOutputStream out new FileOutputStream(file);out.write("ok".getBytes());out.clos…

网络流之最大流算法(EdmondsKarp)

网络流之最大流算法&#xff08;EdmondsKarp&#xff09; 标签&#xff1a; 网络流算法EdmondsKarp流量最大流2014-03-11 18:05 34795人阅读 评论(12) 收藏 举报分类&#xff1a;图论~~网络流&#xff08;26&#xff09; 版权声明&#xff1a;本文为博主原创文章&#xff0c;未…

java文件流操作注意

今天做了一个测试&#xff1a; Testpublic void fileOut() throws Exception {FileOutputStream out new FileOutputStream(new File("test.txt"), false);out.write("1".getBytes());out.write("2".getBytes());File file new File("tes…

try代码块中出现异常后try内程序会继续执行还是直接抛出异常?

Testpublic void excp() {try {int i 1/0;System.out.println(1);}catch (Exception e) {e.printStackTrace();// TODO: handle exception}System.out.println(22);}输出&#xff1a; java.lang.ArithmeticException: / by zero at task.ExceedActiveTimeClearTask.excp(Excee…

java文件重命名失败问题

我记得之前也遇到这个问题后来找了几个小时才找到问题&#xff0c;这次又花了一个小时找出这个问题&#xff0c;发现是自己的文件流没有关闭&#xff0c;一定要切记&#xff0c;当对文件重命名操作的时候一定要先把操作改文件的文件流关闭之后再进行重命名的操作&#xff0c;切…

equalsignorecase用法

来源&#xff1a;百度知道 解释&#xff1a; public boolean equalsIgnoreCase(String anotherString)将此 String 与另一个 String 进行比较&#xff0c;不考虑大小写。如果两个字符串的长度相等&#xff0c;并且两个字符串中的相应字符都相等&#xff08;忽略大小写&#xf…

利用TF-IDF提取新闻文章摘要

文章&#xff1a;http://www.ruanyifeng.com/blog/2013/03/automatic_summarization.html

【转载】LinkedHashMap和HashMap区别

HashMap,LinkedHashMap,TreeMap都属于Map Map 主要用于存储键(key)值(value)对&#xff0c;根据键得到值&#xff0c;因此键不允许键重复,但允许值重复。 HashMap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值&#xff0c;具有很快的访问速度。…

java英文拼写检查并自动纠正

SpellCorrect原理&#xff1a;https://www.cnblogs.com/jianxinzhou/p/4740392.html 项目源码&#xff1a; package com.xq.algorithm;import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import j…

java Trie实现英文单词查找树 搜索自动提示

原理解释文章&#xff1a;https://blog.csdn.net/beiyetengqing/article/details/7856113 代码应用&#xff1a; wordTrie.txt(工具类)&#xff1a; package com.xq.algorithm;import java.util.ArrayList; import java.util.List;/*** * <p>Title:</p>* <p>…

java HashMap实现中文分词器 应用:敏感词过滤实现

今天下午部门内部技术分享是分词器算法。这次的主讲是大名鼎鼎的Ansj分词器的作者-孙健。 作者简介&#xff1a; Ansj分词器作者 elasticsearch-sql&#xff08;elasticsearch的sql插件&#xff09;作者&#xff0c;支持sql查询 nlp-lang自然语言工具包发起人 NLPCN&#xff…

java字典树(Trie)实现中文模糊匹配

原理解释&#xff1a; java实现&#xff1a;https://blog.csdn.net/yuhk231/article/details/51539840 c实现&#xff1a;https://blog.csdn.net/qq_31175231/article/details/77827324 代码模板&#xff1a;缺点&#xff0c;只能检索出在一个分支中的前缀匹配内容 package co…