java trie_Trie树(字典树)的介绍及Java实现

article/2025/9/22 0:48:13

简介

Trie树,又称为前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。

它的主要特点如下:

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

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

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

如下是一棵典型的Trie树:

3be8703e0611f763f3bd5d7f08d00c16.png

Trie的来源是Retrieval,它常用于前缀匹配和词频统计。可能有人要说了,词频统计简单啊,一个hash或者一个堆就可以搞定,但问题来了,如果内存有限呢?还能这么 玩吗?所以这里我们就可以用trie树来压缩下空间,因为公共前缀都是用一个节点保存的。

1、定义

这里为了简化,只考虑了26个小写字母。

首先是节点的定义:

public class TrieNode {

public TrieNode[] children;

public char data;

public int freq;

public TrieNode() {

//因为有26个字母

children = new TrieNode[26];

freq = 0;

}

}

然后是Trie树的定义:

public class TrieTree {

private TrieNode root;

public TrieTree(){

root=new TrieNode();

}

...

}

2、插入

由于是26叉树,故可通过charArray[index]-‘a';来得知字符应该放在哪个孩子中。

public void insert(String word){

if(TextUtils.isEmpty(word)){

return;

}

insertNode(root,word.toCharArray(),0);

}

private static void insertNode(TrieNode rootNode,char[]charArray,int index){

int k=charArray[index]-'a';

if(k<0||k>25){

throw new RuntimeException("charArray[index] is not a alphabet!");

}

if(rootNode.children[k]==null){

rootNode.children[k]=new TrieNode();

rootNode.children[k].data=charArray[index];

}

if(index==charArray.length-1){

rootNode.children[k].freq++;

return;

}else{

insertNode(rootNode.children[k],charArray,index+1);

}

}

3、移除节点

移除操作中,需要对词频进行减一操作。

public void remove(String word){

if(TextUtils.isEmpty(word)){

return;

}

remove(root,word.toCharArray(),0);

}

private static void remove(TrieNode rootNode,char[]charArray,int index){

int k=charArray[index]-'a';

if(k<0||k>25){

throw new RuntimeException("charArray[index] is not a alphabet!");

}

if(rootNode.children[k]==null){

//it means we cannot find the word in this tree

return;

}

if(index==charArray.length-1&&rootNode.children[k].freq >0){

rootNode.children[k].freq--;

}

remove(rootNode.children[k],charArray,index+1);

}

4、查找频率

public int getFreq(String word){

if(TextUtils.isEmpty(word)){

return 0;

}

return getFreq(root,word.toCharArray(),0);

}

private static int getFreq(TrieNode rootNode,char[]charArray,int index){

int k=charArray[index]-'a';

if(k<0||k>25){

throw new RuntimeException("charArray[index] is not a alphabet!");

}

//it means the word is not in the tree

if(rootNode.children[k]==null){

return 0;

}

if(index==charArray.length-1){

return rootNode.children[k].freq;

}

return getFreq(rootNode.children[k],charArray,index+1);

}

5、测试

测试代码如下:

public static void test(){

TrieTree trieTree=new TrieTree();

String sourceStr="Democratic presumptive nominee Hillary Clintons campaign posed pounced on Trumps assertion that British term monetary turmoil might benefit his business venture in Scotland";

//String sourceStr="the that";

sourceStr=sourceStr.toLowerCase();

String[]strArray=sourceStr.split(" ");

for(String str:strArray){

trieTree.insert(str);

}

String sourceStr2="Every president is tested by world events But Donald Trump thinks about how is his golf resort can profit from that";

sourceStr2=sourceStr2.toLowerCase();

String[]strArray2=sourceStr2.split(" ");

for(String str:strArray2){

trieTree.insert(str);

}

BinaryTree.print("frequence of 'that':"+trieTree.getFreq("that"));

BinaryTree.print("\nfrequence of 'donald':"+trieTree.getFreq("donald"));

trieTree.remove("that");

BinaryTree.print("\nafter remove 'that' once,freq of 'that':"+trieTree.getFreq("that"));

trieTree.remove("that");

BinaryTree.print("\nafter remove 'that' twice,freq of 'that':"+trieTree.getFreq("that"));

trieTree.remove("donald");

BinaryTree.print("\nafter remove 'donald' once,freq of 'donald':"+trieTree.getFreq("donald"));

BinaryTree.reallyStartPrint();

}

测试结果如下:

0b6fd76d97c2004c44b57122c176a8db.png

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


http://chatgpt.dhexx.cn/article/ItIFDqRS.shtml

相关文章

Trie前缀树

Trie前缀树 简介 Trie (发音为 "try") 又经常叫前缀树&#xff0c;字典树等等&#xff0c;是一种树数据结构&#xff0c;用于检索字符串数据集中的键。 在计算机科学中&#xff0c;trie是一种有序树&#xff0c;用于保存关联数组&#xff0c;其中的键通常是字符串…

Trie树

Trie树 文章目录 Trie树Trie树介绍应用场景举例代码实现例题 Trie树介绍 字典树 又称单词查找树&#xff0c;Trie树&#xff0c;是一种树形结构&#xff0c;是一种哈希树的变种。典型应用是用于统计&#xff0c;排序和保存大量的字符串&#xff08;但不仅限于字符串&#xff…

trie 树

一、普通 t r i e \rm trie trie 树 t r i e \rm trie trie 树又称字典树、前缀树&#xff0c;它把很多单词放到一棵树上&#xff0c;使用空间去换时间。 LUOGU2580 于是他错误的点名开始了 Description \text{Description} Description 给定 n n n 个互不相同且只含小写字…

Trie

文章目录 应用替换其他数据结构字典表达术语索引 算法排序全文检索 实现Bitwise triesCompressing triesExternal memory trie About Me Trie ,也叫做 digital tree(数字树) 有时候也是 radix tree(基数树) 或者 prefix tree(前缀树) (因为他们可以通过前缀进行搜索) 是一种 se…

Trie(字典树/前缀树)

字典树/前缀树 Trie&#xff08;发音类似 “try”&#xff09;或者说 前缀树&#xff08;字典树&#xff09; 是一种树形数据结构&#xff0c;用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景&#xff0c;例如自动补完和拼写检查。主要思想是利用字符…

trie(字典树、前缀树)

trie&#xff08;字典树、前缀树&#xff09; 1. trie原理 原理 trie树&#xff0c;又被称为字典树、前缀树&#xff0c;是一种高效地存储和查找字符串集合的数据结构。一般来说&#xff0c;用到trie的题目中的字母要么全是小写字母&#xff0c;要么全是大写字母&#xff0c;要…

Trie详解

Trie&#xff0c;又名字典树、单词查找树&#xff0c;可以较高效地实现统计、排序和保存大量的字符串。 顾名思义&#xff0c;Trie是一个树状的结构&#xff0c;按照树型结构来存储字符串&#xff0c;显然是一种以空间换时间的方法。整体上理解和实现都不会很难。 下面是实现方…

Trie 简介

一、Trie简介 在计算机科学中&#xff0c;Trie&#xff0c;又称字典树、前缀树、单词查找树或键树&#xff0c;是一种树形结构&#xff0c;是一种哈希树的变种。典型应用是用于统计&#xff0c;排序和保存大量的字符串&#xff08;但不仅限于字符串&#xff09;&#xff0c;所以…

Trie 字典树 详解

&#x1f60a; | Powered By HeartFireY | Tire Algorithm 一、字典树 1.字典树简介 字典树&#xff0c;英文名Trie&#xff0c;如其名&#xff1a;就是一棵像字典一样的树。 我们首先通过一张图来理解字典树的结构&#xff1a; 我们假定结点的顺序按照图中给定的顺序进行编…

Web前端面试题汇总(持续更新...)

H5 的新特性有哪些&#xff1f;C3 的新特性有哪些&#xff1f; H5 新特性 拖拽释放(Drap and drop) API ondrop自定义属性 data-id语义化更好的内容标签(header,nav,footer ,aside, article, section)音频 ,视频(audio, video) 如果浏览器不支持自动播放怎么办?在属性中添加…

Web前端面试题(全锦集)

1 第一部分&#xff1a; 聪明的猴子都在看右下角目录 点击查看更多资源 前端基础(HTML CSS JS基础) 1. 怎么让一个不定宽高的 DIV&#xff0c;垂直水平居中&#xff1f; 答&#xff1a;1.使用 CSS 方法&#xff1a; 父盒子设置&#xff1a;display&#xff1a;table…

web前端开发面试题(一)

一、html部分 1.1 link和import 区别如下&#xff1a; 1.1.1从属关系区别 import是 CSS 提供的语法规则&#xff0c;只有导入样式表的作用&#xff1b;link是HTML提供的标签&#xff0c;不仅可以加载 CSS 文件&#xff0c;还可以定义 RSS、rel 连接属性等。 2.加载顺序区别…

Web常见前端面试题及答案

前端技术导航大全 1、盒子模型 盒子模型包括四部分&#xff1a;内容&#xff08;content&#xff09;、填充&#xff08;padding&#xff09;、边框&#xff08;border&#xff09;、边界&#xff08;margin&#xff09; 盒子模型可以分为两种&#xff1a;IE盒子模型和W3C标准…

web前端开发面试题(七)

前端面试题第七天 一、HTML 部分 1.1 iframe框架都有哪些优缺点 在讲iframe框架之前 先聊聊iframe吧 定义&#xff1a;iframe是HTML标签&#xff0c;作用是文档中的文档&#xff0c;或者浮动的框架(FRAME)。iframe元素会创建包含另外一个文档的内联框架&#xff08;即行内框…

2020 web前端面试题及答案大全

css相关 1. 万能居中 1.margin: 0 auto;水平 2.text-align: center;水平 3.行高&#xff0c;垂直 4.表格&#xff0c;center,middle&#xff1b;水平垂直 5.display:table-cell&#xff1b;模拟表格&#xff0c;all 6.绝对定位&#xff0c;50%减自身宽高 7.绝对定位&#xff…

初级web前端面试题

文章目录 一、JS1、js基本类型和引用类型2、如何判断js数据类型3、js 拷贝4、事件处理机制5、原型和原型链6、什么是闭包7、事件循环机制&#xff08;event loop&#xff09;8、前端模块化9、es6新增特性1.let代替var关键字&#xff1b;2.const3.箭头函数4.字符串模板 &#xf…

【面试】web前端经典面试题试题及答案(持续更新)-html/css

html/ css css盒模型、BFC、css浮动、css经典布局、css兼容、css hack、html/ css基础 css盒模型BFCcss浮动css经典布局自适应css兼容css hackhtml/ css基础css3 transformcss实战图片 #mermaid-svg-vRGce0x6PUoXllsG .label{font-family:trebuchet ms, verdana, arial;font-fa…

前端面试题2021及答案

身为三本的我就是凭借这些前端面试题拿到百度京东offer的&#xff0c;前端面试题2021及答案... 此文转载自&#xff1a;https://blog.csdn.net/qq_33277654/article/details/112758362#commentBox 点进来之后你的噩梦就要来了&#xff0c;接下来你要面对上百道面试题&#xff…

web前端面试题(全)

近来看到网上格式各样的web前端求职的面试题&#xff0c;接下来我用我的经验总结了一套在面试过程中高频率问到的面试题&#xff0c;希望能帮助各位求职者在求职的过程中顺利通过&#xff0c;废话不多说&#xff0c;直接说题。。。 一、HTML5部分 1.说一下对css盒模型的理解 …

2023最新Web前端经典面试试题及答案-史上最全前端面试题(含答案)

近期总结一一些面试题 都是企业的面试题笔记题 感觉薪资10k-15k的常见面试题 个人录制的最新Vue项目学习视频&#xff1a;B站 Vue2-第二版-后台管理系统项目实战/vueelement-ui/vue经典全套系统案例讲解_哔哩哔哩_bilibili 前端面试题视频讲解&#xff1a; 2023前端高频…