前缀树

基础知识

Trie树。又称之为单词查找树或者键树,是一种树形结构。应用于统计和排序大量的字符串。常被搜索引擎系统用于文本词频统计。它的优点:能够最大限度的减少无谓的字符串比较,查询效率比哈希表高。

核心思想是以空间换时间。利用记录字符串公共前缀来降低查询时间的开销。

3个基本性质

  1. 根节点不包含字符,除根节点外每一个节点都只包含一个字符
  2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点所对应的字符串
  3. 每个节点的所有子节点所包含的字符都不同。
  4. 每个节点对应一个前缀,叶节点对应最长前缀,即单词本身。

功能

应该实现查询,插入,前缀查询的功能。

数据结构组成

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实现的更多相关文章

  1. [leetcode] 208. 实现 Trie (前缀树)(Java)

    208. 实现 Trie (前缀树) 实现Trie树,网上教程一大堆,没啥可说的 public class Trie { private class Node { private int dumpli ...

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

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

  3. Java实现 LeetCode 208 实现 Trie (前缀树)

    208. 实现 Trie (前缀树) 实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作. 示例: Trie trie = new Trie() ...

  4. Trie 树 及Java实现

    来源于英文“retrieval”.   Trie树就是字符树,其核心思想就是空间换时间. 举个简单的例子.   给你100000个长度不超过10的单词.对于每一个单词,我们要判断他出没出现过,如果出现 ...

  5. python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie)

    python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie) 主要包括两部分内容:(1)利用python中的dict实现Trie:(2) ...

  6. 双数组Trie树(DoubleArrayTrie)Java实现

    http://www.hankcs.com/program/java/%E5%8F%8C%E6%95%B0%E7%BB%84trie%E6%A0%91doublearraytriejava%E5%AE ...

  7. Trie(前缀树/字典树)及其应用

    Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree.当然很多名字的意义其实有交 ...

  8. 208 Implement Trie (Prefix Tree) 字典树(前缀树)

    实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个方法.注意:你可以假设所有的输入都是小写字母 a-z.详见:https://leetcode.co ...

  9. 【数据结构】关于前缀树(单词查找树,Trie)

    前缀树的说明和用途 前缀树又叫单词查找树,Trie,是一类常用的数据结构,其特点是以空间换时间,在查找字符串时有极大的时间优势,其查找的时间复杂度与键的数量无关,在能找到时,最大的时间复杂度也仅为键的 ...

随机推荐

  1. C++ 2(将类分文件) //点和圆的关系 //设计一个圆形类 和一个点类 计算点和圆的关系 //点到圆心的距离 == 半径 点在圆上 //点到圆心的距离 > 半径 点在圆外 //点到圆心的距离 < 半径 点在圆内 //点到圆心的距离 获取 ....... (x1 -x2)^2 + (y1-y2)^2 开根号 和半径对比 // 计算 可以 两边同时 平方

    1 源文件 main.cpp 2 //点和圆的关系 3 //设计一个圆形类 和一个点类 计算点和圆的关系 4 //点到圆心的距离 == 半径 点在圆上 5 //点到圆心的距离 > 半径 点在圆外 ...

  2. Spring Boot 入门系列(二十二)使用Swagger2构建 RESTful API文档

    前面介绍了如何Spring Boot 快速打造Restful API 接口,也介绍了如何优雅的实现 Api 版本控制,不清楚的可以看我之前的文章:https://www.cnblogs.com/zha ...

  3. 采用Jpcap+redis+线程 设备网络流量监控 应用实战实例

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  4. Git-09-常用命令

    git常用命令 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下. Workspace:工作区 ...

  5. iOS开发之GIF转MP4

    前言 最近遇到需要将gif转化为mp4的问题,网上找的在线转换限制太多,索性就自己写了一个工具APP.文章末尾有开源代码和打包好的APP,如有需要请自行下载. 效果图 核心代码 来源 import I ...

  6. DVWA靶场之CSRF(跨站请求伪造)通关

    Low: 服务器就看了password_new与password_conf是否相同,没有其他的验证 重新构造一个html页面,(自己假装自己是受害者,ip是靶场ip非本地ip) 1 <img s ...

  7. Sqli-Labs less46-53

    less-46 前置基础知识: select * from users order by 1 desc ;使用降序(倒序)排列 select * from users order by 1 asc ; ...

  8. 题解 Hunter

    传送门 一看这题subtasks就觉得最后能直接推个柿子出来--然而没推出来 首先状压的部分分:发现只需要统计猎人1还没死的状态的贡献,其它情况可以continue掉,有45pts 至于正解--发现我 ...

  9. mysql事务的4大特性

    事务的四大特性(简称ACID) 1.原子性(Atomicity) 事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做. 2.一致性(Consistency) 事务执行的结果必须是使数据 ...

  10. java集成网站微信,微博,qq登录

    微信 WechatConfig.java package com.meeno.chemical.common.sdk.wechat.config; import org.springframework ...