本文档提供了对 LeetCode 存储库中实现和使用的 Trie(前缀树)数据结构的全面概述。它涵盖了 Trie 的基本概念、实现细节以及在解决各种算法问题中的实际应用。
Trie 是一种专门的树状数据结构,用于高效检索字符串数据集中的键。有关二叉搜索树等其他树结构的信息,请参阅 树与图。
Trie,也称为前缀树,是一种树状数据结构,可实现字符串的高效存储和检索。“Trie”这个名字来源于“retrieval”(发音为“try”)。Trie 中的每个节点代表一个字符,从根到标记节点的路径代表完整的单词。
Trie 的关键特征
来源:thinkings/trie.md3-12 thinkings/trie.md19-25
此图表示一个包含单词“oath”、“oar”、“he”、“her”、“god”、“good”的 Trie。粉红色(或标记)节点表示单词的结束。
在存储库实现中,Trie 节点通常包含
isWord(标记单词结束)、count(以此节点结束的单词数)和 preCount(以此为前缀的单词数)来源:thinkings/trie.md27-33 thinkings/trie.md34-49
Trie 数据结构支持三个主要操作
| 操作 | 描述 | 时间复杂度 |
|---|---|---|
| 插入 | 逐个字符将单词添加到 Trie | O(word 的长度) |
| 搜索 | 检查 Trie 中是否存在完整的单词 | O(word 的长度) |
| StartsWith | 检查 Trie 中是否存在任何具有给定前缀的单词 | O(prefix 的长度) |
来源:thinkings/trie.md66-67 thinkings/trie.md79-81 thinkings/trie.md240-244
将单词插入 Trie 时,我们从根开始,对每个字符执行以下步骤
preCount(前缀计数)count 来将最后一个节点标记为单词结束来源:thinkings/trie.md66-76 thinkings/trie.md101-115
搜索过程遵循以下步骤
来源:thinkings/trie.md79-80 thinkings/trie.md117-130
该存储库提供了多种编程语言的 Trie 实现
Java 实现使用大小为 26 的数组作为子节点,假定只包含小写英文字母
JavaScript 实现使用对象属性作为子节点
Trie 在涉及字符串操作的场景中特别有效
Trie 的主要优势在于它们能够利用公共前缀来优化字符串操作,有效地以空间换取时间效率。
来源:thinkings/trie.md9-11 thinkings/trie.md252-259 thinkings/trie.md262-270
Trie 数据结构用于解决存储库中的各种 LeetCode 问题
| 问题 | 问题编号 | Trie 的应用 |
|---|---|---|
| 实现 Trie | 208 | 具有标准操作的基本 Trie 实现 |
| 添加和搜索单词 | 211 | 支持搜索中'.'通配符字符的 Trie |
| 单词搜索 II | 212 | 使用 Trie 高效地在二维网格中搜索单词 |
| 连接词 | 472 | 使用 Trie 查找由其他单词组成的单词 |
| 单词短编码 | 820 | 使用 Trie 压缩单词列表(后缀匹配) |
| 字符流 | 1032 | 使用 Trie 处理字符流 |
对于某些问题,例如单词压缩(问题 820),反向 Trie 或后缀树方法可能更有效
来源:problems/820.short-encoding-of-words.md42-48 problems/1032.stream-of-characters.md86
多种技术可以减少 Trie 的内存占用
来源:problems/472.concatenated-words.md73-89
| 操作 | 时间复杂度 | 备注 |
|---|---|---|
| 插入 | O(键的长度) | 其中键是要插入的单词 |
| 搜索 | O(键的长度) | 其中键是要搜索的单词 |
| StartsWith | O(prefix 的长度) | 其中 prefix 是要搜索的前缀 |
| 从单词构建 Trie | O(Σ单词的长度) | 所有单词长度的总和 |
最坏情况下的空间复杂度为 O(m^n),其中
在实践中,由于共享前缀,所需空间通常远小于此。
存储库包含几个使用 Trie 的问题
Tries 是一种强大的数据结构,用于高效的字符串操作,特别是当处理大量具有共同前缀的字符串时。Tries 的关键原则是以空间换时间,这使其在自动完成、拼写检查和各种字符串匹配问题等应用中具有无价的价值。
在实现 Trie 时,应考虑问题的具体要求,例如标准 Trie、反向 Trie 还是具有附加功能(如通配符搜索)的 Trie 最合适。