数据结构面试问题

原文请戳2022年中科院信工所二室考研杂记__Melody~的博客-CSDN博客

1,常见的数据结构有哪些

从逻辑角度看有

1)线性结构:线性表、栈、队列、数组(是线性表的推广)

2)非线性结构:树、图、集合

2,数组(顺序表)和链表的区别

1)存取方式:顺序表可以随机存取也可顺序存取;链表只能顺序存取(最重要)

2)空间分配:顺序表可以静态分配和动态分配;链式存储随意分配

3)逻辑结构和物理结构:顺序表逻辑上相邻物理上也相邻;链式分配逻辑相邻物理上不一定相邻

3,常用链表有哪些

1)单链表

2)双链表:设置一头一尾两个指针

3)循环列表:有循环单链表和循环双链表

4)静态链表:用下标表示下一个结点(要分配连续的空间)

4,什么是平衡二叉树

二叉树上任意结点的左子树和右子树高度之差不超过1

5,简述KMP算法

在主串和模式串匹配时,主串指针一直往前不回溯,模式串指针回溯,回溯的位置保存在next数组中,可以避免无效的比较。

模式串、主串长度分别为m和n,时间复杂度为O(m+n)

若不使用KMP算法,时间复杂度是 O(m*n)

KMP的改进:若这个不匹配的字符是g 对应的next也指向g,则可以直接跳到最终指向的位置。引入了nextval数组

6,贪心算法、动态规划和分治法的区别

1)贪心算法:在每一步都按照一定策略选择当前的最优解,最后得到的结果不一定是最优解。

2)分治法:将一个大的问题划分为多个相互独立的子问题,来各个求解。

3)动态规划:相当于将分治法中重复的子问题的结果保存起来,再次出现时,直接使用。是一种用空间换时间的算法。

7,快速排序的改进

快速排序是典型的分治法,对于一个序列,选择一个元素作为基准元素,比他小的移到左边,比他大的移到右边,每轮确定一个元素的位置,然后对子序列进行相同操作。

时间复杂度O(nlogn)

最坏情况是原序列有序 回到O(n^2)

优化方法:因为每次选序列第一个元素作为基准,可能导致比较次数过多,所以用“三数取中”的方法,取一个序列的第一个,中间的,最后一个元素中中间值作为基准。

8,循环比递归效率高吗

一般情况下,循环的效率更高,因为递归要用到栈,开辟新的空间,且会有很多的重复计算。

9,图的遍历和树的遍历有什么区别

树是一种特殊的图

树中的层次遍历就是BFS

树中的先中后序遍历就是DFS

10,数据的逻辑结构有哪些?物理结构有哪些

逻辑结构见上

物理结构有顺序结构和链式结构

11,算法的五个特征

答:

有穷性:算法必须在执行有限的步骤后结束

确定性:对于相同的输入,结果必须是确定的

可行性:算法由基本操作执行有限次实习

输入:一个算法必须有0个或者多个输入

输出:一个算法必须有0个或者多个输出

12,头指针和头结点的区别?

头指针表明了链表存储空间的起始位置,是必须有的;头结点是为了方便编程而定义的一个不带信息的结点,对有带头指针的链表,头指针指向头结点,对不带头指针的非空链表,头指针指向第一个元素。

13,最小生成树是什么?

生成树:包含图的所有顶点,含尽可能少的边的连通图

最小生成树(MST)是带权路径之和最小的那颗生成树

求MST的算法有Prim算法(每次选择一个和当前集合最近的结点加入)和Kruskal算法(使用并查集)

14,深度优先搜索和广度优先搜索

BFS:从某一结点出发,访问此结点未被访问过的所有邻接结点,再用同样规则访问这些结点,直到遍历完成(使用队列实现)

DFS:从某一结点出发,访问与其邻接的任一结点,再从这一结点开始访问,若不能继续向下访问,则退回上一个结点。(使用栈实现)

15,什么是并查集

分为并和查两个操作,用一个数组保存每个元素的父节点,初始为-1

并:是将此结点的父节点该为目标根节点

查:找到这个结点的根节点

应用:kruskal算法,先将所有边的权值递增排序,然后依次看这个边的结点在不在当前并查集中,若不在的话,则选中此边并且加入并查集。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值