Trie树的原理

  Trie树也称字典树,因为其效率很高,所以在在字符串查找、前缀匹配等中应用很广泛,其高效率是以空间为代价的。

  利用串构建一个字典树,这个字典树保存了串的公共前缀信息,因此可以降低查询操作的复杂度。下面以英文单词构建的字典树为例,这棵Trie树中每个结点包括26个孩子结点,因为总共有26个英文字母(假设单词都是小写字母组成)。

详细介绍请参考:http://www.cnblogs.com/dolphin0520/archive/2011/10/11/2207886.html 等

字典树模版(Java)

 /**
* 字典树模版,默认只包含26个小写字母
* 提供hasStr、insert、countPrefix、preWalk、getRoot接口
* @author
*/
public class TrieTree { private final int SIZE = 26; //每个节点能包含的子节点数,即需要SIZE个指针来指向其孩子
private Node root; //字典树的根节点 /**
* 字典树节点类
* @author Lenovo
*/
private class Node {
private boolean isStr; //标识该节点是否为某一字符串终端节点
private int num; //标识经过该节点的字符串数。在计算前缀包含的时候会用到
private Node[] child; //该节点的子节点 public Node() {
child = new Node[SIZE];
isStr = false;
num = 1;
}
} public TrieTree() {
root = new Node();
} /**
* 检查字典树中是否完全包含字符串word
* @param word
* @return
*/
public boolean hasStr(String word) {
Node pNode = this.root; //逐个字符去检查
for (int i = 0; i < word.length(); i++) {
int index = word.charAt(i) - 'a';
//在字典树中没有对应的节点,或者word字符串的最后一个字符在字典树中检测对应节点的isStr属性为false,则返回false
if (pNode.child[index] == null
|| (i + 1 == word.length() && pNode.child[index].isStr == false)) {
return false;
}
pNode = pNode.child[index];
} return true;
} /**
* 在字典树中插入一个单词
* @param word
*/
public void insert(String word) {
if (word == null || word.isEmpty()) {
return;
}
Node pNode = this.root;
for (int i = 0; i < word.length(); i++) {
int index = word.charAt(i) - 'a';
if (pNode.child[index] == null) { //如果不存在节点,则new一个一节点插入字典树
Node tmpNode = new Node();
pNode.child[index] = tmpNode;
} else {
pNode.child[index].num++; //如果字典树中改路径上存在节点,则num加1,表示在该节点上有一个新的单词经过
}
pNode = pNode.child[index];
}
pNode.isStr = true;
} /**
* 统计在字典树中有多少个单词是以str为前缀的
* @param str
* @return
*/
public int countPrefix(String str) {
Node pNode = this.root;
for (int i = 0; i < str.length(); i++) {
int index = str.charAt(i) - 'a';
if (pNode.child[index] == null) {
return 0;
} else {
pNode = pNode.child[index];
}
} return pNode.num;
} /**
* 先序遍历
* @param root
*/
public void preWalk(Node root) {
Node pNode = root;
for (int i = 0; i < SIZE; i++) {
if (pNode.child[i] != null) {
System.out.print((char) ('a' + i) + "--");
preWalk(pNode.child[i]);
}
}
} /**
* 返回字典树根节点
* @return
*/
public Node getRoot() {
return root;
} }

字典树Java实现的更多相关文章

  1. 字典树(Trie)的java实现

    一.定义 字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用 ...

  2. 字典树(前缀树)-Java实现

    字典树 字典树是一种树形结构,优点是利用字符串的公共前缀来节约存储空间.在这提供一个自己写的Java实现,非常简洁. 根节点没有字符路径.除根节点外,每一个节点都被一个字符路径找到. 从根节点到某一节 ...

  3. 标准Trie字典树学习二:Java实现方式之一

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! 系列文章: 1. 标准Trie字典树学习一:原理解析 2.标准T ...

  4. java——字典树 Trie

    字典树是一种前缀树 package Trie; import java.util.TreeMap; public class Trie { private class Node{ public boo ...

  5. Trie树(字典树)的介绍及Java实现

    简介 Trie树,又称为前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串.与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定.一个节点的所有子孙都有相同的前缀,也 ...

  6. trie字典树详解及应用

    原文链接    http://www.cnblogs.com/freewater/archive/2012/09/11/2680480.html Trie树详解及其应用   一.知识简介        ...

  7. HDU1671 字典树

    Phone List Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. *HDU1251 字典树

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

  9. hdu 1247:Hat’s Words(字典树,经典题)

    Hat’s Words Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

随机推荐

  1. onMouseDown和onPress的差异AS2

    為了要做出比Button物件更複雜的互動,我們通常會改用MovieClip來製作按鈕.如此一來,就需要處理event handler.與滑鼠有關的MovieClip event handler包括on ...

  2. C# 事件 event 【转】

    C#事件(event)解析   事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂.而这些东西却往往又是编程中常用且非常重要的东西.大家都知道windows消息处理机制的重要, ...

  3. Mysql 知识(1)

    1. 请简洁地描述下MySQL中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别? 答: SQL标准定义的四个隔离级别为:read uncommited,read committed,rep ...

  4. ARMV7,ARMV8

    ARMV7是32位,2011年出了ARMV8,是64位架构,IPHONE5S以上都是64位架构,说明是使用ARMV8??

  5. 吴裕雄 实战PYTHON编程(8)

    import pandas as pd df = pd.DataFrame( {"林大明":[65,92,78,83,70], "陈聪明":[90,72,76, ...

  6. django中怎么使用mysql数据库的事务

    Mysql数据库事务: 在进行后端业务开始操作修改数据库时,可能会涉及到多张表的数据修改,对这些数据的修改应该是一个整体事务,即要么一起成功,要么一起失败. Django中对于数据库的事务,默认每执行 ...

  7. 内核线程和用户线程(SMP)

    用户级和内核级线程 用户级线程:任何应用程序都可以通过使用线程库设计成多线程程序.线程库是用于用户级线程管理的一个例程句,它包含用于创建和销毁线程的代码.在线程间传递消息和数据的代码.调度线程执行的代 ...

  8. Linux 软件 安装到 /usr,/usr/local/ 还是 /opt 目录

    Linux 的软件安装目录是也是有讲究的,理解这一点,在对系统管理是有益的 /usr:系统级的目录,可以理解为C:/Windows/,/usr/lib理解为C:/Windows/System32./u ...

  9. centos 系统下彻底删除mysql

    yum remove mysql mysql-server mysql-libs compat-mysql51 rm -rf /var/lib/mysql (删除数据库) rm /etc/my.cnf ...

  10. Python3 ord() 函数

    Python3 ord() 函数  Python3 内置函数 描述 ord() 函数是 chr() 函数(对于 8 位的 ASCII 字符串)的配对函数,它以一个字符串(Unicode 字符)作为参数 ...