数据结构复试笔记

绪论

在这里插入图片描述
时间复杂度,空间复杂度

用循环比递归的效率高吗?

贪心算法和动态规划以及分治法的区别

线性表

顺序表和链表的比较

头指针和头结点的区别

栈和队列

栈和队列的区别

三种判断循环队列是队空还是队满

队列在计算机系统中的应用

串的模式匹配
暴力模式匹配算法的思想是:从主串的第一个字符起,与子串的第一个字符比较,相等则继续比较;不等则从主串的下一个位置起,继续和子串开始比较,直到最后看是否匹配成功。

KMP匹配算法
如果已匹配相等的前缀序列中有某个后缀正好是模式的前缀,那么就可以将模式向后滑动到与这些相等字符对齐的位置(移动位数=已匹配的字符数-对应的部分匹配值),主串i指针无须回溯,并继续从该位置开始进行比较。而模式向后滑动位数的计算仅与模式本身的结构有关,与主串无关

树与二叉树

线索二叉树解决了什么问题

二叉树的特点

树的存储结构(3种)及各自优缺点

图的存储结构(4种)
在这里插入图片描述

最小生成树和最短路径算法

最小生成树:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最短路径
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

拓扑排序
在这里插入图片描述

在这里插入图片描述

关键路径
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

查找

静态查找(3种)
动态查找(2种)
b树和b+树
哈希表的构造方法(6种)
哈希表解决冲突的方法(4种)

排序

在这里插入图片描述

面试题

  1. 数组和链表的区别
    不同:链表是链式的存储结构;数组是顺序的存储结构。
    链表通过指针来连接元素与元素,数组则是把所有元素按次序依次存储。
    链表的插入删除元素相对数组较为简单,不需要移动元素,且较为容易实现长度扩充,但是寻找某个元素较为困难;
    数组寻找某个元素较为简单,但插入与删除比较复杂,由于最大长度需要再编程一开始时指定,故当达到最大长度时,扩充长度不如链表方便。
    相同:两种结构均可实现数据的顺序存储,构造出来的模型呈线性结构。
    数组
    一、数组的特点
    1.在内存中,数组是一块连续的区域
    2.数组需要预留空间
    在使用前需要提前申请所占内存的大小,这样不知道需要多大的空间,就预先申请可能会浪费内存空间,即数组空间利用率低
    ps:数组的空间在编译阶段就需要进行确定,所以需要提前给出数组空间的大小(在运行阶段是不允许改变的)
    3.在数组起始位置处,插入数据和删除数据效率低。
    插入数据时,待插入位置的的元素和它后面的所有元素都需要向后搬移
    删除数据时,待删除位置后面的所有元素都需要向前搬移
    4.随机访问效率很高,时间复杂度可以达到O(1)
    因为数组的内存是连续的,想要访问那个元素,直接从数组的首地址处向后偏移就可以访问到了
    5.数组开辟的空间,在不够使用的时候需要扩容,扩容的话,就会涉及到需要把旧数组中的所有元素向新数组中搬移
    6.数组的空间是从栈分配的
    二、数组的优点
    随机访问性强,查找速度快,时间复杂度为O(1)
    三、数组的缺点
    1.头插和头删的效率低,时间复杂度为O(N)
    2.空间利用率不高
    3.内存空间要求高,必须有足够的连续的内存空间
    4.数组空间的大小固定,不能动态拓展
    链表
    一、链表的特点
    1.在内存中,元素的空间可以在任意地方,空间是分散的,不需要连续
    2.链表中的元素都会两个属性,一个是元素的值,另一个是指针,此指针标记了下一个元素的地址
    每一个数据都会保存下一个数据的内存的地址,通过此地址可以找到下一个数据
    3.查找数据时效率低,时间复杂度为O(N)
    因为链表的空间是分散的,所以不具有随机访问性,如要需要访问某个位置的数据,需要从第一个数据开始找起,依次往后遍历,直到找到待查询的位置,故可能在查找某个元素时,时间复杂度达到O(N)
    4.空间不需要提前指定大小,是动态申请的,根据需求动态的申请和删除内存空间,扩展方便,故空间的利用率较高
    5.任意位置插入元素和删除元素效率较高,时间复杂度为O(1)
    6.链表的空间是从堆中分配的
    二、链表的优点
    1.任意位置插入元素和删除元素的速度快,时间复杂度为O(1)
    2.内存利用率高,不会浪费内存
    3.链表的空间大小不固定,可以动态拓展
    三、链表的缺点
    随机访问效率低,时间复杂度为0(N)

  2. 贪心算法和动态规划的区别
    贪心算法:局部最优,划分的每个子问题都最优,得到全局最优,但是不能保证是全局最优解,所以对于贪心算法来说,解是从上到下的,一步一步最优,直到最后。
    动态规划:将问题分解成重复的子问题,每次都寻找左右子问题解中最优的解,一步步得到全局的最优解.重复的子问题可以通过记录的方式,避免多次计算。所以对于动态规划来说,解是从小到上,从底层所有可能性中找到最优解,再一步步向上。
    分治法:和动态规划类似,将大问题分解成小问题,但是这些小问题是独立的,没有重复的问题。独立问题取得解,再合并成大问题的解。
    例子:比如钱币分为1元3元4元,要拿6元钱,贪心的话,先拿4,再拿两个1,一共3张钱;实际最优却是两张3元就够了。

  3. 给定一个单链表,只给出头指针h:
    1、如何判断是否存在环?
    2、如何知道环的长度?
    3、如何找出环的连接点在哪里?
    4、带环链表的长度是多少?
    解法:
    1、对于问题1,使用追赶的方法,设定两个指针slow、fast,从头指针开始,每次分别前进1步、2步。如存在环,则两者相遇;如不存在环,fast遇到NULL退出。
    2、对于问题2,记录下问题1的碰撞点p,slow、fast从该点开始,再次碰撞所走过的操作数就是环的长度s。
    3、问题3:有定理:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接点。(证明在后面附注)
    4、问题3中已经求出连接点距离头指针的长度,加上问题2中求出的环的长度,二者之和就是带环单链表的长度

  4. 树与图的区别和联系
    1.树没有环路,图有环路
    2.树是一种层次结构,图是一种网状结构
    3.树是图的子集
    4.树除根节点外每个节点最多只有一个父节点,而图的节点关系是任意的

  5. B树与B+树
    在这里插入图片描述
    4.所有叶节点都在同一层,且不带任何信息
    B树的插入
    B树的插入B树的删除
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

B+树
在这里插入图片描述

B树和B+树的区别

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值