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. MYSQL中利用select查询某字段中包含以逗号分隔的字符串的记录方法

    首先我们建立一张带有逗号分隔的字符串. CREATE TABLE test(id int(6) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id),pname VARCH ...

  2. 进程池(Pool)

    进程池用于进程维护, 当使用时,将会去进程池取数据 from multiprocessing import Pool, Processimport os, time def f(i): time.sl ...

  3. Centos7搭建pptp一键安装脚本

    废话不多说,先上脚本地址:Centos7一键pptp 使用: wget http://files.cnblogs.com/files/wangbin/CentOS7-pptp-host1plus.sh ...

  4. 基于 tensorflow 的 mnist 数据集预测

    1. tensorflow 基本使用方法 2. mnist 数据集简介与预处理 3. 聚类算法模型 4. 使用卷积神经网络进行特征生成 5. 训练网络模型生成结果 how to install ten ...

  5. How a non-windowed component can receive messages from Windows

    Why do it? Sometimes we need a non-windowed component (i.e. one that isn't derived fromTWinControl) ...

  6. python 本地变量和全局变量 locals() globals() global nonlocal 闭包 以及和 scala 闭包的区别

    最近看 scala ,看到了它的作用域,特此回顾一下python的变量作用域问题. A = 10 B = 100 print A #10 print globals() #{'A': 10, 'B': ...

  7. 岭回归和lasso回归(转)

    回归和分类是机器学习算法所要解决的两个主要问题.分类大家都知道,模型的输出值是离散值,对应着相应的类别,通常的简单分类问题模型输出值是二值的,也就是二分类问题.但是回归就稍微复杂一些,回归模型的输出值 ...

  8. drupal 7.1 doc

    https://www.drupal.org/docs/8/api/database-api/dynamic-queries/count-queries https://www.drupal.org/ ...

  9. 前端知识--------HTML内容

    HTML介绍 1.web服务本质 import socket sk = socket.socket() sk.bind(('127.o.o.1',8080)) sk.listen() while 1: ...

  10. C++ auto

    auto用来声明自动变量.它是存储类型标识符,表明变量(自动)具有本地范围.块范围的变量声明(如for循环体内的变量声明)默认为auto存储类型. 好处:auto变量在离开作用域是会变程序自动释放,不 ...