数据结构 : 树的分类及在数据库索引中的运用

文章目录

    • 一 :树的分类
      • 1、二叉树(Binary Tree):
      • 2、二叉搜索树(Binary Search Tree, BST):
      • 3、平衡二叉树:
      • 4、字典树(Trie):
      • 5、多叉树(Multiway Tree):
    • 二、二叉搜素树
      • B树:
      • B+树:
      • 红黑树:
    • 三、字典树和平衡二叉树
      • 字典树(Trie树)的原理:
      • 平衡二叉树的原理:
      • 区别
      • 应用场景:
    • 三、数据库索引
      • 1、树在数据库索引中的作用
      • 2、Oracle、Mysql 、Postgresql 索引所运用的树原理

一 :树的分类

1、二叉树(Binary Tree):

每个节点最多有两个子节点,通常称为左子节点和右子节点。
是许多其他树结构的基础,如二叉搜索树和平衡二叉树。
应用广泛,包括排序、搜索、表达式解析等。

2、二叉搜索树(Binary Search Tree, BST):

二叉树的一种特殊形式,其中左子节点的值小于父节点,右子节点的值大于父节点。
提供了高效的插入、删除和搜索操作,但最坏情况下可能退化为链表。
适用于需要频繁插入、删除和搜索的场景。

3、平衡二叉树:

包括AVL树、伸展树等,它们通过旋转和重新平衡操作来保持树的平衡。
平衡二叉树确保树的高度保持在对数级别,从而保证了高效的搜索性能。
适用于需要频繁搜索、插入和删除的场景,特别是在数据动态变化的情况下。

4、字典树(Trie):

又称前缀树或键树,用于存储关联数组,其中键通常是字符串。
每个节点代表字符串的一个字符,从根到叶子的路径表示一个完整的字符串。
适用于快速检索具有公共前缀的键,如字符串搜索、自动补全等。

5、多叉树(Multiway Tree):

每个节点可以有多个子节点,不像二叉树那样仅限于两个。
多叉树根据具体的定义和用途可以有不同的形式,如k叉树等。
适用于需要表示具有多个子元素的数据结构,如文件系统的目录结构。

二、二叉搜素树

B树:

查询时间复杂度:O(log n)
B树是一种平衡的多路搜索树,其中每个节点可以包含多个键和子节点。查询操作从根节点开始,根据键的值在子树中进行选择,直到找到所需的键或确定键不存在。由于B树的高度与数据量的对数成正比,因此查询操作的时间复杂度为O(log n)。

B+树:

查询时间复杂度:O(log n)
B+树是B树的扩展,其主要区别在于所有键都存储在叶子节点中,而内部节点仅作为索引使用。这种设计使得B+树在范围查询和磁盘存储方面更加高效。尽管结构有所不同,但查询操作的基本过程与B树相似,因此查询时间复杂度也为O(log n)。

红黑树:

查询时间复杂度:O(log n)
红黑树是一种自平衡的二叉搜索树,它通过颜色和特定的调整规则来保持树的平衡。在红黑树中,每个节点都有一个颜色属性(红色或黑色),并且满足一系列属性以确保树的平衡。查询操作在红黑树中按照二叉搜索树的方式进行,因此时间复杂度为O(log n)。

三、字典树和平衡二叉树

字典树(Trie树)的原理:

字典树,也称为Trie树或前缀树,是一种树形结构,用于高效地存储和检索字符串数据集中的键。它的主要原理是利用字符串的公共前缀来组织数据,以减少查询时间。在Trie树中,一个节点表示一个字符串(或前缀)的一个字符,从根节点到任意一个节点的路径就表示一个字符串或前缀。

每个节点包含一个字符,并且除根节点外,每个节点都有一个指向其子节点的指针数组。
如果一个字符串在Trie树中,那么从根节点开始,沿着表示该字符串的字符路径,可以到达一个表示字符串末尾的节点(通常用一个特殊标记来表示)。
查询操作是从根节点开始,沿着与查询字符串相对应的字符路径进行遍历,直到找到目标节点或确定该字符串不存在。

平衡二叉树的原理:

平衡二叉树(如AVL树)是一种自平衡的二叉搜索树,它的主要原理是保持树的平衡,以确保查询、插入和删除操作的时间复杂度接近O(log n)。

在平衡二叉树中,任何节点的两个子树的高度差不会超过1,这有助于防止树出现倾斜,从而保证树的高度相对较低。
平衡二叉树通过旋转操作来维持其平衡性。当在树中插入或删除节点导致树失衡时,会触发旋转操作来调整树的结构,使其重新达到平衡状态。
旋转操作包括单旋转(左旋或右旋)和双旋转(左右旋或右左旋),具体旋转方式取决于失衡节点和其子节点的相对高度以及插入或删除操作的位置。
平衡二叉树的旋转操作和高度平衡的特性是其高效性能的关键。通过保持树的高度相对较低(接近log n),平衡二叉树能够在O(log n)的时间复杂度内完成查询、插入和删除操作。

总的来说,字典树和平衡二叉树都是高效的数据结构,它们在不同的应用场景中发挥着重要作用。字典树适用于具有公共前缀的字符串存储和查询,而平衡二叉树则适用于需要频繁进行插入、删除和查询操作的场景,且要求这些操作的时间复杂度尽可能低。

区别

字典树(Trie树)和平衡二叉树(如AVL树)在数据结构、性质和应用场景上都有着显著的区别。

数据结构与性质:
字典树:字典树是一种树形结构,是哈希树的变种。它特别适用于统计、排序和保存大量的字符串。字典树的基本性质包括:根节点不包含字符,除根节点外的每个子节点都包含一个字符;从根节点到某一节点的路径上经过的字符连接起来,就是该节点对应的字符串;每个节点的所有子节点包含的字符都不相同。这种结构利用字符串的公共前缀来减少查询时间,从而最大限度地减少无谓的字符串比较。
平衡二叉树:平衡二叉树(如AVL树)是一种特殊的二叉搜索树,它要求每个节点的左子树和右子树的高度之差的绝对值不超过1,以此确保树的平衡。这种平衡性使得在插入、删除和搜索操作时,树的深度保持在O(log n)级别,从而保证了操作的效率。

字典树:由于字典树能有效地处理具有公共前缀的字符串,因此它特别适合用于搜索引擎系统的文本词频统计、自动补全等场景。
平衡二叉树:平衡二叉树因其高效的插入、删除和搜索性能,常被用于数据库索引、文件系统、内存管理等需要频繁进行动态操作的场景。
总的来说,字典树和平衡二叉树在数据结构和性质上的差异导致了它们各自在不同应用场景中的优势。选择使用哪种数据结构,取决于具体的需求和数据特性。

应用场景:

字典树和平衡二叉树在实际应用场景中都有广泛的用途,它们各自在不同的领域和场景下发挥着重要的作用。

字典树(Trie树)的实际应用场景包括但不限于:

文本词频统计:在搜索引擎系统中,字典树被用于统计大量的字符串(但不仅限于字符串),以便快速定位包含特定字符串的文档。
自动完成功能:无论是在搜索框、表单还是其他文本输入场景中,字典树都能通过快速匹配前缀来提供用户可能感兴趣的搜索建议或自动补全功能。
前缀搜索:在电子邮件应用或文件系统中,用户可以通过输入部分名称或地址,利用字典树快速找到以指定前缀开头的项目。
维护关键字:在敏感信息检测系统中,字典树可以用来记录常见的敏感单词或短语,以便在系统扫描文档时快速检查是否包含任何敏感信息。
平衡二叉树的实际应用场景则包括:

数据库索引:平衡二叉树如AVL树和红黑树等,常被用于实现数据库中的索引结构,以加速数据的检索速度。
高效排序算法:通过利用平衡二叉树的性质,可以实现高效的排序算法,如二叉排序树和红黑树,从而提高排序算法的效率。
缓存淘汰算法:平衡二叉树也被用于实现高效的缓存淘汰算法,如LRU(Least Recently Used)算法,通过快速选择要淘汰的数据来提高缓存效率。
路由算法:在计算机网络中,平衡二叉树可用于实现高效的路由查找和转发算法。
综上所述,字典树和平衡二叉树各自在文本处理、数据库、排序、缓存管理和网络路由等领域都有着重要的实际应用场景。选择使用哪种数据结构取决于具体的需求和数据特性。

三、数据库索引

1、树在数据库索引中的作用

二叉搜索树(Binary Search Tree,简称 BST)是一种非常有用的数据结构,特别适用于数据索引和快速查找操作。在二叉搜索树中,每个节点包含一个值以及两个子节点(左子节点和右子节点)。左子节点的值小于其父节点的值,而右子节点的值大于其父节点的值。这种性质使得二叉搜索树在查找、插入和删除操作中都具有很高的效率。

在数据索引中,二叉搜索树的应用主要体现在以下几个方面:

快速查找:二叉搜索树的特性使得查找操作非常高效。给定一个目标值,可以从根节点开始,根据目标值与节点值的比较结果,选择向左子树或右子树递归查找。由于每个节点的子节点值都是有序的,因此可以快速地定位到目标值所在的位置。这种查找方式的时间复杂度通常为 O(log n),其中 n 是树中节点的数量。
范围查询:除了查找特定值外,二叉搜索树还可以方便地执行范围查询。例如,查找所有在某个范围内的值。通过遍历树中满足条件的节点,可以快速获取范围内的所有值。
动态数据维护:二叉搜索树能够高效地处理数据的插入和删除操作。当插入一个新值时,可以将其添加到合适的位置,以保持树的搜索属性。同样地,当删除一个值时,需要调整树的结构以确保剩余节点仍然满足搜索属性。这些操作的时间复杂度通常也是 O(log n)。
优化存储和访问:二叉搜索树可以通过平衡操作(如 AVL 树、红黑树等)来优化树的形状,以减少树的高度并进一步提高查找、插入和删除操作的效率。此外,通过适当的内存管理策略,可以有效地利用存储空间并减少访问延迟。
总之,二叉搜索树在数据索引中发挥着重要作用,它提供了一种高效的数据结构来支持快速查找、范围查询以及动态数据的维护。然而,需要注意的是,在实际应用中,还需要考虑数据的分布特性、内存限制以及并发访问等因素,以选择最合适的二叉搜索树变种或优化策略。

2、Oracle、Mysql 、Postgresql 索引所运用的树原理

Oracle数据库、MySQL和PostgreSQL是三种常用的关系型数据库,它们在索引的实现上都运用了树原理和技术,以提高数据的查询效率。以下是对这三种数据库中索引所运用的树原理和技术的详细总结:

Oracle数据库

Oracle数据库主要使用B-Tree索引和Bitmap索引。

B-Tree索引:B-Tree索引是一种平衡的树形结构,它以键值为关键字建立多叉搜索树,每个节点存储一个索引键值与对应记录指针。B-Tree索引的查找速度是与节点高度有关,节点高度越低,查询速度越快。Oracle数据库通过将索引分为多个块进行存储,每个块包含若干字节的数据和指向下一个块的指针,形成链式结构,以便快速定位到目标数据。
Bitmap索引:Bitmap索引是一种特殊的索引技术,在Bitmap索引中,每个索引键值对应一个位图,位图中每一位表示某一行是否存在该索引键值,1表示存在,0表示不存在。Bitmap索引通过逻辑位操作查找数据,因此其查找速度通常比B-Tree索引更快。
MySQL

MySQL的索引结构则更加多样化,包括哈希索引、B-Tree索引等。其中,InnoDB和MyISAM存储引擎主要使用B+树作为其索引结构。

B+树索引:B+树是B-树的扩展,其非叶子节点不保存关键字记录的指针,这样使得B+树更加矮胖,查询效率更加稳定。同时,B+树的叶子节点保存了关键字记录的指针,并且所有叶子节点中包含了全部关键字的信息以及指向含这些关键字记录的指针,且叶子节点本身依关键字的大小自小而大顺序链接。此外,B+树还有一个特点是有一个根节点,根节点只有子节点。所有关键字都出现在叶子节点的链表中(稠密索引),且链表中的节点依关键字大小有序。
哈希索引:MySQL中的MEMORY存储引擎支持哈希索引。哈希索引基于哈希表实现,它仅支持等值比较查询,如“=”、“IN()”和“<=>”,不支持范围查询。由于哈希索引中存储的是通过哈希算法计算得到的哈希值,因此其查询速度非常快。但是,哈希索引并不适用于所有场景,特别是在数据量较大或需要频繁进行范围查询的情况下,其性能可能会下降。
PostgreSQL

PostgreSQL主要使用B-Tree作为其索引结构。

B-Tree索引:在PostgreSQL中,B-Tree索引也是一棵自平衡的多叉树,它允许key+value存储于内部节点,且有序。这种结构使得对节点数据的增删改查的时间复杂度降低到O(logn),其中n是B-Tree节点的个数。B-Tree索引在PostgreSQL中得到了广泛的应用,因为它能够高效地支持各种查询操作,包括精确匹配和范围查询。
总结来说,Oracle数据库、MySQL和PostgreSQL都运用了树原理和技术来构建索引,以提高数据的查询效率。不同的数据库和存储引擎可能选择不同的索引结构以适应不同的应用场景和查询需求。在选择和使用索引时,需要根据实际的数据分布、查询模式和性能要求来做出决策。

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

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

相关文章

算法学习笔记Day9——动态规划基础篇

一、介绍 本文解决几个问题&#xff1a;动态规划是什么&#xff1f;解决动态规划问题有什么技巧&#xff1f;如何学习动态规划&#xff1f; 1. 动态规划问题的一般形式就是求最值。动态规划其实是运筹学的一种最优化方法&#xff0c;只不过在计算机问题上应用比较多&#xff…

opencv_17_翻转与旋转

一、图像翻转 1&#xff09;void flip_test(Mat& image); 2&#xff09;void ColorInvert::flip_test(Mat& image) { Mat dst; //flip(image, dst, 0); //上下翻转 flip(image, dst, 1); //左右翻转 // flip(image, dst, -1); //180度翻转 imsho…

OpenVINO安装教程 vcpkg版

通过 vcpkg 安装 OpenVINO™ Runtime 请注意&#xff0c;vcpkg 发行版&#xff1a; 仅提供 C/C API 不支持 NPU 推理 专用于所有主要操作系统的用户&#xff1a;Windows、Linux 和 macOS &#xff08;所有 x86_64 / ARM64 架构&#xff09; 系统要求处理器说明软件要求 完整…

B站美化插件,支持自定义,太酷辣~

大公司的软件和网站通常具有优雅的默认界面设计。 以国内二次元聚集地B站为例&#xff0c;可以说它的UI设计非常吸引人。与其他视频网站繁复的设计相比&#xff0c;B站的界面设计可以说是遥遥领先 然而&#xff0c;总有些人对默认的用户界面感到不满意&#xff0c;他们渴望尝试…

接口自动化测试框架

接口自动化测试框架&#xff1a;pythonunittest/pytestrequestsddtopenpyxlpymysqllogging 框架设计思路数据驱动结构分层&#xff08;可读性、可维护性、可扩展性&#xff09;数据驱动将维护数据与代码分离&#xff0c;接口调用行为一致&#xff0c;针对不同的参数组合驱动不同…

fiddler提示“The system proxy was changed.Click to reenable capturing.”的原因及解决办法

一、现象描述 运行fiddler时&#xff0c;提示“The system proxy was changed.Click to reenable capturing.”&#xff0c;即使点击了该提示&#xff0c;重新进行抓包&#xff0c;不一会儿&#xff0c;该提示又会出现&#xff0c;又不能进行抓包了。 二、解决方法 2.1 原因一&…

Java 高级面试问题及答案

Java 高级面试问题及答案 问题 1: 在 Java 中&#xff0c;什么是强引用、软引用、弱引用和虚引用&#xff1f;它们分别有什么用途&#xff1f; 探讨过程&#xff1a; 在Java中&#xff0c;对象的引用类型决定了垃圾回收器如何回收对象。强引用是最常见的&#xff0c;它阻止垃…

java 根据对象的boolean字段对集合进行排序

java 根据对象的boolean字段对集合进行排序 ‍ 需求大概如下&#xff1a; 把boolean为true的排序到前面,false排序到后面 ‍ 排序后, boolean为true的会在前面, 为false的会在后面 , isHasMaterial 为boolean类型 Data Builder public class MoguPoiBaseInfo {/*** 是否有…

输电线路的“天眼”:双目协同图像视频监测装置

在广袤的天地之间&#xff0c;纵横交错的输电线路如同血脉一般&#xff0c;为我们的生活输送着源源不断的电力。然而&#xff0c;这些“血脉”也常常面临着各种挑战&#xff0c;如外力破坏、恶劣天气等。为了守护这些重要的“生命线”&#xff0c;鼎信智慧研发了一款智能监控设…

LeetCode 1146. 快照数组【哈希表+二分查找】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

云原生Kubernetes: K8S 1.29版本 部署GitLab

目录 一、实验 1.环境 2.搭建NFS 3.K8S 1.29版本 部署Redis 4.K8S 1.29版本 部署Postgresql 5.K8S 1.29版本 部署GitLab 6.K8S 部署istio微服务 7.K8S 部署ingress应用路由 二、问题 1.K8S部署gitlab报错 2.gitlab创建失败 3.生成网关资源报错 4.安装istio 报错 …

APP自定义身份证相机(Android +iOS)

基本上同时兼容安卓和苹果的插件都需要付费&#xff0c;这里我找了2个好用的免费插件 1.仅支持安卓&#xff1a;自定义身份证相机&#xff08;支持蒙版自定义&#xff09;&#xff0c;内置蒙版&#xff0c;照片预览&#xff0c;身份证裁剪 - DCloud 插件市场、 2.支持iOS(已测…

打水问题(贪心算法)

题目&#xff1a;有n个人排队到r个水龙头去打水&#xff0c;他们装满水桶的时间t1、t2………tn为整数且各不相等&#xff0c;应如何安排他们的打水顺序才能使他们总共花费的时间最少&#xff1f;通过键盘输入排队打水的人数以及每人打水的时间和水龙头数&#xff0c;使用贪心算…

泰迪智能科技受邀参加2024年粤港澳大湾区产教融合技能人才培养联盟理事会会议

4月24日下午&#xff0c;2024年粤港澳大湾区产教融合技能人才培养联盟&#xff08;以下简称联盟&#xff09;理事会会议在白云区成功举办。 会议由广州市人力资源和社会保障局、广州市发展和改革委员会、广州市教育局、广州市工业和信息化局、广州市总工会等单位指导&#xff…

Python实现对规整的二维列表中每个子列表对应的值求和

目录 一、二维列表及其结构 二、对应位置元素求和的逻辑 三、代码实现 四、优化与改进 五、实际应用场景 六、扩展与变体 七、总结 在Python编程中&#xff0c;处理二维列表&#xff08;即列表的列表&#xff09;是一个常见的任务。有时候我们需要对二维列表中每个子列表…

多线程编程7——wait和notify、notifyAll

线程最大的问题就是抢占式执行&#xff0c;随机调度。可以通过一些API让线程主动阻塞&#xff0c;主动放弃CPU&#xff0c;从而控制线程之间的执行顺序。比如&#xff1a;join&#xff0c;sleep&#xff0c;wait和notify、notifyAll 前面章节已经介绍过 join 和 sleep了&#…

计算机网络-IPv6地址规范与分类

昨天学习了IPv6的基础概念&#xff0c;了解了IPv6的由来以及地址格式&#xff0c;今天继续学习下IPv6的地址分类与表示。 一、IPv6地址缩写规范 IPv6地址的长度为128 bit。一般用冒号分割为8段&#xff0c;每一段16 bit&#xff0c;每一段内用十六进制表示。 IPv6地址格式 那12…

3-成功初始化 Kubernetes 控制平面后如何操作

成功初始化 Kubernetes 控制平面后的一系列指示和建议&#xff0c;用于帮助你开始使用你的 Kubernetes 集群。下面是详细的解释和步骤&#xff1a; kubeadm init --apiserver-advertise-address 172.19.35.202 --image-repository registry.cn-hangzhou.aliyuncs.com/google_c…

MATLAB 基础使用教程

MATLAB 的基本使用主要包括如下几个方面&#xff1a;熟悉 MATLAB 环境&#xff0c;数据的输入输出&#xff0c;基本的数学运算&#xff0c;图形绘制&#xff0c;编程等。以下通过一些例子进行简要说明。 1. 熟悉 MATLAB 环境 启动 MATLAB 后&#xff0c;你会看到 MATLAB 的桌面…

【kettle004】kettle访问本地MySQL数据库并处理数据至execl文件

一直以来想写下基于kettle的系列文章&#xff0c;作为较火的数据ETL工具&#xff0c;也是日常项目开发中常用的一款工具&#xff0c;最近刚好挤时间梳理、总结下这块儿的知识体系。 熟悉、梳理、总结下MySQL关系数据库相关知识体系 kettle访问MySQL数据库并处理数据至execl文件…