前缀树及其Java实现
前缀树
基础知识
Trie树。又称之为单词查找树或者键树,是一种树形结构。应用于统计和排序大量的字符串。常被搜索引擎系统用于文本词频统计。它的优点:能够最大限度的减少无谓的字符串比较,查询效率比哈希表高。
核心思想是以空间换时间。利用记录字符串公共前缀来降低查询时间的开销。
3个基本性质
- 根节点不包含字符,除根节点外每一个节点都只包含一个字符。
- 从根节点到某一节点,路径上经过的字符连接起来,为该节点所对应的字符串
- 每个节点的所有子节点所包含的字符都不同。
- 每个节点对应一个前缀,叶节点对应最长前缀,即单词本身。
功能
应该实现查询,插入,前缀查询的功能。
数据结构组成
Trie,又称前缀树或字典树,是一棵有根树,其每个节点包含以下字段:
指向子节点的指针数组children。对于本题而言,数组长度为26,即小写英文字母的数量。此时children[0]对应小写字母 a。
布尔字段isEnd,表示该节点是否为字符串的结尾。
实现
插入
我们从字典树的根开始,插入字符串。对于当前字符对应的子节点,有两种情况:
- 子节点存在。沿着指针移动到子节点,继续处理下一个字符。
- 子节点不存在。创建一个新的子节点,记录在children数组的对应位置上,然后沿着指针移动到子节点,继续搜索下一个字符。
重复以上步骤,直到处理字符串的最后一个字符,然后将当前节点标记为字符串的结尾。
查找前缀
我们从字典树的根开始,查找前缀。对于当前字符对应的子节点,有两种情况:
子节点存在。沿着指针移动到子节点,继续搜索下一个字符。
子节点不存在。说明字典树中不包含该前缀,返回空指针。
重复以上步骤,直到返回空指针或搜索完前缀的最后一个字符。
若搜索到了前缀的末尾,就说明字典树中存在该前缀。此外,若前缀末尾对应节点的isEnd为真,则说明字典树中存在该字符串。
查找
实现了查找前缀的函数,就可以直接调用这个函数,检查返回的node是否不为空且是叶子节点。若是则说明此时的字符串存在,不然就不存在。
package JavaCode.leetcode.DataStructure.Tree;
class Trie {
//Trie的两个属性,指向子节点的指针数组和表示该节点是否为结尾的布尔值
private Trie[] children;
private boolean isEnd;
//构造
public Trie() {
children = new Trie[26];
isEnd = false;
}
//插入节点。
public void insert(String word) {
Trie node = this;//指针指向当前的根
for (int i = 0; i < word.length(); i++) {
char ch = word.charAt(i);//待插入的字符
int index = ch - 'a';//参数
//当前的节点为null,就新建一个节点
if (node.children[index] == null) {
node.children[index] = new Trie();
}
//当前节点不为null,就将node沿指针移动到子节点
node = node.children[index];
}
//完成插入后,就将此时node所指向的节点isEnd置为true
node.isEnd = true;
}
//查询前缀树中是否含有本字符串,使用查询前缀和的函数得到节点node,
//若返回的node不为null,则说明找到了word的前缀,且如果此时isEnd为true,说明node是叶子
//则说明此时的word存在于前缀树中。
public boolean search(String word) {
Trie node = searchPrefix(word);
return node != null && node.isEnd;
}
//查询前缀
public boolean startsWith(String prefix) {
//只要返回值不为null,说明搜索到了前缀的末尾就为true,否则为false
return searchPrefix(prefix) != null;
}
private Trie searchPrefix(String prefix) {
Trie node = this;//指针指向当前的根
for (int i = 0; i < prefix.length(); i++) {
//当前访问的字符及其参数
char ch = prefix.charAt(i);
int index = ch - 'a';
//访问的节点不存在,就返回一个null
if (node.children[index] == null) {
return null;
}
//访问的节点存在,就沿着指针指向的节点移动
node = node.children[index];
}
return node;//最后搜索到了末尾就返回这个末尾的节点,说明存在这个前缀
}
}
前缀树及其Java实现的更多相关文章
- [leetcode] 208. 实现 Trie (前缀树)(Java)
208. 实现 Trie (前缀树) 实现Trie树,网上教程一大堆,没啥可说的 public class Trie { private class Node { private int dumpli ...
- 字典树(前缀树)-Java实现
字典树 字典树是一种树形结构,优点是利用字符串的公共前缀来节约存储空间.在这提供一个自己写的Java实现,非常简洁. 根节点没有字符路径.除根节点外,每一个节点都被一个字符路径找到. 从根节点到某一节 ...
- Java实现 LeetCode 208 实现 Trie (前缀树)
208. 实现 Trie (前缀树) 实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作. 示例: Trie trie = new Trie() ...
- Trie 树 及Java实现
来源于英文“retrieval”. Trie树就是字符树,其核心思想就是空间换时间. 举个简单的例子. 给你100000个长度不超过10的单词.对于每一个单词,我们要判断他出没出现过,如果出现 ...
- python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie)
python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie) 主要包括两部分内容:(1)利用python中的dict实现Trie:(2) ...
- 双数组Trie树(DoubleArrayTrie)Java实现
http://www.hankcs.com/program/java/%E5%8F%8C%E6%95%B0%E7%BB%84trie%E6%A0%91doublearraytriejava%E5%AE ...
- Trie(前缀树/字典树)及其应用
Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree.当然很多名字的意义其实有交 ...
- 208 Implement Trie (Prefix Tree) 字典树(前缀树)
实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个方法.注意:你可以假设所有的输入都是小写字母 a-z.详见:https://leetcode.co ...
- 【数据结构】关于前缀树(单词查找树,Trie)
前缀树的说明和用途 前缀树又叫单词查找树,Trie,是一类常用的数据结构,其特点是以空间换时间,在查找字符串时有极大的时间优势,其查找的时间复杂度与键的数量无关,在能找到时,最大的时间复杂度也仅为键的 ...
随机推荐
- openssl查看证书命令
openssl x509部分命令打印出证书的内容:openssl x509 -in cert.pem -noout -text打印出证书的系列号openssl x509 -in cert.pem -n ...
- Vulhub-DC-3靶场
Vulhub-DC-3靶场 前言 今天把DC-3的靶场打了一遍,可以说这个靶场用到的思路是非常经典的,从信息搜集到漏洞利用包括内核提权.最最重要的是为了下载它的提权EXP,我它喵还花了一块二买了个CS ...
- 为什么大部分的Android开发成为不了架构师
小团队一般 10 人左右,其中常常是技术最牛的人做架构师(或TL).所以,架构师在广大码农中的占比大概平均不到 10%.而架构师也可以分为初级.中级.高级三档,江湖上真正高水平的软件架构师就更少了. ...
- Android NDK/JIN 从入门到精通
1.1 JNI(Java Native Interface) 提供一种Java字节码调用C/C++的解决方案,JNI描述的是一种技术 1.2 NDK(Native Development Kit) A ...
- 心酸!30岁深漂失业3个月,从巅峰跌落谷底,大龄Android开发必须要懂的事!
2021年3月,我的前同事,在我们群里说他准备回老家了,问我们有没有人可以暂时收养他的猫. --他说,这周末就要离开深圳了. 他失业了.3个多月没收入,还要交着房租,过年来之后找了快一个月的工作也没有 ...
- 说实话,Android开发月薪3W,谁不酸呢?
近期有个网友在某匿名区晒字节跳动Offfer,毕业一年月薪3W,引发众多读者羡慕,纷纷留言酸了.酸了.但进大厂的要求还是蛮高的,需要在技术实力上有一定的积累,今天给大家分享一份高质量笔记, 助力大家技 ...
- Android:Camera2的简单使用
以前用的是Camera,但是现在Camera已经被官方弃用了,所以这里使用的是Camera2进行演示 使用Camera需要注意的就是权限的获取,必须有权限 类图介绍 Camera2跟Camera1不一 ...
- TCP文件上传实现
TCP文件上传实现 服务端: package net.study; import java.io.*; import java.net.ServerSocket; import java.net.So ...
- JavaGUI三种布局管理器FlowLayout,BorderLayout,GridLayout的使用
三种布局管理器 流式布局FlowLayout package GUI; import java.awt.*; import java.awt.event.WindowAdapter; import j ...
- awk-08-综合例子
分析nginx日志 1.统计访问IP次数 2.统计访问IP大于10次的 3.统计访问IP次数,并取出前几的访问数 4.统计时间段访问最多的IP 5.统计访问最多的10个页面 6.统计每个 URL 数量 ...