Trie树

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

Trie树


在这里插入图片描述

Trie树介绍

字典树

又称单词查找树Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

总的来讲,Trie树是一种高效的存储和查找字符串集合的数据结构。

应用场景举例

使用用Trie树来存储单词。

如图:

在这里插入图片描述

Trie树是一个多叉树,每一个字母存储为Trie树的一个结点,我们用Trie树来存储小写字母组成的单词,如 apple 的存储就像上方一样,此时每个结点都可以后26个子节点。

代码实现

class TrieNode {boolean isEnd;TrieNode[] childNode;public TrieNode() {isEnd = false;childNode = new TrieNode[26];}
}public class Trie {TrieNode root;public Trie() {root = new TrieNode();}// 插入public void insert(String word) {TrieNode p = root;for (int i = 0; i < word.length(); i++) {char c = word.charAt(i);int mapIdx = c - 'a'; // 设置每一个字母都映射一个下标值: 0 ~ 25if (p.childNode[mapIdx] == null) { // 如果没有字母对应的映射也就是p.childNode[mapIdx] = new TrieNode();}p = p.childNode[mapIdx];}// 此时指针p已经移动到了单词的末尾位置, 就将isEnd变为truep.isEnd = true;}// 查询public boolean search(String word) {TrieNode p = root;for (int i = 0; i < word.length(); i++) {char c = word.charAt(i);int mapIdx = c - 'a';if (p.childNode[mapIdx] != null) {p = p.childNode[mapIdx];} else {return false;}}/*i == word.length() 跳出循环时可能p指向的字母可能不是一个单词的结尾,因此可以直接返回p.isEnd, 如果是true就代表找到了; 如果是false,就代表没找到。*/return p.isEnd;}// 判断是否有与指定条件相同的前缀public boolean startWiths(String word) {TrieNode p = root;for (int i = 0; i < word.length(); i++) {char c = word.charAt(i);int mapIdx = c - 'a';if (p.childNode[mapIdx] != null) {p = p.childNode[mapIdx];} else {return false;}}return true;}
}

上面的代码使用new的方式创建结点对象,便于理解,但是在解题过程中,大量的new操作可能会导致超时。

所以可以用空间来换取时间,开辟数组来保存Trie树的结构。

public class Tire {static final int N = 100010; // 可以根据题目的数据范围来指定数组的大小static int[][] trie = new int[N][26]; // 开辟trie数组,用于保存结点信息 N行数据范围,26代表26个字母static int[] count = new int[N]; // 记录每个字母作为结尾出现的次数static int idx; // 定义idx用于实现插入操作,保证不同的idx值对应不同的结点public static void insert(char[] s) {int p = 0;for (int i = 0; i < s.length; i++) {int u = s[i] - 'a';if (trie[p][u] == 0) {trie[p][u] = ++idx;}p = trie[p][u];}count[p]++;}public static int query(char[] s) {int p = 0;for (int i = 0; i < s.length; i++) {int u = s[i] - 'a';if (trie[p][u] == 0) return 0;p = trie[p][u];}return count[p];}
}

例题

leetcode 208. 实现 Trie (前缀树)

请你实现 Trie 类:

  • Trie() 初始化前缀树对象。
  • void insert(String word) 向前缀树中插入字符串 word 。
  • boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。
  • boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。

示例:

输入
["Trie", "insert", "search", "search", "startsWith", "insert", "search"]
[[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]
输出
[null, null, true, false, true, null, true]解释
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple");   // 返回 True
trie.search("app");     // 返回 False
trie.startsWith("app"); // 返回 True
trie.insert("app");
trie.search("app");     // 返回 True

提示:

  • 1 <= word.length, prefix.length <= 2000
  • word 和 prefix 仅由小写英文字母组成
  • insert、search 和 startsWith 调用次数 总计 不超过 3 * 104 次

题解:

class Trie {static int N = 100009; // 设置为十万级static int[][] trie = new int[N][26];static int[] count = new int[N];static int idx = 0;// 在构造方法中完成重置 static 成员数组的操作// 这样做的目的是为减少 new 操作(无论有多少测试数据,上述 static 成员只会被 new 一次)public Trie() {for (int row = idx; row >= 0; row--) {Arrays.fill(trie[row], 0);}Arrays.fill(count, 0);idx = 0;}public void insert(String word) {int p = 0;for (int i = 0; i < word.length(); i++) {int u = word.charAt(i) - 'a';if (trie[p][u] == 0) trie[p][u] = ++idx;p = trie[p][u];}count[p] ++;}public boolean search(String word) {int p = 0;for (int i = 0; i < word.length(); i++) {int u = word.charAt(i) - 'a';if (trie[p][u] == 0) return false;p = trie[p][u];}return count[p] != 0;}public boolean startsWith(String prefix) {int p = 0;for (int i = 0; i < prefix.length(); i++) {int u = prefix.charAt(i) - 'a';if (trie[p][u] == 0) return false;p = trie[p][u];}return true;}
}

AcWing 835. Trie字符串统计

维护一个字符串集合,支持两种操作:

  1. I x 向集合中插入一个字符串 x;
  2. Q x 询问一个字符串在集合中出现了多少次。

共有 N 个操作,输入的字符串总长度不超过 10^5,字符串仅包含小写英文字母。

输入格式

第一行包含整数 N,表示操作数。

接下来 N 行,每行包含一个操作指令,指令为 I xQ x 中的一种。

输出格式

对于每个询问指令 Q x,都要输出一个整数作为结果,表示 x 在集合中出现的次数。

每个结果占一行。

数据范围

1≤N≤2∗10^4

输入样例:

5
I abc
Q abc
Q ab
I ab
Q ab

输出样例:

1
0
1

题解:

import java.util.Scanner;public class Main {static final int N = 100010;static int[][] son = new int[N][26];static int[] cnt = new int[N];static int idx;public static void insert(char[] s) {int p = 0;for (int i = 0; i < s.length; i ++) {int u = s[i] - 'a';if (son[p][u] == 0) son[p][u] = ++idx;p = son[p][u];}cnt[p]++;}public static int query(char[] s) {int p = 0; for (int i = 0; i < s.length; i++) {int u = s[i] - 'a';if (son[p][u] == 0) return 0;p = son[p][u];}return cnt[p];}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();while (n-- != 0) {String input = sc.next();String s;if ("I".equals(input)) {s = sc.next();insert(s.toCharArray());} else {s = sc.next();int res = query(s.toCharArray());System.out.println(res);}}}
}

在这里插入图片描述
欢迎点赞哦~


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

相关文章

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前端高频…

Web前端面试:这40个经典Web前端面试题面试者必看!

想成功就业Web前端工程师&#xff0c;想要能高薪就业&#xff0c;那么除了好的Web前端技能以外&#xff0c;还得有好的面试技巧&#xff0c;如果提前就了解更多企业的面试要求及面试题目&#xff0c;那么可以让我们的面试成功的几率大大的提高。今天千锋武汉Web前端培训小编为大…

最新Web前端面试题精选大全及答案

目录 HTML、CSS相关 Javascript相关 三者的异同 Vue相关 55.Vue路由懒加载&#xff08;按需加载路由&#xff09; React相关 react 生命周期函数 ******为什么虚拟 dom 会提高性能?(必考) (组件的)状态(state)和属性(props)之间有何不同 shouldComponentUpdate 是做…