热门标签 | 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,导致效率下降;红黑树不是高度平衡的,插入最多两次旋转,删除最多三次旋转;平衡二叉树追求绝对平衡,条件比较苛刻,实现起来比较麻烦,每次插入新节点之后需要旋转的次数不能预知。

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


推荐阅读
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
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社区 版权所有