最近有小伙伴面试,对数据结构和算法比较头疼,我整理了一波资料,帮助大家快速掌握数据结构和算法的面试,感觉有用的小伙伴,点赞支持哦!

不叨叨,直接上干货。

目录

Q1:数据结构和算法的知识点整理:

Q2:链表,队列和栈的区别

Q3: 简述快速排序过程

Q4:快速排序算法的原理

Q5:简述各类算法时间复杂度、空间复杂度、稳定性对比

Q6:什么是 AVL 树?

Q7:什么是红⿊树?

Q8:AVL 树和红⿊树的区别?

Q9:B 树和B+ 树的区别?

Q10:排序有哪些分类?

Q11:直接插⼊排序的原理?

Q12:希尔排序的原理?

Q13:直接选择排序的原理?

Q14:堆排序的原理?

Q15:冒泡排序的原理?

Q16:快速排序的原理?

Q17:循环和递归,你说下有什么不同的点?

Q18:排序算法怎么选择?


Q1:数据结构和算法的知识点整理:

数据结构和算法的需要掌握的知识点,我的好朋友启舰整理的:

Q2:链表,队列和栈的区别

链表是一种物理存储单元上非连续的一种数据结构,看名字我们就知道他是一种链式的结构,就像一群人手牵着手一样。链表有单向的,双向的,还有环形的。

队列是一种特殊的线性表,他的特殊性在于我们只能操作他头部和尾部的元素,中间的元素我们操作不了,我们只能在他的头部进行删除,尾部进行添加。就像大家排队到银行取钱一样,先来的肯定要排到前面,后来的只能排在队尾,所有元素都要遵守这个操作,没有VIP会员,所以走后门插队的现象是不可能存在的,他是一种先进先出的数据结构。我们来看一下队列的数据结构是什么样的。

栈也是一种特殊的线性表,他只能对栈顶进行添加和删除元素。栈有入栈和出栈两种操作,他就好像我们把书一本本的摞起来,最先放的书肯定是摞在下边,最后放的书肯定是摞在了最上面,摞的时候不允许从中间放进去,拿书的时候也是先从最上面开始拿,不允许从下边或中间抽出来。

Q3: 简述快速排序过程

1)选择一个基准元素,通常选择第一个元素或者最后一个元素,

2)通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的元素值比基准值大。

3)此时基准元素在其排好序后的正确位置

4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。

Q4:快速排序算法的原理

是对冒泡排序的⼀种改进,不稳定,平均/最好时间复杂度 O(nlogn),元素基本有序时最坏时间复杂度O(n²),空间复杂度 O(logn)。

⾸先选择⼀个基准元素,通过⼀趟排序将要排序的数据分割成独⽴的两部分,⼀部分全部⼩于等于基准     元素,⼀部分全部⼤于等于基准元素,再按此⽅法递归对这两部分数据进⾏快速排序。
快速排序的⼀次划分从两头交替搜索,直到 low 和 high 指针重合,⼀趟时间复杂度 O(n),整个算法的时间复杂度与划分趟数有关。

最好情况是每次划分选择的中间数恰好将当前序列等分,经过 log(n) 趟划分便可得到⻓度为 1 的⼦表, 这样时间复杂度 O(nlogn)。

最坏情况是每次所选中间数是当前序列中的最⼤或最⼩元素,这使每次划分所得⼦表其中⼀个为空表   , 这样⻓度为 n 的数据表需要 n 趟划分,整个排序时间复杂度 O(n²)。

Q5:简述各类算法时间复杂度、空间复杂度、稳定性对比

排序算法 平均时间复杂度 最坏时间复杂度 空间复杂度 是否稳定
冒泡排序 O(n2)O(n2) O(n2)O(n2) O(1)O(1)
选择排序 O(n2)O(n2) O(n2)O(n2) O(1)O(1) 不是
直接插入排序 O(n2)O(n2) O(n2)O(n2) O(1)O(1)
归并排序 O(nlogn)O(nlogn) O(nlogn)O(nlogn) O(n)O(n)
快速排序 O(nlogn)O(nlogn) O(n2)O(n2) O(logn)O(logn) 不是
堆排序 O(nlogn)O(nlogn) O(nlogn)O(nlogn) O(1)O(1) 不是
希尔排序 O(nlogn)O(nlogn) O(ns)O(ns) O(1)O(1) 不是
计数排序 O(n+k)O(n+k) O(n+k)O(n+k) O(n+k)O(n+k)
基数排序 O(N∗M)O(N∗M) O(N∗M)O(N∗M) O(M)O(M)

Q6:什么是 AVL 树?

AVL 树 是平衡⼆叉查找树,增加和删除节点后通过树形旋转重新达到平衡。右旋是以某个节点为中⼼, 将它沉⼊当前右⼦节点的位置,⽽让当前的左⼦节点作为新树的根节点,也称为顺时针旋转。同理左旋     是以某个节点为中⼼,将它沉⼊当前左⼦节点的位置,⽽让当前的右⼦节点作为新树的根节点,也称为    逆时针旋转。

Q7:什么是红⿊树?

红⿊树 是 1972 年发明的,称为对称⼆叉 B 树,1978 年正式命名红⿊树。主要特征是在每个节点上增加⼀个属性表示节点颜⾊,可以红⾊或⿊⾊。

红⿊树和 AVL 树 类似,都是在进⾏插⼊和删除时通过旋转保持⾃身平衡,从⽽获得较⾼的查找性能。与 AVL 树 相⽐,红⿊树不追求所有递归⼦树的⾼度差不超过 1,保证从根节点到叶尾的最⻓路径不超过最短路径的 2 倍,所以最差时间复杂度是 O(logn)。

红⿊树通过重新着⾊和左右旋转,更加⾼效地完成了插⼊和删除之后的⾃平衡调整。红⿊树在本质上还是⼆叉查找树,它额外引⼊了 5 个约束条件: ① 节点只能是红⾊或⿊⾊。 ② 根节点必须是⿊⾊。 ③ 所有 NIL 节点都是⿊⾊的。 ④ ⼀条路径上不能出现相邻的两个红⾊节点。 ⑤ 在任何递归⼦树中,根节点到叶⼦节点的所有路径上包含相同数⽬的⿊⾊节点。

这五个约束条件保证了红⿊树的新增、删除、查找的最坏时间复杂度均为    O(logn)。如果⼀个树的左⼦节点或右⼦节点不存在,则均认定为⿊⾊。红⿊树的任何旋转在 3 次之内均可完成。

Q8:AVL 树和红⿊树的区别?

红⿊树的平衡性不如 AVL 树,它维持的只是⼀种⼤致的平衡,不严格保证左右⼦树的⾼度差不超过 1。这导致节点数相同的情况下,红⿊树的⾼度可能更⾼,也就是说平均查找次数会⾼于相同情况的 AVL 树。

在插⼊时,红⿊树和 AVL 树都能在⾄多两次旋转内恢复平衡,在删除时由于红⿊树只追求⼤致平衡,因此红⿊树⾄多三次旋转可以恢复平衡,⽽ AVL 树最多需要 O(logn) 次。AVL 树在插⼊和删除时,将向上回溯确定是否需要旋转,这个回溯的时间成本最差为 O(logn),⽽红⿊树每次向上回溯的步⻓为 2,回溯成本低。因此⾯对频繁地插⼊与删除红⿊树更加合适。

Q9:B 树和B+ 树的区别?

B 树中每个节点同时存储 key 和 data,⽽ B+ 树中只有叶⼦节点才存储 data,⾮叶⼦节点只存储 key。InnoDB 对 B+ 树进⾏了优化,在每个叶⼦节点上增加了⼀个指向相邻叶⼦节点的链表指针,形成了带有顺序指针的 B+ 树,提⾼区间访问的性能。

B+ 树的优点在于: ① 由于 B+ 树在⾮叶⼦节点上不含数据信息,因此在内存⻚中能够存放更多的key,数据存放得更加紧密,具有更好的空间利⽤率,访问叶⼦节点上关联的数据也具有更好的缓存命     中率。 ② B+树的叶⼦结点都是相连的,因此对整棵树的遍历只需要⼀次线性遍历叶⼦节点即可。⽽ B 树则需要进⾏每⼀层的递归遍历,相邻的元素可能在内存中不相邻,所以缓存命中性没有 B+树好。但是 B 树也有优点,由于每个节点都包含 key 和 value,因此经常访问的元素可能离根节点更近,访问也更迅速。

Q10:排序有哪些分类?

排序可以分为内部排序和外部排序,在内存中进⾏的称为内部排序,当数据量很⼤时⽆法全部拷⻉到内存需要使⽤外存,称为外部排序。

内部排序包括⽐较排序和⾮⽐较排序,⽐较排序包括插⼊/选择/交换/归并排序,⾮⽐较排序包括计数/  基数/桶排序。
 
插⼊排序包括直接插⼊/希尔排序,选择排序包括直接选择/堆排序,交换排序包括冒泡/快速排序。

Q11:直接插⼊排序的原理?

稳定,平均/最差时间复杂度 O(n²),元素基本有序时最好时间复杂度 O(n),空间复杂度 O(1)。
每⼀趟将⼀个待排序记录按其关键字的⼤⼩插⼊到已排好序的⼀组记录的适当位置上,直到所有待排序 记录全部插⼊为⽌。

直接插⼊没有利⽤到要插⼊的序列已有序的特点,插⼊第 i 个元素时可以通过⼆分查找找到插⼊位置insertIndex,再把 i~insertIndex 之间的所有元素后移⼀位,把第 i 个元素放在插⼊位置上。

Q12:希尔排序的原理?

⼜称缩⼩增量排序,是对直接插⼊排序的改进,不稳定,平均时间复杂度 O(n^1.3^),最差时间复杂度O(n²),最好时间复杂度 O(n),空间复杂度 O(1)。

把记录按下标的⼀定增量分组,对每组进⾏直接插⼊排序,每次排序后减⼩增量,当增量减⾄ 1 时排序完毕。

Q13:直接选择排序的原理?

不稳定,时间复杂度 O(n²),空间复杂度 O(1)。

每次在未排序序列中找到最⼩元素,和未排序序列的第⼀个元素交换位置,再在剩余未排序序列中重复     该操作直到所有元素排序完毕。

Q14:堆排序的原理?

是对直接选择排序的改进,不稳定,时间复杂度 O(nlogn),空间复杂度 O(1)。

将待排序记录看作完全⼆叉树,可以建⽴⼤根堆或⼩根堆,⼤根堆中每个节点的值都不⼩于它的⼦节点     值,⼩根堆中每个节点的值都不⼤于它的⼦节点值。

以⼤根堆为例,在建堆时⾸先将最后⼀个节点作为当前节点,如果当前节点存在⽗节点且值⼤于⽗节点,就将当前节点和⽗节点交换。在移除时⾸先暂存根节点的值,然后⽤最后⼀个节点代替根节点并作 为当前节点,如果当前节点存在⼦节点且值⼩于⼦节点,就将其与值较⼤的⼦节点进⾏交换,调整完堆     后返回暂存的值。

Q15:冒泡排序的原理?

稳定,平均/最坏时间复杂度 O(n²),元素基本有序时最好时间复杂度 O(n),空间复杂度 O(1)。
 
⽐较相邻的元素,如果第⼀个⽐第⼆个⼤就进⾏交换,对每⼀对相邻元素做同样的⼯作,从开始第⼀对     到结尾的最后⼀对,每⼀轮排序后末尾元素都是有序的,针对 n 个元素重复以上步骤 n -1 次排序完毕。

当序列已经有序时仍会进⾏不必要的⽐较,可以设置⼀个标志记录是否有元素交换,如果没有直接结束⽐较。

Q16:快速排序的原理?

是对冒泡排序的⼀种改进,不稳定,平均/最好时间复杂度 O(nlogn),元素基本有序时最坏时间复杂度O(n²),空间复杂度 O(logn)。

⾸先选择⼀个基准元素,通过⼀趟排序将要排序的数据分割成独⽴的两部分,⼀部分全部⼩于等于基准     元素,⼀部分全部⼤于等于基准元素,再按此⽅法递归对这两部分数据进⾏快速排序。
快速排序的⼀次划分从两头交替搜索,直到 low 和 high 指针重合,⼀趟时间复杂度 O(n),整个算法的时间复杂度与划分趟数有关。

最好情况是每次划分选择的中间数恰好将当前序列等分,经过 log(n) 趟划分便可得到⻓度为 1 的⼦表, 这样时间复杂度 O(nlogn)。

最坏情况是每次所选中间数是当前序列中的最⼤或最⼩元素,这使每次划分所得⼦表其中⼀个为空表   , 这样⻓度为 n 的数据表需要 n 趟划分,整个排序时间复杂度 O(n²)。

Q17:循环和递归,你说下有什么不同的点?

递归算法:

优点:代码少、简介。

缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理,比如参数传递需要压栈等操作,会对执行效率有一定影响。但是,对于某些问题,如果不使用递归,那将是极端难看的代码。

循环算法:

优点:速度快,结构简单。

缺点:并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。

Q18:排序算法怎么选择?

数据量规模较⼩,考虑直接插⼊或直接选择。当元素分布有序时直接插⼊将⼤⼤减少⽐较和移动记录的次数,如果不要求稳定性,可以使⽤直接选择,效率略⾼于直接插⼊。

数据量规模中等,选择希尔排序。

数据量规模较⼤,考虑堆排序(元素分布接近正序或逆序)、快速排序(元素分布随机)和归并排序稳定性)。⼀般不使⽤冒泡。

好了,整理结束,小伙伴们点赞、收藏、评论,一键三连走起呀,下期见~~

最后,我将面试前用到的资料,都分享下,点击下面的,回复:csdn面试大全

即可获取所有面试资料

肝完了,一天掌握数据结构和算法面试题,吊打面试官,一起学习吧相关推荐

  1. 2021最新汇总数据结构与算法面试题(准备面试的可以看看)

    闲来无事整理了一下数据结构与算法面试题,准备面试的可以看看. 这份面试题汇总除了Java语言的,我还整理了C++和Golang语言的,无论你是做什么开发这份数据结构与算法面试题汇总都可以看,如果你是做 ...

  2. 数据结构与算法面试题(2022版)

    序列号 内容 链接 1 Java基础知识面试题(2022版) https://blog.csdn.net/qq_43061290/article/details/124023797 2 Java集合容 ...

  3. 【2021最新版】数据结构+算法面试题总结(9+20道题含答案解析)

    文章目录 1.栈(stack) 2.队列(queue) 3.链表(Link) 4.散列表(Hash Table) 5.排序二叉树 6. 前缀树 7.红黑树 8.B-TREE 9.位图 算法面试题 1. ...

  4. 数据结构经典算法面试题

    转自:http://hi.baidu.com/geogre_jsj/blog/item/e4b98fd2aab5aa3611df9b92.html 由于这些题,实在太火了.所以,应广大网友建议要求,在 ...

  5. 分布式数据结构与算法面试题

    分布式 分布式概述 分布式 分布式(distributed)是为了解决单个物理服务器容量和性能瓶颈问题而采用的优化手段,将一个业务拆分成不同的子业务,分布在不同的机器上执行.服务之间通过远程调用协同工 ...

  6. 数据结构和算法面试题系列—二叉树面试题汇总

    这个系列是我多年前找工作时对数据结构和算法总结,其中有基础部分,也有各大公司的经典的面试题,最早发布在CSDN.现整理为一个系列给需要的朋友参考,如有错误,欢迎指正.本系列完整代码地址在 这里. 0 ...

  7. 架构设计分布式数据结构与算法面试题

    目录 架构设计 请列举出在JDK中几个常用的设计模式? 什么是设计模式?你是否在你的代码里面使用过任何设计模式? 静态代理.JDK动态代理以及CGLIB动态代理 静态代理 动态代理 cglib代理 单 ...

  8. 【建议收藏】数据结构和算法面试题

    数据结构 数据结构分为两大类,线性结构和非线性结构. 线性结构:数组.队列.链表.栈 非线性结构:多维数组.树结构.图结构 1.数组 数组是最常用的数据结构,用于存储相同类型的数据,数组的长度也是固定 ...

  9. Java数据结构与算法面试题,首发Java程序员人手必备的进阶知识体系,(1)

    在市场上很少能够看到一套不错的学习笔记,小编也是花了挺久的时间总结了这份**<Java程序员人手必备的进阶知识体系>**,帮助大家系统化高效的进阶学习,而不是零散低效的阅读. 2020全新 ...

最新文章

  1. python数据挖掘主要特点_python数据挖掘(从数据集中抽取特征)
  2. 微服务架构在云端的应用
  3. Error querying database.Cause:java.sql.SQLSyntaxErrorException:ORA-00911:invalid character
  4. Flutter 核心原理与混合开发模式
  5. [mybatis]Mapper XML Files_获取自增主键的值
  6. HH SaaS电商系统的商品营销角标功能模块设计
  7. java中number类型能否相除_Java中 如果复数类成员是int型,怎么实现两个复数相除...
  8. IDEA配置SpringBoot的springloaded热部署(写方法、属性不用重启)
  9. 【C/C++学院】0805-语音识别控制QQ/语音控制游戏
  10. 软件架构师的沟通修炼
  11. 计算机辅助设计与制造考试重点,2016计算机辅助设计与制造复习内容
  12. centos php ioncube_CentOS 7安装ionCube Loader为php解密组件的方法
  13. 以下产品不用再做CCC认证了,你的产品在内吗?
  14. 谷歌画面传输框架_Google Chromecast评论-将视频无线传输到电视的竞赛正在进行中
  15. mysql 分库备份_如何分表分库备份及批量恢复?MySQL
  16. 图片怎么转jpg?教你两个超简单的图片转jpg格式的方法
  17. VUE·17:事件处理之 @keyup、@keydown 等键盘按键触发及 @keyup.enter 等别名
  18. 黑莓Z30评测–黑莓10中的均衡之作
  19. 数字时代,原创者应该如何借助区块链技术保护知识产权?
  20. 【CELL 心脏时空图】A spatiotemporal organ-wide gene expression and cell atlas of the developing human heart

热门文章

  1. LBP特征的实现及LBP+SVM分类
  2. Unity3d学习中遇到的问题记录
  3. gazebo11下uuv_simulator的编译
  4. 数据分析上千部动漫作品
  5. 如何使用手机快速完成证件照制作?
  6. 【产品经理学习笔记】Part 1 产品体验及产品体验报告
  7. Php禁止外部盗链nginx,nginx 防止盗链
  8. docker 利用docker拉取Nvidia/cuda官方镜像,部署深度学习环境
  9. oracle 总转横函数,详解Oracle行列转换函数-pivot函数和unpivot函数-多智时代
  10. Nvidia显卡硬件编解码能力表 官方链接