热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

trie树mysql_字典树(Trie)

字典树,一般称为trie树,trie树常用于搜索提示。如当输入一个网址,可以自动搜索出可能的选择。当没有完全匹配的搜索结果,

字典树,一般称为trie树,trie树常用于搜索提示。如当输入一个网址,可以自动搜索出可能的选择。当没有完全匹配的搜索结果,可以返回前缀最相似的可能。

详细介绍参见维基百科:Trie树

基本概念

一个保存了8个键的trie结构,"A", "to", "tea", "ted", "ten", "i", "in", and "inn".

e431bd41d676

image-20190428191028045

优点:最大限度的减少无谓的比较,查询效率比哈希高

核心思想:空间换时间,利用字符串的公共前缀来降低查询时间的开销已达到提高查询的目的。

缺点:空间消耗比较大

基本性质:

根节点不包含字符,除根节点外每个节点都只包含一个字符

从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串

每个节点的所有子节点包含的字符都不相同

实现

在LeetCode上的第208题

1 首先定义一个节点类,因为数据结构为树,因此需要节点。

static class TrieNode {

/**

* 当前节点要存储的字符

*/

char val;

/**

* 标记节点,用来标记当前的节点是否为要存储节点的最后一个字符

*/

boolean isEnd;

/**

* 存储树的下一个节点,因为这次只考虑到小写,因此

* 只开辟了26个数组空间

*

* //如果trie树的节点远大于26个的话,可以使用Map来作为next

* TreeMap = new TreeMap()

*/

TrieNode[] next = new TrieNode[26];

public TrieNode() {

}

public TrieNode(char val) {

this.val = val;

}

}

2 定义Trie的结构。

public class Trie {

/**

* Trie树的根节点

*/

TrieNode root;

/**

* 初始化Trie数据结构

*/

public Trie() {

root = new TrieNode();

root.val = ' ';

}

/**

* 插入一个单词到Trie树中

*

*/

public void insert(String word) {

TrieNode currentNode = root;

for (int i = 0; i

char c = word.charAt(i);

// 将当前的字符作为节点插入到Trie树中

// 但是插入之前首先做一次检查

if (currentNode.next[c - 'a'] == null) {

currentNode.next[c - 'a'] = new TrieNode(c);

}

currentNode = currentNode.next[c - 'a'];

}

// 现在标识已经走到单词末尾了

currentNode.isEnd = true;

}

/**

* 判断某个单词是否在Trie树之中

*/

public boolean search(String word) {

TrieNode currentNode = root;

for (int i = 0; i

char c = word.charAt(i);

// 在单词还未走完的时候发现已经不匹配了

if (currentNode.next[c - 'a'] == null){

return false;

}

currentNode = currentNode.next[c - 'a'];

}

// 在每个单词的末尾都有设置为true

// 如果当前是false,那么代表未存储这个单词

return currentNode.isEnd;

}

/**

* 判断当前的单词是否为Trie树种某个单词的前缀,注意这里的逻辑与查询是相同的,唯一不同的是

* 匹配完前缀之后返回true

*/

public boolean startsWith(String prefix) {

TrieNode currentNode = root;

for (int i = 0; i

char c = prefix.charAt(i);

if (currentNode.next[c - 'a'] == null){

return false;

}

currentNode = currentNode.next[c - 'a'];

}

return true;

}

}

3 写测试代码,查看效果

public static void main(String[] args) {

Trie trie = new Trie();

trie.insert("flink");

trie.insert("netty");

trie.insert("mysql");

trie.insert("redis");

// false

System.out.println(trie.search("mongodb"));

// true

System.out.println(trie.search("redis"));

//false

System.out.println(trie.search("my"));

// true

System.out.println(trie.search("mysql"));

// true

System.out.println(trie.startsWith("my"));

}

4 运行程序,结果符合预期

e431bd41d676

image-20190429081246407

最后

这里只是简单给与了Trie树的简单介绍与实现,关于Trie树还有很多的话题。

扩展:

压缩Trie树,优化了一定的空间,但是增加维护成本

后缀树

三分字典树



推荐阅读
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 本文介绍了Java中Hashtable的clear()方法,该方法用于清除和移除指定Hashtable中的所有键。通过示例程序演示了clear()方法的使用。 ... [详细]
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
author-avatar
日月阁文玩都汇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有