字典树
1. 字典树
Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。2. 字典树的性质 【字典树】
典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。
Trie的核心思想是空间换时间。它能最大限度地减少无谓的字符串比较,利用字符串的公共前缀来降低查询时间的开销,查询效率比哈希树高。
文章图片
- 除了根节点外,每一个节点都只包含一个字符
- 每个节点的所有子节点包含的字符都不相同
- 从根节点到某个节点,路径上的字符连接起来,为该节点对应的字符串
public class Trie {
static class TrieNode {
// 表示当前节点的值
char value;
// 表示当前节点是否是终止节点(这里不是指叶子节点,是指是否为单词的结尾)
boolean flag;
// 表示当前节点的子节点的数组,不考虑大小写共有26个字母,所以初始化大小为26
TrieNode[] nextNodes = new TrieNode[26];
public TrieNode() {
}public TrieNode(char value) {
this.value = https://www.it610.com/article/value;
}
}/**
* 插入一个新单词
*
* @param root 根节点
* @param str 要插入的新单词
*/
public void insert(TrieNode root, String str) {
if (root == null || str == null || str.length() == 0) {
return;
}
for (int i = 0;
i < str.length();
i++) {
// index表示当前字符在字符表中的位置
int index = str.charAt(i) -'a';
// 如果该分支不存在,则创建一个新节点
if (root.nextNodes[index] == null) {
root.nextNodes[index] = new TrieNode(str.charAt(i));
}
// 把该节点赋给root,进入树的下一层
root = root.nextNodes[index];
}
// 设置当前节点为终止节点
root.flag = true;
}
}
4. 查找单词是否在字典树中存在
/**
* 查找一个单词是否存在
*
* @param root 根节点
* @param str 要查找的单词
*/
public boolean search(TrieNode root, String str) {
if (root == null || str == null || str.length() == 0) {
return false;
}
for (int i = 0;
i < str.length();
i++) {
// index表示当前的字符在中的字符表中的位置
int index = str.charAt(i) - 'a';
// 如果该分支不存在,则说明不存在该字符
if (root.nextNodes[index] == null) {
return false;
}
// 把当前节点赋给root,进入树的下一层
root = root.nextNodes[index];
}
// 如果当前节点是终止节点,则说明存在,否则不存在
return root.flag;
}
推荐阅读
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- java中如何实现重建二叉树
- 种树郭橐驼传(文言句式+古今异义+词类活用+通假字)
- 白杨树
- 08黑龙江迟淑荣弯柳树网络学院第五期学习赵宗瑞老师主讲的(传统文化与身心健康)教育体系心得体会
- 编写字典程序
- [原创]能见沂山一棵树,胜读十年无用书!
- 涵养字外功
- 2018.07.07《刺杀骑士团长》村上春树
- 二叉树路径节点关键值和等于目标值(LeetCode--112&LeetCode--113)