【Algorithms 4】算法(第4版)学习笔记 21 - 5.2 单词查找树

news2024/11/16 19:34:53

文章目录

    • 前言
    • 参考目录
    • 学习笔记
      • 0:前置介绍
      • 0:前置介绍
      • 1:单词查找树 R-way tries
      • 1.1:介绍
      • 1.2:查找操作
      • 1.2.1:成功命中
      • 1.2.2:未命中
      • 1.3:插入操作
      • 1.4:Java 实现
      • 1.5:性能
      • 1.6:删除操作
      • 1.7:小结
      • 2:三向单词查找树 ternary search tries
      • 2.1:介绍
      • 2.2:查找操作
      • 2.2.1:成功命中
      • 2.2.2:未命中
      • 2.3:Java 实现
      • 2.4:字符串 ST 实现开销小结
      • 2.5:混合三向单词查找树 TST with R^2^ branching at root
      • 2.6:字符串 ST 实现开销小结
      • 3:基于字符的操作 character-based operations
      • 3.1:字符串符号表 API
      • 3.2:热身:有序迭代
      • 3.3:前缀匹配
      • 3.4:最长前缀
      • 3.5:压缩前缀树 | 帕特里夏前缀树 Patricia trie
      • 3.6:后缀树
      • 3.7:小结

前言

本篇主要内容包括:单词查找树三向单词查找树基于字符的操作

参考目录

  • B站 普林斯顿大学《Algorithms》视频课
    (请自行搜索。主要以该视频课顺序来进行笔记整理,课程讲述的教授本人是该书原版作者之一 Robert Sedgewick。)
  • 微信读书《算法(第4版)》
    (本文主要内容来自《5.2 单词查找树》)
  • 官方网站
    (有书本配套的内容以及代码)

学习笔记

注1:下面引用内容如无注明出处,均是书中摘录。
注2:所有 demo 演示均为视频 PPT demo 截图。
注3:如果 PPT 截图中没有翻译,会在下面进行汉化翻译,因为内容比较多,本文不再一一说明。

0:前置介绍

符号表 ST 实现性能:

0:前置介绍

符号表 ST 实现性能:

![L18-52Tries_01]

如果我们能避免检查整个键(例如,在字符串排序时),并利用数组访问进行 R 路决策(而不是二进制决策),那么我们就能做得更好。

字符串 ST 基本 API:

![image-20240322111831008]

字符串 ST 实现开销:

![L18-52Tries_03]

1:单词查找树 R-way tries

对应书本章节《5.2.1 单词查找树》。

它的英文单词 trie 来自于 E.Fredkin 在 1960 年玩的一个文字游戏,因为这个数据结构的作用是取出(retrieval)数据,但发音为 try是为了避免与 tree 相混淆。

1.1:介绍

![L18-52Tries_06]

单词查找树:(Tries,词源 “retrieval”,发音为 “try”)

  • 在节点中存储字符(而非整个键)。
  • 每个节点有 R 个子节点,分别对应可能的每个字符。(目前,我们不绘制空链接)

书本对应的示意图:

![image-20240322114008431]

1.2:查找操作

单词查找树中的每个结点都包含了下一个可能出现的所有字符的链接。从根结点开始,首先经过的是键的首字母所对应的链接;在下一个结点中沿着第二个字符所对应的链接继续前进;在第二个结点中沿着第三个字符所对应的链接向前,如此这般直到到达键的最后一个字母所指向的结点或是遇到了一条空链接。

1.2.1:成功命中

![image-20240322150830515]

遍历键中每个字符所对应的链接。

  • 搜索命中:当搜索结束时到达的节点具有非空值。

搜索 “shells”:

初始状态:

![image-20240322151256057]

从根节点开始进行搜索,最终能够成功命中:

![image-20240322151813181]

返回与最后一个关键字符关联的值(返回3)。

搜索 “she”:

同样从根节点开始进行搜索,最终能够成功命中:

![image-20240322151845613]

搜索可能在中间节点处终止(返回0)。

1.2.2:未命中

![image-20240322153815622]

遍历键中每个字符所对应的链接。

  • 搜索未命中:到达空链接,或搜索结束位置的节点具有空值。

搜索 “shell”:

![image-20240322154004782]

没有值与最后一个键字符关联(返回 null)。

搜索 “shelter”:

![image-20240322154245350]

没有链接(无法到达)t(返回 null)。

1.3:插入操作

![image-20240322154854538]

遍历键中每个字符所对应的链接。

  • 遇到空链接时:创建新节点。
  • 遇到最后一个键字符时:在该节点设置值。

对应书本中的介绍:

![image-20240322154816017]

插入 “shore”,值为 7:

初始状态:

![image-20240322155323020]

从根节点开始搜索,创建新节点,把最后一个字符的值设置为 7:

![image-20240322155612659]

树的完整构建轨迹:

![image-20240322160100760]

1.4:Java 实现

edu.princeton.cs.algs4.TrieST

![image-20240322160923738]

edu.princeton.cs.algs4.TrieST#put

![image-20240322161020505]

edu.princeton.cs.algs4.TrieST#get

![image-20240322161133252]

![image-20240322161142319]

1.5:性能

![L18-52Tries_17]

搜索命中: 需要检查所有L个字符是否相等。

搜索未命中:

  • 可能第一个字符就不匹配。
  • 常见情况:只需检查少数几个字符(低于线性时间复杂度)。

空间占用: 每个叶子节点有 R 个空链接。
(但如果许多短字符串共享相同前缀,则有可能实现亚线性空间占用)

最重要: 搜索命中速度快,即使搜索未命中也更快,但会浪费空间。

1.6:删除操作

从一棵单词查找树中删去一个键值对的第一步是,找到键所对应的结点并将它的值设为空(null)。如果该结点含有一个非空的链接指向某个子结点,那么就不需要再进行其他操作了。如果它的所有链接均为空,那就需要从数据结构中删去这个结点。如果删去它使得它的父结点的所有链接也均为空,就需要继续删除它的父结点,依此类推。

删除 “shells”:

![L18-52Tries_18]

![L18-52Tries_19]

要删除一个键值对:

  • 找到对应于键的节点并将值设为空(null)。
  • 如果该节点的值为空,并且所有链接也都为空,则移除该节点(并递归处理子节点)。

书本对应的轨迹图:

![image-20240322162813490]

1.7:小结

![L18-52Tries_20]

R 路单词查找树(R-way trie):

  • 当R较小时的首选方法。
  • 对于较大的R,内存消耗过多。

挑战: 使用更少的内存,例如,对于 Unicode 设计一个 65536 路单词查找树!

2:三向单词查找树 ternary search tries

对应书本章节《5.2.3 三向单词查找树》。

2.1:介绍

![L18-52Tries_23]

  • 在节点中存储字符和值(而非完整的键)。
  • 每个节点拥有三个子节点:较小值(左)、相等值(中)和较大值(右)。

书本对应的示意图:

![image-20240322164622374]

2.2:查找操作

![L18-52Tries_28]

遍历键中每个字符所对应的链接。

  • 若字符较小,则走左侧链接;若字符较大,则走右侧链接。
  • 若字符相等,则取中间链接并移动到下一个键字符。

搜索命中: 搜索结束时所在的节点具有非空值。
搜索未命中: 到达空链接,或搜索结束位置的节点具有空值。

书本相关说明:

在查找时,我们首先比较键的首字母和根结点的字母。如果键的首字母较小,就选择左链接;如果较大,就选择右链接;如果相等,则选择中链接。然后,递归地使用相同的算法。如果遇到了一个空链接或者当键结束时结点的值为空,那么查找未命中;如果键结束时结点的值非空则查找命中。

2.2.1:成功命中

搜索 “sea”:

![L18-52Tries_24]

返回与最后一个关键字符关联的值(返回 6)。

2.2.2:未命中

搜素 “shelter”:

![L18-52Tries_25]

没有链接(无法到达)t(返回 null)。

2.3:Java 实现

edu.princeton.cs.algs4.TST

![image-20240322171704581]

edu.princeton.cs.algs4.TST#put

![image-20240322171756210]

edu.princeton.cs.algs4.TST#get

![image-20240322171834369]

2.4:字符串 ST 实现开销小结

![L18-52Tries_33]

注解: 通过旋转操作可以构建平衡 TST,从而在最坏情况下达到 L + logN 的时间复杂度保证。

最重要: TST 在处理字符串键时速度与哈希表相当,同时具备空间效率优势。

2.5:混合三向单词查找树 TST with R2 branching at root

![L18-52Tries_34]

混合 R 路单词查找树和 TST 的结构:

  • 在根部进行 R 平方分支。
  • R 个 2 路根节点各自指向一个 TST。

2.6:字符串 ST 实现开销小结

![L18-52Tries_35]

最重要: 对于我们的基准客户端,这种方案比哈希更快。

![L18-52Tries_36]

哈希算法:

  • 需要检查整个键。
  • 搜索命中和未命中的成本大致相同。
  • 性能取决于哈希函数的质量。
  • 不支持有序符号表操作。

TST:

  • 只适用于字符串(或数字)类型的键。
  • 只需检查足够多的关键字符即可。
  • 搜索未命中可能仅涉及几个字符。
  • 支持有序符号表操作(以及额外功能)。

最重要:

  • TST 在搜索(特别是搜索未命中时)上比哈希更快。
  • 相比红黑 BST,TST 更为灵活。

3:基于字符的操作 character-based operations

3.1:字符串符号表 API

![L18-52Tries_38]

**基于字符的操作:**字符串符号表 API 支持几种有用的基于字符的操作。

前缀匹配(Prefix match): 对于前缀为 “sh” 的键,可以找到匹配项如 “she”、“shells” 和 “shore”。
通配符匹配(Wildcard match): 符合模式 “.he” 的键,即能找到包含子串 “he” 的键,例如 “she” 和 “the”。
最长前缀(Longest prefix): 能够找到作为 “shellsort” 最长前缀的键,即 “shells”。

字符串 ST 基本 API:

![image-20240322111831008]

3.2:热身:有序迭代

![L18-52Tries_40]

按排序顺序遍历所有键:

  • 对 trie 进行中序遍历;将遇到的键添加到队列中。
  • 在从根节点到当前节点的路径上维护字符序列。

3.3:前缀匹配

![L18-52Tries_43]

3.4:最长前缀

![L18-52Tries_45]

在符号表中查找最长的且是查询字符串前缀的键。

  • 搜索查询字符串。
  • 记录下遇到的最长键。

可能出现的情况:

![image-20240322200430952]

3.5:压缩前缀树 | 帕特里夏前缀树 Patricia trie

![L18-52Tries_48]

Patricia trie: 帕特里夏前缀树,其英文全称为 “Practical Algorithm to Retrieve Information Coded in Alphanumeric”,意指一种针对字母数字编码信息进行高效检索的实用算法。

  • 删除单向分支:在帕特里夏树中消除只有一个后代的节点,使得每个节点都代表一组连续的字符。
  • 每个节点表示一串字符:在该数据结构中,每个内部节点关联了一段字符序列。
  • 实现细节:这部分内容超出了本次课程的范围,需要进一步学习和实践。

应用:

  • 数据库搜索:在数据库中快速查找具有相同前缀的记录。
  • P2P 网络搜索:在点对点网络中高效地查找匹配前缀的信息。
  • IP 路由表查找:在网络路由中寻找最长前缀匹配,确定数据包的最佳传输路径。
  • 压缩四叉树在 N 体模拟中的应用:可用于高效的多体系统空间划分和搜索。
  • 高效存储和查询 XML 文档:用于优化 XML 文档的存储方式,提升查询效率。

此外: Patricia trie 也被称为 “crit-bit 树” 或 “基数树”(radix tree)。

![image-20240322201939036]

3.6:后缀树

![L18-52Tries_49]

后缀树:

  • 字符串所有后缀的帕特里夏前缀树表示形式。
  • 线性时间构建算法:这一内容超出了本课程的范围。

应用:

  • 线性时间复杂度算法的应用:最长重复子串、最长公共子串、最长回文子串、子串搜索、串联重复序列等。
  • 计算生物学数据库(如BLAST、FASTA)中的应用。

3.7:小结

![L18-52Tries_50]

算法设计与分析中的成功案例:

红黑 BST(二叉搜索树):

  • 性能保证:对数级别的键比较次数(O(log N))。
  • 支持有序符号表API。

哈希表:

  • 性能保证:常量级别的探测次数(O(1)理想情况下)。
  • 需要为键类型提供良好的哈希函数。

Trie(单词查找树): R 路、TST

  • 性能保证:访问对数级别的字符数(O(log N)。
  • 支持基于字符的操作。

总结: 实际上,只需要查看大约50-100位的数据(!!!),理论上可以访问任何数据。

(完)

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

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

相关文章

刷题DAY31 | LeetCode 455-分发饼干 376-摆动序列 53-最大子序和

455 分发饼干(easy) 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并…

惠普EliteBook使用VirtualBox安装ISO镜像

实验环境 虚拟机软件:Oracle VM VirtualBox 6.1.16镜像文件:CentOS-7-x86_64-Minimal-2009.iso笔记本:惠普EditBook操作系统:Window10 BIOS开启虚拟化技术 一遍笔记本都不会开启虚拟化技术的,但是在window里使用虚拟…

二叉树|257.二叉树的所有路径

力扣题目链接 class Solution { private:void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {path.push_back(cur->val); // 中&#xff0c;中为什么写在这里&#xff0c;因为最后一个节点也要加入到path中 // 这才到了叶子节…

Qt实现TFTP Server和 TFTP Client(一)

1 概述 TFTP协议是基于UDP的简单文件传输协议&#xff0c;协议双方为Client和Server.Client和Server之间通过5种消息来传输文件,消息前两个字节Code是消息类型&#xff0c;消息内容随消息类型不同而不同。传输模式有三种&#xff1a;octet,netascii和mail&#xff0c;octet为二…

nodejs安装使用React

1、react安装 首先&#xff0c;确保电脑上具备nodejs环境&#xff0c;之后用 winr 呼出控制台&#xff0c;输入 cmd 命令弹出cmd控制台&#xff08;小黑框&#xff09;之后在默认路径输入如下代码 npm i -g create-react-app //全局安装react环境无需选择特定文件夹安装成功后…

代码随想录--排序算法

912.排序数组 快速排序 思路&#xff1a; 1. 设置一个pivot2. 将小于nums[pivot]的值 放在左边3. 将 大于nums[pivot]的值 放在 右边4. 递归调用注意&#xff1a;必须先比较nums[high] 与pivot 代码&#xff1a; class Solution {int partition(vector<int>&nu…

论文解读:Frozen Feature Augmentation for Few-Shot Image Classification

文章总结 动机 通过各种图像增强手段和冻结特征(已经训练好的特征)结合起来训练轻量级模型。 最终得到的最佳设置顺序 亮度&#xff0c;对比度FroFA (C)和后置cFroFA (Pc) 这三种连续的数据增强操作(具体这三种数据增强操作是干了什么&#xff0c;得去附录找) 这里三种FroFA…

国内IP地址格式的多样性与规范化

在当今数字化时代&#xff0c;IP地址作为互联网通信的基本要素之一&#xff0c;在网络通信中扮演着至关重要的角色。了解国内IP地址的格式、规范以及不同类型的IP地址对网络通信的影响&#xff0c;对于构建高效稳定的网络环境至关重要。虎观代理小二将深入探讨国内IP地址的格式…

Centos虚拟机忘记密码;重置虚机密码

虚拟机是一个好用的工具&#xff0c;在本地搭建的虚拟机可以给我们提供测试&#xff0c;但时间长了也会忘记密码&#xff1b;因此这里以centos系统的虚机为例&#xff0c;提供一个重置虚机密码的方法 1.在开机页面按“E”进入编辑模式 进入后长这样&#xff1a; 2.找到ro cras…

iOS模拟器 Unable to boot the Simulator —— Ficow笔记

本文首发于 Ficow Shen’s Blog&#xff0c;原文地址&#xff1a; iOS模拟器 Unable to boot the Simulator —— Ficow笔记。 内容概览 前言终结模拟器进程命令行改权限清除模拟器缓存总结 前言 iOS模拟器和Xcode一样不靠谱&#xff0c;问题也不少。&#x1f602; 那就有病治…

Tensorflow 2.0 常见函数用法(一)

文章目录 0. 基础用法1. tf.cast2. tf.keras.layers.Dense3. tf.variable_scope4. tf.squeeze5. tf.math.multiply 0. 基础用法 Tensorflow 的用法不定期更新遇到的一些用法&#xff0c;之前已经包含了基础用法参考这里 &#xff0c;具体包含如下图的方法&#xff1a; 本文介…

使用PDFBox调整PDF每页格式

目录 一、内容没有图片 二、内容有图片 maven依赖&#xff0c;这里使用的是pdfbox的2.0.30版本 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.30</version></dependency>…

基于python+vue 的一加剧场管理系统的设计与实现flask-django-nodejs-php

二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这一需求设…

vue 消息左右滚动(前后无缝衔接)

演示效果 封装的组件 <!--* Author:* Date: 2024-03-21 19:21:58* LastEditTime: 2024-03-21 20:31:50* LastEditors: Please set LastEditors* Description: 消息左右滚动 --> <template><divid"textScroll"class"text-scroll"mousemove&…

Alibaba spring cloud Dubbo使用(基于Zookeeper或者基于Nacos+泛化调用完整代码一键启动)

Quick Start Dubbo&#xff01;用更优雅的方式来实现RPC调用吧 - 掘金 dubbozookeeper demo 项目结构&#xff1a; RpcService 仅仅是提供服务的接口&#xff1a; public interface HelloService {String sayHello(String name); }DubboServer pom&#xff1a; <?xm…

分布式之网关介绍

一、网关简介 1、网关背景 由于微服务“各自为政的特性”使微服务的使用非常麻烦。通常公司会有一个“前台小姐姐”作为统一入口&#xff0c;这就是网关 2、网关作用 统一入口&#xff1a;为服务提供一个唯一的入口&#xff0c;网关起到外部和内部隔离的作用&#xff0c; 保…

软考中级 --网络工程师真题试卷 2023下半年

在EIGRP协议中&#xff0c;某个路由器收到了两条路径到达目标网络&#xff0c;路径1的带宽为100Mbps&#xff0c;延迟2ms&#xff0c;路径2的带宽为50Mbps&#xff0c;迟为4ms&#xff0c;如果EIGRP使用带宽和延迟的综合度量标准&#xff0c;那么该路由器选择的最佳路径是(D)。…

STM32 CubeMX使用介绍(含FreeRTOS生成)

文章目录 前言1. 简介1.1 什么是STM32CubeMX1.2 为什么会有STM32CubeMX的出现1.3 STM32CubeMX常用功能有哪些&#xff1f;1.4 官方资料下载地址 2. 下载和安装STM32CubeMX2.1 下载软件2.2 软件安装 3. 使用方式3.1 说明3.2 不同选择器介绍3.3 构建新的项目3.1 选择单片机的型号…

处理登录失效后提示多个错误

问题: 我的场景是后端规定&#xff0c;即使登录失效返回的code仍是200&#xff0c;然后data的code是999什么的&#xff1b; 原本代码&#xff1a; 修改版代码&#xff1a; 通过节 const NotLoginEvent () > {router.replace("/login");localStorage.clear();M…

对话悠易科技蔡芳:品牌逐渐回归核心能力建设,布局和构建自己的流量阵地

关于SaaS模式在中国的发展&#xff0c;网上出现多种声音。Marteker近期采访了一些行业专家&#xff0c;围绕SaaS模式以及Martech在中国的发展提出独特观点。悠易科技副总裁蔡芳认为&#xff0c;中国目前存在SaaS的应用场景与客户需求&#xff0c;用户的应用能力也在提升&#x…