程序员不一定要进大厂,但是算法很重要

数据结构与算法是程序员内功的重要体现,特别是在面试和工作中。本文详细介绍了AVL树、二叉搜索树、红黑树等平衡树的定义、应用场景及其在STL中的应用,强调了学习数据结构对于逻辑思维和编程效率的提升。红黑树由于其相对宽松的平衡条件,常用于C++的STL,如map和set。同时,文章还探讨了B树、B+树、Trie树的特点和用途,以及它们在数据库索引和文件系统中的作用。此外,还提及了并查集、贪心算法、动态规划等算法的区别和应用场景。
摘要由CSDN通过智能技术生成

前言

数据结构Q与算法是程序员内功体现的重要标准之一,且数据结构也应用在各个方面, 业界更有程序-数据结构+算法这个等式存在。

各个中间件开发者,架构师Q他们都在努力的优化中间件、项目结构以及算法提高运行效率和降低内存占用,在这里数据结构起到相当重要的作用。

此外数据结构也蕴含-些面向对象的思想,
故学好掌握数据结构对逻辑思维处理抽象能力有很大提升。为什么学习数据结构与算法?如果你还是学生,那么这门课程是必修的,考研基本也是必考科目。

工作在内卷严重的大厂中找工作数据结构与算法也是面试、笔试必备的非常重要的考察点。如果工作了数据结构和算法也是内功提升一个非常重要的体现,对于程序员来说,想要得到满意的结果,数据结构与算法是必备功力!一键获取1000+页PDF算法笔记文档

在这里插入图片描述

(1) 红黑树的了解(平衡树,二叉搜索树),使用场景

把数据结构上几种树集中的讨论一下:

1. AVLtree

定义:先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度二者差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和坏情况 下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这 个树。

节点的平衡因子是它的左子树的高度减去它的右子树的高度(有时相反)。带有 平衡因子1、0或-1的节点被认为是平衡的。带有平衡因子 -2或2的节点被认为 是不平衡的,并需要重新平衡这个树。平衡因子可以直接存储在每个节点中,或 从可能存储在节点中的子树高度计算出来。

一般我们所看见的都是排序平衡二叉树。

AVLtree使用场景:AVL树适合用于插入删除次数比较少,但查找多的情况。插入删除会导致很多的旋转,旋转是非常耗时的。AVL 在linux内核的vm area中使用。

2. 二叉搜索树

二叉搜索树也是一种树,适用于一般二叉树的全部操作,但二叉搜索树能够实现 数据的快速查找。

二叉搜索树满足的条件:

非空左子树的所有键值小于其根节点的键值

非空右子树的所有键值大于其根节点的键值

左右子树都是二叉搜索树

二叉搜索树的应用场景:如果是没有退化称为链表的二叉树,查找效率就是 lgn,效率不错,但是一旦退换称为链表了,要么使用平衡二叉树,或者之后的 RB树,因为链表就是线性的查找效率。

3. 红黑树的定义

红黑树是一种二叉查找树,但在每个结点上增加了一个存储位表示结点的颜色, 可以是RED或者BLACK。通过对任何一条从根到叶子的路径上各个着色方式的 限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的。当二叉查找树的高度较低时,这些操作执行的比较快,但是当树的高度较高时, 这些操作的性能可能不比用链表好。红黑树(red-black tree)是一种平衡的二 叉查找树,它能保证在坏情况下,基本的动态操作集合运行时间为O(lgn)。红黑树必须要满足的五条性质:

性质一:节点是红色或者是黑色;在树里面的节点不是红色的就是黑色的,没有其他 颜色,要不怎么叫红黑树呢,是吧。

性质二:根节点是黑色;根节点总是黑色的。它不能为红。

性质三:每个叶节点(NIL或空节点)是黑色;

性质四:每个红色节点的两个子节点都是黑色的(也就是说不存在两个连续的红色节 点);就是连续的两个节点不能是连续的红色,连续的两个节点的意思就是父节点与 子节点不能是连续的红色。

性质五:从任一节点到其每个叶节点的所有路径都包含相同数目的黑色节点。从根节点 到每一个NIL节点的路径中,都包含了相同数量的黑色节点。

红黑树的应用场景:红黑树是一种不是非常严格的平衡二叉树,没有AVLtree那么严格的平衡要求,所以它的平均查找,增添删除效率都还不错。广泛用在 C++的STL中。如map和set都是用红黑树实现的。

4. B树定义

B树和平衡二叉树稍有不同的是B树属于多叉树又名平衡多路查找树(查找路径 不只两个),不属于二叉搜索树的范畴,因为它不止两路,存在多路。

B树满足的条件:

(1)树种的每个节点多拥有m个子节点且m>=2,空树除外(注:m阶代表一个树节 点多有多少个查找路径,m阶=m路,当m=2则是2叉树,m=3则是3叉);

(2)除根节点外每个节点的关键字数量大于等于ceil(m/2)-1个小于等于m-1个,非根 节点关键字数必须>=2;(注:ceil()是个朝正无穷方向取整的函数 如ceil(1.1)结果为2)

(3)所有叶子节点均在同一层、叶子节点除了包含了关键字和关键字记录的指针外也 有指向其子节点的指针只不过其指针地址都为null对应下图后一层节点的空格子

(4)如果一个非叶节点有N个子节点,则该节点的关键字数等于N-1;

(5)所有节点关键字是按递增次序排列,并遵循左小右大原则;

B树的应用场景:构造一个多阶的B类树,然后在尽量多的在结点上存储相关的信息, 保证层数尽量的少,以便后面我们可以更快的找到信息,磁盘的I/O操作也少一些,而 且B类树是平衡树,每个结点到叶子结点的高度都是相同,这也保证了每个查询是稳定的。
在这里插入图片描述

5. B+树

B+树是B树的一个升级版,B+树是B树的变种树,有n棵子树的节点中含有n个 关键字,每个关键字不保存数据,只用来索引,数据都保存在叶子节点。是为文 件系统而生的。

相对于B树来说B+树更充分的利用了节点的空间,让查询速度更加稳定,其速度 完全接近于二分法查找。为什么说B+树查找的效率要比B树更高、更稳定;我们 先看看两者的区别

(1)B+跟B树不同,B+树的非叶子节点不保存关键字记录的指针,这样使得B+树每 个节点所能保存的关键字大大增加;

(2)B+树叶子节点保存了父节点的所有关键字和关键字记录的指针,每个叶子节点的 关键字从小到大链接;

(3)B+树的根节点关键字数量和其子节点个数相等;

(4)B+的非叶子节点只进行数据索引,不会存实际的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值