1-1
数据结构概念包括数据之间的逻辑结构、数据在计算机中的存储方式和数据的运算三个方面。
1-2
NlogN^2和NlogN具有相同的增长速度。
NlogN^2=2NlogN
Ο(1)<Ο(logn)<Ο(n)<Ο(nlogn)<Ο(n²)<Ο(n³)<…<Ο(2^n)<Ο(n!)<O(n^n)
1-4
所谓“循环队列”是指用单向循环链表或者循环数组表示的队列。
F
循环队列指的是用数组表示的队列,利用求余数运算使得头尾相接。
循环队列本身是一种顺序存储结构,而循环链表是一种链式存储结构。两者之间是平级关系。
线性链表是线性表的链式存储结构,包括单链表,双链表,循环链表等。
队列的顺序存储结构一般采用循环队列的形式。
1-5
某二叉树的后序和中序遍历序列正好一样,则该二叉树中的任何结点一定都无左孩子。
F
中序遍历:左 根 右
先序遍历:根 左 右
后序遍历:左 右 根
所以:一定都无右孩子
1-6
在一棵二叉搜索树上查找63,序列39、101、25、80、70、59、63是一种可能的查找时的结点值比较序列。
F
从前三个数据看该查找均不为三种遍历中的一种:先序(根左右)39 25 101;中序(左根右)25 39 101;后序(左右根)25 101 39
二叉搜索树的性质:非空左子树的所有键值小于其根结点的键值;右子树的大于根结点的键值
1-7
将一棵完全二叉树存于数组中(根结点的下标为1)。则下标为23和24的两个结点是兄弟。
F
完全二叉树第n行的孩子结点个数为2^(n-1)
所以可知x=(1+2^(n-1))*n/2,23,24在第5行,从16-32:22-23,24-25
1-8
对于顺序存储的长度为N的线性表,访问结点和增加结点的时间复杂度分别对应为O(1)和O(N)。
增加结点需要先让部分元素后移后才能插入
1-9
将N个数据按照从小到大顺序组织存放在一个单向链表中。如果采用二分查找,那么查找的平均时间复杂度是O(logN)。
F
二分查找关键是,迅速当前数据的中间值,拿中间值跟需要查找的目的key比较,根据比较的结果,淘汰一半的候选元素。
单向链表不可二分查找,只有按顺序存放的数组/多级链表才可以,这是由链表的特性决定的。链表是很典型的链式存储结构,因为数据在链表中的位置是不确定的,所以只能通过从头到尾的顺序检索得到,因此链表的每一个节点的地址不能在O(1)的时间复杂度内获得。
这和数组有本质的不同。数组中的元素是通过下标来确定的,只要你知道了下标,就可以直接存储整个元素, 比如a[5],是直接的。链表没有这个,所以,折半查找只能在数组上进行。但是二分查找的时间复杂度是为O(logN)
1-10
通过对堆栈S操作:Push(S,1), Push(S,2), Pop(S), Push(S,3), Pop(S), Pop(S)。输出的序列为:123。
F
321
2-1
斐波那契数列FN的定义为:F0=0, F1=1, FN=FN−1+FN−2, N=2, 3, …。用递归函数计算FN的空间复杂度是:
A.O(logN)
B.O(N)
C.O(FN)
D.O(N!)
B 调用了N层空间复杂度
只有二分搜索,大多一般时,才会使O(logN)
2-2
对于顺序存储的长度为N的线性表,访问结点和增加结点的时间复杂度为:
A.O(1), O(1)
B.O(1), O(N)
C.O(N), O(1)
D.O(N), O(N)
B
2-3
设栈S和队列Q的初始状态均为空,元素{1, 2, 3, 4, 5, 6, 7}依次进入栈S。若每个元素出栈后立即进入队列Q,且7个元素出队的顺序是{2, 5, 6, 4, 7, 3, 1},则栈S的容量至少是:
A.1
B.2
C.3
D.4
D
堆栈:先进后出;队列:先进先出
先push1、2进入,2再弹出,此时容量为2;再3、4、5都要进入以后,5就弹出;(被弹出的元素也应该先进入堆栈中)再进入6又弹出...
2-4
要判断一个整数N(>10)是否素数,我们需要检查3到√N之间是否存在奇数可以整除N。则这个算法的时间复杂度是:
A.O(N/2)
B.O(√NlogN)
C.O(√N)
D.O(0.5logN)
正确答案:C
2-5
若一棵二叉树的后序遍历序列是{ 1, 3, 2, 6, 5, 7, 4 },中序遍历序列是{ 1, 2, 3, 4, 5, 6, 7 },则下列哪句是错的?
A.这是一棵完全二叉树
B.2是1和3的父结点
C.这是一棵二叉搜索树
D.7是5的父结点
后序遍历:左右根;中序遍历:左根右
二叉搜索树的中序遍历会得到一个从小到大的输出序列
画图,不是一颗完全二叉树

完全二叉树的深度O(logN)
2-6
如果循环队列用大小为m的数组表示,队头位置为front、队列元素个数为size,那么队尾元素位置rear为:
A.front+size
B.front+size-1
C.(front+size)%m
D.(front+size-1)%m
D 超出了数组长度还需回来-就需要mod m;队满条件:(rear+1)%size=front
2-7
以下说法错误的是( B)。
A.由于顺序存储要求连续的存储区域,所以在存储管理上不够灵活
B.线性表的顺序存储结构优于链式存储结构
C.链式存储的线性表为表示结点间的逻辑关系需要增加额外的存储空间
D.顺序存储的线性表可以随机存取
优缺点
- 顺序存储时,相邻数据元素的存放地址也相邻(逻辑与物理统一);要求内存中可用存储单元的地址必须是连续的。
- 优点:存储密度大(=1),存储空间利用率高。
- 缺点:插入或删除元素时不方便。
- 链式存储时,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针
- 优点:插入或删除元素时很方便,使用灵活。
- 缺点:存储密度小(<1),存储空间利用率低。
使用情况
- 顺序表适宜于做查找这样的静态操作;
- 链表宜于做插入、删除这样的动态操作。
- 若线性表的长度变化不大,且其主要操作是查找,则采用顺序表;
- 若线性表的长度变化较大,且其主要操作是插入、删除操作,则采用链表。
比较
顺序表与链表的比较
基于空间的比较
- 存储分配的方式
- 顺序表的存储空间是静态分配的
- 链表的存储空间是动态分配的
- 存储密度 = 结点数据本身所占的存储量/结点结构所占的存储总量
- 顺序表的存储密度 = 1
- 链表的存储密度 < 1
基于时间的比较
- 存取方式
- 顺序表可以随机存取,也可以顺序存取(知道各个数据的位置)
- 链表是顺序存取的
- 插入/删除时移动元素个数
- 顺序表平均需要移动近一半元素
- 链表不需要移动元素,只需要修改指针
2-8
采用多项式的非零项链式存储表示法,如果两个多项式的非零项分别为N1和N2个,最高项指数分别为M1和M2,则实现两个多项式相乘的时间复杂度是:
A.O(N1×N2)
B.O(M1×M2)
C.O(N1+N2)
D.O(M1+M2)
多项式相乘的方法:把非零项相乘,再加起来
2-9
树最适合于用来表示
A.有序数据元素
B.无序数据元素
C.元素之间无联系的数据
D.元素之间具有分支层次关系的数据


2-10
数据元素在计算机存储器内表示时,物理相对位置和逻辑相对位置相同并且是连续的,称之为( )。
A.逻辑结构
B.顺序存储结构
C.链式存储结构
D.以上都不对
B 顺序存储结构就是利用物理位置来表示逻辑位置,顺序存储时,相邻数据元素的存放地址也相邻(逻辑与物理统一);要求内存中可用存储单元的地址必须是连续的。
2-11
线性表、堆栈、队列的主要区别是什么?
A.线性表用指针,堆栈和队列用数组
B.堆栈和队列都是插入、删除受到约束的线性表
C.线性表和队列都可以用循环链表实现,但堆栈不能
D.堆栈和队列都不是线性结构,而线性表是
B 堆栈是受限制的线性表,插入、删除操作都在一个端点位置(栈顶),栈的顺序存储通常由一个一维数组记录栈顶元素位置的变量(指针)maxsize组成,栈的链式存储结构可以用循环链表表示,而线性表不可以用循环链表表示
队列也是受限制的列表只能在一端插入,在另一端删除。一般用数组表示队列,区分队满的条件之一:另外增设一个变量size记录当前队列元素的个数;之二:少用一个元素空间
线性结构:线性表,队列,堆栈
2-12
以二叉链表作为二叉树的存储结构,在具有 n 个结点的二叉链表中(n>0),空链域的个数为 __
A.n+1
B.n
C.n−1
D.无法确定
A 二叉树分为顺序存储结构和链表存储结构。顺序存储是用一组连续的存储单元(如数组)存储二叉树结点的数据的,结点的父子管通过相对位置来反映的,不需要添加存储单元来存放指针;链表存储一般存储不完全二叉树节省空间。
没有孩子的时候,每一个结点都有两个指针域,n个结点则一共有2n个指针域,又因为n个节点中有n-1条边,(除了头结点没有边,其余节点都有一个父节点,相当于都有1条边,共n-1条)剩下的空链域就是2n-(n-1)=n+1,即n+1个空指针。以二叉链表作为树的存储结构。链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点。

2-13
对于任意一棵高度为 5 且有 10 个结点的二叉树,若采用顺序存储结构保存,每个结点占 1 个存储单元(仅存放结点的数据信息),则存放该二叉树需要的存储单元的数量至少是:
A.31
B.16
C.15
D.10
顺序存储结构需要一大块连续的存储空间,所以开辟时按照完美二叉树的空间开辟
树的高度:根结点的高度;2**n-1(全都填满了)为存放二叉树的存储单元
2-14
按照二叉树的定义,具有3个结点的二叉树有几种?
A.3
B.4
C.5
D.6
左边的单边数,右边的单边数,根左右,根右左,完美二叉树
2-15
将{ 32, 2, 15, 65, 28, 10 }依次插入初始为空的二叉搜索树。则该树的前序遍历结果是
A.2, 10, 15, 28, 32, 65
B.32, 2, 10, 15, 28, 65
C.10, 28, 15, 2, 65, 32
D.32, 2, 15, 10, 28, 65
二叉树:最多只有两个子树,子结点有左右顺序之分
二叉搜索/排序/查找树:键值大小:左<根<右(中序遍历可得到一个从小到大的输出序列)最大元素在最右端点,最小元素在最左端点
平衡二叉/AVL树:ASL为树的平均查找长度;AVL树的插入、删除、查找操作均可在O(logN)的时间内完成;AVL树的根结点左右子树高度差的绝对值不超过1;平衡因子BF=hL(左子树高度)-hR(右子树高度)当BF=2/-2时,标识出树的不平衡,需要旋转调整
前序遍历:根左右的顺序
AC立马排除,因为根结点32肯定在第一个
2-16
若二叉搜索树是有N个结点的完全二叉树,则不正确的说法是:
A.所有结点的平均查找效率是O(logN)
B.最小值一定在叶结点上
C.最大值一定在叶结点上
D.中位值结点在根结点或根的左子树上
最小值在最左端点;最大值在最右端点;
叶结点是度为0的结点(一个结点的度是其子树的个数);完全二叉树是除最后一层外的每层结点都完全填满,在最后一层上如果不是满的,则只缺少右边的若干结点。
B最小值在最左分支上无左孩子的结点;C最大值的结点可以有左孩子的分支,所以不一定为叶结点
多选
3-1
非空线性表具有哪些结构特征
A.只有唯一的开始结点和唯一的终端结点
B.可拥有多个的开始结点和多个终端结点
C.除开始结点外,每个结点只有一个前驱结点
D.除终端结点外,每个结点只有一个后继结点
ACD线性表的特点,一对一;B多对多-图;树-一对多
3-2
链表 - 时间复杂度:在包含 n 个数据元素的链表中,▁▁▁▁▁ 的时间复杂度为 O(n)。
A.访问第 i 个数据元素
B.在第 i (1≤i≤n) 个结点后插入一个新结点
C.删除第 i (1≤i≤n) 个结点
D.将 n 个元素按升序排序
ACB链表只能从头到尾访问,因此访问一个数据最坏需要遍历一遍才可以找到,找到后可以灵活插入与删除。
D O(N**2)或O(logN)
3-3
以下说法正确的是。
A.求表长、定位这两种运算在采用顺序存储结构时实现的效率不比采用链式存储结构时实现的效率低
B.顺序存储的线性表可以随机存取
C.由于顺序存储要求连续的存储区域,所以在存储管理上不够灵活
D.线性表的链式存储结构优于顺序存储结构、
ABC 顺序存储可以顺序存取也可以随机存取,适合做查找等静态操作,要求连续的存储区域,所以管理不够灵活;链式存储只能顺序存取,适合做删除、插入等动态操作,可以随机存放数据,存储位置可分为存储结点值的位置和存放指针的位置,存储管理较灵活但是存储空间利用率低。
3-4
下列说法正确的是()
A.一个算法是求特定问题的运算序列。
B.算法是一个有穷规则的集合,其中之规则规定了一个解决某一特定类型的问题的运算序列。
C.算法是一个对任一有效输入能够停机的图灵机。
D.一个算法,它是满足5 个特性的程序,这5个特性是:有限性、确定性、能行性、有0个或多个输入且有1个或多个输出。
C 停机的图灵机:必须能够终止算法,不能一直允许下去
ABCD
模拟题
(logN)²是O(N)的。
答案:T
2-2
下列函数中,哪个函数具有最慢的增长速度:
A.N^1.5
B.NlogN^2
C.N^2logN
D.N(logN)^2
logN的增长速度小于N^0.5
2-7
给定程序时间复杂度的递推公式:T(1)=1,T(N)=2T(N/2)+N。则对该程序时间复杂度最接近的描述是:
A.O(logN)
B.O(N)
C.O(NlogN)
D.O(N2)

2-8
下列代码
for(i=0; i<n; i++)
for(j=i; j>0; j/=2)
printf(“%d\n”, j);
的时间复杂度是:
A.O(N×i)
B.O(N)
C.O(N2)
D.O(NlogN)
2-9
在数据结构中,从逻辑上可以把数据结构分成线性结构和非线性结构
2-10
与数据元素本身的形式、内容、相对位置、个数无关的是数据的逻辑结构
2-12
算法的时间复杂度取决于问题的规模、待处理数据的初态
2-11
通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着不仅数据元素所包含的数据项的个数要相同,而且对应数据项的类型要一致
2-32
某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用什么存储方式最节省运算时间?
A.单链表
B.仅有尾指针的单循环链表
C.仅有头指针的单循环链表
D.双链表
目前我们所学到的链表,无论是动态链表还是静态链表,表中各节点中都只包含一个指针(游标),且都统一指向直接后继节点,通常称这类链表为单向链表(或单链表)。
在解决某些特殊问题时,单链表并不是效率最优的存储结构。比如说,如果算法中需要大量地找某指定结点的前趋结点,使用单链表无疑是灾难性的,因为单链表更适合 "从前往后" 找,而 "从后往前" 找并不是它的强项。
双向链表
循环链表(首尾相连)
因此本题:仅有尾指针的单循环链表,可以非常方便地找到尾结点,尾结点后面的第一个结点往往是头结点,头结点的下一个结点就是第线性表的第一个结点。对最后一个元素和第一个元素操作对带尾指针的单循环链表是非常方便的。
二分查找
Position BinarySearch( List L, ElementType X ){
int a = 1;
int b = L->Last;
while(a <= b){
int mid = (a + b) / 2;
if(L->Data[mid] == X){
return mid;
}else if(L->Data[mid] > X){
b = mid-1;
}else{
a = mid+1;
}
}
return NotFound; /*p等于NotFound,返回的时候不用if判断,因为p只会在找到所查找数据时才会进行赋值。*/
}
链表序列的合并
List Merge(List L1,List L2)
{
List pa,pb,pc,L;
L=(List)malloc(sizeof(struct Node));
pa=L1->Next;
pb=L2->Next;
pc=L;
while(pa&&pb)
{
if(pa->Data<=pb->Data)
{
pc->Next=pa;
pc=pa;
pa=pa->Next;
}
else
{
pc->Next=pb;
pc=pb;
pb=pb->Next;
}
}
pc->Next=pa?pa:pb;
L1->Next=NULL;
L2->Next=NULL;
return L;
}
本文详细探讨了数据结构的基础概念,包括逻辑结构、存储方式和运算三个方面,并通过具体的题目解析了顺序表、链表、二叉树、队列、堆栈等数据结构的优缺点、使用情况和比较。此外,还涉及了算法的时间复杂度分析,如斐波那契数列、二分查找等,并对数据结构在实际问题中的应用进行了深入讨论,如线性表的顺序存储和链式存储的选择、循环队列的操作等。

6816

被折叠的 条评论
为什么被折叠?



