前缀树/字典树Trie

news2024/11/24 20:46:14

目录

一、Trie的数据结构

二、代码示例


一、Trie的数据结构

Tire通常包括:
1.root节点(根节点):插入、查找、删除、遍历等操作从root节点开始.
2.flag:结束标志true/false,用于表示当前节点是否为一个完整的字符串的结尾.
3.key:每个节点代表一个字符,这个字符是组成字符串的一部分.
4.children:一个节点的孩子节点.
5.data:key代表一个字符,多个key组合起来所表示的数据.
6.parent(可选):当前父节点,有助于回溯到根节点,通常用于删除、修改等操作.

class TrieNode:
    def __init__(self, key):
        # 每一个节点代表一个字符,当然你可以用char等命名
        self.key = key

        # 表示这个节点是否是一个单词的结尾
        self.flag_end = False

        # 可能包含任何相关的数据,例如完整的单词、完整的词语、一个URL等等
        self.data = None

        # 孩子节点,值是下一个TrieNode
        self.children = {}

        # 父节点,值是上一个TrieNode
        self.parent = None
function TrieNode(key) {
    this.key = key;
    this.flag_end = false;
    this.data = data;
    this.children = {};
    this.parent = null;
}

以下是前缀树的一些主要特点和用途:

  1. 路径表示单词:在前缀树中,每个节点可能包含多个子节点,每个子节点代表在当前字符后可能出现的下一个字符。沿着从根节点到某个特定节点的路径可以形成一个字符串。

  2. 共享前缀:前缀树可以高效地处理具有共同前缀的字符串集合。如果多个字符串有相同的前缀,它们将共享前缀树中的一条路径,这使得前缀树在空间使用上非常高效。

  3. 快速搜索:前缀树允许以O(m)的时间复杂度进行搜索,其中m是要搜索的字符串的长度。这是因为每个步骤沿着树的路径只需要查找下一个字符。

  4. 自动补全:前缀树是实现自动补全功能的理想数据结构,因为它可以快速找到具有共同前缀的所有字符串。

  5. 词频统计:前缀树可以用来统计和排序大量字符串(如单词)的频率。

  6. 拼写检查:它可以用来进行拼写检查,因为它可以快速告诉你一个单词是否在字典中。

  7. 字符串排序:前缀树可以用来对字符串进行字典序排序。

  8. 空间效率:尽管前缀树在最坏情况下可能空间效率低下(每个节点只有一个子节点),但对于有共同前缀的字符串集合,前缀树通常比其他数据结构更节省空间。

二、代码示例

class TrieNode {
        constructor(key) {
        this.key = key;
        this.parent = null;
        this.children = {};
        this.end = false;
        this.url = null;
    }

    findURL() {
        if (this.end) {
            return this.url;
        }
        return null;
    }
}

class Trie {
    constructor() {
        this.root = new TrieNode(null);
    }

    insert(word, url) {
        let node = this.root;

        for (let i = 0; i < word.length; i++) {
            if (!node.children[word[i]]) {
                node.children[word[i]] = new TrieNode(word[i]);
                node.children[word[i]].parent = node;
            }

            node = node.children[word[i]];

            if (i === word.length - 1) {
                node.end = true;
                node.url = url;
            }
        }
    }

    search(word) {
        let node = this.root;

        for (let i = 0; i < word.length; i++) {
            if (node.children[word[i]]) {
                node = node.children[word[i]];
            } else {
                return null;
            }
        }

        return node.findURL();
    }
}

var trie = new Trie();
trie.insert("Ja", "http://www.baidu.com");
trie.insert("Java", "http://www.bilbil.com");
trie.insert("JaC++", "http://www.youtube.com");
trie.insert("ScPy", "http://www.coze.com");
trie.insert("Script", "http://www.sklearn.com");
trie.insert("Go", "http://www.google.com");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1557852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第几个幸运数字(蓝桥杯)

文章目录 第几个幸运数字题目描述答案&#xff1a;1905生成法C代码代码详细注释代码思路解释 第几个幸运数字 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 到x星球旅行的游客都被发给一个整数&#xff0c;作为…

软考高级架构师:信息安全保护等级

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

二十四种设计模式与六大设计原则(三):【装饰模式、迭代器模式、组合模式、观察者模式、责任链模式、访问者模式】的定义、举例说明、核心思想、适用场景和优缺点

接上次博客&#xff1a;二十四种设计模式与六大设计原则&#xff08;二&#xff09;&#xff1a;【门面模式、适配器模式、模板方法模式、建造者模式、桥梁模式、命令模式】的定义、举例说明、核心思想、适用场景和优缺点-CSDN博客 目录 装饰模式【Decorator Pattern】 定义…

Android MediaPlayer

MediaPlayer 类是媒体框架最重要的组成部分之一。此类的对象能够获取、解码以及播放音频和视频&#xff0c;而且只需极少量设置。它支持多种不同的媒体源&#xff0c;例如&#xff1a; • 本地资源 • 内部 URI&#xff0c;例如您可能从内容解析器那获取的 URI • 外部网址…

idea从零开发Android 安卓 (超详细)

首先把所有的要准备的说明一下 idea 2023.1 什么版本也都可以操作都是差不多的 gradle 8.7 什么版本也都可以操作都是差不多的 Android SDK 34KPI 下载地址&#xff1a; AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 …

智慧水利中数据可视化的关键作用

在当今这个数据驱动的时代&#xff0c;数据可视化已成为转化复杂数据集为易于理解的视觉格式的关键技术&#xff0c;它在智慧水利领域的应用尤为显著。智慧水利利用现代信息技术&#xff0c;整合水资源管理的各个方面&#xff0c;旨在提高水资源的使用效率和管理效能。数据可视…

Linux基础篇:VMware虚拟机3种常用的网络模式介绍

VMware虚拟机3种常用的网络模式介绍 VMware虚拟机提供了几种不同的网络连接模式&#xff0c;以满足不同场景下的网络需求。以下是VMware虚拟机的三种主要网络模式&#xff1a; 1.桥接模式&#xff08;Bridged Mode&#xff09;网卡名称VMnet0 桥接模式允许虚拟机直接连接到物…

Linux——将云服务器作为跳板机,frp实现内网穿透

文章目录 操作步骤1. 准备工作&#xff1a;2. 配置frp服务器端&#xff1a;3. 配置frp客户端&#xff1a;4. 启动frp客户端&#xff1a;5. 测试连接&#xff1a;6. 安全注意事项&#xff1a; 云服务器性能分析阿里云具体操作步骤1. 购买&#xff1a;2. 登录&#xff1a;3. 首次…

Transformer论文阅读

Transformer论文阅读 摘要结论1 Introduction &#xff08;导言&#xff09;2 Background3 Model Architecture3.1 Encoder and Decoder StacksEncoderLayer NormDecoder 3.2 Attention3.2.1 Scaled Dot-Product Attention3.2.2 Scaled Dot-Product Attention3.2.3 Application…

HAProxy + Vitess负载均衡

一、环境搭建 Vitess环境搭建&#xff1a; 具体vitess安装不再赘述&#xff0c;主要是需要启动3个vtgate&#xff08;官方推荐vtgate和vtablet数量一致&#xff09; 操作&#xff1a; 在vitess/examples/common/scripts目录中&#xff0c;修改vtgate-up.sh文件&#xff0c;…

嵌入式Qt 布局管理器QBoxLayout

一.存在问题 二.布局管理器 三.布局接口函数的使用 TestBtn1.setText("Test Button 1"); TestBtn1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); TestBtn1.setMinimumSize(160, 30); 使用setSizePolicy&#xff0c;那么 TestBtn1按钮 就会随着…

TypseScript再学习之类型别名和接口(10)

先看类型别名&#xff1a;使用关键字 type 声明,注意有等于号额 // 类型别名 使用关键字 type 声明,注意有等于号额 type Cat {name: string; }; let huahua: Cat {name: "花花", };type和interface不同之处在于&#xff1a;interface 是可以自动合并类型的&#…

源支付V7开源版2.99,修复各种提示错误

源支付V7开源版2.99&#xff0c;修复各种提示错误 加密说明&#xff1a;200拿来的&#xff0c;只有8.1这个文件加密&#xff0c;其他文件无任何加密&#xff0c;已修复各种提示错误 测试其他开源版安装提示错误&#xff0c;有几个文件是加密的 注&#xff1a;开发不易&#…

基于stm32的h5新建工程

目录 基于stm32的h5新建工程前言实验目的原理图部分搭建工程引脚配置界面&#xff1a;时钟配置界面工程选项卡&#xff1a; 编写代码实现点灯本文中使用的测试工程 基于stm32的h5新建工程 本文目标&#xff1a;基于stm32的基础实验 按照本文的描述&#xff0c;应该可以跑通实…

python学习16:python中的布尔类型和条件语句的学习

python中的布尔类型和条件语句的学习 1.布尔&#xff08;bool&#xff09;类型的定义&#xff1a; 布尔类型的字面量&#xff1a;True表示真&#xff08;是、肯定&#xff09; False表示假&#xff08;否、否定&#xff09; True本质上是一个数字记作1&#xff0c;False记作0 …

码支付个人支付宝永不掉线使用教程

​支付宝免CK添加操作稍微繁琐点&#xff0c;请耐心观看 此通道必须关闭你的余额宝自动转入功能&#xff0c;否则可能造成不跳转 支付宝添加的所有通道均支持H5免输入收款 第一步&#xff1a;打开支付宝开发平台&#xff0c;然后用你的支付宝注册登陆&#xff1a;https://op…

Node.js的Event Loop:六个阶段详解

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Ypay源支付码支付最新PC三合一监控软件实测有效

Ypay源支付码支付最新PC三合一监控软件实测有效 【免费授权】源支付正版授权_ 打造更专业的免签支付系统

深入理解HDFS工作原理:大数据存储和容错性机制解析

** 引言&#xff1a; ** 在当今数据爆炸的时代&#xff0c;存储和管理大规模数据成为了许多组织面临的重要挑战。为了解决这一挑战&#xff0c;分布式文件系统应运而生。Hadoop分布式文件系统&#xff08;HDFS&#xff09;作为Apache Hadoop生态系统的核心组件之一&#xff…

C语言-写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。

0xaaaaaaaa...等是什么&#xff1f;-CSDN博客https://blog.csdn.net/Jason_from_China/article/details/137179252 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #define SWAP(num) (((num & 0xAAAAAAAA) >> 1) | ((num & 0x55555555) << …