文章目录
-
- [一 :树的分类](#一 :树的分类)
-
- [1、二叉树(Binary Tree):](#1、二叉树(Binary Tree):)
- [2、二叉搜索树(Binary Search Tree, BST):](#2、二叉搜索树(Binary Search Tree, BST):)
- 3、平衡二叉树:
- 4、字典树(Trie):
- [5、多叉树(Multiway Tree):](#5、多叉树(Multiway Tree):)
- 二、二叉搜素树
- 三、字典树和平衡二叉树
- 三、数据库索引
-
- 1、树在数据库索引中的作用
- [2、Oracle、Mysql 、Postgresql 索引所运用的树原理](#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都运用了树原理和技术来构建索引,以提高数据的查询效率。不同的数据库和存储引擎可能选择不同的索引结构以适应不同的应用场景和查询需求。在选择和使用索引时,需要根据实际的数据分布、查询模式和性能要求来做出决策。