前缀树(字典树)总结-java版

前缀树是一种多路树形结构,用于快速检索和统计大量字符串。本文介绍了前缀树的概念、应用场景、Java实现以及与DFA查询敏感词的比较。通过节点构建和操作,展示了如何利用前缀树进行插入、查询和删除操作,特别适合字符串的快速检索和排序。
摘要由CSDN通过智能技术生成

目录

前缀树的概述

 前缀树的应用场景

前缀树的java实现

节点

前缀树(增加,查询字符串数量,查询前缀数量)

测试

与DFA查询敏感词的类似与不同

类似

不同


前缀树的概述

前缀树又名字典树,单词查找树,Trie树,是一种多路树形结构,是哈希树的变种,和hash效率有一拼,是一种用于快速检索的多叉树结构。

典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。

Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

Trie树也有它的缺点,Trie树的内存消耗非常大。

性质:不同字符串的相同前缀只保存一份。

操作:查找,插入,删除。

举个栗子:给出一组单词,inn, int, at, age, adv,ant, 我们可以得到下面的Trie:

从上面可以发现一些Trie树的特性:

1)根节点不包含字符,除根节点外的每一个子节点都包含一个字符。

2)从根节点到某一节点的路径上的字符连接起来,就是该节点对应的字符串。

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

4)每条边对应一个字母。每个节点对应一项前缀。叶节点对应最长前缀,即单词本身。

单词inn与单词int有共同的前缀“in”, 因此他们共享左边的一条分支,root->i->in。同理,ate, age, adv, 和ant共享前缀"a",所以他们共享从根节点到节点"a"的边。

查询操纵非常简单。比如要查找int,顺着路径i -> in -> int就找到了。

搭建Trie的基本算法也很简单,无非是逐一把每则单词的每个字母插入Trie。插入前先看前缀是否存在。如果存在,就共享,否则创建对应的节点和边。比如要插入单词add,就有下面几步:

考察前缀"a",发现边a已经存在。于是顺着边a走到节点a。

考察剩下的字符串"dd"的前缀"d",发现从节点a出发,已经有边d存在。于是顺着边d走到节点ad

考察最后一个字符"d",这下从节点ad出发没有边d了,于是创建节点ad的子节点add,并把边ad->add标记为d。

 前缀树的应用场景

(1)字符串的快速检索

字典树的查询时间复杂度是O(logL),L是字符串的长度。所以效率还是比较高的。字典树的效率比hash表高。

hash表:

通过hash函数把所有的单词分别hash成key值,查询的时候直接通过hash函数即可,都知道h

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值