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

说一下B+tree和二叉搜索树的区别?说一下二叉搜索树和AVL树、红黑树之间的差别...

https:blog.csdn.netkingcat666articledetails45248487http:www.cnblogs.comFMOONp9487472.html二

https://blog.csdn.net/kingcat666/article/details/45248487

http://www.cnblogs.com/FMOON/p/9487472.html

二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree)优势:

(1) 都是动态结构。在删除,插入操作的时候,都不需要彻底重建原始的索引树。最多就是执行一定量的旋转,变色操作来有限的改变树的形态。而这些操作所付出的代价都远远小于重建一棵树。这一优势在《查找结构专题(1):静态查找结构概论 》中讲到过。

(2) 查找的时间复杂度大体维持在O(log(N))数量级上。可能有些结构在最差的情况下效率将会下降很快,比如BST。这个会在下面的对比中详细阐述。

 

二叉搜索树:就是二叉排序树,中序遍历可以得出递增序列

BST 的操作代价分析:

    (1) 查找代价: 任何一个数据的查找过程都需要从根结点出发,沿某一个路径朝叶子结点前进。因此查找中数据比较次数与树的形态密切相关。

         当树中每个结点左右子树高度大致相同时,树高为logN。则平均查找长度与logN成正比,查找的平均时间复杂度在O(logN)数量级上。

         当先后插入的关键字有序时,BST退化成单支树结构。此时树高n。平均查找长度为(n+1)/2,查找的平均时间复杂度在O(N)数量级上。

 

    (2) 插入代价: 新结点插入到树的叶子上,完全不需要改变树中原有结点的组织结构。插入一个结点的代价与查找一个不存在的数据的代价完全相同。

 

    (3) 删除代价: 当删除一个结点P,首先需要定位到这个结点P,这个过程需要一个查找的代价。然后稍微改变一下树的形态。如果被删除结点的左、右子树只有一个存在,则改变形态的代价仅为O(1)。如果被删除结点的左、右子树均存在,只需要将当P的左孩子的右孩子的右孩子的...的右叶子结点与P互换,在改变一些左右子树即可。因此删除操作的时间复杂度最大不会超过O(logN)。

 

    BST效率总结 :  查找最好时间复杂度O(logN),最坏时间复杂度O(N)。

                            插入删除操作算法简单,时间复杂度与查找差不多

 

AVL树(平衡二叉查找树),解决单支的情况。平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。

   (1) 查找代价: AVL是严格平衡的BST(平衡因子不超过1)。那么查找过程与BST一样,只是AVL不会出现最差情况的BST(单支树)。因此查找效率最好,最坏情况都是O(logN)数量级的。

 

    (2) 插入代价&#xff1a; AVL必须要保证严格平衡(|bf|<&#61;1)&#xff0c;那么每一次插入数据使得AVL中某些结点的平衡因子超过1就必须进行旋转操作。事实上&#xff0c;AVL的每一次插入结点操作最多只需要旋转1次(单旋转或双旋转)。因此&#xff0c;总体上插入操作的代价仍然在O(logN)级别上(插入结点需要首先查找插入的位置)。

 

    (3) 删除代价&#xff1a;AVL删除结点的算法可以参见BST的删除结点&#xff0c;但是删除之后必须检查从删除结点开始到根结点路径上的所有结点的平衡因子。因此删除的代价稍微要大一些。每一次删除操作最多需要O(logN)次旋转。因此&#xff0c;删除操作的时间复杂度为O(logN)&#43;O(logN)&#61;O(2logN)

 

    AVL 效率总结 :  查找的时间复杂度维持在O(logN)&#xff0c;不会出现最差情况

                            AVL树在执行每个插入操作时最多需要1次旋转&#xff0c;其时间复杂度在O(logN)左右。

                            AVL树在执行删除时代价稍大&#xff0c;执行每个删除操作的时间复杂度需要O(2logN)。

 红黑树 (Red-Black Tree )

  二叉平衡树的严格平衡策略以牺牲建立查找结构(插入&#xff0c;删除操作为代价&#xff0c;换来了稳定的O(logN) 的查找时间复杂度

 能不能找一种折中策略&#xff0c;即不牺牲太大的建立查找结构的代价&#xff0c;也能保证稳定高效的查找效率呢&#xff1f; 答案就是&#xff1a;红黑树。

红黑树的特性:
&#xff08;1&#xff09;每个节点或者是黑色&#xff0c;或者是红色。
&#xff08;2&#xff09;根节点是黑色。
&#xff08;3&#xff09;每个叶子节点&#xff08;NIL&#xff09;是黑色。 [注意&#xff1a;这里叶子节点&#xff0c;是指为空(NIL或NULL)的叶子节点&#xff01;]
&#xff08;4&#xff09;如果一个节点是红色的&#xff0c;则它的子节点必须是黑色的。
&#xff08;5&#xff09;从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。&#xff08;接近平衡二叉树&#xff09;

最长路径长度不超过最短路径长度的2倍

主要是用它来存储有序的数据。C&#43;&#43; STL中的set、map&#xff0c;以及Linux虚拟内存的管理&#xff0c;都是通过红黑树去实现的。

   (1) 查找代价&#xff1a;由于红黑树的性质(最长路径长度不超过最短路径长度的2倍)&#xff0c;可以说明红黑树虽然不像AVL一样是严格平衡的&#xff0c;但平衡性能还是要比BST要好。其查找代价基本维持在O(logN)左右&#xff0c;但在最差情况下(最长路径是最短路径的2倍少1)&#xff0c;比AVL要略逊色一点。

 

    (2) 插入代价&#xff1a;RBT插入结点时&#xff0c;需要旋转操作和变色操作。但由于只需要保证RBT基本平衡就可以了。因此插入结点最多只需要2次旋转&#xff0c;这一点和AVL的插入操作一样。虽然变色操作需要O(logN)&#xff0c;但是变色操作十分简单&#xff0c;代价很小。

 

    (3) 删除代价&#xff1a;RBT的删除操作代价要比AVL要好的多&#xff0c;删除一个结点最多只需要3次旋转操作。

 

    RBT 效率总结 : 查找 效率最好情况下时间复杂度为O(logN)&#xff0c;但在最坏情况下比AVL要差一些&#xff0c;但也远远好于BST。

                           插入和删除操作改变树的平衡性的概率要远远小于AVL&#xff08;RBT不是高度平衡的&#xff09;。因此需要的旋转操作的可能性要小&#xff0c;而且一旦需要旋转&#xff0c;插入一个结点最多只需要旋转2次&#xff0c;删除最多只需要旋转3次(小于AVL的删除操作所需要的旋转次数)。虽然变色操作的时间复杂度在O(logN)&#xff0c;但是实际上&#xff0c;这种操作由于简单所需要的代价很小。

 

b&#43;树&#xff1a;多路的平衡二叉树

在B&#43;树中&#xff0c;所有记录节点都是按键值的大小顺序存放在同一层的叶节点中&#xff0c;各叶节点指针进行连接

小结

       B树&#xff1a;二叉树&#xff0c;每个结点只存储一个关键字&#xff0c;等于则命中&#xff0c;小于走左结点&#xff0c;大于

走右结点&#xff1b;

       B-树&#xff1a;多路搜索树&#xff0c;每个结点存储M/2到M个关键字&#xff0c;非叶子结点存储指向关键

字范围的子结点&#xff1b;

       所有关键字在整颗树中出现&#xff0c;且只出现一次&#xff0c;非叶子结点可以命中&#xff1b;

       B&#43;树&#xff1a;在B-树基础上&#xff0c;为叶子结点增加链表指针&#xff0c;所有关键字都在叶子结点

中出现&#xff0c;非叶子结点作为叶子结点的索引&#xff1b;B&#43;树总是到叶子结点才命中&#xff1b;

       B*树&#xff1a;在B&#43;树基础上&#xff0c;为非叶子结点也增加链表指针&#xff0c;将结点的最低利用率

从1/2提高到2/3&#xff1b;

转:https://www.cnblogs.com/FMOON/p/9487472.html



推荐阅读
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • QBlog开源博客系统:Page_Load生命周期与参数传递优化(第四部分)
    本教程将深入探讨QBlog开源博客系统的Page_Load生命周期,并介绍一种简洁的参数传递重构方法。通过视频演示和详细讲解,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 探讨如何高效使用FastJSON进行JSON数据解析,特别是从复杂嵌套结构中提取特定字段值的方法。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本文介绍如何使用JPA Criteria API创建带有多个可选参数的动态查询方法。当某些参数为空时,这些参数不会影响最终查询结果。 ... [详细]
  • Babylon.js 实例展示
    探索 Babylon.js 的强大功能,通过全屏演示体验其卓越性能。本文提供在线文档链接和默认渲染管线的源码调试地址,帮助您深入了解 Babylon.js 的工作原理。 ... [详细]
author-avatar
killphp
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有