热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

红黑树与平衡二叉树和b树,4阶b树

一、二叉树二叉树是每个结点最多有两个子树的有序树,子树的根被称作左子树和右子树。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。叶节点,分支节点,根节点这些基本概念就不一一进行说明


一、二叉树是每个节点最多有两个子树的有序树,子树的根称为左子树和右子树。 二叉树常用作二叉树的搜索树和二叉树的山或二叉树的排序树。 不对叶节点、分支节点、根节点这些基本概念进行说明。二叉树性质:


二叉树的i层最多有2i-1个节点。 深度为k的二叉树最多具有2k-1个节点。 在任何二叉树中,如果2度的节点数为n2个,则叶数n0一定是


n2 1即n0=n2 1 二叉树分类:


1、完全二叉树以二叉树高度为h,除第h层外其他各层(1~h-1 )的节点数达到最大个数,第h层有叶节点,叶节点从左向右依次排列的为完全二叉树。


性质:


具有n个节点的完全二叉树的深度可能对int(log2n ) 1前k-1层节点均为“满”的第k层不满意,且节点偏左聚集的叶只出现在最后两层。 对于任意节点,如果将其右枝下的子孙的最大层次设为l,则其左枝下的子孙的最大层次必须为l或L 1。 也就是说,度为1的点为只有最后一片叶子的1或0个,且有左子女无右子女,其余非叶结节度均为2 2,满二叉树除叶结节外所有节点均有左右子叶,叶节点均为最底层二叉树。性质:


任何充满二叉树的节点都“填满”每个层的节点,这取决于度是0还是2。 即每层i的节点数最大值2i -1二叉树与完全二叉树有区别。


二叉树是至少有一个节点的树,而完全二叉树前面的k-1层是满的,但最底层允许缺少右侧连续的几个节点。


二、平衡二叉树(AVL )是一种空树,或具有以下性质的二叉树:


左侧子树和右侧子树深度差(平衡因子)的绝对值小于等于1,而左右子树是平衡二叉树的主要使用场景。 使用windows管理进程地址空间


二叉树的平衡调整有四种情况。 分别是LL、LR、RR、RL。 关于这四个案例的具体调整过程请看本博客:


二叉树(AVL )的图解与实现


三、红黑树红黑树是各节点具有颜色属性的自平衡二叉树,都是在插入和删除操作时通过特定操作保持二叉树的平衡,获得较高的搜索性能。


除了四元查找树的一般要求外,还为有效的红黑树添加了以下附加要求:


节点为红色或黑色。 根节点是黑色的。 每个叶节点(NIL节点、空节点)为黑色。 每个红色节点的两个子节点是黑色的。 (从每个叶到根的所有路径不能有两个连续的红色节点)从其中一个节点到每个叶的所有路径都包含相同数量的黑色节点。 红黑树通过旋转和变色达到自我平衡。 具体过程可浏览以下博客:


30张图让你彻底了解红黑树


使用场景: map、set和Linux文件管理


四、B/B树1、b树b树是多叉树别名平衡多重搜索树,一般说m阶b树,必须满足以下条件:


每个节点最多只有m个子节点。 每个非叶节点(根节点除外)至少有m/2个子节点。 如果根不是叶节点,则根至少有两个子节点。 具有k个子节点的非叶节点包含k -1个密钥。 所有叶出现在同一水平上、没有任何信息的(高度一致的) b树的一个节点的子节点数的最大值用m表示,如果最大值为10则为10次。 例子如下。


在所有节点中,节点【13、16、19】具有最多的子节点,是4个子节点(灰色节点),因此上面的图像可以定义为4阶b树。


排序方式:在b树中,所有节点密钥按升序排列,遵循左小右大原则。 而且,在该节点的孩子是非叶节点的情况下,该k-1个密钥正好是k个孩子所包含的密钥的值域的分隔。


有关查询、插入和删除Web树的流程,将显示本文。 是b树和b树


2、b树b树是文件系统所需的b树的变形树。 b树更充分地利用节点空间,使查询速度更稳定,速度完全接近二分法搜索。


特征:


具有m个子树的中间节点包含m个元素(在b树中为k-1个元素),每个元素不存储数据,只用于索引。 所有叶节点包含所有关键字的信息和指向包含这些关键字的记录的指针,叶节点自身按照关键字大小从小到大的顺序链接; 的所有非终结节点都可以视为索引部分,该节点只包含其子树的根节点中最大(或最小)的关键字。特点


较低的b树级别:由于树级别比为b树b中的每个非叶节点存储的关键字少,因此对数据的查询速度更快。 b树查询速度更稳定: b由于叶节点上存在所有关键字数据地址,每次查询次数相同,因此查询速度比b树稳定的b树自然具有排序功能。 b树中所有叶节点的数据组成有序的链表,在查询大小区间的数据时方便,数据紧密性强,缓存命中率也高于b树。 b树全

节点遍历更快:B+树遍历整棵树只需要遍历所有的叶子节点即可,,而不需要像B树一样需要对每一层进行遍历,这有利于数据库做全表扫描。

使用场景:磁盘文件组织数据索引和数据库索引

五、相关面试题 1、为什么说B+树比B树更适合数据库索引?

(1)B+树的磁盘读写代价更低
B+树的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了;

(2)B+树查询效率更加稳定
由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当;

(3)B+树便于范围查询
B树在提高了IO性能的同时并没有解决元素遍历的我效率低下的问题。B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低。

B树的范围查找用的是中序遍历,而B+树用的是在链表上遍历;

2、B树的缺点

不利于范围查找(区间查找),如果要找 0~100的索引值,那么B树需要多次从根结点开始逐个查找

3、B树与B+树的区别: B+树内部有两种结点,一种是索引结点,一种是叶子结点;B树没有索引结点。B+树的索引结点并不会保存记录,只用于索引,所有的数据都保存在B+树的叶子结点中;而B树则是所有结点都会保存数据。B+树由于叶子结点都有链表,且链表是以从小到大的顺序排好序的,因此可以直接通过遍历链表实现范围查找,而B树不支持范围查找。B树的所有索引值是不会重复的,而B+树非叶子结点的索引值最终一定会全部出现在叶子结点中。 4、平衡二叉树优缺点、与红黑树的区别

二叉查找树在某些情况下可以退化为一条链表,这样的二叉查找树的查找时间复杂度变成了 O(n),为了解决这个问题,于是引申出了平衡二叉树。

优点: 在插入或者删除元素时不需要移动元素,插入和删除的性能较好;

缺点: 平衡树要求每个节点的左子树和右子树的高度差至多等于1,这个要求导致每次进行插入/删除节点的时候,几乎都会破坏平衡树的第二个规则,进而需要通过左旋和右旋来进行调整,使之再次成为一颗符合要求的平衡树。显然,如果在插入、删除很频繁的场景中,平衡树需要频繁着进行调整,会使平衡树的性能大打折扣。

与红黑树的区别:

AVL树是高度平衡的,频繁的插入和删除,会引起频繁的rebalance,导致效率下降;红黑树不是高度平衡的,插入最多两次旋转,删除最多三次旋转;平衡二叉树追求绝对平衡,条件比较苛刻,实现起来比较麻烦,每次插入新节点之后需要旋转的次数不能预知。

参考文章:【数据结构】二叉树


推荐阅读
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 树莓派Linux基础(一):查看文件系统的命令行操作
    本文介绍了在树莓派上通过SSH服务使用命令行查看文件系统的操作,包括cd命令用于变更目录、pwd命令用于显示当前目录位置、ls命令用于显示文件和目录列表。详细讲解了这些命令的使用方法和注意事项。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
author-avatar
六尾11
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有