二叉查找树/红黑树/B+树

二叉查找树

1.为什么会出现二叉查找树

    二分法可以很好的对有序数组进行查找,但增删比较低效

    链表可以很好的增删元素,查找低效,且使用二分法也低效

    ------> 出现了普通二叉查找树的数据结构

              

               特征:左子树所有节点 < 根节点 < 右子树所有节点

               中序遍历是有序的

               查找的时间复杂度:O(logN)

2.普通二叉查找树缺点?

3.如果每次节点插入都能自动平衡,那么会保持二叉查找树的性能,该如何设计呢?

-----> 于是有了AVL树

AVL树

有二叉查找树的所有特征

每个节点的左子树和右子树的高度差最多等于1

 

4.AVL树的缺点?

解决了二叉查找树退化成链表的缺点,将时间负责度控制在O(logN)

平衡树的要求太高了:左右子树高度差最多为1,导致每次插入/删除节点的时候几乎都需要通过左旋或者右旋来进行调整

在频繁插入、删除的场景中,平衡树会频繁调整,大大降低性能

 

5.为了解决AVL树的缺点,于是出现了红黑树,为什么红黑树可以解决AVL树的缺点?

右旋:

 

原理&手写红黑树:https://www.bilibili.com/video/BV1UJ411J7CU?p=4

 

6.红黑树使用场景?

Java8之后的hashmaphash冲突的解决方案数据结构

广泛用在C++的STL中,如map和set都是用红黑树实现的

 

7.与字典树的区别?

字典树(trie树)用在统计和排序大量字符串,如自动机。

 

8.相似的数据结构?

       

      

       B树:与平衡二叉树相似,不同的是B树属于多叉树,又名 平衡多路查找树
       B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;
       所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;
       B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;
       B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;

 

B树相对于红黑树的区别?

在大规模数据存储的时候,红黑树往往出现由于树的深度过大而造成磁盘IO读写过于频繁,进而导致效率低下的情况。为什么会出现这样的情况,我们知道要获取磁盘上数据,必须先通过磁盘移动臂移动到数据所在的柱面,然后找到指定盘面,接着旋转盘面找到数据所在的磁道,最后对数据进行读写。磁盘IO代价主要花费在查找所需的柱面上,树的深度过大会造成磁盘IO频繁读写。根据磁盘查找存取的次数往往由树的高度所决定,所以,只要我们通过某种较好的树结构减少树的结构尽量减少树的高度,B树可以有多个子女,从几十到上千,可以降低树的高度。

 

B树和B+树的区别?

B树所有叶子结点都出现在同一层,叶子结点不包含任何关键字信息。

B+树所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接,所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含需要查找的有效信息)

 

为什么说B+比B树更适合实际应用中操作系统的文件索引和数据库索引?
1) B+的磁盘读写代价更低

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

2) B+-tree的查询效率更加稳定

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

数据库索引采用B+树的主要原因是 B树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题。正是为了解决这个问题,B+树应运而生。B+树只要遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作(或者说效率太低)
 

 

9.用途?

B树是为了提高磁盘或外部存储设备查找效率而产生的一种多路平衡查找树。

B+树为B树的变形结构,用于大多数数据库或文件系统的存储而设计。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值