Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >字典树Trie(单词查找树)详解

字典树Trie(单词查找树)详解

作者头像
地鼠窝里有个Gopher
发布于 2022-10-30 06:44:55
发布于 2022-10-30 06:44:55
70100
代码可运行
举报
运行总次数:0
代码可运行

字典树

1. 背景和定义

  算法导论中,Trie叫做“基数树”。其应用范围不仅和字符串有关,本质上其实是个N叉树。   在N叉树上,如果共父节点的N个子节点是有序的字符序列,构造出来就很像字典树了。

2. 功能

  字典树的功能是对很多串进行压缩,压缩方法是合并这些字符串的相同前缀。   具体而言,就是字典树的每个节点都代表一个字符,用从根节点到叶子节点的路径来表示一个字符串。   这样做就压缩了所有模式串,并将大量前缀进行了合并,从而节省了时间。

3. 代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct TrieNode {
    TrieNode *sons[26];
    int flag = 0; // flag == 1表示有该单词(叶子节点)
    TrieNode() {
        memset(sons, 0, 26 * sizeof(TrieNode*));
    }
};

class Trie {
private:
    TrieNode* root;
public:
    /** Initialize your data structure here. */
    Trie() {
        root = new TrieNode;
    }
    
    /** Inserts a word into the trie. */
    void insert(string word) {
        TrieNode *cur = root;
        int len = (int) word.length();
        for (int i = 0; i < len; i++) {
            if (!cur->sons[word[i] - 'a']) cur->sons[word[i] - 'a'] = new TrieNode();
            cur = cur->sons[word[i] - 'a'];
        }
        cur->flag = 1;
    }
    
    /** Returns if the word is in the trie. */
    bool search(string word) {
        TrieNode *cur = root;
        int len = (int) word.length();
        for (int i = 0; i < len; i++) {
            if (cur->sons[word[i] - 'a']) cur = cur->sons[word[i] - 'a'];
            else return false;
        }
        if (cur->flag) return true;
        else return false;
    }
    
    /** Returns if there is any word in the trie that starts with the given prefix. */
    bool startsWith(string prefix) {
        TrieNode *cur = root;
        int len = (int) prefix.length();
        for (int i = 0; i < len; i++) {
            if (cur->sons[prefix[i] - 'a']) cur = cur->sons[prefix[i] - 'a'];
            else return false;
        }
        return true;
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
算法:字典树(Trie)-理论与实战
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
营琪
2019/11/04
6680
数据结构之Trie字典树
Trie 树,也叫“字典树”或“前缀树”。顾名思义,它是一个树形结构。但与二分搜索树、红黑树等不同的是,Trie 树是一种多叉树,即每个节点可以有 m 个子节点。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。
端碗吹水
2021/01/29
8470
LeetCode 208.实现Trie(字典树) - JavaScript
实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。
心谭博客
2020/04/21
6850
字典树,不就有点不一样的一颗树
字典树,是一种空间换时间的数据结构,又称Trie树、前缀树,是一种树形结构(字典树是一种数据结构),典型用于统计、排序、和保存大量字符串。所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
bigsai
2021/05/17
7620
字典树,不就有点不一样的一颗树
Trie(字典树、前缀树)
  Trie是一个多叉树,Trie专门为处理字符串而设计的。使用我们之前实现的二分搜索树来查询字典中的单词,查询的时间复杂度为O(logn),如果有100万(220)个单词,则logn大约等于20,但是使用Trie这种数据结构,查询每个条目的时间复杂度,和一共有多少个条目无关!时间复杂度为O(w),w为被查询单词的长度!大多数单词的长度小于10。   Trie将整个字符串以字母为单位,一个一个拆开,从根节点开始一直到叶子节点去遍历,就形成了一个单词,下图中的Trie就存储的四个单词(cat,dog,deer,panda)
程序员波特
2024/01/19
2060
Trie(字典树、前缀树)
字典树概念与题型解析
这次讲一个不经常被人提起的数据结构 - 字典树,虽说知名度不高,但是这个数据结构可以解决其他数据结构所不能解决,或者是比较难解决的问题,而且性能方面,相对于其他的功能类似的数据结构会更优,文章会从概念与基本实现,性能分析,题型解析三大方向来介绍字典树。
五分钟学算法
2019/10/18
5960
【图解算法】模板+变式——带你彻底搞懂字典树(Trie树)
接下来将对经典的字典树进行代码实现;接着做几个变体题目深入理解字典树的强大;最后回到日常生活,瞧瞧字典树怎样融入到了我们的生活之中 >_<
全栈程序员站长
2022/10/04
1.4K0
【图解算法】模板+变式——带你彻底搞懂字典树(Trie树)
(Leetcode 2021 刷题计划) 208. 实现 Trie (前缀树)
Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。
windism
2021/04/14
4220
剑指Offer——Trie树(字典树)
Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。
全栈程序员站长
2022/10/03
9420
剑指Offer——Trie树(字典树)
字典树 Krains 2020-09-01
当然还有其他的数据结构,如哈希表,使我们能够在字符串数据集中搜索单词。为什么我们还需要 Trie 树呢?尽管哈希表可以在 O(1) 时间内寻找键值,却无法高效的完成以下操作: 找到具有同一前缀的全部键值。
Krains
2020/09/10
3940
哈夫曼树、哈夫曼编码和字典树
        哈夫曼树(Huffman Tree)是一种带权路径长度最短的二叉树。哈夫曼树常常用于数据压缩,其压缩效率比较高。
周小末天天开心
2023/10/16
4850
哈夫曼树、哈夫曼编码和字典树
字典树的数据结构_数据结构快速排序
上一篇我们介绍了 线段树(Segment Tree),本文主要介绍Trie字典树。
全栈程序员站长
2022/10/04
4250
字典树的数据结构_数据结构快速排序
字典树进行大数据次数的统计
提起字典我们首先想到的就是小时候使用的新华字典,字典的好处就是把大量的汉字,组织到了一本书中,安装一定的顺序方便了我们进行快速的查找。
Tim在路上
2020/08/04
8630
力扣208——实现 Trie (前缀树)
实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。
健程之道
2020/02/12
4530
力扣208——实现 Trie (前缀树)
搞定大厂算法面试之leetcode精讲22.字典树
Trie树,即字典树,又称前缀树,是一种树形结构,典型应用是用于统计和排序大量的字符串(但不限于字符串),所以经常被搜索引擎用于文本词频统计。它的优先是,最大限度的减少无谓的字符串比较,提高查找效率。
全栈潇晨
2021/12/06
4590
字典树简介
字典树(Trie)又名前缀树或单词查找树,最初是由美国计算机科学家Edward Fredkin在1960年提出的。
恋喵大鲤鱼
2023/03/31
8790
字典树简介
leetcode刷题(55)——208. 实现 Trie (前缀树)
实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。
老马的编程之旅
2022/06/22
2080
用 JavaScript 实现单词查找树
对于搜索字符串的需求,在最坏的情况下,二叉搜索树的时间复杂度可能为 O(n),“n” 是二叉树中存储的字符串的总数量。所以为了在最佳时间内搜索字符串,需要一种性能更好的数据结构。Trie 树(又名单词搜索树)可以避免在搜索字符串时遍历整个树。仅包含字母的字符串会把 trie 节点的子级数量限制为 26。这样搜索字符串的时间复杂度为 O(s),其中 “s” 为字符串的长度。与二进制搜索树相比,trie 树在搜索字符串方面效率更高。
疯狂的技术宅
2020/02/18
7370
字典树(Trie树)
例如,单词序列a, to, tea, ted, ten, i, in, inn,对应的trie。
全栈程序员站长
2022/07/15
5110
字典树(Trie树)
深入理解Trie树
前面的文章介绍过各种高效的的数据结构,比如二叉搜索树,AVL树,红黑树,B树,跳跃表等,今天我们再来学习一种多路树,叫做Trie树。
我是攻城师
2019/06/03
2.1K0
相关推荐
算法:字典树(Trie)-理论与实战
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验