1.算法以及算法的五个基本特征(简答题1)
算法是对特定问题求解步骤的一种描述,是指令的有限序列
五个基本特征:有穷性,确定性,可行性,有输入,有输出
2.算法时间复杂度,空间复杂度以及其计算方法(判断题1)
略
3.数据结构从逻辑上分,有几种?从物理上分有几种?分别是什么不同以及其优劣(简答题1)
逻辑结构:树、图、线性、集合
不同:集合结构数据元素之间除了同属于一个集合的关系以外没有别的关系
线性结构:一对一的关系
树形结构:一对多的关系,除了开始元素以外,只有一个前驱元素,除了终端元素以外,只有一个或多个后继元素
图形结构:指元素和元素之间存在多对多的关系
物理:顺序、散列、链表、索引
4. 同一组数据,其逻辑结构是否唯一?如不是,请举出反例。(判断题2)
不是,可以采取线性结构,也可以采取图结构,树结构
5.同一组数据,其物理结构是否唯一?如不是,请举出反例。(判断题3)
不是,一组队列,可以用顺序表存储,也可以用链表存储
6.在有n个元素的顺序表中的任一位置插入、删除一个元素,其对应的时间复杂度是多少?在有n个元素的链表中的任一位置插入删除一个元素,其对应的时间复杂度是多少?(编程题1)
插入或删除到顺序表:n
插入或删除到链表:插入删除是1,其余的是n
7.给定一个进栈序列,给出所有可能的出栈序列(简答题2)
例如:给出 1 2 3 4 进栈
那么可能的出栈有:
1234 1243 1324 1342 1432
2134 2143 2314 2341 2431
3421 3214 3241
4321
总共14种情况
相对于全排列24,少掉的10种即第一个数输出后,后面的比他小的数(即已经入栈的数)都要按顺序输出,比他大的(即还未入栈的)可以随意插入后面的任何一个位置
总情况用这个公式算,n为元素个数
8.就你所知,列出3-4个栈的应用场景(简答题3)
(1)将中缀表达式转化成后缀表达式并进行运算
(2)求解迷宫问题
(3)检查字符串中{【()】}符号是否对上
(4)栈在遍历的应用
9.什么是队列的假溢出,如何解决假溢出?如何判断循环队列的空与满(简答题4)
队列的假溢出:在顺序队中,队尾指针rear=MaxSize-1,即元素不能再进队,但是实际上,当rear=MaxSize-1时,队列中可能还有空位置,这种以为队满条件设置不合理导致队满条件成立而队列中仍有空位置的情况称为假溢出。
如何解决:将数组的前端和后端连接起来,形成一个环形数组,即把存储队列元素的数组从逻辑上看成一个环,称为环形队列或循环队列
怎样判断循环队列的空与满:将”队尾指针循环增1等于队头指针“作为队满条件,尝试进队一次,若达到队头,则认为队满了
10.如果一个线性表最常见的操作是取第i个元素以及其前驱元素,该如何选择存储结构,为什么?(简答题5)
采用顺序存储,无须为表示表中元素之间的逻辑关系而增加额外的存储空间
11.如何删除一个顺序表中的所有相同元素X?如何删除顺序表中大于x而小于y的所有元素?(编程题2)
void Delete(SeqList &L){
int i,j;
for(i=0, j=1; j<L.length; j++)
if(L.data[i]!=L.data[j])
L.data[++i] = L.data[j];
L.length = i+1;
}
void Delete(SeqList &L){
int i,j;
for( i=0;j=0; j<L.length; j++)
if(L.data[j]<x||L.data[j]>y)
L.data[++i]=L.data[j]
L.length = i;
}
12.什么是哈夫曼树、哈夫曼编码?如何构造哈夫曼树和哈夫曼编码?以及该哈夫曼树的 WPL?针对一个案例,给出其求解过程。(大题1)
哈夫曼树:在带权叶子结点构成的所有二叉树中,带权路径长度最小的二叉树称为哈夫曼树
哈夫曼编码:规定左分支为0、右分支为1,则从根节点到每个叶子结点所经过的分支对应的0和1组成的序列便是该结点对应的哈夫曼编码
13.如何实现计算二叉树中的高度、层次以及度?(判断题4)
高度:顾名思义,从最底下往上数,根节点在多少层高度就是多少
层次:从上往下数,第多少层,层次就是多少
度:结点总个数-1
14.对于一个二叉树,给定其先序遍历序列和后序遍历序列,是否可以唯一确定一颗二叉树?如果不是,请给出反例。如果给定其先序遍历序列和中序遍历序列呢?如果不是,请给出反例。(大题2)
只知道先序和后序不可以;
知道先序和中序可以确定
15.图的遍历算法有哪些?各自的原理是什么?对于一个无向连通图,调用一次遍历算法,能否实现访问所有顶点?如果换做一个是一个非连通图呢?什么是强连通图,它有什么特点?对有n(n>2)个顶点的强连通图,它至少有几个边?(大题3)
图的遍历算法:深度优先搜索与广度优先搜索
原理:
深度优先遍历时从图中的某个初始点v出发,首先访问初始点v,然后选择一个与顶点v相邻且没有被访问过的顶点w,以w为初始顶点,再从它出发进行深度优先遍历,直到图中与v点邻接的所有顶点都被访问过为止。
广度优先遍历:先访问邻接点,再访问顶点
16.如何求出图中任意两点间的最短路径?(大题4)
主要两种 Floyd和dijistra算法
17.什么是顺序查找?什么是二分查找,什么是哈希查找?分别针对什么场景?对于有n个元素的二分查找,查找第几个元素花费的比较次数最多?如何计算他们各自的平均查找时间(查找成功/查找失败)查找第几号元素花费的次数最少?哈希查找解决冲突的办法有哪些?具体方法是什么?如何提升哈希查找的效率?
顺序查找:即从表的一端向另一端逐个将关键字华人给定值k比较,若相等则查找成功,给出该元素在查找表中的位置。成功收(n+1)/2,失败是n
二分查找:要求是有序区间。建立判定树,在树中进行查找成功,查找失败的计算。
哈希查找:
冲突解决方法:开放地址法,拉链法
18.内排序。每种排序方法的原理、过程以及时间复杂度、稳定性分析。稳定(元素移动跨步较小)/不稳定(跨步较大)。插入(直接插入、二分查找插入、shell排序)、交换(冒泡、快速排序)、选择(简单排序、堆排序)、归并、基数。
以关键字序列为(6,8,7,9,0,1,3,2,4,5)为例以下是对各排序算法的介绍及第一趟结果
插入排序:从左往右读,遇到右边的比左边的小,就把右边的与左边的逐个比较,插入其中
第一趟结果:(6,7,8,9,0,1,3,2,4,5)
二分查找插入:是在插入排序上的一个升级,即在与前面的数比较的过程中采取二分查找的办法,减少比较次数
第一趟结果:(6,8,7,9,0,1,3,2,4,5)
希尔排序:设置n/2为步长,比较间隔n/2的两个元素,第一轮排序完成后,缩小一个步长,直到步长为1为止
第一趟结果:以5为步长(1,3,2,4,0,6,8,7,9,5)
冒泡排序:从左往右扫描,依次比较相邻的两个数,若左数比右数大,则交换位置,再接着向右走,每一趟都可以找到一个最大值。
第一趟结果:(6,7,8,0,1,3,2,4,5,9)
快速排序:首先选取一个基准元素,这个基准元素是可以随便取的,我们一般选取第一个,然后建立左右两个指针,分别指向左右第一个元素,再依次比较左指针指向的数和基准数之间的关系,若比基准小,则位置不动,指针接着向左移动,比他大则与基准元素交换位置,依此类推。直到最后,基准元素左边的都是比它小的,右边的都是比他大的,则第一趟排序完毕。
第一趟结果:以6为基准元素(5,4,2,3,0,1,4,9,7,8)
堆排序:先把数字依次填入到完全二叉树里,然后确定是选用大根堆还是小根堆,若是用大根堆,则从第一层依次进行调整,使每一个树的根结点都大于左右子树(建堆完毕),然后再将根节点与最后一个结点交换位置,同时取出根结点,再按照先前的规则进行调整,直到调整完毕为止(b站上有一个动态的视频,讲得是最清晰的)
第一趟结果:(0,8,7,6,5,1,3,2,4,9)
简单排序:将序列从左向右扫描,找到最小的那个关键字,然后再将第一个数与该关键字交换位置,一趟可以找到最小的数。
第一趟结果:(0,8,7,9,6,1,3,2,4,5)
归并排序:将数据分成n组,然后再组与组之间相互比较合并,最后生成一个有序的大组
第一趟结果:(6,8,7,9,0,1,2,3,4,5)
基数排序:按照个十百千逐个比较,每次仅比较一个位数,对该位数上的数字进行排序
第一趟结果:(0,1,2,3,4,5,6,7,8,9)
附加
1.什么是数据结构
数据结构是指所有数据元素以及数据元素之间的关系,可以看作相互之间存在着某种特定关系的数据元素的集合。
2.抽象数据类型由什么构成
数据对象、数据关系、基本运算。