这个二叉树比之前的遍历的方案,性能提高了很多。但他也有一个问题,如果id的值是持续递增的话,会是什么样的结构?
我们发现如果id是持续递增的话,我们的二叉树结构出现了残缺,如果这个时候查找id=5,也是从一直遍历到最后,没有像之前的数据那样,排除掉一部分数据。那怎么解决?
红黑树
红黑树的出现就可以解决这个问题,红黑树的特点会自动平衡树,其他特点(小伙伴们自行度娘)。我们看一下红黑树怎么平衡?
上面两个图,左图在插入数值为3时,红黑树的算法发现有偏向,就会重新调整树结构;调整到右边的图
那我们可以看看,之前的数据1~6持续递增的树,会变成什么样
我们看到红黑树的结构,这样我们再次查找数据为5,只需要比较3次,有部分数据被提前排序了。红黑树很好的平衡了树的偏向问题,但红黑树问题也比较大。
1、每次都要检查规则,再把树进行重新平衡,这个是非常消耗时间的
2、数据量大的话,红黑树的深度会比较深,树一旦深就代表着我们读取磁盘次数就会增加
B树
小伙伴们有没有发现,影响数据查询时间的是树的高度,高度越高,我们需要比较的次数越多,那我们是不是可以想办法把树的高度弄低点?那我们的B树数据结构就由此产生。
B树的特点
假如当前有一颗m阶的B树(注意阶的意思是指每个节点的孩子节点的个数),那么其符合
(1)每个节点最多有m个子节点
(2)除了根节点和叶子节点之外,其他的每个节点最少有m/2(向上取整)个孩子节点
(3)根节点至少有两个孩子节点,(除了第一次插入的时候,此时只有一个节点,根节点同时是叶子节点)
(4)所有的叶子节点都在同一层
(5)有k个子节点的父节点包含k-1个关键码
(6)所有的叶节点都在同一层
(7)每个节点中的子节点都是从左到右排序的
小伙伴们是不是看到这个比较晕,这么多的特点(其实还有更多性质,老顾也记不住);其实我们不需要记住这么多的特点,只要记住几个核心点,先看图
我们的主要目标就是把树的高度弄低,上图中,我们可以看到之前的一个节点里面多了几个子节点(即几阶树)【核心点一】,这样的设计就是把之前节点只存储1个数值,现在可以存储多个数值。
多个子节点数值都是从左到右排序【核心点二】,有便于快速查找。而且叶节点具有相同的深度,保证了每个数值查询效率一致【核心点三】。
图中每个节点里面都包含具体信息data【核心点四】,再查询的时候找到对应的索引后,直接取出这个节点中的信息。
B树的核心思想就是把树高度弄低,用了树节点包含多个子节点的设计思想,上图中一个树节点包含3个子节点。
小伙伴有没有过这个想法,那我们可以把树节点包含更多子节点,10个、100个、甚至1万个,这样就让树高度越来越小,甚至就只有一个树根节点,**这样不是更好吗?**往下看
硬盘原理
这里就涉及到计算机原理的知识了,用通俗的图表示一下
读取数据流程主要交给磁头和磁盘,我们的数据存放在每个扇区中,要读取一个扇区数据,需要把磁头移动到相应的磁道上面,然后磁盘快速旋转,从而读取到里面值。(详细知识自行度娘)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
备注Android)**
[外链图片转存中…(img-JTvgkwnR-1710944181274)]