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



推荐阅读
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了一些好用的搜索引擎的替代品,包括网盘搜索工具、百度网盘搜索引擎等。同时还介绍了一些笑话大全、GIF笑话图片、动态图等资源的搜索引擎。此外,还推荐了一些迅雷快传搜索和360云盘资源搜索的网盘搜索引擎。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了使用CentOS7.0 U盘刻录工具进行安装的详细步骤,包括使用USBWriter工具刻录ISO文件到USB驱动器、格式化USB磁盘、设置启动顺序等。通过本文的指导,用户可以轻松地使用U盘安装CentOS7.0操作系统。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
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社区 版权所有