字典树TRIE(前缀树)

news/2024/9/18 2:54:11

字典树(Trie 树)是一种用于快速查找前缀的数据结构。它的主要思想是:

  1. 树的每个节点表示一个字符
  2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串
  3. 每个节点的所有子节点包含共同的前缀
    例如,对于单词列表[“hello”, “help”, “world”]可以构造这样的字典树:
    root
    /
    h w
    / \
    e l
    | \
    l p

    o
    搜索某个字符串是否在字典树中,就是从根节点开始,逐字符向下搜索对应的节点,如果最后能搜索到叶子节点,就说明这个字符串在树中。
    字典树的典型操作有:
  4. 插入字符串:逐字符插入节点
  5. 查找前缀:从根向下搜索前缀字符
  6. 查找字符串:从根向下完全匹配搜索
    字典树的优点是:
  • 搜索前缀非常快速,时间复杂度O(K),K为字符串长度
  • 占用空间小,结构紧凑
  • 可以高效删除与插入字符串
    字典树常用来存储大量字符串,实现自动补全、拼写检查等功能。
    总之,字典树是一种用于快速查找前缀的树形数据结构,它利用字符串之间的公共前缀来提高查询效率。如果要存储大量字符串,并经常查询字符串前缀,字典树是非常高效的选择。
class Trie {
    vector<Trie*> children;
    bool isEnd;

    Trie* searchPrefix(string prefix) {
        Trie* node = this;
        for (char ch : prefix) {
            ch -= 'a';
            if (node->children[ch] == nullptr){
                return nullptr;
            }
            node = node->children[ch];
        }
        return node;
    }

public:
    Trie() : children(26), isEnd(false) {}
    
    void insert(string word) {
        Trie* node = this;
        for (char ch : word) {
            ch -= 'a';
            if (node->children[ch] == nullptr) {
                node->children[ch] = new Trie();
            }
            node = node->children[ch];
        }
        node->isEnd = true;
    }
    
    bool search(string word) {
        Trie* node = this->searchPrefix(word);
        return node != nullptr && node->isEnd;
    }
    
    bool startsWith(string prefix) {
        return this->searchPrefix(prefix) != nullptr;
    }
};


http://lihuaxi.xjx100.cn/news/1334461.html

相关文章

标准单元库---NLDM/CCS library model

Timing Model 数字芯片设计&#xff0c;除了全定制设计外&#xff0c;绝大部分都是基于std cell的半定制设计&#xff0c;那么std cell的模型就极为重要&#xff0c;尤其半定制&#xff0c;需要把一个std cell看成block box&#xff0c;只考虑其input/output pin。其input pin对…

Python 生成随机datetime和date

Python 生成随机datetime和date 验证程序经常需要生成随机的datetime和date 。 import datetime import time# 2000年到2023年日期时间 def randdatetime():mintime datetime.datetime(2000,1,1,0,0,0)maxtime datetime.datetime(2023,12,31,23,23,59)mintime_ts int(time…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第二十三天 23/50

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

springboot驾校管理系统

框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 …

简单的复习下与 CSS Flex 布局相关的几个关键属性

揭开align-content、justify-content、align-items和justify-items的神秘面纱&#xff0c;解释它们各自的功能以及在不同的情境下如何使用。 在过去几年中&#xff0c;由于弹性盒子和网格布局的演变&#xff0c;CSS布局设计的艺术发生了重大变化。而这一变革的核心&#xff0c;…

【洛谷】P3954 [NOIP2017 普及组] 成绩

[NOIP2017 普及组] 成绩 题目背景 NOIP2017 普及组 T1 题目描述 牛牛最近学习了 C 入门课程&#xff0c;这门课程的总成绩计算方法是&#xff1a; 总成绩作业成绩$ \times 20% 小测成绩 小测成绩 小测成绩30% 期末考试成绩 期末考试成绩 期末考试成绩 \times 50%$ 牛牛想…

13 个最佳免费 PDF 编辑器清单

您正在寻找一款真正免费的 PDF 编辑器&#xff0c;不仅可以编辑和添加文本&#xff0c;还可以更改图像、添加您自己的图形、签署您的名字、填写表格等等&#xff1f;您来对地方了&#xff1a;我研究了这些类型的应用程序&#xff0c;以得出您正在寻找的内容的列表。 其中一些是…

抖音短视频seo源码开发部署-技术分享(四)

一、 抖音短视频seo源码开发流程 抖音短视频SEO源码开发流程如下&#xff1a; 1.分析需求&#xff1a;首先需要明确你的SEO目标。分析竞争对手&#xff0c;了解抖音短视频平台的规则&#xff0c;选定目标关键词和主题。 2.编写代码&#xff1a;根据需求编写代码&#xff0c;…