字典树-大量字符串前缀及出现次数是否存在统计(Trie树-java)算法实现

前言

       字典树又称单词查找树,它是一种树形结构,是一种哈希树的变种,典型应用是用于统计,保存大量的字符串(但不仅限于字符串),统计以是否有以某字符串最为前缀的字符串,有的话有多少,某字符串出现了多少次等,所以经常被搜索引擎系统用于文本词频统计。

       它与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没有该单词,如果在就在该字母的孩子节点里找是不是有单词的第二个字母,没有说明没有该单词,有的话用同样的方法继续查找.字典树不仅可以用来储存字母,也可以储存数字等其它数据。它的优势是,利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表还高,当数据足够庞大时,会发现她比传统的字符串统计要快很多。


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

       下边我将把我实现的代码和大家分享一下,代码几乎每行都有详细注释,大家一看就清除明了了,时间原因,就不再用多余的文字再追加详述了。

 

创建字典树

package Trie;

import org.apache.commons.lang3.StringUtils;

import com.google.common.base.CharMatcher;

/**
 * 字典树类
 * 
 * @author chenleixing
 */
public class Trie {

	//各个节点的子树数目即字符串中的字符出现的最多种类
	private final int SIZE = 26;
	//除根节点外其他所有子节点的数目
	private int numNode;
	//树的深度即最长字符串的长度
	private int depth;
	//字典树的根
	private TrieNode root;

	/**
	 * 初始化字典树
	 */
	public Trie() {
		this.numNode=0;
		this.depth=0;
		this.root = new TrieNode();
	}

	/**
	 * 字典树节点类,为私有内部类
	 */
	private class TrieNode {

		// 所有的儿子节点或者一级子节点
		private TrieNode[] son;
		// 有多少字符串经过或到达这个节点,即节点字符出现的次数
		private int numPass;
		// 有多少字符串通过这个节点并到此结束的数量
		private int numEnd;
		// 是否有结束节点
		private boolean isEnd;
		// 节点的值
		private char value;

		/**
		 * 初始化节点类
		 */
		public TrieNode() {
			this.numPass=0;
			this.nu
  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值