热门标签 | 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



推荐阅读
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • Babylon.js 实例展示
    探索 Babylon.js 的强大功能,通过全屏演示体验其卓越性能。本文提供在线文档链接和默认渲染管线的源码调试地址,帮助您深入了解 Babylon.js 的工作原理。 ... [详细]
  • 本文详细介绍了Git分布式版本控制系统中远程仓库的概念和操作方法。通过具体案例,帮助读者更好地理解和掌握如何高效管理代码库。 ... [详细]
  • 本文介绍了如何利用npm脚本和concurrently工具,实现本地开发环境中多个监听服务的同时启动,包括HTTP服务、自动刷新、Sass和ES6支持。 ... [详细]
  • 解决网站乱码问题的综合指南
    本文总结了导致网站乱码的常见原因,并提供了详细的解决方案,包括文件编码、HTML元标签设置、服务器响应头配置、数据库字符集调整以及PHP与MySQL交互时的编码处理。 ... [详细]
  • 本文介绍如何在Linux Mint系统上搭建Rust开发环境,包括安装IntelliJ IDEA、Rust工具链及必要的插件。通过详细步骤,帮助开发者快速上手。 ... [详细]
  • 作为一名专业的Web前端工程师,掌握HTML和CSS的命名规范是至关重要的。良好的命名习惯不仅有助于提高代码的可读性和维护性,还能促进团队协作。本文将详细介绍Web前端开发中常用的HTML和CSS命名规范,并提供实用的建议。 ... [详细]
  • 本文详细介绍了如何在 Windows 环境下使用 node-gyp 工具进行 Node.js 本地扩展的编译和配置,涵盖从环境搭建到代码实现的全过程。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 脑机接口(BCI)技术正逐步将科幻变为现实,从帮助听障人士恢复听力到使瘫痪者重新站立,甚至可能将多年的学习过程压缩至瞬间。本文探讨了这一前沿技术的现状、挑战及其未来前景。 ... [详细]
  • 本文详细探讨了网站流量统计中常用的三个关键指标:页面浏览量(PV)、独立访客数(UV)和独立IP数(IP)。通过分析这些指标的定义、计算方法及其应用场景,帮助网站运营者更好地理解用户行为,优化网站内容与用户体验。 ... [详细]
  • TechStride 网站
    TechStride 成立于2014年初,致力于互联网前沿技术、产品创意及创业内容的聚合、搜索、学习与展示。我们旨在为互联网从业者提供更高效的新技术搜索、学习、分享和产品推广平台。 ... [详细]
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社区 版权所有