首先,要去定义一个单词树结构,先考虑我们需要的信息,每个节点应该包含的属性,节点常用属性定义如下
public class WordTree implements Comparable<WordTree>{ public WordTree leaf; //数组用来存储该节点所包含的所有子节点 public WordTree[] leafs; //当前节点存储了什么单词字符 public char c; //status 设三种状态,1: 不是单词,继续查找, 2:是单词,但是还可能匹配到更长的单词 3:是单词,当前已经是匹配到的最长单词 public int status; //改字段主要存储单词的一些附加信息,如词性等额外信息,用数组存储 public String[] params; //定义根节点数组容量 public final int MAX_SIZE = 65536;
考虑构造方法
//其实就是构造root节点 public WordTree(){ this.leafs = new WordTree [MAX_SIZE]; } public WordTree(char c){ this.c = c; } //这个主要用来构造子节点 public WordTree(char c, int status, String[] params){ this.c = c; this.status = status; this.params = params; }
在我们构造、查询字典树的时候,我们会经常需要遍历节点,这时就会频繁的查询该节点是否包含某个子节点,下面两个方法可以帮助我们实现这个功能
//根据字符获取当前节点的子节点编号 public int getLeafIdByChar(char c){ if(leafs == null){ return -1; } if(leafs.length == MAX_SIZE){ return c; } return WordTree.binarySearch(leafs, c); } /** * 根据字符c获取子节点对象 * @param c * @return */ public WordTree getLeafByChar(char c){ if(this.leafs == null){ return null; } if(leafs.length == MAX_SIZE){ return this.leafs[c]; } System.out.println(this.leafs.length); int id = WordTree.binarySearch(this.leafs, c); if(id<0){ return null; }else{ if(this.leafs[id] == null){ return null; }else{ return this.leafs[id]; } } }
最重要的就是为节点添加子节点了,需要考虑同事更新节点状态,来标识到哪个节点是一个完整的单词
/** * 为当前节点添加一个子节点 * @return */ @SuppressWarnings("unchecked") public WordTree addSubLeaf(WordTree subleaf){ WordTree leaf = this; WordTree tmpleaf = null; int subLeafId = leaf.getLeafIdByChar(subleaf.getC()); if(leaf.leafs == null){ leaf.leafs = new WordTree [0]; } //if this leaf always exists in this tree, wee need to updated status if needed if(subLeafId > -1){ tmpleaf = leaf.leafs[subLeafId]; if(tmpleaf == null){ tmpleaf = subleaf; } switch(subleaf.getStatus()){ case -1: tmpleaf.setStatus((char)1); break; case 1: if(tmpleaf.getStatus() == 3){ tmpleaf.setStatus(2); } break; case 3: if(tmpleaf.getStatus() != 2){ tmpleaf.setStatus(3); } tmpleaf.setParams(subleaf.getParams()); } leaf.leafs[subLeafId] = tmpleaf; return tmpleaf; } //if this leaf also not exists in this tree else{ WordTree[] tmpleafs = leaf.leafs; leaf.leafs = new WordTree [tmpleafs.length + 1]; int insertId = -(subLeafId+1); System.arraycopy(tmpleafs, 0, leaf.leafs, 0, insertId); System.arraycopy(tmpleafs, insertId, leaf.leafs, insertId+1, tmpleafs.length-insertId); leaf.leafs[insertId] = subleaf; return leaf.leafs[insertId]; } }
相关推荐
对双数纽Trie 树(Double-Array Trie)分词算法进行了优化:在采用Trie 树构造 双数纽Trie 树的过程中,优先处理分支节点多的结点,以减少冲突;构造一个空状态序列; 将冲突的结点放入Hash表中,不需要重新分配...
基于Trie树模仿谷歌百度搜索框提示。写的比较简单、代码漏洞之处欢迎指正。
2.1 优化双数组 Trie 树的建立过程 2 .1 .1 2 .1 .2 2 .1 .3 分词所需要的查询算法
ACM Trie树 模板,字典树模板,数据结构
基于trie树的中文拼音输入法的研究与实现,雷宇,,中文输入法是指为了将汉字输入计算机或手机等电子设备而采用的编码方法,是中文信息处理的重要技术,是电脑中的必备软件。在PC平�
嵌入式系统中基于trie树的拼音输入法的实现,李巧红,,介绍一种中文拼音输入法的实现方式,着重讨论了字库的设计及基于Trie树检索方法的实现。Trie树是基于关键码空间分解的树结构,其内�
傻傻分不清楚Trie树,又称字典树,是一种树形数据结构被广泛用于字符串的统计Trie树的构造Trie树节点的每个儿子都代表一个字母那么就可以用某节点到根的路径来
Trie树,又称字典树或前缀树,关于它的结构就不详细介绍了。Trie树在单词统计、前缀匹配等很多方面有很大用处。下面这篇文章主要介绍了Trie树,以及Java实现如何Trie树,有需要的朋友可以参考借鉴,下面来一起看看吧...
基于Trie树的搜索提示设计与实现,杜星,王洪波,本文重点讨论用Trie树的方式实现从内存中检索完成搜索提示。首先介绍了传统英文Trie树的建立方法,讨论了常用英文Trie树中使用定长数
一个简单的C语言程序:用Trie树实现词频统计和单词查询
hash trie树 字典树,完整的sdk开发包 具有说明文档
对双数组Trie树(Double-Array Trie)...然后,利用这些方法构造了一个中文分词系统,并与其他几种分词方法进行对比,结果表明,优化后的双数组Trie树插入速度和空间利用率得到了很大提高,且分词查询效率也得到了提高.
Trie树是搜索树的一种,来自英文单词"Retrieval"的简写,可以建立有效的数据检索组织结构,是中文匹配分词算法中词典的一种常见实现。它本质上是一个确定的有限状态自动机(DFA),每个节点代表自动机的一个状态。在...
基于Java链表实现的字典树(trie),实现了增删改查等功能,它说摘要必须大于50字我还能说啥啥啥啥
3、基于Trie树SDK可以开发以下功能 1)查询 2)分类统计 3)集合(交集、并集)运算 4)快速排序 5)前缀匹配 6)中文分词 7)关键词过滤 8)ip路由 9)中文输入法 10)消息路由 11)消息队列 12)超大规模时钟 13)...
很容易上手的Trie树入门,特别适合于acm初学者
Trie实现英文分词的相关算法,包括Trie树的构造等等等
trie.c中定义了trie树的操作函数; trie.h为相应的头文件; test.c用于测试相关的函数。 在trie.c中,关于查找定义了两个函数,一个是find(),一个是search(),二者的区别是,前者仅判断一个字符串是否在树中出现,...
基于Trie树和Memcached的搜索引擎架构,陈如建,李昕,本文介绍一种搜索引擎智能弹出提示字符串的实现方式,着重讨论了如何使用存储在集群中的Trie树和Memcached来实现搜索引擎弹出提示字��
用Python实现Trie树的应用,并可以对英汉词典进行导入和检索、添加和删除,最终可以将导入的英汉词典保存到本地磁盘。内附两个.py文件,分别是tree.py和d_gui.py,tree.py是类和方法,d_gui.py是图形界面;一个.txt...